15
15
from .models import Action , Appointment , Document , Invite , Message , User
16
16
17
17
18
+ class ReadOnlyFileMixin :
19
+ """
20
+ By default, private media fields do not display the correct URL when readonly
21
+ """
22
+
23
+ def display_file_url (self , obj ):
24
+ view_name = "%(app_label)s_%(model_name)s_%(field)s" % {
25
+ "app_label" : self .opts .app_label ,
26
+ "model_name" : self .opts .model_name ,
27
+ "field" : "file" ,
28
+ }
29
+ return format_html (
30
+ _ ("<a href='{url}'>{text}</a>" ),
31
+ url = reverse (f"admin:{ view_name } " , kwargs = {"pk" : obj .pk }),
32
+ text = obj .file .name ,
33
+ )
34
+
35
+ display_file_url .short_description = _ ("File" )
36
+
37
+
18
38
class ActionInlineAdmin (UUIDAdminFirstInOrder , admin .StackedInline ):
19
39
model = Action
20
40
extra = 1
@@ -141,15 +161,17 @@ class _UserAdmin(ImageCroppingMixin, UserAdmin):
141
161
142
162
143
163
@admin .register (Action )
144
- class ActionAdmin (UUIDAdminFirstInOrder , PrivateMediaMixin , admin .ModelAdmin ):
164
+ class ActionAdmin (
165
+ ReadOnlyFileMixin , UUIDAdminFirstInOrder , PrivateMediaMixin , admin .ModelAdmin
166
+ ):
145
167
fields = [
146
168
"uuid" ,
147
169
"name" ,
148
170
"description" ,
149
171
"status" ,
150
172
"type" ,
151
173
"end_date" ,
152
- "file " ,
174
+ "display_file_url " ,
153
175
"is_for" ,
154
176
"created_on" ,
155
177
"updated_on" ,
@@ -164,7 +186,7 @@ class ActionAdmin(UUIDAdminFirstInOrder, PrivateMediaMixin, admin.ModelAdmin):
164
186
"status" ,
165
187
"type" ,
166
188
"end_date" ,
167
- "file " ,
189
+ "display_file_url " ,
168
190
"is_for" ,
169
191
"created_on" ,
170
192
"updated_on" ,
@@ -219,22 +241,22 @@ def mark_not_deleted(self, request, queryset):
219
241
220
242
221
243
@admin .register (Document )
222
- class DocumentAdmin (UUIDAdminFirstInOrder , PrivateMediaMixin , admin .ModelAdmin ):
223
- fields = ["uuid" , "name" , "file" , "created_on" , "plan" , "owner" ]
224
- readonly_fields = ("uuid" , "name" , "file" , "plan" , "preview" , "created_on" , "owner" )
225
- list_display = ("name" , "preview" , "created_on" , "owner" )
244
+ class DocumentAdmin (
245
+ ReadOnlyFileMixin , UUIDAdminFirstInOrder , PrivateMediaMixin , admin .ModelAdmin
246
+ ):
247
+ fields = ["uuid" , "name" , "display_file_url" , "created_on" , "plan" , "owner" ]
248
+ readonly_fields = (
249
+ "uuid" ,
250
+ "name" ,
251
+ "display_file_url" ,
252
+ "plan" ,
253
+ "created_on" ,
254
+ "owner" ,
255
+ )
256
+ list_display = ("name" , "display_file_url" , "created_on" , "owner" )
226
257
list_filter = ("owner" ,)
227
258
private_media_fields = ("file" ,)
228
259
229
- def preview (self , obj ):
230
- return format_html (
231
- _ ("<a href='{url}'>{text}</a>" ),
232
- url = reverse ("admin:accounts_document_file" , kwargs = {"pk" : obj .pk }),
233
- text = obj .file .name ,
234
- )
235
-
236
- preview .short_description = "Preview file"
237
-
238
260
def has_add_permission (self , request ):
239
261
return False
240
262
@@ -247,7 +269,7 @@ class AppointmentAdmin(UUIDAdminFirstInOrder, admin.ModelAdmin):
247
269
248
270
249
271
@admin .register (Message )
250
- class MessageAdmin (PrivateMediaMixin , admin .ModelAdmin ):
272
+ class MessageAdmin (ReadOnlyFileMixin , PrivateMediaMixin , admin .ModelAdmin ):
251
273
fields = (
252
274
"uuid" ,
253
275
"sender" ,
@@ -256,7 +278,7 @@ class MessageAdmin(PrivateMediaMixin, admin.ModelAdmin):
256
278
"content" ,
257
279
"seen" ,
258
280
"sent" ,
259
- "file " ,
281
+ "display_file_url " ,
260
282
)
261
283
readonly_fields = (
262
284
"uuid" ,
@@ -266,7 +288,7 @@ class MessageAdmin(PrivateMediaMixin, admin.ModelAdmin):
266
288
"content" ,
267
289
"seen" ,
268
290
"sent" ,
269
- "file " ,
291
+ "display_file_url " ,
270
292
)
271
293
list_display = ("sender" , "receiver" , "created_on" , "seen" , "sent" )
272
294
list_filter = ("sender" , "receiver" )
0 commit comments