django-spire 0.16.13__py3-none-any.whl → 0.17.1__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.
Files changed (79) hide show
  1. django_spire/consts.py +1 -1
  2. django_spire/core/management/commands/spire_startapp.py +84 -46
  3. django_spire/core/management/commands/spire_startapp_pkg/__init__.py +60 -0
  4. django_spire/core/management/commands/spire_startapp_pkg/builder.py +91 -0
  5. django_spire/core/management/commands/spire_startapp_pkg/config.py +115 -0
  6. django_spire/core/management/commands/spire_startapp_pkg/filesystem.py +125 -0
  7. django_spire/core/management/commands/spire_startapp_pkg/generator.py +167 -0
  8. django_spire/core/management/commands/spire_startapp_pkg/maps.py +783 -25
  9. django_spire/core/management/commands/spire_startapp_pkg/permissions.py +147 -0
  10. django_spire/core/management/commands/spire_startapp_pkg/processor.py +144 -57
  11. django_spire/core/management/commands/spire_startapp_pkg/registry.py +89 -0
  12. django_spire/core/management/commands/spire_startapp_pkg/reporter.py +245 -108
  13. django_spire/core/management/commands/spire_startapp_pkg/resolver.py +86 -0
  14. django_spire/core/management/commands/spire_startapp_pkg/template/app/__init__.py.template +0 -0
  15. django_spire/core/management/commands/spire_startapp_pkg/template/app/apps.py.template +15 -0
  16. django_spire/core/management/commands/spire_startapp_pkg/template/app/forms.py.template +18 -0
  17. django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/__init__.py.template +0 -0
  18. django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/bots.py.template +18 -0
  19. django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/intel.py.template +7 -0
  20. django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/prompts.py.template +32 -0
  21. django_spire/core/management/commands/spire_startapp_pkg/template/app/migrations/__init__.py.template +0 -0
  22. django_spire/core/management/commands/spire_startapp_pkg/template/app/models.py.template +52 -0
  23. django_spire/core/management/commands/spire_startapp_pkg/template/app/querysets.py.template +20 -0
  24. django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/__init__.py.template +0 -0
  25. django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/seed.py.template +6 -0
  26. django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/seeder.py.template +26 -0
  27. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/__init__.py.template +0 -0
  28. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/factory_service.py.template +12 -0
  29. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/intelligence_service.py.template +12 -0
  30. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/processor_service.py.template +12 -0
  31. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/service.py.template +22 -0
  32. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/transformation_service.py.template +12 -0
  33. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/__init__.py.template +0 -0
  34. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_intelligence/__init__.py.template +0 -0
  35. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_intelligence/test_bots.py.template +8 -0
  36. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_models.py.template +8 -0
  37. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/__init__.py.template +0 -0
  38. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_factory_service.py.template +8 -0
  39. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_intelligence_service.py.template +8 -0
  40. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_processor_service.py.template +8 -0
  41. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_service.py.template +8 -0
  42. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_transformation_service.py.template +8 -0
  43. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/__init__.py.template +0 -0
  44. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/test_form_urls.py.template +8 -0
  45. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/test_page_urls.py.template +8 -0
  46. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/__init__.py.template +0 -0
  47. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/test_form_views.py.template +8 -0
  48. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/test_page_views.py.template +8 -0
  49. django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/__init__.py.template +9 -0
  50. django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/form_urls.py.template +15 -0
  51. django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/page_urls.py.template +11 -0
  52. django_spire/core/management/commands/spire_startapp_pkg/template/app/views/__init__.py.template +0 -0
  53. django_spire/core/management/commands/spire_startapp_pkg/template/app/views/form_views.py.template +134 -0
  54. django_spire/core/management/commands/spire_startapp_pkg/template/app/views/page_views.py.template +44 -0
  55. django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/{spirechildapp_detail_card.html → ${detail_card_template_name}.html.template} +7 -7
  56. django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/{spirechildapp_form_card.html → ${form_card_template_name}.html.template} +2 -2
  57. django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/${list_card_template_name}.html.template +18 -0
  58. django_spire/core/management/commands/spire_startapp_pkg/template/templates/form/{spirechildapp_form.html → ${form_template_name}.html.template} +4 -4
  59. django_spire/core/management/commands/spire_startapp_pkg/template/templates/item/${item_template_name}.html.template +24 -0
  60. django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/{spirechildapp_detail_page.html → ${detail_page_template_name}.html.template} +3 -3
  61. django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/{spirechildapp_form_page.html → ${form_page_template_name}.html.template} +1 -1
  62. django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/{spirechildapp_list_page.html → ${list_page_template_name}.html.template} +2 -2
  63. django_spire/core/management/commands/spire_startapp_pkg/user_input.py +252 -0
  64. django_spire/core/management/commands/spire_startapp_pkg/validator.py +96 -0
  65. django_spire/core/middleware/__init__.py +1 -2
  66. django_spire/profiling/__init__.py +13 -0
  67. django_spire/profiling/middleware/__init__.py +6 -0
  68. django_spire/{core → profiling}/middleware/profiling.py +63 -58
  69. django_spire/profiling/panel.py +345 -0
  70. django_spire/profiling/templates/panel.html +166 -0
  71. {django_spire-0.16.13.dist-info → django_spire-0.17.1.dist-info}/METADATA +1 -1
  72. {django_spire-0.16.13.dist-info → django_spire-0.17.1.dist-info}/RECORD +75 -23
  73. django_spire/core/management/commands/spire_startapp_pkg/constants.py +0 -4
  74. django_spire/core/management/commands/spire_startapp_pkg/manager.py +0 -176
  75. django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/spirechildapp_list_card.html +0 -18
  76. django_spire/core/management/commands/spire_startapp_pkg/template/templates/item/spirechildapp_item.html +0 -24
  77. {django_spire-0.16.13.dist-info → django_spire-0.17.1.dist-info}/WHEEL +0 -0
  78. {django_spire-0.16.13.dist-info → django_spire-0.17.1.dist-info}/licenses/LICENSE.md +0 -0
  79. {django_spire-0.16.13.dist-info → django_spire-0.17.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,6 @@
1
+ from __future__ import annotations
2
+
3
+ from ${module_path}.seeding.seeder import ${seeder_class_name}
4
+
5
+
6
+ ${seeder_class_name}.seed_database(count=10)
@@ -0,0 +1,26 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from django_spire.contrib.seeding import DjangoModelSeeder
6
+
7
+ from ${module_path} import models
8
+
9
+ if TYPE_CHECKING:
10
+ from typing import ClassVar
11
+
12
+
13
+ class ${seeder_class_name}(DjangoModelSeeder):
14
+ """https://django-spire.stratusadv.com/app_guides/seeding/overview/"""
15
+
16
+ model_class = models.${model_class_name}
17
+ default_to = 'faker'
18
+
19
+ fields: ClassVar = {
20
+ 'id': 'exclude',
21
+ 'created_datetime': 'exclude',
22
+ 'is_active': True,
23
+ 'is_deleted': False,
24
+ # 'name': ('faker', 'company'),
25
+ # 'status': ('faker'),
26
+ }
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from django_spire.contrib.service import BaseDjangoModelService
6
+
7
+ if TYPE_CHECKING:
8
+ from ${module_path}.models import ${model_class_name}
9
+
10
+
11
+ class ${factory_service_class_name}(BaseDjangoModelService['${model_class_name}']):
12
+ obj: ${model_class_name}
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from django_spire.contrib.service import BaseDjangoModelService
6
+
7
+ if TYPE_CHECKING:
8
+ from ${module_path}.models import ${model_class_name}
9
+
10
+
11
+ class ${intelligence_service_class_name}(BaseDjangoModelService['${model_class_name}']):
12
+ obj: ${model_class_name}
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from django_spire.contrib.service import BaseDjangoModelService
6
+
7
+ if TYPE_CHECKING:
8
+ from ${module_path}.models import ${model_class_name}
9
+
10
+
11
+ class ${processor_service_class_name}(BaseDjangoModelService['${model_class_name}']):
12
+ obj: ${model_class_name}
@@ -0,0 +1,22 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from django_spire.contrib.service import BaseDjangoModelService
6
+
7
+ from ${module_path}.services.factory_service import ${factory_service_class_name}
8
+ from ${module_path}.services.intelligence_service import ${intelligence_service_class_name}
9
+ from ${module_path}.services.processor_service import ${processor_service_class_name}
10
+ from ${module_path}.services.transformation_service import ${transformation_service_class_name}
11
+
12
+ if TYPE_CHECKING:
13
+ from ${module_path}.models import ${model_class_name}
14
+
15
+
16
+ class ${service_class_name}(BaseDjangoModelService['${model_class_name}']):
17
+ obj: ${model_class_name}
18
+
19
+ intelligence = ${intelligence_service_class_name}()
20
+ processor = ${processor_service_class_name}()
21
+ factory = ${factory_service_class_name}()
22
+ transformation = ${transformation_service_class_name}()
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from django_spire.contrib.service import BaseDjangoModelService
6
+
7
+ if TYPE_CHECKING:
8
+ from ${module_path}.models import ${model_class_name}
9
+
10
+
11
+ class ${transformation_service_class_name}(BaseDjangoModelService['${model_class_name}']):
12
+ obj: ${model_class_name}
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${bot_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${model_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${factory_service_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${intelligence_service_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${processor_service_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${service_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${transformation_service_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${url_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${url_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${view_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,8 @@
1
+ from __future__ import annotations
2
+
3
+ from django_spire.core.tests.test_cases import BaseTestCase
4
+
5
+
6
+ class ${view_test_class_name}(BaseTestCase):
7
+ def setUp(self) -> None:
8
+ super().setUp()
@@ -0,0 +1,9 @@
1
+ from django.urls.conf import include, path
2
+
3
+
4
+ app_name = '${url_namespace}'
5
+
6
+ urlpatterns = [
7
+ path('page/', include('${module_path}.urls.page_urls', namespace='page')),
8
+ path('form/', include('${module_path}.urls.form_urls', namespace='form')),
9
+ ]
@@ -0,0 +1,15 @@
1
+ from django.urls import path
2
+
3
+ from ${module_path}.views import form_views
4
+
5
+
6
+ app_name = 'form'
7
+
8
+ urlpatterns = [
9
+ path('create/', form_views.${create_form_view_name}, name='create'),
10
+ path('<int:pk>/update/', form_views.${update_form_view_name}, name='update'),
11
+ path('<int:pk>/delete/', form_views.${delete_form_view_name}, name='delete'),
12
+ path('create/modal/', form_views.${create_modal_form_view_name}, name='create_modal'),
13
+ path('<int:pk>/update/modal/', form_views.${update_modal_form_view_name}, name='update_modal'),
14
+ path('<int:pk>/delete/modal/', form_views.${delete_modal_form_view_name}, name='delete_modal'),
15
+ ]
@@ -0,0 +1,11 @@
1
+ from django.urls import path
2
+
3
+ from ${module_path}.views import page_views
4
+
5
+
6
+ app_name = 'page'
7
+
8
+ urlpatterns = [
9
+ path('list/', page_views.${list_page_view_name}, name='list'),
10
+ path('<int:pk>/detail/', page_views.${detail_page_view_name}, name='detail'),
11
+ ]
@@ -0,0 +1,134 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from django.contrib.auth.decorators import permission_required
6
+ from django.shortcuts import get_object_or_404, redirect
7
+ from django.template.response import TemplateResponse
8
+ from django.urls import reverse
9
+
10
+ from django_spire.contrib.form.utils import show_form_errors
11
+ from django_spire.contrib.generic_views import modal_views, portal_views
12
+ from django_spire.core.redirect.safe_redirect import safe_redirect_url
13
+ from django_spire.core.shortcuts import get_object_or_null_obj
14
+ from django_spire.history.activity.utils import add_form_activity
15
+
16
+ import django_glue as dg
17
+
18
+ from ${module_path} import forms, models
19
+
20
+ if TYPE_CHECKING:
21
+ from django.core.handlers.wsgi import WSGIRequest
22
+ from django.http import HttpResponseRedirect
23
+
24
+
25
+ @permission_required('${permission_prefix}.delete_${model_instance_name}')
26
+ def ${delete_modal_form_view_name}(request: WSGIRequest, pk: int) -> TemplateResponse:
27
+ ${context_single_var} = get_object_or_404(models.${model_class_name}, pk=pk)
28
+
29
+ form_action = reverse(
30
+ '${url_reverse_path}:form:delete_modal',
31
+ kwargs={'pk': pk}
32
+ )
33
+
34
+ def add_activity() -> None:
35
+ ${context_single_var}.add_activity(
36
+ user=request.user,
37
+ verb='deleted',
38
+ device=request.device,
39
+ information=f'{request.user.get_full_name()} deleted a ${model_instance_name}.'
40
+ )
41
+
42
+ fallback = reverse('${url_reverse_path}:page:list')
43
+ return_url = safe_redirect_url(request, fallback=fallback)
44
+
45
+ return modal_views.dispatch_modal_delete_form_content(
46
+ request,
47
+ obj=${context_single_var},
48
+ form_action=form_action,
49
+ activity_func=add_activity,
50
+ return_url=return_url,
51
+ )
52
+
53
+
54
+ @permission_required('${permission_prefix}.delete_${model_instance_name}')
55
+ def ${delete_form_view_name}(request: WSGIRequest, pk: int) -> TemplateResponse:
56
+ ${context_single_var} = get_object_or_404(models.${model_class_name}, pk=pk)
57
+
58
+ return_url = request.GET.get(
59
+ 'return_url',
60
+ reverse('${url_reverse_path}:page:list')
61
+ )
62
+
63
+ return portal_views.delete_form_view(
64
+ request,
65
+ obj=${context_single_var},
66
+ return_url=return_url
67
+ )
68
+
69
+
70
+ @permission_required('${permission_prefix}.add_${model_instance_name}')
71
+ def ${create_modal_form_view_name}(request: WSGIRequest) -> TemplateResponse:
72
+ return _modal_form_view(request)
73
+
74
+
75
+ @permission_required('${permission_prefix}.change_${model_instance_name}')
76
+ def ${update_modal_form_view_name}(request: WSGIRequest, pk: int) -> TemplateResponse:
77
+ return _modal_form_view(request, pk)
78
+
79
+
80
+ def _modal_form_view(request: WSGIRequest, pk: int = 0) -> TemplateResponse:
81
+ ${context_single_var} = get_object_or_404(models.${model_class_name}, pk=pk)
82
+
83
+ dg.glue_model_object(request, '${glue_model_key}', ${context_single_var})
84
+
85
+ context_data = {
86
+ '${context_single_var}': ${context_single_var}
87
+ }
88
+
89
+ return TemplateResponse(
90
+ request,
91
+ context=context_data,
92
+ template='${template_directory_path}/modal/content/${form_template_name}'
93
+ )
94
+
95
+
96
+ @permission_required('${permission_prefix}.add_${model_instance_name}')
97
+ def ${create_form_view_name}(request: WSGIRequest) -> TemplateResponse:
98
+ return _form_view(request)
99
+
100
+
101
+ @permission_required('${permission_prefix}.change_${model_instance_name}')
102
+ def ${update_form_view_name}(request: WSGIRequest, pk: int) -> TemplateResponse:
103
+ return _form_view(request, pk)
104
+
105
+
106
+ def _form_view(request: WSGIRequest, pk: int = 0) -> TemplateResponse|HttpResponseRedirect:
107
+ ${context_single_var} = get_object_or_null_obj(models.${model_class_name}, pk=pk)
108
+
109
+ dg.glue_model_object(request, '${glue_model_key}', ${context_single_var}, 'view')
110
+
111
+ if request.method == 'POST':
112
+ form = forms.${form_class_name}(request.POST, instance=${context_single_var})
113
+
114
+ if form.is_valid():
115
+ ${context_single_var} = form.save()
116
+ add_form_activity(${context_single_var}, pk, request.user)
117
+
118
+ return redirect(
119
+ request.GET.get(
120
+ 'return_url',
121
+ reverse('${url_reverse_path}:page:list')
122
+ )
123
+ )
124
+
125
+ show_form_errors(request, form)
126
+ else:
127
+ form = forms.${form_class_name}(instance=${context_single_var})
128
+
129
+ return portal_views.form_view(
130
+ request,
131
+ form=form,
132
+ obj=${context_single_var},
133
+ template='${template_directory_path}/page/${form_page_template_name}'
134
+ )
@@ -0,0 +1,44 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from django.contrib.auth.decorators import permission_required
6
+ from django.shortcuts import get_object_or_404
7
+
8
+ from django_spire.contrib.generic_views import portal_views
9
+
10
+ from ${module_path} import models
11
+
12
+ if TYPE_CHECKING:
13
+ from django.core.handlers.wsgi import WSGIRequest
14
+ from django.template.response import TemplateResponse
15
+
16
+
17
+ @permission_required('${permission_prefix}.view_${model_instance_name}')
18
+ def ${detail_page_view_name}(request: WSGIRequest, pk: int) -> TemplateResponse:
19
+ ${context_single_var} = get_object_or_404(models.${model_class_name}, pk=pk)
20
+
21
+ context_data = {
22
+ '${context_single_var}': ${context_single_var},
23
+ }
24
+
25
+ return portal_views.detail_view(
26
+ request,
27
+ obj=${context_single_var},
28
+ context_data=context_data,
29
+ template='${template_directory_path}/page/${detail_page_template_name}'
30
+ )
31
+
32
+
33
+ @permission_required('${permission_prefix}.view_${model_instance_name}')
34
+ def ${list_page_view_name}(request: WSGIRequest) -> TemplateResponse:
35
+ context_data = {
36
+ '${context_plural_var}': models.${model_class_name}.objects.all()
37
+ }
38
+
39
+ return portal_views.list_view(
40
+ request,
41
+ model=models.${model_class_name},
42
+ context_data=context_data,
43
+ template='${template_directory_path}/page/${list_page_template_name}'
44
+ )
@@ -1,24 +1,24 @@
1
1
  {% extends 'django_spire/card/title_card.html' %}
2
2
 
3
3
  {% block card_title %}
4
- spire_model_name
4
+ ${model_verbose_name}
5
5
  {% endblock %}
6
6
 
7
7
  {% block card_button %}
8
- {% if perms.spire_label_path.change_spire_app_name %}
9
- {% url 'spire_parent_app:spire_app_name:page:form' pk=spire_app_name.pk as spire_app_name_edit_url %}
10
- {% include 'django_spire/button/primary_dark_button.html' with button_text='Edit' button_icon='bi bi-pencil' button_href=spire_app_name_edit_url %}
8
+ {% if perms.${permission_prefix}.change_${model_instance_name} %}
9
+ {% url '${url_reverse_path}:form:update' pk=${context_single_var}.pk as ${context_single_var}_edit_url %}
10
+ {% include 'django_spire/button/primary_dark_button.html' with button_text='Edit' button_icon='bi bi-pencil' button_href=${context_single_var}_edit_url %}
11
11
  {% endif %}
12
12
  {% endblock %}
13
13
 
14
14
  {% block card_title_content %}
15
- <div class="row g-3">
15
+ <div class="row g-3">
16
16
  <div class="col-12">
17
- {% include 'django_spire/element/attribute_element.html' with attribute_title='Name' attribute_value=spire_app_name.name %}
17
+ {% include 'django_spire/element/attribute_element.html' with attribute_title='Name' attribute_value=${context_single_var}.name %}
18
18
  </div>
19
19
 
20
20
  <div class="col-12">
21
- {% include 'django_spire/element/attribute_element.html' with attribute_title='Description' attribute_value=spire_app_name.description|linebreaksbr %}
21
+ {% include 'django_spire/element/attribute_element.html' with attribute_title='Description' attribute_value=${context_single_var}.description|linebreaksbr %}
22
22
  </div>
23
23
  </div>
24
24
  {% endblock %}
@@ -1,9 +1,9 @@
1
1
  {% extends 'django_spire/card/title_card.html' %}
2
2
 
3
3
  {% block card_title %}
4
- spire_model_name
4
+ ${model_verbose_name}
5
5
  {% endblock %}
6
6
 
7
7
  {% block card_title_content %}
8
- {% include 'spire_parent_app/spire_app_name/form/spire_app_name_form.html' %}
8
+ {% include '${template_directory_path}/form/${form_template_name}' %}
9
9
  {% endblock %}
@@ -0,0 +1,18 @@
1
+ {% extends 'django_spire/card/title_card.html' %}
2
+
3
+ {% block card_title %}
4
+ ${model_verbose_name_plural}
5
+ {% endblock %}
6
+
7
+ {% block card_button %}
8
+ {% url '${url_reverse_path}:form:create' as new_${context_single_var}_url %}
9
+ {% include 'django_spire/button/primary_dark_button.html' with button_text='Add' button_icon='bi bi-plus' button_href=new_${context_single_var}_url %}
10
+ {% endblock %}
11
+
12
+ {% block card_title_content %}
13
+ {% for ${context_single_var} in ${context_plural_var} %}
14
+ {% include '${template_directory_path}/item/${item_template_name}' %}
15
+ {% empty %}
16
+ {% include 'django_spire/item/no_data_item.html' %}
17
+ {% endfor %}
18
+ {% endblock %}
@@ -1,20 +1,20 @@
1
1
  <div
2
2
  x-data="{
3
3
  async init() {
4
- await this.placeholder.get()
4
+ await this.${glue_model_key}.get()
5
5
  },
6
- placeholder: new ModelObjectGlue('placeholder')
6
+ ${glue_model_key}: new ModelObjectGlue('${glue_model_key}')
7
7
  }"
8
8
  >
9
9
  {% include 'django_spire/element/divider_element.html' with divider_title='Details' %}
10
10
 
11
11
  <div class="row g-3 mb-3">
12
12
  <div class="col-12">
13
- {% include 'django_glue/form/field/char_field.html' with glue_model_field='placeholder.name' %}
13
+ {% include 'django_glue/form/field/char_field.html' with glue_model_field='${glue_model_key}.name' %}
14
14
  </div>
15
15
 
16
16
  <div class="col-12">
17
- {% include 'django_glue/form/field/text_field.html' with glue_model_field='placeholder.description' %}
17
+ {% include 'django_glue/form/field/text_field.html' with glue_model_field='${glue_model_key}.description' %}
18
18
  </div>
19
19
  </div>
20
20
  </div>
@@ -0,0 +1,24 @@
1
+ {% extends 'django_spire/item/item.html' %}
2
+
3
+ {% block item_title %}
4
+ {% url '${url_reverse_path}:page:detail' pk=${context_single_var}.pk as ${context_single_var}_view_url %}
5
+ {% include 'django_spire/element/attribute_element.html' with attribute_title='${model_verbose_name}' attribute_value=${context_single_var}.name attribute_href=${context_single_var}_view_url %}
6
+ {% endblock %}
7
+
8
+ {% block item_row_content %}
9
+ {% include 'django_spire/element/attribute_element.html' with attribute_title='Description' attribute_value=${context_single_var}.description %}
10
+ {% endblock %}
11
+
12
+ {% block item_button %}
13
+ {% url '${url_reverse_path}:page:detail' pk=${context_single_var}.pk as ${context_single_var}_view_url %}
14
+
15
+ {% if perms.${permission_prefix}.change_${model_instance_name} %}
16
+ {% url '${url_reverse_path}:form:update' pk=${context_single_var}.pk as ${context_single_var}_edit_url %}
17
+ {% endif %}
18
+
19
+ {% if perms.${permission_prefix}.delete_${model_instance_name} %}
20
+ {% url '${url_reverse_path}:form:delete' pk=${context_single_var}.pk as ${context_single_var}_delete_url %}
21
+ {% endif %}
22
+
23
+ {% include 'django_spire/dropdown/ellipsis_dropdown.html' with view_url=${context_single_var}_view_url edit_url=${context_single_var}_edit_url delete_url=${context_single_var}_delete_url %}
24
+ {% endblock %}
@@ -1,13 +1,13 @@
1
1
  {% extends 'django_spire/page/full_page.html' %}
2
2
 
3
3
  {% block page_content %}
4
- <div class="row g-3">
4
+ <div class="row g-3">
5
5
  <div class="col-12">
6
- {% include 'spire_parent_app/spire_app_name/card/spire_app_name_detail_card.html' %}
6
+ {% include '${template_directory_path}/card/${detail_card_template_name}' %}
7
7
  </div>
8
8
 
9
9
  <div class="col-4">
10
- {% include 'history/card/activity_list_card.html' with activity_log=spire_app_name.activity_log.prefetch_user %}
10
+ {% include 'history/card/activity_list_card.html' with activity_log=${context_single_var}.activity_log.prefetch_user %}
11
11
  </div>
12
12
  </div>
13
13
  {% endblock %}
@@ -6,7 +6,7 @@
6
6
 
7
7
  <div class="row g-3">
8
8
  <div class="col-12">
9
- {% include 'placeholder/card/placeholder_form_card.html' %}
9
+ {% include '${template_directory_path}/card/${form_card_template_name}' %}
10
10
  </div>
11
11
  </div>
12
12
  </form>
@@ -1,9 +1,9 @@
1
1
  {% extends 'django_spire/page/full_page.html' %}
2
2
 
3
3
  {% block page_content %}
4
- <div class="row">
4
+ <div class="row">
5
5
  <div class="col-12">
6
- {% include 'placeholder/card/placeholder_list_card.html' %}
6
+ {% include '${template_directory_path}/card/${list_card_template_name}' %}
7
7
  </div>
8
8
  </div>
9
9
  {% endblock %}