django-fast-treenode 2.1.5__py3-none-any.whl → 3.0.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 (107) hide show
  1. django_fast_treenode-3.0.0.dist-info/METADATA +203 -0
  2. django_fast_treenode-3.0.0.dist-info/RECORD +90 -0
  3. {django_fast_treenode-2.1.5.dist-info → django_fast_treenode-3.0.0.dist-info}/WHEEL +1 -1
  4. treenode/admin/__init__.py +0 -5
  5. treenode/admin/admin.py +137 -208
  6. treenode/admin/changelist.py +21 -39
  7. treenode/admin/exporter.py +170 -0
  8. treenode/admin/importer.py +171 -0
  9. treenode/admin/mixin.py +291 -0
  10. treenode/apps.py +42 -20
  11. treenode/cache.py +192 -303
  12. treenode/forms.py +45 -65
  13. treenode/managers/__init__.py +4 -20
  14. treenode/managers/managers.py +216 -0
  15. treenode/managers/queries.py +233 -0
  16. treenode/managers/tasks.py +167 -0
  17. treenode/models/__init__.py +8 -5
  18. treenode/models/decorators.py +54 -0
  19. treenode/models/factory.py +44 -68
  20. treenode/models/mixins/__init__.py +2 -1
  21. treenode/models/mixins/ancestors.py +44 -20
  22. treenode/models/mixins/children.py +33 -26
  23. treenode/models/mixins/descendants.py +33 -22
  24. treenode/models/mixins/family.py +25 -15
  25. treenode/models/mixins/logical.py +23 -21
  26. treenode/models/mixins/node.py +162 -104
  27. treenode/models/mixins/properties.py +22 -16
  28. treenode/models/mixins/roots.py +59 -15
  29. treenode/models/mixins/siblings.py +46 -43
  30. treenode/models/mixins/tree.py +212 -153
  31. treenode/models/mixins/update.py +154 -0
  32. treenode/models/models.py +365 -0
  33. treenode/settings.py +28 -0
  34. treenode/static/{treenode/css → css}/tree_widget.css +1 -1
  35. treenode/static/{treenode/css → css}/treenode_admin.css +43 -2
  36. treenode/static/css/treenode_tabs.css +51 -0
  37. treenode/static/js/lz-string.min.js +1 -0
  38. treenode/static/{treenode/js → js}/tree_widget.js +9 -23
  39. treenode/static/js/treenode_admin.js +531 -0
  40. treenode/static/vendors/jquery-ui/AUTHORS.txt +384 -0
  41. treenode/static/vendors/jquery-ui/LICENSE.txt +43 -0
  42. treenode/static/vendors/jquery-ui/external/jquery/jquery.js +10716 -0
  43. treenode/static/vendors/jquery-ui/images/ui-icons_444444_256x240.png +0 -0
  44. treenode/static/vendors/jquery-ui/images/ui-icons_555555_256x240.png +0 -0
  45. treenode/static/vendors/jquery-ui/images/ui-icons_777620_256x240.png +0 -0
  46. treenode/static/vendors/jquery-ui/images/ui-icons_777777_256x240.png +0 -0
  47. treenode/static/vendors/jquery-ui/images/ui-icons_cc0000_256x240.png +0 -0
  48. treenode/static/vendors/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
  49. treenode/static/vendors/jquery-ui/index.html +297 -0
  50. treenode/static/vendors/jquery-ui/jquery-ui.css +438 -0
  51. treenode/static/vendors/jquery-ui/jquery-ui.js +5223 -0
  52. treenode/static/vendors/jquery-ui/jquery-ui.min.css +7 -0
  53. treenode/static/vendors/jquery-ui/jquery-ui.min.js +6 -0
  54. treenode/static/vendors/jquery-ui/jquery-ui.structure.css +16 -0
  55. treenode/static/vendors/jquery-ui/jquery-ui.structure.min.css +5 -0
  56. treenode/static/vendors/jquery-ui/jquery-ui.theme.css +439 -0
  57. treenode/static/vendors/jquery-ui/jquery-ui.theme.min.css +5 -0
  58. treenode/static/vendors/jquery-ui/package.json +82 -0
  59. treenode/templates/admin/treenode_changelist.html +25 -0
  60. treenode/templates/admin/treenode_import_export.html +85 -0
  61. treenode/templates/admin/treenode_rows.html +57 -0
  62. treenode/tests.py +3 -0
  63. treenode/urls.py +6 -27
  64. treenode/utils/__init__.py +0 -15
  65. treenode/utils/db/__init__.py +7 -0
  66. treenode/utils/db/compiler.py +114 -0
  67. treenode/utils/db/db_vendor.py +50 -0
  68. treenode/utils/db/service.py +84 -0
  69. treenode/utils/db/sqlcompat.py +60 -0
  70. treenode/utils/db/sqlquery.py +70 -0
  71. treenode/version.py +2 -2
  72. treenode/views/__init__.py +5 -0
  73. treenode/views/autoapi.py +91 -0
  74. treenode/views/autocomplete.py +52 -0
  75. treenode/views/children.py +41 -0
  76. treenode/views/common.py +23 -0
  77. treenode/views/crud.py +209 -0
  78. treenode/views/search.py +48 -0
  79. treenode/widgets.py +27 -44
  80. django_fast_treenode-2.1.5.dist-info/METADATA +0 -165
  81. django_fast_treenode-2.1.5.dist-info/RECORD +0 -63
  82. treenode/admin/mixins.py +0 -302
  83. treenode/managers/adjacency.py +0 -205
  84. treenode/managers/closure.py +0 -278
  85. treenode/models/adjacency.py +0 -342
  86. treenode/models/classproperty.py +0 -27
  87. treenode/models/closure.py +0 -122
  88. treenode/static/treenode/js/.gitkeep +0 -1
  89. treenode/static/treenode/js/treenode_admin.js +0 -131
  90. treenode/templates/admin/export_success.html +0 -26
  91. treenode/templates/admin/tree_node_changelist.html +0 -19
  92. treenode/templates/admin/tree_node_export.html +0 -27
  93. treenode/templates/admin/tree_node_import.html +0 -45
  94. treenode/templates/admin/tree_node_import_report.html +0 -32
  95. treenode/templates/widgets/tree_widget.css +0 -23
  96. treenode/utils/aid.py +0 -46
  97. treenode/utils/base16.py +0 -38
  98. treenode/utils/base36.py +0 -37
  99. treenode/utils/db.py +0 -116
  100. treenode/utils/exporter.py +0 -196
  101. treenode/utils/importer.py +0 -328
  102. treenode/utils/radix.py +0 -61
  103. treenode/views.py +0 -184
  104. {django_fast_treenode-2.1.5.dist-info → django_fast_treenode-3.0.0.dist-info}/licenses/LICENSE +0 -0
  105. {django_fast_treenode-2.1.5.dist-info → django_fast_treenode-3.0.0.dist-info}/top_level.txt +0 -0
  106. /treenode/static/{treenode → css}/.gitkeep +0 -0
  107. /treenode/static/{treenode/css → js}/.gitkeep +0 -0
treenode/views.py DELETED
@@ -1,184 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- """
3
- TreeNode Views Module
4
-
5
- This module provides API views for handling AJAX requests related to
6
- tree-structured data in Django. It supports Select2 autocomplete
7
- and retrieving child node counts.
8
-
9
- Features:
10
- - `TreeNodeAutocompleteView`: Returns JSON data for Select2 with hierarchical
11
- structure.
12
- - `GetChildrenCountView`: Retrieves the number of children for a given
13
- parent node.
14
- - Uses optimized QuerySets for efficient database queries.
15
- - Handles validation and error responses gracefully.
16
-
17
- Version: 2.1.0
18
- Author: Timur Kady
19
- Email: timurkady@yandex.com
20
- """
21
-
22
- from django.apps import apps
23
- from django.http import JsonResponse
24
- from django.utils.translation import gettext_lazy as _
25
- from django.views import View
26
-
27
- import logging
28
-
29
- logger = logging.getLogger(__name__)
30
-
31
-
32
- class TreeNodeAutocompleteView(View):
33
- """
34
- Return JSON data for Select2 with tree structure.
35
-
36
- Lazy load tree nodes for Select2 scrolling with reference node support.
37
- """
38
-
39
- def get(self, request):
40
- """
41
- Process an AJAX request to lazily load tree nodes.
42
-
43
- Operation logic:
44
- """
45
- # Search Processing
46
- q = request.GET.get("q", "")
47
- if q:
48
- return self.search(request)
49
-
50
- # Model extracting
51
- model_label = request.GET.get("model")
52
- try:
53
- model = apps.get_model(model_label)
54
- except LookupError:
55
- return JsonResponse(
56
- {"error": f"Invalid model: {model_label}"},
57
- status=400
58
- )
59
-
60
- # select_id not specified
61
- queryset_list = model.get_roots()
62
-
63
- select_id = request.GET.get("select_id", "")
64
- if select_id:
65
- select = model.objects.filter(pk=select_id).first()
66
- if not select:
67
- return JsonResponse(
68
- {"error": f"Invalid select_id: {select_id}"},
69
- status=400
70
- )
71
- breadcrumbs = select.get_breadcrumbs()
72
- # Delete self
73
- del breadcrumbs[-1]
74
- for pk in breadcrumbs:
75
- parent = model.model.objects.filter(pk=pk).first()
76
- children = parent.get_children()
77
- queryset_list.extend(children)
78
-
79
- nodes = model._sort_node_list(queryset_list)
80
- # Generate a response
81
- results = [
82
- {
83
- "id": node.pk,
84
- "text": str(node),
85
- "level": node.get_depth(),
86
- "is_leaf": node.is_leaf(),
87
- }
88
- for node in nodes
89
- ]
90
- # Add the "Root" option to the top of the list
91
- root_option = {
92
- "id": "",
93
- "text": _("Root"),
94
- "level": 0,
95
- "is_leaf": True,
96
- }
97
- results.insert(0, root_option)
98
-
99
- response_data = {"results": results}
100
- return JsonResponse(response_data)
101
-
102
- def search(self, request):
103
- """Search processing."""
104
- # Chack search query
105
- q = request.GET.get("q", "")
106
- if not q:
107
- return JsonResponse({"results": []})
108
-
109
- # Model extracting
110
- model_label = request.GET.get("model")
111
- try:
112
- model = apps.get_model(model_label)
113
- except LookupError:
114
- return JsonResponse(
115
- {"error": f"Invalid model: {model_label}"},
116
- status=400
117
- )
118
-
119
- # Search
120
- params = {}
121
- treenode_field = model.treenode_display_field
122
- if not treenode_field:
123
- return {"results": ""}
124
-
125
- params[f"{treenode_field}__icontains"] = q
126
- queryset = model.objects.filter(**params)[:15]
127
- queryset_list = list(queryset)
128
- nodes = model._sort_node_list(queryset_list)
129
- results = [
130
- {
131
- "id": node.pk,
132
- "text": node.name,
133
- "level": node.get_depth(),
134
- "is_leaf": node.is_leaf(),
135
- }
136
- for node in nodes
137
- ]
138
- return JsonResponse({"results": results})
139
-
140
-
141
- class ChildrenView(View):
142
- """Return JSON data for Select2 with node children."""
143
-
144
- def get(self, request):
145
- """Process an AJAX request to load node children."""
146
- # Get reference_id
147
- reference_id = request.GET.get("reference_id", "")
148
- if not reference_id:
149
- return JsonResponse({"results": []})
150
-
151
- # Model extracting
152
- model_label = request.GET.get("model")
153
- try:
154
- model = apps.get_model(model_label)
155
- except LookupError:
156
- return JsonResponse(
157
- {"error": f"Invalid model: {model_label}"},
158
- status=400
159
- )
160
- obj = model.objects.filter(pk=reference_id).first()
161
- if not obj:
162
- return JsonResponse(
163
- {"error": f"Invalid reference_id: {reference_id}"},
164
- status=400
165
- )
166
-
167
- if obj.is_leaf():
168
- return JsonResponse({"results": []})
169
-
170
- queryset_list = obj.get_children()
171
- nodes = model._sort_node_list(queryset_list)
172
- results = [
173
- {
174
- "id": node.pk,
175
- "text": node.name,
176
- "level": node.get_depth(),
177
- "is_leaf": node.is_leaf(),
178
- }
179
- for node in nodes
180
- ]
181
- return JsonResponse({"results": results})
182
-
183
-
184
- # The End
File without changes
File without changes