10
10
from django .utils .translation import gettext_lazy as _
11
11
12
12
import magic
13
- from rest_framework import exceptions , serializers
13
+ from rest_framework import serializers
14
14
15
15
from core import choices , enums , models , utils
16
16
from core .services .ai_services import AI_ACTIONS
@@ -38,78 +38,7 @@ class Meta:
38
38
read_only_fields = ["full_name" , "short_name" ]
39
39
40
40
41
- class BaseAccessSerializer (serializers .ModelSerializer ):
42
- """Serialize template accesses."""
43
-
44
- abilities = serializers .SerializerMethodField (read_only = True )
45
-
46
- def update (self , instance , validated_data ):
47
- """Make "user" field is readonly but only on update."""
48
- validated_data .pop ("user" , None )
49
- return super ().update (instance , validated_data )
50
-
51
- def get_abilities (self , instance ) -> dict :
52
- """Return abilities of the logged-in user on the instance."""
53
- request = self .context .get ("request" )
54
- if request :
55
- return instance .get_abilities (request .user )
56
- return {}
57
-
58
- def validate (self , attrs ):
59
- """
60
- Check access rights specific to writing (create/update)
61
- """
62
- request = self .context .get ("request" )
63
- user = getattr (request , "user" , None )
64
- role = attrs .get ("role" )
65
-
66
- # Update
67
- if self .instance :
68
- can_set_role_to = self .instance .get_abilities (user )["set_role_to" ]
69
- if role and role not in can_set_role_to :
70
- message = (
71
- f"You are only allowed to set role to { ', ' .join (can_set_role_to )} "
72
- if can_set_role_to
73
- else "You are not allowed to set this role for this template."
74
- )
75
- raise exceptions .PermissionDenied (message )
76
-
77
- # Create
78
- else :
79
- try :
80
- resource_id = self .context ["resource_id" ]
81
- except KeyError as exc :
82
- raise exceptions .ValidationError (
83
- "You must set a resource ID in kwargs to create a new access."
84
- ) from exc
85
-
86
- if not self .Meta .model .objects .filter ( # pylint: disable=no-member
87
- Q (user = user ) | Q (team__in = user .teams ),
88
- role__in = choices .PRIVILEGED_ROLES ,
89
- ** {self .Meta .resource_field_name : resource_id }, # pylint: disable=no-member
90
- ).exists ():
91
- raise exceptions .PermissionDenied (
92
- "You are not allowed to manage accesses for this resource."
93
- )
94
-
95
- if (
96
- role == models .RoleChoices .OWNER
97
- and not self .Meta .model .objects .filter ( # pylint: disable=no-member
98
- Q (user = user ) | Q (team__in = user .teams ),
99
- role = models .RoleChoices .OWNER ,
100
- ** {self .Meta .resource_field_name : resource_id }, # pylint: disable=no-member
101
- ).exists ()
102
- ):
103
- raise exceptions .PermissionDenied (
104
- "Only owners of a resource can assign other users as owners."
105
- )
106
-
107
- # pylint: disable=no-member
108
- attrs [f"{ self .Meta .resource_field_name } _id" ] = self .context ["resource_id" ]
109
- return attrs
110
-
111
-
112
- class DocumentAccessSerializer (BaseAccessSerializer ):
41
+ class DocumentAccessSerializer (serializers .ModelSerializer ):
113
42
"""Serialize document accesses."""
114
43
115
44
document_id = serializers .PrimaryKeyRelatedField (
@@ -124,6 +53,7 @@ class DocumentAccessSerializer(BaseAccessSerializer):
124
53
allow_null = True ,
125
54
)
126
55
user = UserSerializer (read_only = True )
56
+ abilities = serializers .SerializerMethodField (read_only = True )
127
57
max_ancestors_role = serializers .SerializerMethodField (read_only = True )
128
58
129
59
class Meta :
@@ -141,10 +71,22 @@ class Meta:
141
71
]
142
72
read_only_fields = ["id" , "document_id" , "abilities" , "max_ancestors_role" ]
143
73
74
+ def get_abilities (self , instance ) -> dict :
75
+ """Return abilities of the logged-in user on the instance."""
76
+ request = self .context .get ("request" )
77
+ if request :
78
+ return instance .get_abilities (request .user )
79
+ return {}
80
+
144
81
def get_max_ancestors_role (self , instance ):
145
82
"""Return max_ancestors_role if annotated; else None."""
146
83
return getattr (instance , "max_ancestors_role" , None )
147
84
85
+ def update (self , instance , validated_data ):
86
+ """Make "user" field is readonly but only on update."""
87
+ validated_data .pop ("user" , None )
88
+ return super ().update (instance , validated_data )
89
+
148
90
149
91
class DocumentAccessLightSerializer (DocumentAccessSerializer ):
150
92
"""Serialize document accesses with limited fields."""
@@ -173,15 +115,29 @@ class Meta:
173
115
]
174
116
175
117
176
- class TemplateAccessSerializer (BaseAccessSerializer ):
118
+ class TemplateAccessSerializer (serializers . ModelSerializer ):
177
119
"""Serialize template accesses."""
178
120
121
+ abilities = serializers .SerializerMethodField (read_only = True )
122
+
179
123
class Meta :
180
124
model = models .TemplateAccess
181
125
resource_field_name = "template"
182
126
fields = ["id" , "user" , "team" , "role" , "abilities" ]
183
127
read_only_fields = ["id" , "abilities" ]
184
128
129
+ def get_abilities (self , instance ) -> dict :
130
+ """Return abilities of the logged-in user on the instance."""
131
+ request = self .context .get ("request" )
132
+ if request :
133
+ return instance .get_abilities (request .user )
134
+ return {}
135
+
136
+ def update (self , instance , validated_data ):
137
+ """Make "user" field is readonly but only on update."""
138
+ validated_data .pop ("user" , None )
139
+ return super ().update (instance , validated_data )
140
+
185
141
186
142
class ListDocumentSerializer (serializers .ModelSerializer ):
187
143
"""Serialize documents with limited fields for display in lists."""
0 commit comments