django-spire 0.16.6__py3-none-any.whl → 0.16.7__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- django_spire/consts.py +1 -1
- django_spire/knowledge/collection/querysets.py +24 -1
- django_spire/knowledge/collection/services/transformation_service.py +2 -10
- django_spire/knowledge/collection/views/form_views.py +7 -1
- django_spire/knowledge/entry/views/json_views.py +1 -1
- {django_spire-0.16.6.dist-info → django_spire-0.16.7.dist-info}/METADATA +2 -2
- {django_spire-0.16.6.dist-info → django_spire-0.16.7.dist-info}/RECORD +10 -10
- {django_spire-0.16.6.dist-info → django_spire-0.16.7.dist-info}/WHEEL +0 -0
- {django_spire-0.16.6.dist-info → django_spire-0.16.7.dist-info}/licenses/LICENSE.md +0 -0
- {django_spire-0.16.6.dist-info → django_spire-0.16.7.dist-info}/top_level.txt +0 -0
django_spire/consts.py
CHANGED
|
@@ -2,8 +2,10 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import TYPE_CHECKING
|
|
4
4
|
|
|
5
|
+
from django.core.handlers.wsgi import WSGIRequest
|
|
5
6
|
from django.db.models import Count, Q
|
|
6
7
|
|
|
8
|
+
from django_spire.auth.controller.controller import AppAuthController
|
|
7
9
|
from django_spire.contrib.ordering.querysets import OrderingQuerySetMixin
|
|
8
10
|
from django_spire.history.querysets import HistoryQuerySet
|
|
9
11
|
|
|
@@ -26,10 +28,31 @@ class CollectionQuerySet(HistoryQuerySet, OrderingQuerySetMixin):
|
|
|
26
28
|
def childless(self) -> QuerySet[Collection]:
|
|
27
29
|
return self.annotate(child_count=Count('child')).filter(child_count=0)
|
|
28
30
|
|
|
31
|
+
def exclude_children(self, collection: Collection) -> QuerySet[Collection]:
|
|
32
|
+
descendant_ids = set()
|
|
33
|
+
current_level_ids = [collection.id]
|
|
34
|
+
|
|
35
|
+
while current_level_ids:
|
|
36
|
+
children = self.filter(parent_id__in=current_level_ids)
|
|
37
|
+
child_ids = list(children.values_list('id', flat=True))
|
|
38
|
+
|
|
39
|
+
if not child_ids:
|
|
40
|
+
break
|
|
41
|
+
|
|
42
|
+
descendant_ids.update(child_ids)
|
|
43
|
+
current_level_ids = child_ids
|
|
44
|
+
|
|
45
|
+
return self.exclude(id__in=descendant_ids)
|
|
46
|
+
|
|
29
47
|
def parentless(self) -> QuerySet[Collection]:
|
|
30
48
|
return self.filter(parent_id__isnull=True)
|
|
31
49
|
|
|
32
|
-
def
|
|
50
|
+
def request_user_has_access(self, request: WSGIRequest) -> QuerySet[Collection]:
|
|
51
|
+
user = request.user
|
|
52
|
+
|
|
53
|
+
if user.is_superuser or AppAuthController('knowledge', request).can_access_all_collections():
|
|
54
|
+
return self.all()
|
|
55
|
+
|
|
33
56
|
direct_access = self.filter(group__auth_group__user=user)
|
|
34
57
|
accessible_ids = set(direct_access.values_list('id', flat=True))
|
|
35
58
|
|
|
@@ -7,7 +7,6 @@ from django.contrib.sites.models import Site
|
|
|
7
7
|
from django.db.models import Prefetch
|
|
8
8
|
from django.urls import reverse
|
|
9
9
|
|
|
10
|
-
from django_spire.auth.controller.controller import AppAuthController
|
|
11
10
|
from django_spire.contrib.service import BaseDjangoModelService
|
|
12
11
|
|
|
13
12
|
from typing import TYPE_CHECKING
|
|
@@ -21,27 +20,20 @@ class CollectionTransformationService(BaseDjangoModelService['Collection']):
|
|
|
21
20
|
obj: Collection
|
|
22
21
|
|
|
23
22
|
def to_hierarchy_json(self, request: WSGIRequest) -> str:
|
|
24
|
-
user = request.user
|
|
25
|
-
|
|
26
23
|
collections = (
|
|
27
24
|
self.obj_class.objects
|
|
28
25
|
.active()
|
|
26
|
+
.request_user_has_access(request)
|
|
29
27
|
.select_related('parent')
|
|
30
28
|
)
|
|
31
29
|
|
|
32
|
-
if not (
|
|
33
|
-
user.is_superuser or
|
|
34
|
-
AppAuthController('knowledge', request).can_access_all_collections()
|
|
35
|
-
):
|
|
36
|
-
collections = collections.user_has_access(user=user)
|
|
37
|
-
|
|
38
30
|
entry_queryset = (
|
|
39
31
|
collections.model._meta.fields_map.get('entry')
|
|
40
32
|
.related_model
|
|
41
33
|
.objects
|
|
42
34
|
.active()
|
|
43
35
|
.has_current_version()
|
|
44
|
-
.user_has_access(user=user)
|
|
36
|
+
.user_has_access(user=request.user)
|
|
45
37
|
.select_related('current_version__author')
|
|
46
38
|
.order_by('order')
|
|
47
39
|
)
|
|
@@ -31,7 +31,13 @@ def form_view(
|
|
|
31
31
|
dg.glue_query_set(
|
|
32
32
|
request,
|
|
33
33
|
unique_name='collections',
|
|
34
|
-
target=
|
|
34
|
+
target=(
|
|
35
|
+
Collection.objects
|
|
36
|
+
.active()
|
|
37
|
+
.request_user_has_access(request)
|
|
38
|
+
.exclude(pk=collection.pk)
|
|
39
|
+
.exclude_children(collection=collection)
|
|
40
|
+
),
|
|
35
41
|
fields=['name']
|
|
36
42
|
)
|
|
37
43
|
dg.glue_query_set(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-spire
|
|
3
|
-
Version: 0.16.
|
|
3
|
+
Version: 0.16.7
|
|
4
4
|
Summary: A project for Django Spire
|
|
5
5
|
Author-email: Brayden Carlson <braydenc@stratusadv.com>, Nathan Johnson <nathanj@stratusadv.com>
|
|
6
6
|
License: Copyright (c) 2024 Stratus Advanced Technologies and Contributors.
|
|
@@ -46,7 +46,7 @@ Requires-Python: >=3.11
|
|
|
46
46
|
Description-Content-Type: text/markdown
|
|
47
47
|
License-File: LICENSE.md
|
|
48
48
|
Requires-Dist: crispy-bootstrap5==2024.10
|
|
49
|
-
Requires-Dist: dandy
|
|
49
|
+
Requires-Dist: dandy==0.20.0
|
|
50
50
|
Requires-Dist: django>=5.1.8
|
|
51
51
|
Requires-Dist: django-crispy-forms==2.3
|
|
52
52
|
Requires-Dist: django-glue>=0.8.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
django_spire/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
2
|
django_spire/conf.py,sha256=EYC1hXqYqheYrb_b6Q93LrSgNl91JV633E4N5j-KGTo,1012
|
|
3
|
-
django_spire/consts.py,sha256=
|
|
3
|
+
django_spire/consts.py,sha256=03xGzuHfxFzwqmJw9psV6y5rGeae223LllbKCunKROI,390
|
|
4
4
|
django_spire/exceptions.py,sha256=L5ndRO5ftMmh0pHkO2z_NG3LSGZviJ-dDHNT73SzTNw,48
|
|
5
5
|
django_spire/settings.py,sha256=NBDa_kZozESTz2UfHgy2PzhBqj54eIrjZsUsWqDgI0g,735
|
|
6
6
|
django_spire/urls.py,sha256=mKeZszb5U4iIGqddMb5Tt5fRC72U2wABEOi6mvOfEBU,656
|
|
@@ -716,7 +716,7 @@ django_spire/knowledge/collection/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeR
|
|
|
716
716
|
django_spire/knowledge/collection/admin.py,sha256=7Ykw1zDBzMuoO4OfyszsOXWmVvtof4ooXseplTmqa-E,677
|
|
717
717
|
django_spire/knowledge/collection/forms.py,sha256=4zMzdonUjYEK7GW-3m0DDimG19zm9ji89j0FVFIg6W0,202
|
|
718
718
|
django_spire/knowledge/collection/models.py,sha256=eArUPJu9bnFMixnfogQiA-TSbnz2NGoaJbmR4tJU3Mw,1625
|
|
719
|
-
django_spire/knowledge/collection/querysets.py,sha256=
|
|
719
|
+
django_spire/knowledge/collection/querysets.py,sha256=EJM-LqOeFmaPZQkTcHAYp4qu1nuEXu36BH0-cJ339II,2532
|
|
720
720
|
django_spire/knowledge/collection/seeding/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
721
721
|
django_spire/knowledge/collection/seeding/seed.py,sha256=DVTYx8gt4zQQ1UpeOfMq5G1PWGdeENaw-XdA7DtjRUg,267
|
|
722
722
|
django_spire/knowledge/collection/seeding/seeder.py,sha256=l8qDxIPYMlc8hntpVtb3BpvlPXr3XLemxOdnl8B16fo,1531
|
|
@@ -725,7 +725,7 @@ django_spire/knowledge/collection/services/factory_service.py,sha256=92DLZODSRPF
|
|
|
725
725
|
django_spire/knowledge/collection/services/ordering_service.py,sha256=vTkSdt1lVT4VxSK3GhZibj8FPDDy5butwPkVzqmm07g,1243
|
|
726
726
|
django_spire/knowledge/collection/services/processor_service.py,sha256=3ArKBndoL3HEvH_1EBqfiw7AnbFYZ0WmBgcPV8BHdLQ,911
|
|
727
727
|
django_spire/knowledge/collection/services/service.py,sha256=Vg9ZPWlCxZ_43fkudvBUBZfd7L7A8_vKlBA9dIHUNas,1709
|
|
728
|
-
django_spire/knowledge/collection/services/transformation_service.py,sha256=
|
|
728
|
+
django_spire/knowledge/collection/services/transformation_service.py,sha256=AZVKA7RCFkoT3Iey0PmeZPZEb3Q6GUJTEG1MVPhFlLg,3387
|
|
729
729
|
django_spire/knowledge/collection/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
730
730
|
django_spire/knowledge/collection/tests/factories.py,sha256=rQfLX9kz72X-ne6i_IDWXoQMlAnyrxrReuOFM01bC2Q,393
|
|
731
731
|
django_spire/knowledge/collection/tests/test_services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -739,7 +739,7 @@ django_spire/knowledge/collection/urls/form_urls.py,sha256=zOAbLQXw-POh9F7lzxAFW
|
|
|
739
739
|
django_spire/knowledge/collection/urls/json_urls.py,sha256=XZp5wt8m9x38Uuy1dhegqZ4qlJLZK2EgJsLltx97o0Q,195
|
|
740
740
|
django_spire/knowledge/collection/urls/page_urls.py,sha256=zvcqS6zE_OZd_Ah1nMIIbMOzYkIYJ-BQbCMXijeDj7E,324
|
|
741
741
|
django_spire/knowledge/collection/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
742
|
-
django_spire/knowledge/collection/views/form_views.py,sha256=
|
|
742
|
+
django_spire/knowledge/collection/views/form_views.py,sha256=QA-z-iDhtJTAQlPxrQP6KdQl-M8W01NG2TK_EwEo4d8,2605
|
|
743
743
|
django_spire/knowledge/collection/views/json_views.py,sha256=JvTciCngT_dc_7JlTlAcc1zD5aaFelqLL67kc0e6JmU,994
|
|
744
744
|
django_spire/knowledge/collection/views/page_views.py,sha256=Vbi87b0xSCrXQULAReK2SY-8HVvDT7Y83zAM6nVYwNM,2566
|
|
745
745
|
django_spire/knowledge/entry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -836,7 +836,7 @@ django_spire/knowledge/entry/version/views/page_views.py,sha256=QtwI2CM0dcSkKApX
|
|
|
836
836
|
django_spire/knowledge/entry/version/views/redirect_views.py,sha256=VCtgwXIzzpYx7vufDQB4G04cDoX_ceH_KL-yZ7WxGSg,718
|
|
837
837
|
django_spire/knowledge/entry/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
838
838
|
django_spire/knowledge/entry/views/form_views.py,sha256=X0S8tQsONjuK46Y4F-a0blB1KydoJ34q8kIzJdQxmo8,4461
|
|
839
|
-
django_spire/knowledge/entry/views/json_views.py,sha256
|
|
839
|
+
django_spire/knowledge/entry/views/json_views.py,sha256=-9Ug9cBbIsAZa7RStGErNfg_ANiyYiBnwyjRoTIS30s,1769
|
|
840
840
|
django_spire/knowledge/entry/views/page_views.py,sha256=fsS4G58o1ZsFG2JlGgjUYhWAMY22C3FjmWCXh5JFZXs,914
|
|
841
841
|
django_spire/knowledge/entry/views/template_views.py,sha256=U3pqndOpPQlC2zJBKcOIM4IUXK870FH_Wpna5imIkm0,1782
|
|
842
842
|
django_spire/knowledge/intelligence/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -1040,8 +1040,8 @@ django_spire/theme/urls/page_urls.py,sha256=S8nkKkgbhG3XHI3uMUL-piOjXIrRkuY2UlM_
|
|
|
1040
1040
|
django_spire/theme/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1041
1041
|
django_spire/theme/views/json_views.py,sha256=W1khC2K_EMbEzAFmMxC_P76_MFnkRH4-eVdodrRfAhw,1904
|
|
1042
1042
|
django_spire/theme/views/page_views.py,sha256=pHr8iekjtR99xs7w1taj35HEo133Svq1dvDD0y0VL1c,3933
|
|
1043
|
-
django_spire-0.16.
|
|
1044
|
-
django_spire-0.16.
|
|
1045
|
-
django_spire-0.16.
|
|
1046
|
-
django_spire-0.16.
|
|
1047
|
-
django_spire-0.16.
|
|
1043
|
+
django_spire-0.16.7.dist-info/licenses/LICENSE.md,sha256=tlTbOtgKoy-xAQpUk9gPeh9O4oRXCOzoWdW3jJz0wnA,1091
|
|
1044
|
+
django_spire-0.16.7.dist-info/METADATA,sha256=8Ayxzp8tKoMl85LD1o2-_PRhiPowfXKmUXghi5z-0dA,4762
|
|
1045
|
+
django_spire-0.16.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
1046
|
+
django_spire-0.16.7.dist-info/top_level.txt,sha256=xf3QV1e--ONkVpgMDQE9iqjQ1Vg4--_6C8wmO-KxPHQ,13
|
|
1047
|
+
django_spire-0.16.7.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|