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 CHANGED
@@ -1,4 +1,4 @@
1
- __VERSION__ = '0.16.6'
1
+ __VERSION__ = '0.16.7'
2
2
 
3
3
 
4
4
  AI_CHAT_WORKFLOW_SENDER_SETTINGS_NAME = 'AI_CHAT_WORKFLOW_NAME'
@@ -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 user_has_access(self, user: AuthUser) -> QuerySet[Collection]:
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=Collection.objects.active().user_has_access(request.user),
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(
@@ -41,7 +41,7 @@ def reorder_view(request: WSGIRequest) -> JsonResponse:
41
41
  destination_objects=(
42
42
  collection.entries
43
43
  .has_current_version()
44
- .user_has_access(user=request.user)
44
+ .request_user_has_access(user=request.user)
45
45
  .active()
46
46
  ),
47
47
  position=order,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-spire
3
- Version: 0.16.6
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>=0.18.0
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=b-ZLKW2TfJ9usKaHkyvoGYTqBCMCxBJ4TbeFRowbO2Q,390
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=bmLCqlRMkZ_9GOzNUiRanuxTIjiIXeQ8tiXMvXvsk-8,1717
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=dfjl5xm_N1CrAMBShNxMs351plwaN_eTfcWXZHy0cek,3648
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=FoVC9IjD-3nLemw9ai5pIyKFdsBN04mmP1DkDN7d034,2460
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=UqfKcJZ908y2UmKBBF0PoQj1-a6liQBbEt4RD7dwEeI,1761
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.6.dist-info/licenses/LICENSE.md,sha256=tlTbOtgKoy-xAQpUk9gPeh9O4oRXCOzoWdW3jJz0wnA,1091
1044
- django_spire-0.16.6.dist-info/METADATA,sha256=SgNlsugbwqiRdETA-JSmu4l8643rKabhbRLFbuBHpbo,4762
1045
- django_spire-0.16.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1046
- django_spire-0.16.6.dist-info/top_level.txt,sha256=xf3QV1e--ONkVpgMDQE9iqjQ1Vg4--_6C8wmO-KxPHQ,13
1047
- django_spire-0.16.6.dist-info/RECORD,,
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,,