1
- from django .db .models import FileField , ImageField
1
+ from __future__ import annotations
2
+
3
+ from django .db .models import FileField , ImageField , Model
4
+ from django .db .models .fields .files import FieldFile , ImageFieldFile
5
+ from django .urls import reverse
2
6
3
7
from .storages import private_media_storage
4
8
5
9
10
+ class PrivateMediaFieldFileMixin :
11
+ instance : Model
12
+
13
+ @property
14
+ def url (self ) -> str :
15
+ django_url = super ().url # type: ignore
16
+
17
+ readonly_fields = getattr (self .instance , "_private_media_readonly_fields" , None )
18
+ model_admin = getattr (self .instance , "_private_media_model_admin" , None )
19
+ if not readonly_fields or not model_admin :
20
+ return django_url
21
+
22
+ field_name = self .field .name # type: ignore
23
+ if field_name not in readonly_fields :
24
+ return django_url
25
+
26
+ url_name = f"admin:{ model_admin ._get_private_media_view_name (field_name )} "
27
+ return reverse (url_name , kwargs = {"pk" : self .instance .pk })
28
+
29
+
30
+ class PrivateMediaFieldFile (PrivateMediaFieldFileMixin , FieldFile ):
31
+ pass
32
+
33
+
34
+ class PrivateMediaImageFieldFile (PrivateMediaFieldFileMixin , ImageFieldFile ):
35
+ pass
36
+
37
+
6
38
class PrivateMediaFieldMixin :
7
39
"""
8
40
Enable a private media storage for file-based model fields.
@@ -25,8 +57,12 @@ class PrivateMediaFileField(PrivateMediaFieldMixin, FileField):
25
57
A generic private media file field.
26
58
"""
27
59
60
+ attr_class = PrivateMediaFieldFile
61
+
28
62
29
63
class PrivateMediaImageField (PrivateMediaFieldMixin , ImageField ):
30
64
"""
31
65
A private media image field.
32
66
"""
67
+
68
+ attr_class = PrivateMediaImageFieldFile
0 commit comments