django-fast-treenode 3.0.7__py3-none-any.whl → 3.2.0__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.
Files changed (56) hide show
  1. {django_fast_treenode-3.0.7.dist-info → django_fast_treenode-3.2.0.dist-info}/METADATA +3 -1
  2. django_fast_treenode-3.2.0.dist-info/RECORD +97 -0
  3. treenode/admin/admin.py +109 -131
  4. treenode/admin/mixin.py +6 -6
  5. treenode/managers/managers.py +1 -1
  6. treenode/managers/queries.py +1 -1
  7. treenode/managers/tasks.py +1 -1
  8. treenode/models/mixins/node.py +4 -4
  9. treenode/models/models.py +14 -9
  10. treenode/settings.py +4 -1
  11. treenode/static/treenode/.gitkeep +0 -0
  12. treenode/static/{css → treenode/css}/treenode_admin.css +21 -0
  13. treenode/static/treenode/js/treenode_admin.js +322 -0
  14. treenode/static/treenode/vendors/.gitkeep +0 -0
  15. treenode/static/treenode/vendors/jquery-ui/.gitkeep +0 -0
  16. treenode/templates/treenode/admin/treenode_changelist.html +61 -15
  17. treenode/templates/treenode/admin/treenode_import_export.html +3 -2
  18. treenode/templates/treenode/admin/treenode_rows.html +37 -40
  19. treenode/templatetags/treenode_admin.py +57 -14
  20. treenode/utils/jwt_auth.py +25 -0
  21. treenode/version.py +2 -2
  22. treenode/views/autoapi.py +5 -1
  23. treenode/views/autocomplete.py +52 -52
  24. treenode/views/children.py +41 -41
  25. treenode/views/common.py +23 -23
  26. treenode/widgets.py +2 -2
  27. django_fast_treenode-3.0.7.dist-info/RECORD +0 -93
  28. treenode/static/js/treenode_admin.js +0 -531
  29. {django_fast_treenode-3.0.7.dist-info → django_fast_treenode-3.2.0.dist-info}/WHEEL +0 -0
  30. {django_fast_treenode-3.0.7.dist-info → django_fast_treenode-3.2.0.dist-info}/licenses/LICENSE +0 -0
  31. {django_fast_treenode-3.0.7.dist-info → django_fast_treenode-3.2.0.dist-info}/top_level.txt +0 -0
  32. /treenode/static/{css → treenode/css}/.gitkeep +0 -0
  33. /treenode/static/{css → treenode/css}/tree_widget.css +0 -0
  34. /treenode/static/{css → treenode/css}/treenode_tabs.css +0 -0
  35. /treenode/static/{js → treenode/js}/.gitkeep +0 -0
  36. /treenode/static/{js → treenode/js}/lz-string.min.js +0 -0
  37. /treenode/static/{js → treenode/js}/tree_widget.js +0 -0
  38. /treenode/static/{vendors → treenode/vendors}/jquery-ui/AUTHORS.txt +0 -0
  39. /treenode/static/{vendors → treenode/vendors}/jquery-ui/LICENSE.txt +0 -0
  40. /treenode/static/{vendors → treenode/vendors}/jquery-ui/external/jquery/jquery.js +0 -0
  41. /treenode/static/{vendors → treenode/vendors}/jquery-ui/images/ui-icons_444444_256x240.png +0 -0
  42. /treenode/static/{vendors → treenode/vendors}/jquery-ui/images/ui-icons_555555_256x240.png +0 -0
  43. /treenode/static/{vendors → treenode/vendors}/jquery-ui/images/ui-icons_777620_256x240.png +0 -0
  44. /treenode/static/{vendors → treenode/vendors}/jquery-ui/images/ui-icons_777777_256x240.png +0 -0
  45. /treenode/static/{vendors → treenode/vendors}/jquery-ui/images/ui-icons_cc0000_256x240.png +0 -0
  46. /treenode/static/{vendors → treenode/vendors}/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
  47. /treenode/static/{vendors → treenode/vendors}/jquery-ui/index.html +0 -0
  48. /treenode/static/{vendors → treenode/vendors}/jquery-ui/jquery-ui.css +0 -0
  49. /treenode/static/{vendors → treenode/vendors}/jquery-ui/jquery-ui.js +0 -0
  50. /treenode/static/{vendors → treenode/vendors}/jquery-ui/jquery-ui.min.css +0 -0
  51. /treenode/static/{vendors → treenode/vendors}/jquery-ui/jquery-ui.min.js +0 -0
  52. /treenode/static/{vendors → treenode/vendors}/jquery-ui/jquery-ui.structure.css +0 -0
  53. /treenode/static/{vendors → treenode/vendors}/jquery-ui/jquery-ui.structure.min.css +0 -0
  54. /treenode/static/{vendors → treenode/vendors}/jquery-ui/jquery-ui.theme.css +0 -0
  55. /treenode/static/{vendors → treenode/vendors}/jquery-ui/jquery-ui.theme.min.css +0 -0
  56. /treenode/static/{vendors → treenode/vendors}/jquery-ui/package.json +0 -0
@@ -1,52 +1,52 @@
1
- # -*- coding: utf-8 -*-
2
- """
3
-
4
-
5
- Handles autocomplete suggestions for TreeNode models.
6
-
7
- Version: 3.0.0
8
- Author: Timur Kady
9
- Email: timurkady@yandex.com
10
- """
11
-
12
- # autocomplete.py
13
- from django.http import JsonResponse
14
- from django.views import View
15
- from django.contrib.admin.views.decorators import staff_member_required
16
- from django.utils.decorators import method_decorator
17
-
18
- from .common import get_model_from_request
19
-
20
-
21
- @method_decorator(staff_member_required, name='dispatch')
22
- class TreeNodeAutocompleteView(View):
23
- """Widget Autocomplete View."""
24
-
25
- def get(self, request, *args, **kwargs):
26
- """Get request."""
27
- select_id = request.GET.get("select_id", "").strip()
28
- q = request.GET.get("q", "").strip()
29
-
30
- model = get_model_from_request(request)
31
- results = []
32
-
33
- if q:
34
- field = getattr(model, "display_field", "id")
35
- queryset = model.objects.filter(**{f"{field}__icontains": q})
36
- elif select_id:
37
- pk = int(select_id)
38
- queryset = model.objects.filter(pk=pk)
39
- else:
40
- queryset = model.objects.filter(parent__isnull=True)
41
-
42
- results = [
43
- {
44
- "id": obj.pk,
45
- "text": str(obj),
46
- "level": obj.get_depth(),
47
- "is_leaf": obj.is_leaf(),
48
- }
49
- for obj in queryset[:20]
50
- ]
51
-
52
- return JsonResponse({"results": results})
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+
4
+
5
+ Handles autocomplete suggestions for TreeNode models.
6
+
7
+ Version: 3.0.0
8
+ Author: Timur Kady
9
+ Email: timurkady@yandex.com
10
+ """
11
+
12
+ # autocomplete.py
13
+ from django.http import JsonResponse
14
+ from django.views import View
15
+ from django.contrib.admin.views.decorators import staff_member_required
16
+ from django.utils.decorators import method_decorator
17
+
18
+ from .common import get_model_from_request
19
+
20
+
21
+ @method_decorator(staff_member_required, name='dispatch')
22
+ class TreeNodeAutocompleteView(View):
23
+ """Widget Autocomplete View."""
24
+
25
+ def get(self, request, *args, **kwargs):
26
+ """Get request."""
27
+ select_id = request.GET.get("select_id", "").strip()
28
+ q = request.GET.get("q", "").strip()
29
+
30
+ model = get_model_from_request(request)
31
+ results = []
32
+
33
+ if q:
34
+ field = getattr(model, "display_field", "id")
35
+ queryset = model.objects.filter(**{f"{field}__icontains": q})
36
+ elif select_id:
37
+ pk = int(select_id)
38
+ queryset = model.objects.filter(pk=pk)
39
+ else:
40
+ queryset = model.objects.filter(parent__isnull=True)
41
+
42
+ results = [
43
+ {
44
+ "id": obj.pk,
45
+ "text": str(obj),
46
+ "level": obj.get_depth(),
47
+ "is_leaf": obj.is_leaf(),
48
+ }
49
+ for obj in queryset[:20]
50
+ ]
51
+
52
+ return JsonResponse({"results": results})
@@ -1,41 +1,41 @@
1
- # -*- coding: utf-8 -*-
2
- """
3
-
4
- Version: 3.0.0
5
- Author: Timur Kady
6
- Email: timurkady@yandex.com
7
- """
8
-
9
- from django.http import JsonResponse
10
- from django.views import View
11
- from django.contrib.admin.views.decorators import staff_member_required
12
- from django.utils.decorators import method_decorator
13
-
14
- from .common import get_model_from_request
15
-
16
-
17
- @method_decorator(staff_member_required, name='dispatch')
18
- class TreeChildrenView(View):
19
- def get(self, request, *args, **kwargs):
20
- model = get_model_from_request(request)
21
- reference_id = request.GET.get("reference_id")
22
- if not reference_id:
23
- return JsonResponse({"results": []})
24
-
25
- obj = model.objects.filter(pk=reference_id).first()
26
- if not obj or obj.is_leaf():
27
- return JsonResponse({"results": []})
28
-
29
- results = [
30
- {
31
- "id": node.pk,
32
- "text": str(node),
33
- "level": node.get_depth(),
34
- "is_leaf": node.is_leaf(),
35
- }
36
- for node in obj.get_children()
37
- ]
38
- return JsonResponse({"results": results})
39
-
40
-
41
- # The End
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+
4
+ Version: 3.0.0
5
+ Author: Timur Kady
6
+ Email: timurkady@yandex.com
7
+ """
8
+
9
+ from django.http import JsonResponse
10
+ from django.views import View
11
+ from django.contrib.admin.views.decorators import staff_member_required
12
+ from django.utils.decorators import method_decorator
13
+
14
+ from .common import get_model_from_request
15
+
16
+
17
+ @method_decorator(staff_member_required, name='dispatch')
18
+ class TreeChildrenView(View):
19
+ def get(self, request, *args, **kwargs):
20
+ model = get_model_from_request(request)
21
+ reference_id = request.GET.get("reference_id")
22
+ if not reference_id:
23
+ return JsonResponse({"results": []})
24
+
25
+ obj = model.objects.filter(pk=reference_id).first()
26
+ if not obj or obj.is_leaf():
27
+ return JsonResponse({"results": []})
28
+
29
+ results = [
30
+ {
31
+ "id": node.pk,
32
+ "text": str(node),
33
+ "level": node.get_depth(),
34
+ "is_leaf": node.is_leaf(),
35
+ }
36
+ for node in obj.get_children()
37
+ ]
38
+ return JsonResponse({"results": results})
39
+
40
+
41
+ # The End
treenode/views/common.py CHANGED
@@ -1,23 +1,23 @@
1
- # -*- coding: utf-8 -*-
2
- """
3
- Created on Thu Apr 10 19:50:23 2025
4
-
5
- Version: 3.0.0
6
- Author: Timur Kady
7
- Email: timurkady@yandex.com
8
- """
9
-
10
- from django.apps import apps
11
- from django.http import Http404
12
-
13
-
14
- def get_model_from_request(request):
15
- """Get model from request."""
16
- model_label = request.GET.get("model")
17
- if not model_label:
18
- raise Http404("Missing 'model' parameter.")
19
- try:
20
- app_label, model_name = model_label.lower().split(".")
21
- return apps.get_model(app_label, model_name)
22
- except Exception:
23
- raise Http404(f"Invalid model format: {model_label}")
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Created on Thu Apr 10 19:50:23 2025
4
+
5
+ Version: 3.0.0
6
+ Author: Timur Kady
7
+ Email: timurkady@yandex.com
8
+ """
9
+
10
+ from django.apps import apps
11
+ from django.http import Http404
12
+
13
+
14
+ def get_model_from_request(request):
15
+ """Get model from request."""
16
+ model_label = request.GET.get("model")
17
+ if not model_label:
18
+ raise Http404("Missing 'model' parameter.")
19
+ try:
20
+ app_label, model_name = model_label.lower().split(".")
21
+ return apps.get_model(app_label, model_name)
22
+ except Exception:
23
+ raise Http404(f"Invalid model format: {model_label}")
treenode/widgets.py CHANGED
@@ -24,8 +24,8 @@ class TreeWidget(forms.Widget):
24
24
  class Media:
25
25
  """Meta class to define required CSS and JS files."""
26
26
 
27
- css = {"all": ("css/tree_widget.css",)}
28
- js = ("js/tree_widget.js",)
27
+ css = {"all": ("treenode/css/tree_widget.css",)}
28
+ js = ("treenode/js/tree_widget.js",)
29
29
 
30
30
  def build_attrs(self, base_attrs, extra_attrs=None):
31
31
  """Build attributes for the widget."""
@@ -1,93 +0,0 @@
1
- django_fast_treenode-3.0.7.dist-info/licenses/LICENSE,sha256=SSYqS84FCnAW7tAxmjBKU8qAa8Jv4VGPuSSGeHwWtJE,1095
2
- treenode/__init__.py,sha256=3z1hWpHyy4wg6uz7HCmRi9FaXYeN5CfANVpa77UIoPw,53
3
- treenode/apps.py,sha256=QlwjNDM9rkUoWB8Vm8-OkS6lNx0-aTByuGZlu9wrQMs,1832
4
- treenode/cache.py,sha256=2jUiiecfFxwB7QFukpU4u0FnDzGH6hNRfo6KAYvs6vM,8447
5
- treenode/forms.py,sha256=V-upmbYSW1BbuXdSBGExHxw_j5TTUheaHvreK9tSGTE,3155
6
- treenode/settings.py,sha256=oSkcKXNVd28HXrlWZIH2VYinCMq-UdCDlX4KD0Qc_Xk,631
7
- treenode/signals.py,sha256=ERrlKjGqhYaPYVKKRk1JBBlPFOmJKpJ6bXsJavcTlo0,518
8
- treenode/tests.py,sha256=2uDafv3Ns6f7Vy1ekUtgYxCZEi1KRyesZDTAFhYcX-E,63
9
- treenode/urls.py,sha256=krHvVigc_dxC0z5hEd2rgeH6th8jW7qJY3Qbia-419Y,240
10
- treenode/version.py,sha256=-I7mgQs7Zf31bXpDTd5OymDS52Y_ye4ZPw9yQjKTS9E,220
11
- treenode/widgets.py,sha256=VItPvN9XgaSRI_MZjKEmtaHDJcn2bDIQIppwKjXmYQM,4017
12
- treenode/admin/__init__.py,sha256=XNEYHdF5lKb0vpdlVxdR2fxj5oUgzyx1YyCwsv0gxHw,100
13
- treenode/admin/admin.py,sha256=2-74ESGEZ7s6wfPzep6OQlz1uD_80WFExemtwbQiD3M,8289
14
- treenode/admin/changelist.py,sha256=KUYS9MaR8Ck_1xmMqupobxWKarrJEqmHuEG32CL01Bo,1662
15
- treenode/admin/exporter.py,sha256=QE74V6W3tvwA5kCvBt1MmVlLOaWh-o8EU63cgmiwD5Q,5724
16
- treenode/admin/importer.py,sha256=hK3D-1DZcoowGblRluGzng3n5Bf__hMsbNaIGXRpRdg,6263
17
- treenode/admin/mixin.py,sha256=jOkKKt0CpknGokluW8T1YB7VhkCkaAAMYBuptbYDXAw,10648
18
- treenode/managers/__init__.py,sha256=c7F9Ku9489Hv6lTpUY2nbyBlWFCXBWAkNBm4xTKcjL8,186
19
- treenode/managers/managers.py,sha256=8OaFxtajyR1d7-UHyiUbifMBEF9cjfHTIEYPkYUWmt0,7166
20
- treenode/managers/queries.py,sha256=pmZ07QZQbTTJN0ur6-pQGua2vGXVCVisylL1LWNXMmo,10655
21
- treenode/managers/tasks.py,sha256=b8deUAbCpD1Yov-PpjKNAx49rL4fejkGf64ih5JziF0,7138
22
- treenode/models/__init__.py,sha256=iR4ksCKoayvkIWWgGk6OUGHZC3D0mzAtgdBcS2vQPBw,188
23
- treenode/models/decorators.py,sha256=N2dcnWqSCiEXDcYCf0zVijrbGUC8kYlqOLi_GKFmECU,1457
24
- treenode/models/factory.py,sha256=sPUSrvo1za-r6ny3B8ptwevyjO8-iUpPNrT0eSD2kvI,1786
25
- treenode/models/models.py,sha256=n_2nCJzBOEcmh3r-GCoHV3ZiTX8Xe1ewK9SPptvI_M0,12273
26
- treenode/models/mixins/__init__.py,sha256=aALVKMGAWbgMAeKWS6s-NF3L5FmRX96mQxtpthOX-Ec,805
27
- treenode/models/mixins/ancestors.py,sha256=9g-0nPHoiF_SX2kN4uDLdbWyw-TDCz1YqxLJngwTZOQ,1971
28
- treenode/models/mixins/children.py,sha256=H9iMqgucSmwLX-3O3QUj1a2PUQTmmWZ4GPPjRZ9a5E4,2399
29
- treenode/models/mixins/descendants.py,sha256=RKowr29JUUO3E_UDvbLbMLhbn5IUkY2eh3AXfU8XSE8,2165
30
- treenode/models/mixins/family.py,sha256=MB5kWRVvxU_xmSgCekveTP5Vhj4wJki8bU7hzn9RNLE,1673
31
- treenode/models/mixins/logical.py,sha256=gh5wv5XZDs5GWarU6g9zKXWNwji7SE3zSVNIpywDWjw,2190
32
- treenode/models/mixins/node.py,sha256=8kqYdFTyZK5WsSxguuX3jBo1nZehDmwIBjm38S6QJw4,8576
33
- treenode/models/mixins/properties.py,sha256=1O6p2tfvOesBooZeOeuXi8yfEO_o-5gn_agtKqMxU-s,3945
34
- treenode/models/mixins/roots.py,sha256=2lDjUH22NZFUMVbVZgsdtEqDoUyHhGTiaoeo9h3KRfk,4102
35
- treenode/models/mixins/siblings.py,sha256=4XvQS7WkgolzEZdnURhIClo-VUcpuqQ-Sc7PDYKGmFw,3069
36
- treenode/models/mixins/tree.py,sha256=5Cew5c-NtTmz15S_ueDZ-fojHtQKZEKNxmp3W6qlC-8,14512
37
- treenode/models/mixins/update.py,sha256=oCZkMnfT23n2n3_mnokDrtTLS_jO_lJRwG3ENkH_DE4,4948
38
- treenode/static/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- treenode/static/css/.gitkeep,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
40
- treenode/static/css/tree_widget.css,sha256=YVIHuZT_E5ck5N7wvYvuwgV_m-4Ta_uGFiNUoTw-zbk,4861
41
- treenode/static/css/treenode_admin.css,sha256=_AVEO52atudOVBspgH4ecubbgGUeKhcC13WSxo7QQAw,3021
42
- treenode/static/css/treenode_tabs.css,sha256=pbulaUEhNMQFNWXFQrRN1zMyKjoSqLAnjNygpouPUfE,879
43
- treenode/static/js/.gitkeep,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
44
- treenode/static/js/lz-string.min.js,sha256=TAnTJQd2AlLqT9M2TU7GFjnoj9SIfwLeZnpEtLkP624,4718
45
- treenode/static/js/tree_widget.js,sha256=2LU8IIJD5TXbWVGjCEgrj5aYnUYtwBZECzj25XLtxNc,9633
46
- treenode/static/js/treenode_admin.js,sha256=fkxAj50QxwpPVdQxDNxQZ5vR0goUt53h8FzOv_fjxBQ,15945
47
- treenode/static/vendors/jquery-ui/AUTHORS.txt,sha256=geZ7JfVsTJq8Wgjrcm1p56Zqjxx7PL9FkxhKiN8dQg8,14848
48
- treenode/static/vendors/jquery-ui/LICENSE.txt,sha256=9kkCXPZcjc2FiLCTeIO6elK9ttNRKUZKNqFgLrACUPE,1818
49
- treenode/static/vendors/jquery-ui/index.html,sha256=RSv8cA662qJdc02OX-UmpaBJoZrngoQqnNWVZNn9GQQ,24229
50
- treenode/static/vendors/jquery-ui/jquery-ui.css,sha256=O8mmheetXPeKUa-iDk8fdxDhs096eWIi10qLJb6OXyw,17171
51
- treenode/static/vendors/jquery-ui/jquery-ui.js,sha256=XtnlPiKuVzMh-cef76mBCNCTPqk2cIlKBgmTHfRBDog,146430
52
- treenode/static/vendors/jquery-ui/jquery-ui.min.css,sha256=Yv2MureLOGZicbgEv28X9ft9o0SRBZ84PWIgg6h_V2E,15003
53
- treenode/static/vendors/jquery-ui/jquery-ui.min.js,sha256=FT6F7DDm5J1Qz6B5fv3e8jnmx9QyyfR2qUeTptb73bA,70364
54
- treenode/static/vendors/jquery-ui/jquery-ui.structure.css,sha256=392jP1trXFqS1OVv2X50px0F8w1DeTyIvvHL9wxNXi0,328
55
- treenode/static/vendors/jquery-ui/jquery-ui.structure.min.css,sha256=cXLe7UDVCN5SvPpbb3HJdndQIk1hlWMrzyRRYO9rcLs,208
56
- treenode/static/vendors/jquery-ui/jquery-ui.theme.css,sha256=grsB4hVvwiBxnNsG1c_ocH1YK76CExOav_dn_BsxepU,17140
57
- treenode/static/vendors/jquery-ui/jquery-ui.theme.min.css,sha256=oW6e3DmGiKSNLzo3HCUnjes9ykGZ6gXEtl3LjiQIkMs,13708
58
- treenode/static/vendors/jquery-ui/package.json,sha256=AvCATruWzbwY7NsfzcUR2WqPjslGO8M7hHzTj1AYDQY,2122
59
- treenode/static/vendors/jquery-ui/external/jquery/jquery.js,sha256=eKhayi8LEQwp4NKxN-CfCh-3qOVUtJn3QNZ0TciWLP4,285314
60
- treenode/static/vendors/jquery-ui/images/ui-icons_444444_256x240.png,sha256=YW09ms2dyfoVEOT_NEpaWXMMRLJxVIqu8hku63SoCEA,7107
61
- treenode/static/vendors/jquery-ui/images/ui-icons_555555_256x240.png,sha256=HP6KoU5aOllbVtaudhmNOLhBIzi_0oCuxBjwyhDATOo,7105
62
- treenode/static/vendors/jquery-ui/images/ui-icons_777620_256x240.png,sha256=NxKGIMNmb6YYZor0RuijQ7PTK5BoA9b5qXLjYTMFvXo,4615
63
- treenode/static/vendors/jquery-ui/images/ui-icons_777777_256x240.png,sha256=TLerPghEHzRXKPUuwr0VPT1PusnYFUe1-k1QIyeXe7g,7115
64
- treenode/static/vendors/jquery-ui/images/ui-icons_cc0000_256x240.png,sha256=S36ETnNcCxoWxmxAkVl0P3LYEDInjxi9GnG_g5uho1c,4615
65
- treenode/static/vendors/jquery-ui/images/ui-icons_ffffff_256x240.png,sha256=SBgnaQEkoyko7AbSFy0lDoDzAup6bkVQ74XyenFleUM,6395
66
- treenode/templates/.gitkeep,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
67
- treenode/templates/treenode/.gitkeep,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
68
- treenode/templates/treenode/admin/.gitkeep,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
69
- treenode/templates/treenode/admin/treenode_ajax_rows.html,sha256=zFyPaTbSyxRjOqQ85SMv__qTIYDjEna6chYODBypDZA,224
70
- treenode/templates/treenode/admin/treenode_changelist.html,sha256=ALU8iZLCOIiiGIf5RTdv3Bb694pG_YyQ-wcbz1CkBKc,654
71
- treenode/templates/treenode/admin/treenode_import_export.html,sha256=K6L_JnhGpWgQdduXSfAJ0UuTBfSN4ylFw9w_e5tPDDE,2926
72
- treenode/templates/treenode/admin/treenode_rows.html,sha256=S1XtZXWMUdfgjDoKG7OJwZg81a_5IKPp7tyrrHhJbBk,1695
73
- treenode/templates/treenode/widgets/tree_widget.html,sha256=GKcCU-B2FkkJ2BSOuXOw9e_PdYTtADcvyITEXqOlZ9Y,723
74
- treenode/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
- treenode/templatetags/treenode_admin.py,sha256=0Xz5tS_Etf2FU69Ww7GfQ6u2_jh97jymD1Gc4XCpHbc,1204
76
- treenode/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
- treenode/utils/db/__init__.py,sha256=RwicAcJSI1nhIPWLdT7j9TFsgOc9834VDn9lVn54GlY,247
78
- treenode/utils/db/compiler.py,sha256=PgD9ybS5H8OUHw1gkFBQHhnrf5HiCx8QXUMRhydwh7o,3824
79
- treenode/utils/db/db_vendor.py,sha256=4SyEHl51jVCDB3is4omHCf2bTB_QV3RvemUQYxJP5m0,930
80
- treenode/utils/db/service.py,sha256=PF85Yhz2xUWFFCzpLYotmiNTZXXEH61rhswslSxEUds,2640
81
- treenode/utils/db/sqlcompat.py,sha256=K71ggkKIvpdTtHQ6Y4qcbo6cj2eYiEfy6DlVBr8Po1E,4460
82
- treenode/utils/db/sqlquery.py,sha256=KXcfKbbaBF-D134H_2DiPQtjedR79SJNXPJc0msZYEc,1938
83
- treenode/views/__init__.py,sha256=ppxbBx51TUaKstJFpAd_DTmbKjbZGmVMLNYSpgUKnd0,111
84
- treenode/views/autoapi.py,sha256=o75e8IFsogbhZN_rbx3BKVnoruD96nWelnC5UzOqUDw,3628
85
- treenode/views/autocomplete.py,sha256=Z7cBnC4Ihdyxm8zlbnG6CkZdVkM3TOTWRpw5mdhaIVA,1469
86
- treenode/views/children.py,sha256=bygXaEBExxG3zIPL34_PYHLFFIqlQU2naqPIlyQ6e-s,1152
87
- treenode/views/common.py,sha256=mrmr40R91XVbMWcz5GZT-OjpnQ87F7XQZxu1W6rqpqI,617
88
- treenode/views/crud.py,sha256=RI5rdyD4hZTszjZFThByxi_lkAeJlqbDCXFkD8iyzKE,7424
89
- treenode/views/search.py,sha256=c_GyooT3jyoNa96bBxfoWruRN1wIw-ZGYvwGKkGojTs,1501
90
- django_fast_treenode-3.0.7.dist-info/METADATA,sha256=7scCSnoGv6UFkQHQV1yLuZBtXr3PSU1Lii3qQi43r_o,10249
91
- django_fast_treenode-3.0.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
92
- django_fast_treenode-3.0.7.dist-info/top_level.txt,sha256=fmgxHbXyx1O2MPi_9kjx8aL9L-8TmV0gre4Go8XgqFk,9
93
- django_fast_treenode-3.0.7.dist-info/RECORD,,