@@ -400,44 +400,6 @@ class DocumentViewSet(
400
400
trashbin_serializer_class = serializers .ListDocumentSerializer
401
401
tree_serializer_class = serializers .ListDocumentSerializer
402
402
403
- def annotate_is_favorite (self , queryset ):
404
- """
405
- Annotate document queryset with the favorite status for the current user.
406
- """
407
- user = self .request .user
408
-
409
- if user .is_authenticated :
410
- favorite_exists_subquery = models .DocumentFavorite .objects .filter (
411
- document_id = db .OuterRef ("pk" ), user = user
412
- )
413
- return queryset .annotate (is_favorite = db .Exists (favorite_exists_subquery ))
414
-
415
- return queryset .annotate (is_favorite = db .Value (False ))
416
-
417
- def annotate_user_roles (self , queryset ):
418
- """
419
- Annotate document queryset with the roles of the current user
420
- on the document or its ancestors.
421
- """
422
- user = self .request .user
423
- output_field = ArrayField (base_field = db .CharField ())
424
-
425
- if user .is_authenticated :
426
- user_roles_subquery = models .DocumentAccess .objects .filter (
427
- db .Q (user = user ) | db .Q (team__in = user .teams ),
428
- document__path = Left (db .OuterRef ("path" ), Length ("document__path" )),
429
- ).values_list ("role" , flat = True )
430
-
431
- return queryset .annotate (
432
- user_roles = db .Func (
433
- user_roles_subquery , function = "ARRAY" , output_field = output_field
434
- )
435
- )
436
-
437
- return queryset .annotate (
438
- user_roles = db .Value ([], output_field = output_field ),
439
- )
440
-
441
403
def get_queryset (self ):
442
404
"""Get queryset performing all annotation and filtering on the document tree structure."""
443
405
user = self .request .user
@@ -473,8 +435,9 @@ def get_queryset(self):
473
435
def filter_queryset (self , queryset ):
474
436
"""Override to apply annotations to generic views."""
475
437
queryset = super ().filter_queryset (queryset )
476
- queryset = self .annotate_is_favorite (queryset )
477
- queryset = self .annotate_user_roles (queryset )
438
+ user = self .request .user
439
+ queryset = queryset .annotate_is_favorite (user )
440
+ queryset = queryset .annotate_user_roles (user )
478
441
return queryset
479
442
480
443
def get_response_for_queryset (self , queryset ):
@@ -498,9 +461,10 @@ def list(self, request, *args, **kwargs):
498
461
Additional annotations (e.g., `is_highest_ancestor_for_user`, favorite status) are
499
462
applied before ordering and returning the response.
500
463
"""
501
- queryset = (
502
- self .get_queryset ()
503
- ) # Not calling filter_queryset. We do our own cooking.
464
+ user = self .request .user
465
+
466
+ # Not calling filter_queryset. We do our own cooking.
467
+ queryset = self .get_queryset ()
504
468
505
469
filterset = ListDocumentFilter (
506
470
self .request .GET , queryset = queryset , request = self .request
@@ -513,7 +477,7 @@ def list(self, request, *args, **kwargs):
513
477
for field in ["is_creator_me" , "title" ]:
514
478
queryset = filterset .filters [field ].filter (queryset , filter_data [field ])
515
479
516
- queryset = self .annotate_user_roles (queryset )
480
+ queryset = queryset .annotate_user_roles (user )
517
481
518
482
# Among the results, we may have documents that are ancestors/descendants
519
483
# of each other. In this case we want to keep only the highest ancestors.
@@ -530,7 +494,7 @@ def list(self, request, *args, **kwargs):
530
494
)
531
495
532
496
# Annotate favorite status and filter if applicable as late as possible
533
- queryset = self .annotate_is_favorite (queryset )
497
+ queryset = queryset .annotate_is_favorite (user )
534
498
queryset = filterset .filters ["is_favorite" ].filter (
535
499
queryset , filter_data ["is_favorite" ]
536
500
)
@@ -613,7 +577,7 @@ def trashbin(self, request, *args, **kwargs):
613
577
deleted_at__isnull = False ,
614
578
deleted_at__gte = models .get_trashbin_cutoff (),
615
579
)
616
- queryset = self .annotate_user_roles (queryset )
580
+ queryset = queryset .annotate_user_roles (self . request . user )
617
581
queryset = queryset .filter (user_roles__contains = [models .RoleChoices .OWNER ])
618
582
619
583
return self .get_response_for_queryset (queryset )
@@ -793,6 +757,8 @@ def tree(self, request, pk, *args, **kwargs):
793
757
List ancestors tree above the document.
794
758
What we need to display is the tree structure opened for the current document.
795
759
"""
760
+ user = self .request .user
761
+
796
762
try :
797
763
current_document = self .queryset .only ("depth" , "path" ).get (pk = pk )
798
764
except models .Document .DoesNotExist as excpt :
@@ -847,8 +813,8 @@ def tree(self, request, pk, *args, **kwargs):
847
813
output_field = db .BooleanField (),
848
814
)
849
815
)
850
- queryset = self .annotate_user_roles (queryset )
851
- queryset = self .annotate_is_favorite (queryset )
816
+ queryset = queryset .annotate_user_roles (user )
817
+ queryset = queryset .annotate_is_favorite (user )
852
818
853
819
# Pass ancestors' links definitions to the serializer as a context variable
854
820
# in order to allow saving time while computing abilities on the instance
0 commit comments