django-fast-treenode 2.0.5__tar.gz → 2.0.6__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {django_fast_treenode-2.0.5/django_fast_treenode.egg-info → django_fast_treenode-2.0.6}/PKG-INFO +1 -1
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6/django_fast_treenode.egg-info}/PKG-INFO +1 -1
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/pyproject.toml +1 -1
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/setup.cfg +1 -1
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/admin.py +47 -12
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/LICENSE +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/MANIFEST.in +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/README.md +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/django_fast_treenode.egg-info/SOURCES.txt +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/django_fast_treenode.egg-info/dependency_links.txt +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/django_fast_treenode.egg-info/requires.txt +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/django_fast_treenode.egg-info/top_level.txt +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/setup.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/__init__.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/apps.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/cache.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/docs/Documentation +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/forms.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/managers.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/models/__init__.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/models/classproperty.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/models/closure.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/models/factory.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/models/proxy.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/.gitkeep +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/treenode/.gitkeep +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/treenode/css/.gitkeep +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/treenode/css/tree_widget.css +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/treenode/css/treenode_admin.css +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/treenode/js/.gitkeep +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/treenode/js/tree_widget.js +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/treenode/js/treenode_admin.js +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/templates/.gitkeep +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/templates/admin/.gitkeep +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/templates/admin/export_success.html +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/templates/admin/tree_node_changelist.html +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/templates/admin/tree_node_export.html +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/templates/admin/tree_node_import.html +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/templates/widgets/tree_widget.css +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/templates/widgets/tree_widget.html +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/urls.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/utils/__init__.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/utils/base36.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/utils/exporter.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/utils/importer.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/version.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/views.py +0 -0
- {django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/widgets.py +0 -0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "django-fast-treenode"
|
7
|
-
version = "2.0.
|
7
|
+
version = "2.0.6"
|
8
8
|
description = "Application for supporting tree (hierarchical) data structure in Django projects"
|
9
9
|
readme = "README.md"
|
10
10
|
authors = [{ name = "Timur Kady", email = "timurkady@yandex.com" }]
|
@@ -6,7 +6,7 @@ This module provides Django admin integration for the TreeNode model.
|
|
6
6
|
It includes custom tree-based sorting, optimized queries, and
|
7
7
|
import/export functionality for hierarchical data structures.
|
8
8
|
|
9
|
-
Version: 2.0.
|
9
|
+
Version: 2.0.6
|
10
10
|
Author: Timur Kady
|
11
11
|
Email: kaduevtr@gmail.com
|
12
12
|
"""
|
@@ -81,7 +81,7 @@ class TreeNodeAdminModel(admin.ModelAdmin):
|
|
81
81
|
TREENODE_DISPLAY_MODE_INDENTATION = 'indentation'
|
82
82
|
|
83
83
|
treenode_display_mode = TREENODE_DISPLAY_MODE_ACCORDION
|
84
|
-
|
84
|
+
import_export = False # Track import/export availability
|
85
85
|
change_list_template = "admin/tree_node_changelist.html"
|
86
86
|
ordering = []
|
87
87
|
list_per_page = 1000
|
@@ -107,10 +107,25 @@ class TreeNodeAdminModel(admin.ModelAdmin):
|
|
107
107
|
"""Динамически добавляем поле `tn_order` в `list_display`."""
|
108
108
|
super().__init__(model, admin_site)
|
109
109
|
|
110
|
-
#
|
110
|
+
# If `list_display` is empty, take all `fields`
|
111
111
|
if not self.list_display:
|
112
112
|
self.list_display = [field.name for field in model._meta.fields]
|
113
113
|
|
114
|
+
# Check for necessary dependencies
|
115
|
+
self.import_export = all(
|
116
|
+
importlib.util.find_spec(pkg) is not None
|
117
|
+
for pkg in ["openpyxl", "pyyaml", "pandas"]
|
118
|
+
)
|
119
|
+
|
120
|
+
if self.import_export:
|
121
|
+
from .utils import TreeNodeImporter, TreeNodeExporter
|
122
|
+
|
123
|
+
self.TreeNodeImporter = TreeNodeImporter
|
124
|
+
self.TreeNodeExporter = TreeNodeExporter
|
125
|
+
else:
|
126
|
+
self.TreeNodeImporter = None
|
127
|
+
self.TreeNodeExporter = None
|
128
|
+
|
114
129
|
def get_queryset(self, request):
|
115
130
|
"""Override get_ueryset()."""
|
116
131
|
queryset = super().get_queryset(request)
|
@@ -182,10 +197,7 @@ class TreeNodeAdminModel(admin.ModelAdmin):
|
|
182
197
|
def changelist_view(self, request, extra_context=None):
|
183
198
|
"""Changelist View."""
|
184
199
|
extra_context = extra_context or {}
|
185
|
-
extra_context['import_export_enabled'] =
|
186
|
-
importlib.util.find_spec(pkg)
|
187
|
-
is not None for pkg in ["openpyxl", "pyyaml", "pandas"]
|
188
|
-
)
|
200
|
+
extra_context['import_export_enabled'] = self.import_export
|
189
201
|
return super().changelist_view(request, extra_context=extra_context)
|
190
202
|
|
191
203
|
def get_ordering(self, request):
|
@@ -250,12 +262,19 @@ class TreeNodeAdminModel(admin.ModelAdmin):
|
|
250
262
|
return form
|
251
263
|
|
252
264
|
def get_urls(self):
|
253
|
-
"""
|
265
|
+
"""
|
266
|
+
Extend admin URLs with custom import/export routes.
|
267
|
+
|
268
|
+
Register these URLs only if all the required packages are installed.
|
269
|
+
"""
|
254
270
|
urls = super().get_urls()
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
271
|
+
if self.import_export:
|
272
|
+
custom_urls = [
|
273
|
+
path('import/', self.import_view, name='tree_node_import'),
|
274
|
+
path('export/', self.export_view, name='tree_node_export'),
|
275
|
+
]
|
276
|
+
else:
|
277
|
+
custom_urls = []
|
259
278
|
return custom_urls + urls
|
260
279
|
|
261
280
|
def import_view(self, request):
|
@@ -265,6 +284,14 @@ class TreeNodeAdminModel(admin.ModelAdmin):
|
|
265
284
|
File upload processing, auto-detection of format, validation and data
|
266
285
|
import.
|
267
286
|
"""
|
287
|
+
if not self.import_export:
|
288
|
+
self.message_user(
|
289
|
+
request,
|
290
|
+
"Import functionality is disabled because required \
|
291
|
+
packages are not installed."
|
292
|
+
)
|
293
|
+
return redirect("..")
|
294
|
+
|
268
295
|
if request.method == 'POST':
|
269
296
|
if 'file' not in request.FILES:
|
270
297
|
return render(
|
@@ -317,6 +344,14 @@ class TreeNodeAdminModel(admin.ModelAdmin):
|
|
317
344
|
link for manual download,
|
318
345
|
and a button to go to the model page.
|
319
346
|
"""
|
347
|
+
if not self.import_export:
|
348
|
+
self.message_user(
|
349
|
+
request,
|
350
|
+
"Export functionality is disabled because required \
|
351
|
+
packages are not installed."
|
352
|
+
)
|
353
|
+
return redirect("..")
|
354
|
+
|
320
355
|
# If the download parameter is present, we give the file directly
|
321
356
|
if 'download' in request.GET:
|
322
357
|
# Get file format
|
File without changes
|
File without changes
|
File without changes
|
{django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/django_fast_treenode.egg-info/SOURCES.txt
RENAMED
File without changes
|
File without changes
|
{django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/django_fast_treenode.egg-info/requires.txt
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/treenode/css/.gitkeep
RENAMED
File without changes
|
File without changes
|
File without changes
|
{django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/treenode/js/.gitkeep
RENAMED
File without changes
|
{django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/static/treenode/js/tree_widget.js
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{django_fast_treenode-2.0.5 → django_fast_treenode-2.0.6}/treenode/templates/widgets/tree_widget.css
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|