django-fast-treenode 2.0.4__tar.gz → 2.0.6__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. {django_fast_treenode-2.0.4/django_fast_treenode.egg-info → django_fast_treenode-2.0.6}/PKG-INFO +2 -1
  2. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6/django_fast_treenode.egg-info}/PKG-INFO +2 -1
  3. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/django_fast_treenode.egg-info/requires.txt +1 -0
  4. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/pyproject.toml +3 -2
  5. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/setup.cfg +2 -1
  6. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/admin.py +47 -12
  7. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/LICENSE +0 -0
  8. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/MANIFEST.in +0 -0
  9. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/README.md +0 -0
  10. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/django_fast_treenode.egg-info/SOURCES.txt +0 -0
  11. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/django_fast_treenode.egg-info/dependency_links.txt +0 -0
  12. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/django_fast_treenode.egg-info/top_level.txt +0 -0
  13. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/setup.py +0 -0
  14. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/__init__.py +0 -0
  15. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/apps.py +0 -0
  16. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/cache.py +0 -0
  17. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/docs/Documentation +0 -0
  18. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/forms.py +0 -0
  19. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/managers.py +0 -0
  20. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/models/__init__.py +0 -0
  21. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/models/classproperty.py +0 -0
  22. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/models/closure.py +0 -0
  23. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/models/factory.py +0 -0
  24. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/models/proxy.py +0 -0
  25. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/static/.gitkeep +0 -0
  26. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/static/treenode/.gitkeep +0 -0
  27. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/static/treenode/css/.gitkeep +0 -0
  28. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/static/treenode/css/tree_widget.css +0 -0
  29. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/static/treenode/css/treenode_admin.css +0 -0
  30. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/static/treenode/js/.gitkeep +0 -0
  31. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/static/treenode/js/tree_widget.js +0 -0
  32. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/static/treenode/js/treenode_admin.js +0 -0
  33. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/templates/.gitkeep +0 -0
  34. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/templates/admin/.gitkeep +0 -0
  35. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/templates/admin/export_success.html +0 -0
  36. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/templates/admin/tree_node_changelist.html +0 -0
  37. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/templates/admin/tree_node_export.html +0 -0
  38. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/templates/admin/tree_node_import.html +0 -0
  39. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/templates/widgets/tree_widget.css +0 -0
  40. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/templates/widgets/tree_widget.html +0 -0
  41. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/urls.py +0 -0
  42. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/utils/__init__.py +0 -0
  43. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/utils/base36.py +0 -0
  44. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/utils/exporter.py +0 -0
  45. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/utils/importer.py +0 -0
  46. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/version.py +0 -0
  47. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/views.py +0 -0
  48. {django_fast_treenode-2.0.4 → django_fast_treenode-2.0.6}/treenode/widgets.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: django-fast-treenode
3
- Version: 2.0.4
3
+ Version: 2.0.6
4
4
  Summary: Application for supporting tree (hierarchical) data structure in Django projects
5
5
  Home-page: https://github.com/TimurKady/django-fast-treenode
6
6
  Author: Timur Kady
@@ -53,6 +53,7 @@ Description-Content-Type: text/markdown
53
53
  License-File: LICENSE
54
54
  Requires-Dist: Django>=4.0
55
55
  Requires-Dist: pympler>=1.0
56
+ Requires-Dist: django-widget-tweaks>=1.5
56
57
  Provides-Extra: import-export
57
58
  Requires-Dist: openpyxl; extra == "import-export"
58
59
  Requires-Dist: pyyaml; extra == "import-export"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: django-fast-treenode
3
- Version: 2.0.4
3
+ Version: 2.0.6
4
4
  Summary: Application for supporting tree (hierarchical) data structure in Django projects
5
5
  Home-page: https://github.com/TimurKady/django-fast-treenode
6
6
  Author: Timur Kady
@@ -53,6 +53,7 @@ Description-Content-Type: text/markdown
53
53
  License-File: LICENSE
54
54
  Requires-Dist: Django>=4.0
55
55
  Requires-Dist: pympler>=1.0
56
+ Requires-Dist: django-widget-tweaks>=1.5
56
57
  Provides-Extra: import-export
57
58
  Requires-Dist: openpyxl; extra == "import-export"
58
59
  Requires-Dist: pyyaml; extra == "import-export"
@@ -1,5 +1,6 @@
1
1
  Django>=4.0
2
2
  pympler>=1.0
3
+ django-widget-tweaks>=1.5
3
4
 
4
5
  [import_export]
5
6
  openpyxl
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "django-fast-treenode"
7
- version = "2.0.4"
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" }]
@@ -12,7 +12,8 @@ license = { file = "LICENSE" }
12
12
  requires-python = ">=3.9"
13
13
  dependencies = [
14
14
  "Django >=4.0",
15
- "pympler >=1.0"
15
+ "pympler >=1.0",
16
+ "django-widget-tweaks >= 1.5"
16
17
  ]
17
18
  classifiers = [
18
19
  "Development Status :: 5 - Production/Stable",
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = django-fast-treenode
3
- version = 2.0.4
3
+ version = 2.0.6
4
4
  description = Application for supporting tree (hierarchical) data structure in Django projects
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown
@@ -34,6 +34,7 @@ python_requires = >=3.9
34
34
  install_requires =
35
35
  Django >=4.0
36
36
  pympler >=1.0
37
+ django-widget-tweaks >= 1.5
37
38
 
38
39
  [options.extras_require]
39
40
  import_export =
@@ -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.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
- # Если `list_display` пустой, берем все `fields`
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'] = all(
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
- """Extend admin URLs with custom import/export routes."""
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
- custom_urls = [
256
- path('import/', self.import_view, name='tree_node_import'),
257
- path('export/', self.export_view, name='tree_node_export'),
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