django-fast-treenode 2.1.4__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.
- django_fast_treenode-3.0.0.dist-info/METADATA +203 -0
- django_fast_treenode-3.0.0.dist-info/RECORD +90 -0
- {django_fast_treenode-2.1.4.dist-info → django_fast_treenode-3.0.0.dist-info}/WHEEL +1 -1
- treenode/admin/__init__.py +2 -7
- treenode/admin/admin.py +138 -209
- treenode/admin/changelist.py +21 -39
- treenode/admin/exporter.py +170 -0
- treenode/admin/importer.py +171 -0
- treenode/admin/mixin.py +291 -0
- treenode/apps.py +42 -20
- treenode/cache.py +192 -303
- treenode/forms.py +45 -65
- treenode/managers/__init__.py +4 -20
- treenode/managers/managers.py +216 -0
- treenode/managers/queries.py +233 -0
- treenode/managers/tasks.py +167 -0
- treenode/models/__init__.py +8 -5
- treenode/models/decorators.py +54 -0
- treenode/models/factory.py +44 -68
- treenode/models/mixins/__init__.py +2 -1
- treenode/models/mixins/ancestors.py +44 -20
- treenode/models/mixins/children.py +33 -26
- treenode/models/mixins/descendants.py +33 -22
- treenode/models/mixins/family.py +25 -15
- treenode/models/mixins/logical.py +23 -21
- treenode/models/mixins/node.py +162 -104
- treenode/models/mixins/properties.py +22 -16
- treenode/models/mixins/roots.py +59 -15
- treenode/models/mixins/siblings.py +46 -43
- treenode/models/mixins/tree.py +212 -153
- treenode/models/mixins/update.py +154 -0
- treenode/models/models.py +365 -0
- treenode/settings.py +28 -0
- treenode/static/{treenode/css → css}/tree_widget.css +1 -1
- treenode/static/{treenode/css → css}/treenode_admin.css +43 -2
- treenode/static/css/treenode_tabs.css +51 -0
- treenode/static/js/lz-string.min.js +1 -0
- treenode/static/{treenode/js → js}/tree_widget.js +9 -23
- treenode/static/js/treenode_admin.js +531 -0
- treenode/static/vendors/jquery-ui/AUTHORS.txt +384 -0
- treenode/static/vendors/jquery-ui/LICENSE.txt +43 -0
- treenode/static/vendors/jquery-ui/external/jquery/jquery.js +10716 -0
- treenode/static/vendors/jquery-ui/images/ui-icons_444444_256x240.png +0 -0
- treenode/static/vendors/jquery-ui/images/ui-icons_555555_256x240.png +0 -0
- treenode/static/vendors/jquery-ui/images/ui-icons_777620_256x240.png +0 -0
- treenode/static/vendors/jquery-ui/images/ui-icons_777777_256x240.png +0 -0
- treenode/static/vendors/jquery-ui/images/ui-icons_cc0000_256x240.png +0 -0
- treenode/static/vendors/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
- treenode/static/vendors/jquery-ui/index.html +297 -0
- treenode/static/vendors/jquery-ui/jquery-ui.css +438 -0
- treenode/static/vendors/jquery-ui/jquery-ui.js +5223 -0
- treenode/static/vendors/jquery-ui/jquery-ui.min.css +7 -0
- treenode/static/vendors/jquery-ui/jquery-ui.min.js +6 -0
- treenode/static/vendors/jquery-ui/jquery-ui.structure.css +16 -0
- treenode/static/vendors/jquery-ui/jquery-ui.structure.min.css +5 -0
- treenode/static/vendors/jquery-ui/jquery-ui.theme.css +439 -0
- treenode/static/vendors/jquery-ui/jquery-ui.theme.min.css +5 -0
- treenode/static/vendors/jquery-ui/package.json +82 -0
- treenode/templates/admin/treenode_changelist.html +25 -0
- treenode/templates/admin/treenode_import_export.html +85 -0
- treenode/templates/admin/treenode_rows.html +57 -0
- treenode/tests.py +3 -0
- treenode/urls.py +6 -27
- treenode/utils/__init__.py +0 -15
- treenode/utils/db/__init__.py +7 -0
- treenode/utils/db/compiler.py +114 -0
- treenode/utils/db/db_vendor.py +50 -0
- treenode/utils/db/service.py +84 -0
- treenode/utils/db/sqlcompat.py +60 -0
- treenode/utils/db/sqlquery.py +70 -0
- treenode/version.py +2 -2
- treenode/views/__init__.py +5 -0
- treenode/views/autoapi.py +91 -0
- treenode/views/autocomplete.py +52 -0
- treenode/views/children.py +41 -0
- treenode/views/common.py +23 -0
- treenode/views/crud.py +209 -0
- treenode/views/search.py +48 -0
- treenode/widgets.py +27 -44
- django_fast_treenode-2.1.4.dist-info/METADATA +0 -166
- django_fast_treenode-2.1.4.dist-info/RECORD +0 -63
- treenode/admin/mixins.py +0 -302
- treenode/managers/adjacency.py +0 -205
- treenode/managers/closure.py +0 -278
- treenode/models/adjacency.py +0 -342
- treenode/models/classproperty.py +0 -27
- treenode/models/closure.py +0 -122
- treenode/static/treenode/js/.gitkeep +0 -1
- treenode/static/treenode/js/treenode_admin.js +0 -131
- treenode/templates/admin/export_success.html +0 -26
- treenode/templates/admin/tree_node_changelist.html +0 -19
- treenode/templates/admin/tree_node_export.html +0 -27
- treenode/templates/admin/tree_node_import.html +0 -45
- treenode/templates/admin/tree_node_import_report.html +0 -32
- treenode/templates/widgets/tree_widget.css +0 -23
- treenode/utils/aid.py +0 -46
- treenode/utils/base16.py +0 -38
- treenode/utils/base36.py +0 -37
- treenode/utils/db.py +0 -116
- treenode/utils/exporter.py +0 -196
- treenode/utils/importer.py +0 -328
- treenode/utils/radix.py +0 -61
- treenode/views.py +0 -184
- {django_fast_treenode-2.1.4.dist-info → django_fast_treenode-3.0.0.dist-info/licenses}/LICENSE +0 -0
- {django_fast_treenode-2.1.4.dist-info → django_fast_treenode-3.0.0.dist-info}/top_level.txt +0 -0
- /treenode/static/{treenode → css}/.gitkeep +0 -0
- /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
|
{django_fast_treenode-2.1.4.dist-info → django_fast_treenode-3.0.0.dist-info/licenses}/LICENSE
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|