django-fast-treenode 3.2.2__tar.gz → 3.2.4__tar.gz

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 (125) hide show
  1. {django_fast_treenode-3.2.2/django_fast_treenode.egg-info → django_fast_treenode-3.2.4}/PKG-INFO +1 -1
  2. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4/django_fast_treenode.egg-info}/PKG-INFO +1 -1
  3. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/models.md +7 -0
  4. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/pyproject.toml +1 -1
  5. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/setup.py +1 -1
  6. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/admin/admin.py +13 -5
  7. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/version.py +2 -2
  8. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/views/common.py +30 -23
  9. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/LICENSE +0 -0
  10. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/MANIFEST.in +0 -0
  11. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/README.md +0 -0
  12. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/django_fast_treenode.egg-info/SOURCES.txt +0 -0
  13. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/django_fast_treenode.egg-info/dependency_links.txt +0 -0
  14. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/django_fast_treenode.egg-info/requires.txt +0 -0
  15. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/django_fast_treenode.egg-info/top_level.txt +0 -0
  16. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/.gitignore +0 -0
  17. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/.nojekyll +0 -0
  18. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/about.md +0 -0
  19. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/admin.md +0 -0
  20. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/api.md +0 -0
  21. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/apifirst.md +0 -0
  22. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/cache.md +0 -0
  23. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/customization.md +0 -0
  24. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/dnd.md +0 -0
  25. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/import_export.md +0 -0
  26. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/index.md +0 -0
  27. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/insert-after.jpg +0 -0
  28. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/insert-as-child.jpg +0 -0
  29. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/installation.md +0 -0
  30. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/migration.md +0 -0
  31. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/requirements.txt +0 -0
  32. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/roadmap.md +0 -0
  33. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/docs/using.md +0 -0
  34. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/setup.cfg +0 -0
  35. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/tests/test_suite.py +0 -0
  36. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/__init__.py +0 -0
  37. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/admin/__init__.py +0 -0
  38. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/admin/changelist.py +0 -0
  39. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/admin/exporter.py +0 -0
  40. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/admin/importer.py +0 -0
  41. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/admin/mixin.py +0 -0
  42. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/apps.py +0 -0
  43. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/cache.py +0 -0
  44. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/forms.py +0 -0
  45. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/managers/__init__.py +0 -0
  46. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/managers/managers.py +0 -0
  47. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/managers/queries.py +0 -0
  48. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/managers/tasks.py +0 -0
  49. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/__init__.py +0 -0
  50. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/decorators.py +0 -0
  51. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/factory.py +0 -0
  52. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/__init__.py +0 -0
  53. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/ancestors.py +0 -0
  54. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/children.py +0 -0
  55. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/descendants.py +0 -0
  56. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/family.py +0 -0
  57. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/logical.py +0 -0
  58. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/node.py +0 -0
  59. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/properties.py +0 -0
  60. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/roots.py +0 -0
  61. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/search.py +0 -0
  62. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/siblings.py +0 -0
  63. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/tree.py +0 -0
  64. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/mixins/update.py +0 -0
  65. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/models/models.py +0 -0
  66. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/settings.py +0 -0
  67. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/signals.py +0 -0
  68. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/.gitkeep +0 -0
  69. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/.gitkeep +0 -0
  70. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/css/.gitkeep +0 -0
  71. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/css/tree_widget.css +0 -0
  72. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/css/treenode_admin.css +0 -0
  73. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/css/treenode_tabs.css +0 -0
  74. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/js/.gitkeep +0 -0
  75. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/js/lz-string.min.js +0 -0
  76. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/js/tree_widget.js +0 -0
  77. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/js/treenode_admin.js +0 -0
  78. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/.gitkeep +0 -0
  79. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/.gitkeep +0 -0
  80. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/AUTHORS.txt +0 -0
  81. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/LICENSE.txt +0 -0
  82. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/external/jquery/jquery.js +0 -0
  83. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/images/ui-icons_444444_256x240.png +0 -0
  84. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/images/ui-icons_555555_256x240.png +0 -0
  85. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/images/ui-icons_777620_256x240.png +0 -0
  86. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/images/ui-icons_777777_256x240.png +0 -0
  87. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/images/ui-icons_cc0000_256x240.png +0 -0
  88. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
  89. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/index.html +0 -0
  90. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.css +0 -0
  91. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.js +0 -0
  92. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.min.css +0 -0
  93. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.min.js +0 -0
  94. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.structure.css +0 -0
  95. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.structure.min.css +0 -0
  96. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.theme.css +0 -0
  97. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.theme.min.css +0 -0
  98. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/static/treenode/vendors/jquery-ui/package.json +0 -0
  99. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/templates/.gitkeep +0 -0
  100. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/templates/treenode/.gitkeep +0 -0
  101. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/templates/treenode/admin/.gitkeep +0 -0
  102. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/templates/treenode/admin/treenode_ajax_rows.html +0 -0
  103. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/templates/treenode/admin/treenode_changelist.html +0 -0
  104. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/templates/treenode/admin/treenode_import_export.html +0 -0
  105. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/templates/treenode/admin/treenode_rows.html +0 -0
  106. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/templates/treenode/widgets/tree_widget.html +0 -0
  107. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/templatetags/__init__.py +0 -0
  108. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/templatetags/treenode_admin.py +0 -0
  109. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/tests.py +0 -0
  110. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/urls.py +0 -0
  111. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/utils/__init__.py +0 -0
  112. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/utils/db/__init__.py +0 -0
  113. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/utils/db/compiler.py +0 -0
  114. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/utils/db/db_vendor.py +0 -0
  115. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/utils/db/service.py +0 -0
  116. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/utils/db/sqlcompat.py +0 -0
  117. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/utils/db/sqlquery.py +0 -0
  118. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/utils/jwt_auth.py +0 -0
  119. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/views/__init__.py +0 -0
  120. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/views/autoapi.py +0 -0
  121. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/views/autocomplete.py +0 -0
  122. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/views/children.py +0 -0
  123. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/views/crud.py +0 -0
  124. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/views/search.py +0 -0
  125. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.4}/treenode/widgets.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-fast-treenode
3
- Version: 3.2.2
3
+ Version: 3.2.4
4
4
  Summary: Treenode Framework for supporting tree (hierarchical) data structure in Django projects
5
5
  Home-page: https://django-fast-treenode.readthedocs.io/
6
6
  Author: Timur Kady
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-fast-treenode
3
- Version: 3.2.2
3
+ Version: 3.2.4
4
4
  Summary: Treenode Framework for supporting tree (hierarchical) data structure in Django projects
5
5
  Home-page: https://django-fast-treenode.readthedocs.io/
6
6
  Author: Timur Kady
@@ -121,6 +121,13 @@ class Category(TreeNodeModel):
121
121
 
122
122
  This approach ensures full Django integration, efficient queries, and correct hierarchical behavior.
123
123
 
124
+ !!! important
125
+ Do **not** override `Meta.ordering` in models based on `TreeNodeModel`.
126
+ Internal ordering relies on the `_path` field to keep the hierarchy intact
127
+ in the admin interface and elsewhere. To control sibling order, use the
128
+ `sorting_field` attribute instead.
129
+
130
+
124
131
  ---
125
132
 
126
133
  ### Model Extending
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "django-fast-treenode"
7
- version = "3.2.2"
7
+ version = "3.2.4"
8
8
  description = "Treenode Framework for supporting tree (hierarchical) data structure in Django projects"
9
9
  readme = "README.md"
10
10
  authors = [{ name = "Timur Kady", email = "timurkady@yandex.com" }]
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
2
2
 
3
3
  setup(
4
4
  name='django-fast-treenode',
5
- version='3.2.2',
5
+ version='3.2.4',
6
6
  description='Treenode Framework for supporting tree (hierarchical) data structure in Django projects',
7
7
  long_description=open('README.md', encoding='utf-8').read(),
8
8
  long_description_content_type='text/markdown',
@@ -36,6 +36,7 @@ from django.utils.translation import gettext_lazy as _
36
36
 
37
37
  from .mixin import AdminMixin
38
38
  from ..forms import TreeNodeForm
39
+ from ..models import TreeNodeModel
39
40
  from ..widgets import TreeWidget
40
41
  from .importer import TreeNodeImporter
41
42
  from .exporter import TreeNodeExporter
@@ -57,11 +58,6 @@ class TreeNodeModelAdmin(AdminMixin, admin.ModelAdmin):
57
58
  importer_class = None
58
59
  exporter_class = None
59
60
  ordering = []
60
-
61
- formfield_overrides = {
62
- models.ForeignKey: {'widget': TreeWidget()},
63
- }
64
-
65
61
  change_list_template = "treenode/admin/treenode_changelist.html"
66
62
  import_export = True
67
63
 
@@ -175,6 +171,18 @@ class TreeNodeModelAdmin(AdminMixin, admin.ModelAdmin):
175
171
  form.base_fields["parent"].widget = TreeWidget()
176
172
  return form
177
173
 
174
+ def formfield_for_foreignkey(self, db_field, request, **kwargs):
175
+ """Use TreeWidget only for 'parent' field."""
176
+ formfield = super().formfield_for_foreignkey(db_field, request, **kwargs)
177
+
178
+ if db_field.name == "parent":
179
+ related = getattr(db_field.remote_field, "model", None)
180
+ if related and issubclass(related, TreeNodeModel):
181
+ formfield.widget = TreeWidget()
182
+ formfield.widget.model = related
183
+ return formfield
184
+
185
+
178
186
  def get_search_fields(self, request):
179
187
  """Get search fields."""
180
188
  return [getattr(self.model, 'display_field', 'id') or 'id']
@@ -4,9 +4,9 @@ TreeNode Version Module
4
4
 
5
5
  This module defines the current version of the TreeNode package.
6
6
 
7
- Version: 3.2.2
7
+ Version: 3.2.4
8
8
  Author: Timur Kady
9
9
  Email: timurkady@yandex.com
10
10
  """
11
11
 
12
- __version__ = '3.2.2'
12
+ __version__ = '3.2.4'
@@ -1,23 +1,30 @@
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
+ from ..models import TreeNodeModel
14
+
15
+ def get_model_from_request(request):
16
+ """Get model from request."""
17
+ model_label = request.GET.get("model")
18
+ if not model_label:
19
+ raise Http404("Missing 'model' parameter.")
20
+ try:
21
+ app_label, model_name = model_label.lower().split(".")
22
+ model = apps.get_model(app_label, model_name)
23
+ except Exception:
24
+ raise Http404(f"Invalid model format: {model_label}")
25
+
26
+ # Ensure the model is a subclass of TreeNodeModel
27
+ if not issubclass(model, TreeNodeModel):
28
+ raise Http404(f"{model_label} is not a TreeNodeModel.")
29
+
30
+ return model