django-fast-treenode 3.2.2__tar.gz → 3.2.3__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.3}/PKG-INFO +1 -1
  2. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3/django_fast_treenode.egg-info}/PKG-INFO +1 -1
  3. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/models.md +7 -0
  4. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/pyproject.toml +1 -1
  5. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/setup.py +1 -1
  6. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/admin/admin.py +12 -5
  7. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/version.py +2 -2
  8. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/views/common.py +29 -23
  9. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/LICENSE +0 -0
  10. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/MANIFEST.in +0 -0
  11. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/README.md +0 -0
  12. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/django_fast_treenode.egg-info/SOURCES.txt +0 -0
  13. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/django_fast_treenode.egg-info/dependency_links.txt +0 -0
  14. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/django_fast_treenode.egg-info/requires.txt +0 -0
  15. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/django_fast_treenode.egg-info/top_level.txt +0 -0
  16. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/.gitignore +0 -0
  17. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/.nojekyll +0 -0
  18. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/about.md +0 -0
  19. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/admin.md +0 -0
  20. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/api.md +0 -0
  21. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/apifirst.md +0 -0
  22. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/cache.md +0 -0
  23. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/customization.md +0 -0
  24. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/dnd.md +0 -0
  25. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/import_export.md +0 -0
  26. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/index.md +0 -0
  27. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/insert-after.jpg +0 -0
  28. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/insert-as-child.jpg +0 -0
  29. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/installation.md +0 -0
  30. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/migration.md +0 -0
  31. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/requirements.txt +0 -0
  32. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/roadmap.md +0 -0
  33. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/docs/using.md +0 -0
  34. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/setup.cfg +0 -0
  35. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/tests/test_suite.py +0 -0
  36. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/__init__.py +0 -0
  37. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/admin/__init__.py +0 -0
  38. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/admin/changelist.py +0 -0
  39. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/admin/exporter.py +0 -0
  40. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/admin/importer.py +0 -0
  41. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/admin/mixin.py +0 -0
  42. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/apps.py +0 -0
  43. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/cache.py +0 -0
  44. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/forms.py +0 -0
  45. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/managers/__init__.py +0 -0
  46. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/managers/managers.py +0 -0
  47. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/managers/queries.py +0 -0
  48. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/managers/tasks.py +0 -0
  49. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/__init__.py +0 -0
  50. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/decorators.py +0 -0
  51. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/factory.py +0 -0
  52. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/__init__.py +0 -0
  53. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/ancestors.py +0 -0
  54. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/children.py +0 -0
  55. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/descendants.py +0 -0
  56. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/family.py +0 -0
  57. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/logical.py +0 -0
  58. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/node.py +0 -0
  59. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/properties.py +0 -0
  60. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/roots.py +0 -0
  61. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/search.py +0 -0
  62. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/siblings.py +0 -0
  63. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/tree.py +0 -0
  64. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/mixins/update.py +0 -0
  65. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/models/models.py +0 -0
  66. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/settings.py +0 -0
  67. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/signals.py +0 -0
  68. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/.gitkeep +0 -0
  69. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/.gitkeep +0 -0
  70. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/css/.gitkeep +0 -0
  71. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/css/tree_widget.css +0 -0
  72. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/css/treenode_admin.css +0 -0
  73. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/css/treenode_tabs.css +0 -0
  74. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/js/.gitkeep +0 -0
  75. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/js/lz-string.min.js +0 -0
  76. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/js/tree_widget.js +0 -0
  77. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/js/treenode_admin.js +0 -0
  78. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/vendors/.gitkeep +0 -0
  79. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/vendors/jquery-ui/.gitkeep +0 -0
  80. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/vendors/jquery-ui/AUTHORS.txt +0 -0
  81. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/vendors/jquery-ui/LICENSE.txt +0 -0
  82. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/vendors/jquery-ui/external/jquery/jquery.js +0 -0
  83. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/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.3}/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.3}/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.3}/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.3}/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.3}/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.3}/treenode/static/treenode/vendors/jquery-ui/index.html +0 -0
  90. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.css +0 -0
  91. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.js +0 -0
  92. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.min.css +0 -0
  93. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.min.js +0 -0
  94. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.structure.css +0 -0
  95. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/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.3}/treenode/static/treenode/vendors/jquery-ui/jquery-ui.theme.css +0 -0
  97. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/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.3}/treenode/static/treenode/vendors/jquery-ui/package.json +0 -0
  99. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/templates/.gitkeep +0 -0
  100. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/templates/treenode/.gitkeep +0 -0
  101. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/templates/treenode/admin/.gitkeep +0 -0
  102. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/templates/treenode/admin/treenode_ajax_rows.html +0 -0
  103. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/templates/treenode/admin/treenode_changelist.html +0 -0
  104. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/templates/treenode/admin/treenode_import_export.html +0 -0
  105. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/templates/treenode/admin/treenode_rows.html +0 -0
  106. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/templates/treenode/widgets/tree_widget.html +0 -0
  107. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/templatetags/__init__.py +0 -0
  108. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/templatetags/treenode_admin.py +0 -0
  109. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/tests.py +0 -0
  110. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/urls.py +0 -0
  111. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/utils/__init__.py +0 -0
  112. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/utils/db/__init__.py +0 -0
  113. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/utils/db/compiler.py +0 -0
  114. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/utils/db/db_vendor.py +0 -0
  115. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/utils/db/service.py +0 -0
  116. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/utils/db/sqlcompat.py +0 -0
  117. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/utils/db/sqlquery.py +0 -0
  118. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/utils/jwt_auth.py +0 -0
  119. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/views/__init__.py +0 -0
  120. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/views/autoapi.py +0 -0
  121. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/views/autocomplete.py +0 -0
  122. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/views/children.py +0 -0
  123. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/views/crud.py +0 -0
  124. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/treenode/views/search.py +0 -0
  125. {django_fast_treenode-3.2.2 → django_fast_treenode-3.2.3}/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.3
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.3
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.3"
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.3',
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',
@@ -57,11 +57,6 @@ class TreeNodeModelAdmin(AdminMixin, admin.ModelAdmin):
57
57
  importer_class = None
58
58
  exporter_class = None
59
59
  ordering = []
60
-
61
- formfield_overrides = {
62
- models.ForeignKey: {'widget': TreeWidget()},
63
- }
64
-
65
60
  change_list_template = "treenode/admin/treenode_changelist.html"
66
61
  import_export = True
67
62
 
@@ -175,6 +170,18 @@ class TreeNodeModelAdmin(AdminMixin, admin.ModelAdmin):
175
170
  form.base_fields["parent"].widget = TreeWidget()
176
171
  return form
177
172
 
173
+ def formfield_for_foreignkey(self, db_field, request, **kwargs):
174
+ """Use TreeWidget only for 'parent' field."""
175
+ formfield = super().formfield_for_foreignkey(db_field, request, **kwargs)
176
+
177
+ if db_field.name == "parent":
178
+ related = getattr(db_field.remote_field, "model", None)
179
+ if related and issubclass(related, TreeNodeModel):
180
+ formfield.widget = TreeWidget()
181
+ formfield.widget.model = related
182
+ return formfield
183
+
184
+
178
185
  def get_search_fields(self, request):
179
186
  """Get search fields."""
180
187
  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.3
8
8
  Author: Timur Kady
9
9
  Email: timurkady@yandex.com
10
10
  """
11
11
 
12
- __version__ = '3.2.2'
12
+ __version__ = '3.2.3'
@@ -1,23 +1,29 @@
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
+
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
+ model = apps.get_model(app_label, model_name)
22
+ except Exception:
23
+ raise Http404(f"Invalid model format: {model_label}")
24
+
25
+ # Ensure the model is a subclass of TreeNodeModel
26
+ if not issubclass(model, TreeNodeModel):
27
+ raise Http404(f"{model_label} is not a TreeNodeModel.")
28
+
29
+ return model