@@ -404,44 +404,6 @@ class DocumentViewSet(
404
404
trashbin_serializer_class = serializers .ListDocumentSerializer
405
405
tree_serializer_class = serializers .ListDocumentSerializer
406
406
407
- def annotate_is_favorite (self , queryset ):
408
- """
409
- Annotate document queryset with the favorite status for the current user.
410
- """
411
- user = self .request .user
412
-
413
- if user .is_authenticated :
414
- favorite_exists_subquery = models .DocumentFavorite .objects .filter (
415
- document_id = db .OuterRef ("pk" ), user = user
416
- )
417
- return queryset .annotate (is_favorite = db .Exists (favorite_exists_subquery ))
418
-
419
- return queryset .annotate (is_favorite = db .Value (False ))
420
-
421
- def annotate_user_roles (self , queryset ):
422
- """
423
- Annotate document queryset with the roles of the current user
424
- on the document or its ancestors.
425
- """
426
- user = self .request .user
427
- output_field = ArrayField (base_field = db .CharField ())
428
-
429
- if user .is_authenticated :
430
- user_roles_subquery = models .DocumentAccess .objects .filter (
431
- db .Q (user = user ) | db .Q (team__in = user .teams ),
432
- document__path = Left (db .OuterRef ("path" ), Length ("document__path" )),
433
- ).values_list ("role" , flat = True )
434
-
435
- return queryset .annotate (
436
- user_roles = db .Func (
437
- user_roles_subquery , function = "ARRAY" , output_field = output_field
438
- )
439
- )
440
-
441
- return queryset .annotate (
442
- user_roles = db .Value ([], output_field = output_field ),
443
- )
444
-
445
407
def get_queryset (self ):
446
408
"""Get queryset performing all annotation and filtering on the document tree structure."""
447
409
user = self .request .user
@@ -477,8 +439,9 @@ def get_queryset(self):
477
439
def filter_queryset (self , queryset ):
478
440
"""Override to apply annotations to generic views."""
479
441
queryset = super ().filter_queryset (queryset )
480
- queryset = self .annotate_is_favorite (queryset )
481
- queryset = self .annotate_user_roles (queryset )
442
+ user = self .request .user
443
+ queryset = queryset .annotate_is_favorite (user )
444
+ queryset = queryset .annotate_user_roles (user )
482
445
return queryset
483
446
484
447
def get_response_for_queryset (self , queryset ):
@@ -502,9 +465,10 @@ def list(self, request, *args, **kwargs):
502
465
Additional annotations (e.g., `is_highest_ancestor_for_user`, favorite status) are
503
466
applied before ordering and returning the response.
504
467
"""
505
- queryset = (
506
- self .get_queryset ()
507
- ) # Not calling filter_queryset. We do our own cooking.
468
+ user = self .request .user
469
+
470
+ # Not calling filter_queryset. We do our own cooking.
471
+ queryset = self .get_queryset ()
508
472
509
473
filterset = ListDocumentFilter (
510
474
self .request .GET , queryset = queryset , request = self .request
@@ -517,7 +481,7 @@ def list(self, request, *args, **kwargs):
517
481
for field in ["is_creator_me" , "title" ]:
518
482
queryset = filterset .filters [field ].filter (queryset , filter_data [field ])
519
483
520
- queryset = self .annotate_user_roles (queryset )
484
+ queryset = queryset .annotate_user_roles (user )
521
485
522
486
# Among the results, we may have documents that are ancestors/descendants
523
487
# of each other. In this case we want to keep only the highest ancestors.
@@ -534,7 +498,7 @@ def list(self, request, *args, **kwargs):
534
498
)
535
499
536
500
# Annotate favorite status and filter if applicable as late as possible
537
- queryset = self .annotate_is_favorite (queryset )
501
+ queryset = queryset .annotate_is_favorite (user )
538
502
queryset = filterset .filters ["is_favorite" ].filter (
539
503
queryset , filter_data ["is_favorite" ]
540
504
)
@@ -625,7 +589,7 @@ def trashbin(self, request, *args, **kwargs):
625
589
deleted_at__isnull = False ,
626
590
deleted_at__gte = models .get_trashbin_cutoff (),
627
591
)
628
- queryset = self .annotate_user_roles (queryset )
592
+ queryset = queryset .annotate_user_roles (self . request . user )
629
593
queryset = queryset .filter (user_roles__contains = [models .RoleChoices .OWNER ])
630
594
631
595
return self .get_response_for_queryset (queryset )
@@ -819,6 +783,8 @@ def tree(self, request, pk, *args, **kwargs):
819
783
List ancestors tree above the document.
820
784
What we need to display is the tree structure opened for the current document.
821
785
"""
786
+ user = self .request .user
787
+
822
788
try :
823
789
current_document = self .queryset .only ("depth" , "path" ).get (pk = pk )
824
790
except models .Document .DoesNotExist as excpt :
@@ -873,8 +839,8 @@ def tree(self, request, pk, *args, **kwargs):
873
839
output_field = db .BooleanField (),
874
840
)
875
841
)
876
- queryset = self .annotate_user_roles (queryset )
877
- queryset = self .annotate_is_favorite (queryset )
842
+ queryset = queryset .annotate_user_roles (user )
843
+ queryset = queryset .annotate_is_favorite (user )
878
844
879
845
# Pass ancestors' links definitions to the serializer as a context variable
880
846
# in order to allow saving time while computing abilities on the instance
0 commit comments