@@ -18,30 +18,7 @@ class AlbumManager(models.Manager): # type: ignore[type-arg]
1818
1919 def get_queryset (self ): # type: ignore[no-untyped-def] # noqa: ANN201
2020 """Annotations and prefetches for the Album model."""
21- qs = super ().get_queryset ()
22-
23- # queries to count past, present, and future memberships of each album
24- active_memberships = Count ("memberships" , filter = Q (memberships__period__contains = timezone .now ()), distinct = True )
25- historic_memberships = Count ("memberships" , filter = Q (memberships__period__endswith__lt = timezone .now ()))
26- future_memberships = Count ("memberships" , filter = Q (memberships__period__startswith__gt = timezone .now ()))
27-
28- return (
29- qs .annotate (
30- active_memberships = active_memberships ,
31- historic_memberships = historic_memberships ,
32- future_memberships = future_memberships ,
33- )
34- .select_related ("owner" )
35- .prefetch_related ("user_permissions__user" )
36- .prefetch_related ("user_permissions__permission" )
37- .prefetch_related ("group_permissions__group" )
38- .prefetch_related ("group_permissions__permission" )
39- .prefetch_related ("hits" )
40- .annotate (hitcount = Count ("hits" , distinct = True ))
41- .prefetch_active_files_list (recursive = True )
42- # ordering from Album META gets lost for some reason :(
43- ).order_by ("created_at" )
44-
21+ return super ().get_queryset ()
4522
4623class AlbumQuerySet (models .QuerySet ): # type: ignore[type-arg]
4724 """Custom queryset for album operations."""
@@ -76,3 +53,30 @@ def prefetch_active_files_list(self, *, recursive: bool = True) -> models.QueryS
7653 to_attr = "active_files_list" ,
7754 ),
7855 )
56+
57+ def prefetch_user_permissions (self ) -> models .QuerySet ["Album" ]:
58+ """Prefetch user permissions."""
59+ return self .prefetch_related ("user_permissions__user" ).prefetch_related ("user_permissions__permission" )
60+
61+ def prefetch_group_permissions (self ) -> models .QuerySet ["Album" ]:
62+ """Prefetch group permissions."""
63+ return self .prefetch_related ("group_permissions__group" ).prefetch_related ("group_permissions__permission" )
64+
65+ def annotate_hitcount (self ) -> models .QuerySet ["Album" ]:
66+ """Annotate hitcounts for the qs."""
67+ return self .annotate (hitcount = Count ("hits" , distinct = True ))
68+
69+ def annotate_memberships (self ) -> models .QuerySet ["Album" ]:
70+ """Annotate membership counts."""
71+ active_memberships = Count ("memberships" , filter = Q (memberships__period__contains = timezone .now ()), distinct = True )
72+ historic_memberships = Count ("memberships" , filter = Q (memberships__period__endswith__lt = timezone .now ()))
73+ future_memberships = Count ("memberships" , filter = Q (memberships__period__startswith__gt = timezone .now ()))
74+ return self .annotate (
75+ active_memberships = active_memberships ,
76+ historic_memberships = historic_memberships ,
77+ future_memberships = future_memberships ,
78+ )
79+
80+ def select_owner (self ) -> models .QuerySet ["Album" ]:
81+ """Get owner with select_related()."""
82+ return self .select_related ("owner" )
0 commit comments