django-spire 0.17.0__py3-none-any.whl → 0.17.2__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 (56) hide show
  1. django_spire/ai/prompt/system/bots.py +9 -9
  2. django_spire/consts.py +1 -1
  3. django_spire/core/management/commands/spire_startapp_pkg/template/app/__init__.py.template +0 -0
  4. django_spire/core/management/commands/spire_startapp_pkg/template/app/apps.py.template +15 -0
  5. django_spire/core/management/commands/spire_startapp_pkg/template/app/forms.py.template +18 -0
  6. django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/__init__.py.template +0 -0
  7. django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/bots.py.template +18 -0
  8. django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/intel.py.template +7 -0
  9. django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/prompts.py.template +32 -0
  10. django_spire/core/management/commands/spire_startapp_pkg/template/app/migrations/__init__.py.template +0 -0
  11. django_spire/core/management/commands/spire_startapp_pkg/template/app/models.py.template +52 -0
  12. django_spire/core/management/commands/spire_startapp_pkg/template/app/querysets.py.template +20 -0
  13. django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/__init__.py.template +0 -0
  14. django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/seed.py.template +6 -0
  15. django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/seeder.py.template +26 -0
  16. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/__init__.py.template +0 -0
  17. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/factory_service.py.template +12 -0
  18. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/intelligence_service.py.template +12 -0
  19. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/processor_service.py.template +12 -0
  20. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/service.py.template +22 -0
  21. django_spire/core/management/commands/spire_startapp_pkg/template/app/services/transformation_service.py.template +12 -0
  22. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/__init__.py.template +0 -0
  23. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_intelligence/__init__.py.template +0 -0
  24. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_intelligence/test_bots.py.template +8 -0
  25. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_models.py.template +8 -0
  26. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/__init__.py.template +0 -0
  27. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_factory_service.py.template +8 -0
  28. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_intelligence_service.py.template +8 -0
  29. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_processor_service.py.template +8 -0
  30. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_service.py.template +8 -0
  31. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_transformation_service.py.template +8 -0
  32. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/__init__.py.template +0 -0
  33. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/test_form_urls.py.template +8 -0
  34. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/test_page_urls.py.template +8 -0
  35. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/__init__.py.template +0 -0
  36. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/test_form_views.py.template +8 -0
  37. django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/test_page_views.py.template +8 -0
  38. django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/__init__.py.template +9 -0
  39. django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/form_urls.py.template +15 -0
  40. django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/page_urls.py.template +11 -0
  41. django_spire/core/management/commands/spire_startapp_pkg/template/app/views/__init__.py.template +0 -0
  42. django_spire/core/management/commands/spire_startapp_pkg/template/app/views/form_views.py.template +134 -0
  43. django_spire/core/management/commands/spire_startapp_pkg/template/app/views/page_views.py.template +44 -0
  44. django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/${detail_card_template_name}.html.template +24 -0
  45. django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/${form_card_template_name}.html.template +9 -0
  46. django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/${list_card_template_name}.html.template +18 -0
  47. django_spire/core/management/commands/spire_startapp_pkg/template/templates/form/${form_template_name}.html.template +22 -0
  48. django_spire/core/management/commands/spire_startapp_pkg/template/templates/item/${item_template_name}.html.template +24 -0
  49. django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/${detail_page_template_name}.html.template +13 -0
  50. django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/${form_page_template_name}.html.template +13 -0
  51. django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/${list_page_template_name}.html.template +9 -0
  52. {django_spire-0.17.0.dist-info → django_spire-0.17.2.dist-info}/METADATA +2 -2
  53. {django_spire-0.17.0.dist-info → django_spire-0.17.2.dist-info}/RECORD +56 -7
  54. {django_spire-0.17.0.dist-info → django_spire-0.17.2.dist-info}/WHEEL +0 -0
  55. {django_spire-0.17.0.dist-info → django_spire-0.17.2.dist-info}/licenses/LICENSE.md +0 -0
  56. {django_spire-0.17.0.dist-info → django_spire-0.17.2.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from dandy import Bot, LlmConfigOptions
3
+ from dandy import Bot, LlmConfigOptions, recorder_to_html_file
4
4
 
5
5
  from django_spire.ai.prompt.system import prompts
6
6
  from django_spire.ai.prompt.system import intel
@@ -60,15 +60,15 @@ class SystemPromptBot(Bot):
60
60
  guidelines_bot = GuidelinesSystemPromptBot()
61
61
  output_format_bot = OutputFormatSystemPromptBot()
62
62
 
63
- role_future = role_bot.process_to_future(user_story)
64
- task_future = task_bot.process_to_future(user_story)
65
- guidelines_future = guidelines_bot.process_to_future(user_story)
66
- output_format_future = output_format_bot.process_to_future(user_story)
63
+ # role_future = role_bot.process_to_future(user_story)
64
+ # task_future = task_bot.process_to_future(user_story)
65
+ # guidelines_future = guidelines_bot.process_to_future(user_story)
66
+ # output_format_future = output_format_bot.process_to_future(user_story)
67
67
 
68
- role = role_future.result
69
- task = task_future.result
70
- guidelines = guidelines_future.result
71
- output_format = output_format_future.result
68
+ role = role_bot.process(user_story)
69
+ task = task_bot.process(user_story)
70
+ guidelines = guidelines_bot.process(user_story)
71
+ output_format = output_format_bot.process(user_story)
72
72
 
73
73
  return SystemPromptIntel(
74
74
  role=role.result,
django_spire/consts.py CHANGED
@@ -1,4 +1,4 @@
1
- __VERSION__ = '0.17.0'
1
+ __VERSION__ = '0.17.2'
2
2
 
3
3
 
4
4
  AI_CHAT_WORKFLOW_SENDER_SETTINGS_NAME = 'AI_CHAT_WORKFLOW_NAME'
@@ -0,0 +1,15 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class ${app_config_class_name}(AppConfig):
5
+ default_auto_field = 'django.db.models.BigAutoField'
6
+ label = '${django_label}'
7
+ name = '${module_path}'
8
+
9
+ MODEL_PERMISSIONS = (
10
+ {
11
+ 'name': '${permission_name}',
12
+ 'model_class_path': '${model_class_path}',
13
+ 'is_proxy_model': ${is_proxy_model}
14
+ },
15
+ )
@@ -0,0 +1,18 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from django import forms
6
+
7
+ from ${module_path} import models
8
+
9
+ if TYPE_CHECKING:
10
+ from typing import ClassVar
11
+
12
+
13
+ class ${form_class_name}(forms.ModelForm):
14
+ field = forms.JSONField(required=False)
15
+
16
+ class Meta:
17
+ model = models.${model_class_name}
18
+ exclude: ClassVar = []
@@ -0,0 +1,18 @@
1
+ from __future__ import annotations
2
+
3
+ from dandy import Bot
4
+
5
+ from ${module_path}.intelligence import intel, prompts
6
+
7
+
8
+ class ${bot_class_name}(Bot):
9
+ llm_intel_class = intel.${intel_class_name}
10
+ llm_role = prompts.${instruction_prompt_function_name}()
11
+
12
+ def process(
13
+ self,
14
+ user_input: str
15
+ ) -> intel.${intel_class_name}:
16
+ return self.llm.prompt_to_intel(
17
+ prompt=prompts.${user_input_prompt_function_name}(user_input)
18
+ )
@@ -0,0 +1,7 @@
1
+ from __future__ import annotations
2
+
3
+ from dandy import BaseIntel
4
+
5
+
6
+ class ${intel_class_name}(BaseIntel):
7
+ data: dict
@@ -0,0 +1,32 @@
1
+ from __future__ import annotations
2
+
3
+ from dandy import Prompt
4
+
5
+
6
+ def ${instruction_prompt_function_name}() -> Prompt:
7
+ return (
8
+ Prompt()
9
+ .title('${model_verbose_name} Operations')
10
+ .line_break()
11
+ .heading('Purpose')
12
+ .text('This prompt provides instructions for ${model_verbose_name} operations.')
13
+ .line_break()
14
+ .heading('Instructions')
15
+ .ordered_list([
16
+ 'Instruction 1',
17
+ 'Instruction 2',
18
+ 'Instruction 3',
19
+ ])
20
+ .line_break()
21
+ )
22
+
23
+
24
+ def ${user_input_prompt_function_name}(user_input: str) -> Prompt:
25
+ return (
26
+ Prompt()
27
+ .heading('${model_verbose_name} Request')
28
+ .text('The user wants to perform the following operation:')
29
+ .text('')
30
+ .text(user_input)
31
+ .text('')
32
+ )
@@ -0,0 +1,52 @@
1
+ from __future__ import annotations
2
+
3
+ from django.db import models
4
+ from django.urls import reverse
5
+
6
+ from django_spire.contrib.breadcrumb import Breadcrumbs
7
+ from django_spire.history.mixins import HistoryModelMixin
8
+
9
+ from ${module_path} import querysets
10
+ from ${module_path}.services.service import ${service_class_name}
11
+
12
+
13
+ class ${model_class_name}(HistoryModelMixin):
14
+ name = models.CharField(max_length=255)
15
+ description = models.TextField(default='')
16
+
17
+ objects = querysets.${queryset_class_name}().as_manager()
18
+ services = ${service_class_name}()
19
+
20
+ def __str__(self):
21
+ return self.name
22
+
23
+ @classmethod
24
+ def base_breadcrumb(cls) -> Breadcrumbs:
25
+ crumbs = Breadcrumbs()
26
+
27
+ crumbs.add_breadcrumb(
28
+ '${model_verbose_name}',
29
+ reverse('${url_reverse_path}:page:list')
30
+ )
31
+
32
+ return crumbs
33
+
34
+ def breadcrumbs(self) -> Breadcrumbs:
35
+ crumbs = Breadcrumbs()
36
+ crumbs.add_base_breadcrumb(self._meta.model)
37
+
38
+ if self.pk:
39
+ crumbs.add_breadcrumb(
40
+ str(self),
41
+ reverse(
42
+ '${url_reverse_path}:page:detail',
43
+ kwargs={'pk': self.pk}
44
+ )
45
+ )
46
+
47
+ return crumbs
48
+
49
+ class Meta:
50
+ verbose_name = '${model_verbose_name}'
51
+ verbose_name_plural = '${model_verbose_name_plural}'
52
+ db_table = '${db_table_name}'
@@ -0,0 +1,20 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import TYPE_CHECKING
4
+
5
+ from django.db.models import Q
6
+
7
+ from django_spire.history.querysets import HistoryQuerySet
8
+
9
+ if TYPE_CHECKING:
10
+ from django.db.models import QuerySet
11
+
12
+ from ${module_path}.models import ${model_class_name}
13
+
14
+
15
+ class ${queryset_class_name}(HistoryQuerySet):
16
+ def search(self, search_value: str) -> QuerySet[${model_class_name}]:
17
+ return self.filter(
18
+ Q(name__icontains=search_value) |
19
+ Q(description__icontains=search_value)
20
+ )
@@ -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
+ )
@@ -0,0 +1,24 @@
1
+ {% extends 'django_spire/card/title_card.html' %}
2
+
3
+ {% block card_title %}
4
+ ${model_verbose_name}
5
+ {% endblock %}
6
+
7
+ {% block card_button %}
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
+ {% endif %}
12
+ {% endblock %}
13
+
14
+ {% block card_title_content %}
15
+ <div class="row g-3">
16
+ <div class="col-12">
17
+ {% include 'django_spire/element/attribute_element.html' with attribute_title='Name' attribute_value=${context_single_var}.name %}
18
+ </div>
19
+
20
+ <div class="col-12">
21
+ {% include 'django_spire/element/attribute_element.html' with attribute_title='Description' attribute_value=${context_single_var}.description|linebreaksbr %}
22
+ </div>
23
+ </div>
24
+ {% endblock %}
@@ -0,0 +1,9 @@
1
+ {% extends 'django_spire/card/title_card.html' %}
2
+
3
+ {% block card_title %}
4
+ ${model_verbose_name}
5
+ {% endblock %}
6
+
7
+ {% block card_title_content %}
8
+ {% include '${template_directory_path}/form/${form_template_name}' %}
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 %}
@@ -0,0 +1,22 @@
1
+ <div
2
+ x-data="{
3
+ async init() {
4
+ await this.${glue_model_key}.get()
5
+ },
6
+ ${glue_model_key}: new ModelObjectGlue('${glue_model_key}')
7
+ }"
8
+ >
9
+ {% include 'django_spire/element/divider_element.html' with divider_title='Details' %}
10
+
11
+ <div class="row g-3 mb-3">
12
+ <div class="col-12">
13
+ {% include 'django_glue/form/field/char_field.html' with glue_model_field='${glue_model_key}.name' %}
14
+ </div>
15
+
16
+ <div class="col-12">
17
+ {% include 'django_glue/form/field/text_field.html' with glue_model_field='${glue_model_key}.description' %}
18
+ </div>
19
+ </div>
20
+ </div>
21
+
22
+ {% include 'django_spire/contrib/form/button/form_submit_button.html' %}
@@ -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 %}
@@ -0,0 +1,13 @@
1
+ {% extends 'django_spire/page/full_page.html' %}
2
+
3
+ {% block page_content %}
4
+ <div class="row g-3">
5
+ <div class="col-12">
6
+ {% include '${template_directory_path}/card/${detail_card_template_name}' %}
7
+ </div>
8
+
9
+ <div class="col-4">
10
+ {% include 'history/card/activity_list_card.html' with activity_log=${context_single_var}.activity_log.prefetch_user %}
11
+ </div>
12
+ </div>
13
+ {% endblock %}
@@ -0,0 +1,13 @@
1
+ {% extends 'django_spire/page/form_full_page.html' %}
2
+
3
+ {% block page_content %}
4
+ <form method="post">
5
+ {% csrf_token %}
6
+
7
+ <div class="row g-3">
8
+ <div class="col-12">
9
+ {% include '${template_directory_path}/card/${form_card_template_name}' %}
10
+ </div>
11
+ </div>
12
+ </form>
13
+ {% endblock %}
@@ -0,0 +1,9 @@
1
+ {% extends 'django_spire/page/full_page.html' %}
2
+
3
+ {% block page_content %}
4
+ <div class="row">
5
+ <div class="col-12">
6
+ {% include '${template_directory_path}/card/${list_card_template_name}' %}
7
+ </div>
8
+ </div>
9
+ {% endblock %}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-spire
3
- Version: 0.17.0
3
+ Version: 0.17.2
4
4
  Summary: A project for Django Spire
5
5
  Author-email: Brayden Carlson <braydenc@stratusadv.com>, Nathan Johnson <nathanj@stratusadv.com>
6
6
  License: Copyright (c) 2024 Stratus Advanced Technologies and Contributors.
@@ -48,7 +48,7 @@ License-File: LICENSE.md
48
48
  Requires-Dist: boto3>=1.34.0
49
49
  Requires-Dist: botocore>=1.34.0
50
50
  Requires-Dist: crispy-bootstrap5==2024.10
51
- Requires-Dist: dandy==1.1.0
51
+ Requires-Dist: dandy==1.1.2
52
52
  Requires-Dist: django>=5.1.8
53
53
  Requires-Dist: django-crispy-forms==2.3
54
54
  Requires-Dist: django-glue>=0.8.1
@@ -1,6 +1,6 @@
1
1
  django_spire/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  django_spire/conf.py,sha256=EYC1hXqYqheYrb_b6Q93LrSgNl91JV633E4N5j-KGTo,1012
3
- django_spire/consts.py,sha256=fGGLMXMV9HZCluwzPHZ9ijrXLb_jLrCjzG0u1BEIV3k,390
3
+ django_spire/consts.py,sha256=Odz5gEKCZA69khacAP5BT2hpe_nlJ5JA9f2EFViqG1A,390
4
4
  django_spire/exceptions.py,sha256=L5ndRO5ftMmh0pHkO2z_NG3LSGZviJ-dDHNT73SzTNw,48
5
5
  django_spire/settings.py,sha256=tGxgEri3TQRBaiwX7YRcWifMf_g1xv1RznplFR6zZnI,821
6
6
  django_spire/urls.py,sha256=mKeZszb5U4iIGqddMb5Tt5fRC72U2wABEOi6mvOfEBU,656
@@ -76,7 +76,7 @@ django_spire/ai/prompt/intel.py,sha256=_R0CVYbAKK0Yt-hDuqTQ6GO9f8NuypdTMjnIEcodY
76
76
  django_spire/ai/prompt/prompts.py,sha256=9zSxB8xGgeut5wHRKQNBBe7cbM1Oddx4v_tlGx2HRYE,4501
77
77
  django_spire/ai/prompt/text_to_prompt_cli.py,sha256=JCybqfz0W3OC1AMXYOQY-MRklIEM51Cbs-tx0ceUvdc,193
78
78
  django_spire/ai/prompt/system/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
- django_spire/ai/prompt/system/bots.py,sha256=zPvUrURRGPWkh3Ws89fPTpGe7QQEossW0Gc5SW5ygX8,2771
79
+ django_spire/ai/prompt/system/bots.py,sha256=w1Y3Ggnoc-clfUzeGxcILOmSDwPcTHdCvJ4n-65-C74,2842
80
80
  django_spire/ai/prompt/system/intel.py,sha256=FYlZML66cL9tFHLMePKi1WAPkRlpHl6XlAbcaKCVX_c,836
81
81
  django_spire/ai/prompt/system/prompts.py,sha256=pjz3S_rfFeqgGvDjIj_qJ7faE3-N1RvZhyZ7l0bN6-Q,7632
82
82
  django_spire/ai/prompt/system/system_prompt_cli.py,sha256=ymO4yB9TLCguc38qYUTf2ouKAheOFy-Uz2tqre-Ay_w,1283
@@ -423,6 +423,55 @@ django_spire/core/management/commands/spire_startapp_pkg/resolver.py,sha256=-y86
423
423
  django_spire/core/management/commands/spire_startapp_pkg/user_input.py,sha256=VUyY9PrqM07vRvgbVJhkC4lgNolnBik3K8S_8U9s_zM,9518
424
424
  django_spire/core/management/commands/spire_startapp_pkg/validator.py,sha256=cVzQqaShGZ0ae-M69tHFDgXlYBmtR2Zg0zblIj55-Nc,3404
425
425
  django_spire/core/management/commands/spire_startapp_pkg/template/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
426
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
427
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/apps.py.template,sha256=hry02l60eqkUVUraogSZ9XRoZAFqrUkJw51U0KOcBuc,393
428
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/forms.py.template,sha256=zdHsuTjk_fM2s7o0_JgcHioIZKxBcmo4vziHXYEYHmA,361
429
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/models.py.template,sha256=U5-5feDcgy63uPiuxm5mwrtsoC61ExAIyhK1c-pK3iY,1406
430
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/querysets.py.template,sha256=my06IPSuiyKw1Goj7-cAMWRIRWDSY0RFpkrmFYLwuiE,539
431
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
432
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/bots.py.template,sha256=jd6AhAhEU_e0QmIX7uMUDnvjSRJ6TU9kV8-rv2NXJ5k,472
433
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/intel.py.template,sha256=byeizQFWtrhcnEOaSIpRfm12vo1ZyhoMcH6EjxBptWU,119
434
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/prompts.py.template,sha256=1FxXSCC5V2fQexyHWfoOsepNngxe49_tv7DEykA2xPQ,826
435
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/migrations/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
436
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
437
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/seed.py.template,sha256=M7EqfGNfjkgM6Fq4CeWhSDaD6cvbRLY_iX0pjuH57rU,146
438
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/seeder.py.template,sha256=LSSdIsbPpsXcLrRi0sSzz1NjxM-6nEtG7EGdawlLhiY,633
439
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/services/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
440
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/services/factory_service.py.template,sha256=yWvLFT6G0hLUOYafp9UwLmmHY0j1OYHgHfqpCZ0glso,326
441
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/services/intelligence_service.py.template,sha256=FHjE-Gm4bJ6V7ksb7HObo-gvB8tuceAxct7kvYM57mg,331
442
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/services/processor_service.py.template,sha256=IGs5kH4_tnKJLe6u30KVs-Ky1zWbUHM3EXQbAiSWR5U,328
443
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/services/service.py.template,sha256=aakNxhOJC4_uzz_7DSgzIMy-kKXau6lZnUrKLQqT4bg,888
444
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/services/transformation_service.py.template,sha256=KziILbCSErJLR5yet_uQPpZdjqNn_jdz61wzGkzsYLY,333
445
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
446
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_models.py.template,sha256=SI9aMtCJinF0dV_oEqhMe6T-cS_yxXpe0EJbZKZCZxY,197
447
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_intelligence/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
448
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_intelligence/test_bots.py.template,sha256=CRb3mM0PwsYhzBbjZKTtqnX6NuVWEy4GHS_VLjZ4ftg,195
449
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
450
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_factory_service.py.template,sha256=oE5XfkPYG14ol3yBrXlGgIsZX-OwCxnJfG8f2RVIDFg,207
451
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_intelligence_service.py.template,sha256=tHECog2BMvHPBvreCIS1SaLI6w9eTTZAUcP91M89878,212
452
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_processor_service.py.template,sha256=QkDbgr8_JQv71FZa_supA08KjAqP8KeWxdew8IWWJz4,209
453
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_service.py.template,sha256=_Wu60zUWEigP4laPamAv0EpzJKTNV3LTq8jIz8QpGmQ,199
454
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_transformation_service.py.template,sha256=XdQYL1abaeKHC3kCRIQOmmZ9OUW0TKr255WcRwBT6AU,214
455
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
456
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/test_form_urls.py.template,sha256=JluI4IZYqetiqOTYDi9ohSK6w8Yj8D36A9DA7zLSURo,195
457
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/test_page_urls.py.template,sha256=JluI4IZYqetiqOTYDi9ohSK6w8Yj8D36A9DA7zLSURo,195
458
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
459
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/test_form_views.py.template,sha256=ZXbAwKt9jl9Wv_ho-DoBQGdhRpPXld7PFbIFWfPLCMo,196
460
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/test_page_views.py.template,sha256=ZXbAwKt9jl9Wv_ho-DoBQGdhRpPXld7PFbIFWfPLCMo,196
461
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/__init__.py.template,sha256=oLUVg3_pnCtG-wRGA38vmLU7J__SIw1xUtrhi0EvlQI,252
462
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/form_urls.py.template,sha256=D2ReVjflX_ZIVU3xGJzokHWnWdwpLEfW92gAMQxo-Pw,641
463
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/page_urls.py.template,sha256=f3y2mJCP92HrLMw37T7xSUc1E6Ky8ZnqiFIzJYnM3jc,262
464
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/views/__init__.py.template,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
465
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/views/form_views.py.template,sha256=KWvIdPrhfPdpvuJMHYvoUQXi1_ngUeSx28OX691JO10,4538
466
+ django_spire/core/management/commands/spire_startapp_pkg/template/app/views/page_views.py.template,sha256=h1MBeRmY7c3bioVp46zHwTINtHYJ5dmCf_kmMRDUHC8,1399
467
+ django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/${detail_card_template_name}.html.template,sha256=-TtrmvKgiB5fMmVtP6ZZdg3tkkKvKdG0Z6DNtdzL1Lw,1004
468
+ django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/${form_card_template_name}.html.template,sha256=Tybi6-14YHAoXeqPFDE4ZIesCaEggPBlAP6wHJ7uzPw,236
469
+ django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/${list_card_template_name}.html.template,sha256=s8w4sibmXKMmAa3OWM43OrjKUplbWAQMRxtjDgKgXk8,677
470
+ django_spire/core/management/commands/spire_startapp_pkg/template/templates/form/${form_template_name}.html.template,sha256=JDoLlUlu1TAlYV0Sqk3XqjpUcnmbt9utp94asoLH5sk,716
471
+ django_spire/core/management/commands/spire_startapp_pkg/template/templates/item/${item_template_name}.html.template,sha256=reHnBcH87yOJvCqEduAeiQ1eafqj687tBtaXO4ZJMYw,1334
472
+ django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/${detail_page_template_name}.html.template,sha256=ffmg2eNi3AIkS1hAxMgWP51qAzZ8HUuyloNEP3SXXw0,436
473
+ django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/${form_page_template_name}.html.template,sha256=JdUCGpWgCvwg328dgAkCA9b7MGTyQG2EZs_Dol8c-pM,346
474
+ django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/${list_page_template_name}.html.template,sha256=Ve0RVvWjMU6m33wXdDv10MkDoEFKWULuu-1_BK-O4aI,254
426
475
  django_spire/core/middleware/__init__.py,sha256=BvBwVHLVebknJkObtKk_s5OqaIJaAmnavTvnnv4TBO8,149
427
476
  django_spire/core/middleware/maintenance.py,sha256=jJtmz69UXJBBgPkq5SNspWuER1bGfAjSnsVipYS4TF0,921
428
477
  django_spire/core/redirect/__init__.py,sha256=ubAsz_h3ufwgNNkdtqiJQDgXc6DodE2LTUyBwi9dgkE,71
@@ -1046,8 +1095,8 @@ django_spire/theme/urls/page_urls.py,sha256=S8nkKkgbhG3XHI3uMUL-piOjXIrRkuY2UlM_
1046
1095
  django_spire/theme/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
1047
1096
  django_spire/theme/views/json_views.py,sha256=W1khC2K_EMbEzAFmMxC_P76_MFnkRH4-eVdodrRfAhw,1904
1048
1097
  django_spire/theme/views/page_views.py,sha256=pHr8iekjtR99xs7w1taj35HEo133Svq1dvDD0y0VL1c,3933
1049
- django_spire-0.17.0.dist-info/licenses/LICENSE.md,sha256=tlTbOtgKoy-xAQpUk9gPeh9O4oRXCOzoWdW3jJz0wnA,1091
1050
- django_spire-0.17.0.dist-info/METADATA,sha256=bVDHr6SnMBQaXRxcp9wExF6zN6mOQLORWWzrZDZr_WU,4936
1051
- django_spire-0.17.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1052
- django_spire-0.17.0.dist-info/top_level.txt,sha256=xf3QV1e--ONkVpgMDQE9iqjQ1Vg4--_6C8wmO-KxPHQ,13
1053
- django_spire-0.17.0.dist-info/RECORD,,
1098
+ django_spire-0.17.2.dist-info/licenses/LICENSE.md,sha256=tlTbOtgKoy-xAQpUk9gPeh9O4oRXCOzoWdW3jJz0wnA,1091
1099
+ django_spire-0.17.2.dist-info/METADATA,sha256=bOFYjXjbxDI8AYLhRJ8ReFqfWhbehdLKgzLvHQqL0YY,4936
1100
+ django_spire-0.17.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1101
+ django_spire-0.17.2.dist-info/top_level.txt,sha256=xf3QV1e--ONkVpgMDQE9iqjQ1Vg4--_6C8wmO-KxPHQ,13
1102
+ django_spire-0.17.2.dist-info/RECORD,,