@@ -40,11 +40,14 @@ def consequence_handler_from_slug(slug):
4040
4141def editable_consequences (user ):
4242 handlers = list (installed_consequence_handlers ())
43- # qs = LocalConsequence.objects.all().select_related("user")
44- # for handler in handlers:
45- # qs = handler.filter_queryset(qs, user)
46- qs = AbstractConsequence .objects .all ()
47- return qs .filter (slug__in = map (operator .attrgetter ("slug" ), handlers )).distinct ()
43+ consequence_classes = AbstractConsequence .__subclasses__ ()
44+
45+ qs = AbstractConsequence .objects .filter (slug__in = map (operator .attrgetter ("slug" ), handlers )).distinct ()
46+ q_obj = Q ()
47+ for handler in handlers :
48+ for ConcreteConsequence in consequence_classes :
49+ q_obj = q_obj | ConcreteConsequence .filter_editable_by_user (handler , user )
50+ return qs .filter (q_obj )
4851
4952
5053def pending_consequences (user ):
@@ -81,10 +84,9 @@ def render(cls, consequence):
8184 raise NotImplementedError
8285
8386 @classmethod
84- def filter_queryset (cls , qs , user : UserProfile ):
87+ def filter_editable_by_user (cls , user : UserProfile ) -> Q :
8588 """
86- Return a filtered that excludes consequences with the slug of this class that the user is not allowed to edit.
87- Consequences should also be annotated with values needed for rendering.
89+ Return a Q object that include consequences with the slug of this class that the user is allowed to edit.
8890 """
8991 raise NotImplementedError
9092
@@ -126,15 +128,12 @@ def render(cls, consequence):
126128 )
127129
128130 @classmethod
129- def filter_queryset (cls , qs , user : UserProfile ):
130- return qs .filter (
131- ~ Q (slug = cls .slug )
132- | Q (
133- user__groups__in = get_objects_for_user (
131+ def filter_editable_by_user (cls , user : UserProfile ):
132+ return Q (slug = cls .slug ,
133+ localconsequence__user__groups__in = get_objects_for_user (
134134 user , "decide_workinghours_for_group" , klass = Group
135135 )
136136 )
137- )
138137
139138
140139class QualificationConsequenceHandler (BaseConsequenceHandler ):
@@ -215,25 +214,14 @@ def render(cls, consequence):
215214 return s
216215
217216 @classmethod
218- def filter_queryset (cls , qs , user : UserProfile ):
219- qs = qs .annotate (
220- qualification_id = Cast (KeyTransform ("qualification_id" , "data" ), IntegerField ()),
221- event_id = Cast (KeyTransform ("event_id" , "data" ), IntegerField ()),
222- ).annotate (
223- qualification_title = Subquery (
224- Qualification .objects .filter (id = OuterRef ("qualification_id" )).values ("title" )[:1 ]
225- ),
226- event_title = Subquery (Event .objects .filter (id = OuterRef ("event_id" )).values ("title" )[:1 ]),
227- )
228-
229- return qs .filter (
230- ~ Q (slug = cls .slug )
217+ def filter_editable_by_user (cls , user : UserProfile ):
218+ return Q (slug = cls .slug ) & Q (
231219 # Qualifications can be granted by people who...
232- | Q ( # are responsible for the event the consequence originated from, if applicable
233- event_id__in = get_objects_for_user (user , perms = "change_event" , klass = Event ),
220+ Q ( # are responsible for the event the consequence originated from, if applicable
221+ data__event_id__in = get_objects_for_user (user , perms = "change_event" , klass = Event ),
234222 )
235223 | Q ( # can edit the affected user anyway
236- user__in = get_objects_for_user (
224+ localconsequence__user__in = get_objects_for_user (
237225 user , perms = "change_userprofile" , klass = get_user_model ()
238226 )
239227 )
0 commit comments