django-spire 0.23.4__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.
- django_spire/__init__.py +0 -0
- django_spire/ai/__init__.py +0 -0
- django_spire/ai/admin.py +127 -0
- django_spire/ai/apps.py +18 -0
- django_spire/ai/chat/__init__.py +0 -0
- django_spire/ai/chat/admin.py +51 -0
- django_spire/ai/chat/apps.py +23 -0
- django_spire/ai/chat/auth/__init__.py +0 -0
- django_spire/ai/chat/auth/controller.py +8 -0
- django_spire/ai/chat/choices.py +9 -0
- django_spire/ai/chat/intelligence/__init__.py +0 -0
- django_spire/ai/chat/intelligence/decoders/__init__.py +0 -0
- django_spire/ai/chat/intelligence/decoders/intent_decoder.py +49 -0
- django_spire/ai/chat/intelligence/prompts.py +25 -0
- django_spire/ai/chat/intelligence/workflows/__init__.py +0 -0
- django_spire/ai/chat/intelligence/workflows/chat_workflow.py +42 -0
- django_spire/ai/chat/message_intel.py +47 -0
- django_spire/ai/chat/migrations/0001_initial.py +55 -0
- django_spire/ai/chat/migrations/0002_remove_chatmessage_content_chatmessage__content_and_more.py +29 -0
- django_spire/ai/chat/migrations/0003_rename__content_chatmessage__intel_data_and_more.py +28 -0
- django_spire/ai/chat/migrations/0004_chatmessage_response_type_chatmessage_sender.py +25 -0
- django_spire/ai/chat/migrations/__init__.py +0 -0
- django_spire/ai/chat/models.py +154 -0
- django_spire/ai/chat/querysets.py +34 -0
- django_spire/ai/chat/responses.py +74 -0
- django_spire/ai/chat/router.py +105 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/card/chat_card.html +13 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/dropdown/ellipsis_dropdown.html +18 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/element/recent_chat_select_element.html +122 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/message/default_message.html +5 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/message/loading_response_message.html +53 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/message/message.html +52 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/message/request_message.html +11 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/message/response_message.html +18 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/page/chat_page.html +35 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/section/confirm_delete_section.html +22 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/widget/dialog_widget.html +126 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/widget/recent_chat_list_widget.html +3 -0
- django_spire/ai/chat/templates/django_spire/ai/chat/widget/selection_widget.html +42 -0
- django_spire/ai/chat/tests/__init__.py +0 -0
- django_spire/ai/chat/tests/test_router/test_base_chat_router.py +110 -0
- django_spire/ai/chat/tests/test_router/test_chat_workflow.py +113 -0
- django_spire/ai/chat/tests/test_router/test_integration.py +147 -0
- django_spire/ai/chat/tests/test_router/test_intent_decoder.py +141 -0
- django_spire/ai/chat/tests/test_router/test_message_intel.py +67 -0
- django_spire/ai/chat/tests/test_router/test_spire_chat_router.py +92 -0
- django_spire/ai/chat/tests/test_urls/__init__.py +0 -0
- django_spire/ai/chat/tests/test_urls/factories.py +15 -0
- django_spire/ai/chat/tests/test_urls/test_json_urls.py +23 -0
- django_spire/ai/chat/urls/__init__.py +10 -0
- django_spire/ai/chat/urls/json_urls.py +12 -0
- django_spire/ai/chat/urls/message_request_urls.py +10 -0
- django_spire/ai/chat/urls/message_response_urls.py +10 -0
- django_spire/ai/chat/urls/message_urls.py +16 -0
- django_spire/ai/chat/urls/page_urls.py +10 -0
- django_spire/ai/chat/urls/template/__init__.py +0 -0
- django_spire/ai/chat/urls/template/template_urls.py +13 -0
- django_spire/ai/chat/views/__init__.py +0 -0
- django_spire/ai/chat/views/json_views.py +56 -0
- django_spire/ai/chat/views/message_request_views.py +82 -0
- django_spire/ai/chat/views/message_response_views.py +44 -0
- django_spire/ai/chat/views/message_views.py +35 -0
- django_spire/ai/chat/views/page_views.py +26 -0
- django_spire/ai/chat/views/template/__init__.py +0 -0
- django_spire/ai/chat/views/template/template_views.py +70 -0
- django_spire/ai/context/__init__.py +0 -0
- django_spire/ai/context/admin.py +15 -0
- django_spire/ai/context/apps.py +16 -0
- django_spire/ai/context/choices.py +11 -0
- django_spire/ai/context/intelligence/__init__.py +0 -0
- django_spire/ai/context/intelligence/prompts/__init__.py +0 -0
- django_spire/ai/context/intelligence/prompts/organization_prompts.py +19 -0
- django_spire/ai/context/migrations/0001_initial.py +67 -0
- django_spire/ai/context/migrations/__init__.py +0 -0
- django_spire/ai/context/models.py +67 -0
- django_spire/ai/context/querysets.py +15 -0
- django_spire/ai/context/seeding/__init__.py +0 -0
- django_spire/ai/context/seeding/seed.py +24 -0
- django_spire/ai/decorators.py +81 -0
- django_spire/ai/migrations/0001_initial.py +61 -0
- django_spire/ai/migrations/__init__.py +0 -0
- django_spire/ai/mixins.py +22 -0
- django_spire/ai/models.py +77 -0
- django_spire/ai/prompt/__init__.py +0 -0
- django_spire/ai/prompt/bots.py +26 -0
- django_spire/ai/prompt/intel.py +35 -0
- django_spire/ai/prompt/prompts.py +88 -0
- django_spire/ai/prompt/system/__init__.py +0 -0
- django_spire/ai/prompt/system/bots.py +76 -0
- django_spire/ai/prompt/system/intel.py +36 -0
- django_spire/ai/prompt/system/prompts.py +153 -0
- django_spire/ai/prompt/system/system_prompt_cli.py +43 -0
- django_spire/ai/prompt/tests/__init__.py +0 -0
- django_spire/ai/prompt/tests/test_bots.py +31 -0
- django_spire/ai/prompt/text_to_prompt_cli.py +8 -0
- django_spire/ai/prompt/tuning/__init__.py +0 -0
- django_spire/ai/prompt/tuning/bot_tuning_cli.py +56 -0
- django_spire/ai/prompt/tuning/bots.py +109 -0
- django_spire/ai/prompt/tuning/choices.py +10 -0
- django_spire/ai/prompt/tuning/intel.py +11 -0
- django_spire/ai/prompt/tuning/mixins.py +31 -0
- django_spire/ai/prompt/tuning/prompt_tuning_cli.py +40 -0
- django_spire/ai/prompt/tuning/prompts.py +204 -0
- django_spire/ai/sms/__init__.py +0 -0
- django_spire/ai/sms/admin.py +52 -0
- django_spire/ai/sms/apps.py +16 -0
- django_spire/ai/sms/decorators.py +31 -0
- django_spire/ai/sms/intel.py +7 -0
- django_spire/ai/sms/intelligence/__init__.py +0 -0
- django_spire/ai/sms/intelligence/workflows/__init__.py +0 -0
- django_spire/ai/sms/intelligence/workflows/sms_conversation_workflow.py +27 -0
- django_spire/ai/sms/migrations/0001_initial.py +56 -0
- django_spire/ai/sms/migrations/__init__.py +0 -0
- django_spire/ai/sms/models.py +128 -0
- django_spire/ai/sms/querysets.py +18 -0
- django_spire/ai/sms/tests/__init__.py +0 -0
- django_spire/ai/sms/tests/test_sms.py +30 -0
- django_spire/ai/sms/tests/test_webhook.py +38 -0
- django_spire/ai/sms/urls.py +12 -0
- django_spire/ai/sms/views.py +61 -0
- django_spire/ai/tests/__init__.py +0 -0
- django_spire/ai/tests/test_ai.py +28 -0
- django_spire/ai/urls.py +11 -0
- django_spire/auth/__init__.py +0 -0
- django_spire/auth/apps.py +17 -0
- django_spire/auth/controller/__init__.py +0 -0
- django_spire/auth/controller/controller.py +84 -0
- django_spire/auth/group/__init__.py +0 -0
- django_spire/auth/group/admin.py +53 -0
- django_spire/auth/group/apps.py +22 -0
- django_spire/auth/group/factories.py +15 -0
- django_spire/auth/group/forms.py +45 -0
- django_spire/auth/group/migrations/0001_initial.py +32 -0
- django_spire/auth/group/migrations/__init__.py +0 -0
- django_spire/auth/group/models.py +35 -0
- django_spire/auth/group/querysets.py +8 -0
- django_spire/auth/group/templates/django_spire/auth/group/card/detail_card.html +25 -0
- django_spire/auth/group/templates/django_spire/auth/group/card/form_card.html +9 -0
- django_spire/auth/group/templates/django_spire/auth/group/card/group_permission_list_card.html +13 -0
- django_spire/auth/group/templates/django_spire/auth/group/card/group_user_form_card.html +9 -0
- django_spire/auth/group/templates/django_spire/auth/group/card/list_card.html +24 -0
- django_spire/auth/group/templates/django_spire/auth/group/card/permission_user_groups_form_card.html +77 -0
- django_spire/auth/group/templates/django_spire/auth/group/card/user_list_card.html +26 -0
- django_spire/auth/group/templates/django_spire/auth/group/container/user_detail_card.html +51 -0
- django_spire/auth/group/templates/django_spire/auth/group/element/group_perm_element.html +63 -0
- django_spire/auth/group/templates/django_spire/auth/group/element/group_perm_level_badge.html +11 -0
- django_spire/auth/group/templates/django_spire/auth/group/element/group_special_role_element.html +65 -0
- django_spire/auth/group/templates/django_spire/auth/group/element/is_active_badge.html +5 -0
- django_spire/auth/group/templates/django_spire/auth/group/form/form.html +19 -0
- django_spire/auth/group/templates/django_spire/auth/group/form/group_user_form.html +20 -0
- django_spire/auth/group/templates/django_spire/auth/group/item/group_item.html +31 -0
- django_spire/auth/group/templates/django_spire/auth/group/item/group_perm_item.html +28 -0
- django_spire/auth/group/templates/django_spire/auth/group/item/group_user_item.html +24 -0
- django_spire/auth/group/templates/django_spire/auth/group/item/permission_user_group_form_item.html +15 -0
- django_spire/auth/group/templates/django_spire/auth/group/navigation/accordion/permission_nav_accordion.html +19 -0
- django_spire/auth/group/templates/django_spire/auth/group/page/detail_page.html +22 -0
- django_spire/auth/group/templates/django_spire/auth/group/page/form_page.html +9 -0
- django_spire/auth/group/templates/django_spire/auth/group/page/group_user_form_page.html +9 -0
- django_spire/auth/group/templates/django_spire/auth/group/page/list_page.html +9 -0
- django_spire/auth/group/templates/django_spire/auth/group/tab/user_list_card_tab_section.html +5 -0
- django_spire/auth/group/templates/django_spire/auth/group/tab/user_list_card_tabs.html +11 -0
- django_spire/auth/group/templatetags/__init__.py +0 -0
- django_spire/auth/group/templatetags/permission_tags.py +11 -0
- django_spire/auth/group/urls/__init__.py +10 -0
- django_spire/auth/group/urls/form_urls.py +21 -0
- django_spire/auth/group/urls/json_urls.py +16 -0
- django_spire/auth/group/urls/page_urls.py +17 -0
- django_spire/auth/group/utils.py +79 -0
- django_spire/auth/group/views/__init__.py +0 -0
- django_spire/auth/group/views/form_views.py +175 -0
- django_spire/auth/group/views/json_views.py +83 -0
- django_spire/auth/group/views/page_views.py +60 -0
- django_spire/auth/mfa/__init__.py +0 -0
- django_spire/auth/mfa/admin.py +21 -0
- django_spire/auth/mfa/apps.py +15 -0
- django_spire/auth/mfa/forms.py +28 -0
- django_spire/auth/mfa/migrations/0001_initial.py +31 -0
- django_spire/auth/mfa/migrations/__init__.py +0 -0
- django_spire/auth/mfa/models.py +63 -0
- django_spire/auth/mfa/querysets.py +9 -0
- django_spire/auth/mfa/tests/__init__.py +0 -0
- django_spire/auth/mfa/urls/__init__.py +9 -0
- django_spire/auth/mfa/urls/page_urls.py +12 -0
- django_spire/auth/mfa/urls/redirect_urls.py +12 -0
- django_spire/auth/mfa/utils.py +17 -0
- django_spire/auth/mfa/views/__init__.py +0 -0
- django_spire/auth/mfa/views/page_views.py +35 -0
- django_spire/auth/mfa/views/redirect_views.py +20 -0
- django_spire/auth/migrations/__init__.py +0 -0
- django_spire/auth/permissions/__init__.py +0 -0
- django_spire/auth/permissions/consts.py +30 -0
- django_spire/auth/permissions/decorators.py +60 -0
- django_spire/auth/permissions/permissions.py +192 -0
- django_spire/auth/permissions/tools.py +82 -0
- django_spire/auth/seeding/__init__.py +0 -0
- django_spire/auth/seeding/seed.py +3 -0
- django_spire/auth/seeding/seeder.py +23 -0
- django_spire/auth/templates/django_spire/auth/form/login_form.html +25 -0
- django_spire/auth/templates/django_spire/auth/mfa/mfa_form.html +23 -0
- django_spire/auth/templates/django_spire/auth/page/auth_page.html +25 -0
- django_spire/auth/templates/django_spire/auth/page/login_page.html +12 -0
- django_spire/auth/templates/django_spire/auth/page/logout_page.html +22 -0
- django_spire/auth/templates/django_spire/auth/page/password_change_done_page.html +11 -0
- django_spire/auth/templates/django_spire/auth/page/password_change_page.html +50 -0
- django_spire/auth/templates/django_spire/auth/page/password_reset_complete_page.html +10 -0
- django_spire/auth/templates/django_spire/auth/page/password_reset_confirmation_page.html +30 -0
- django_spire/auth/templates/django_spire/auth/page/password_reset_done_page.html +10 -0
- django_spire/auth/templates/django_spire/auth/page/password_reset_key_done_page.html +11 -0
- django_spire/auth/templates/django_spire/auth/page/password_reset_key_form_page.html +32 -0
- django_spire/auth/templates/django_spire/auth/page/password_reset_page.html +24 -0
- django_spire/auth/templates/django_spire/auth/page/password_set_form_page.html +20 -0
- django_spire/auth/templates/django_spire/auth/password_reset_email.html +14 -0
- django_spire/auth/tests/__init__.py +0 -0
- django_spire/auth/tests/test_url_endpoints.py +29 -0
- django_spire/auth/urls/__init__.py +12 -0
- django_spire/auth/urls/admin_urls.py +52 -0
- django_spire/auth/urls/redirect_urls.py +16 -0
- django_spire/auth/user/__init__.py +0 -0
- django_spire/auth/user/admin.py +0 -0
- django_spire/auth/user/apps.py +22 -0
- django_spire/auth/user/factories.py +18 -0
- django_spire/auth/user/forms.py +86 -0
- django_spire/auth/user/migrations/0001_initial.py +32 -0
- django_spire/auth/user/migrations/__init__.py +0 -0
- django_spire/auth/user/models.py +35 -0
- django_spire/auth/user/services/__init__.py +0 -0
- django_spire/auth/user/services/services.py +20 -0
- django_spire/auth/user/templates/django_spire/auth/user/card/detail_card.html +38 -0
- django_spire/auth/user/templates/django_spire/auth/user/card/form_card.html +9 -0
- django_spire/auth/user/templates/django_spire/auth/user/card/group_form_card.html +9 -0
- django_spire/auth/user/templates/django_spire/auth/user/card/group_list_card.html +26 -0
- django_spire/auth/user/templates/django_spire/auth/user/card/list_card.html +26 -0
- django_spire/auth/user/templates/django_spire/auth/user/card/register_form_card.html +9 -0
- django_spire/auth/user/templates/django_spire/auth/user/element/is_active_badge.html +5 -0
- django_spire/auth/user/templates/django_spire/auth/user/form/form.html +28 -0
- django_spire/auth/user/templates/django_spire/auth/user/form/group_form.html +18 -0
- django_spire/auth/user/templates/django_spire/auth/user/form/register_form.html +52 -0
- django_spire/auth/user/templates/django_spire/auth/user/item/user_item.html +34 -0
- django_spire/auth/user/templates/django_spire/auth/user/item/user_master_perm_item.html +18 -0
- django_spire/auth/user/templates/django_spire/auth/user/item/user_profile_item.html +17 -0
- django_spire/auth/user/templates/django_spire/auth/user/page/detail_page.html +17 -0
- django_spire/auth/user/templates/django_spire/auth/user/page/form_page.html +9 -0
- django_spire/auth/user/templates/django_spire/auth/user/page/group_form_page.html +9 -0
- django_spire/auth/user/templates/django_spire/auth/user/page/list_page.html +9 -0
- django_spire/auth/user/templates/django_spire/auth/user/page/register_form_page.html +9 -0
- django_spire/auth/user/templates/django_spire/auth/user/tab/list_card_tab_section.html +5 -0
- django_spire/auth/user/templates/django_spire/auth/user/tab/list_card_tabs.html +11 -0
- django_spire/auth/user/tests/__init__.py +0 -0
- django_spire/auth/user/tests/factories.py +37 -0
- django_spire/auth/user/tests/test_factories.py +7 -0
- django_spire/auth/user/tests/test_unit.py +9 -0
- django_spire/auth/user/tools.py +11 -0
- django_spire/auth/user/urls/__init__.py +9 -0
- django_spire/auth/user/urls/form_urls.py +11 -0
- django_spire/auth/user/urls/page_urls.py +10 -0
- django_spire/auth/user/views/__init__.py +0 -0
- django_spire/auth/user/views/form_views.py +123 -0
- django_spire/auth/user/views/page_views.py +47 -0
- django_spire/auth/views/__init__.py +0 -0
- django_spire/auth/views/admin_views.py +70 -0
- django_spire/auth/views/redirect_views.py +27 -0
- django_spire/comment/__init__.py +0 -0
- django_spire/comment/admin.py +43 -0
- django_spire/comment/apps.py +16 -0
- django_spire/comment/factories.py +11 -0
- django_spire/comment/forms.py +20 -0
- django_spire/comment/migrations/0001_initial.py +40 -0
- django_spire/comment/migrations/__init__.py +0 -0
- django_spire/comment/mixins.py +37 -0
- django_spire/comment/models.py +78 -0
- django_spire/comment/querysets.py +20 -0
- django_spire/comment/templates/django_spire/comment/card/comment_list_card.html +30 -0
- django_spire/comment/templates/django_spire/comment/card/comment_textarea_card.html +7 -0
- django_spire/comment/templates/django_spire/comment/container/comment_container.html +21 -0
- django_spire/comment/templates/django_spire/comment/container/comment_reply_list_container.html +7 -0
- django_spire/comment/templates/django_spire/comment/element/comment_button_element.html +165 -0
- django_spire/comment/templates/django_spire/comment/element/comment_edit_link.html +5 -0
- django_spire/comment/templates/django_spire/comment/element/comment_reply_element.html +8 -0
- django_spire/comment/templates/django_spire/comment/element/comment_reply_link.html +5 -0
- django_spire/comment/templates/django_spire/comment/element/comment_textarea_element.html +120 -0
- django_spire/comment/templates/django_spire/comment/form/comment_form.html +18 -0
- django_spire/comment/templates/django_spire/comment/form/content/comment_form_content.html +13 -0
- django_spire/comment/templates/django_spire/comment/item/comment_item.html +42 -0
- django_spire/comment/templates/django_spire/comment/item/comment_item_ellipsis.html +22 -0
- django_spire/comment/templates/django_spire/comment/item/comment_reply_item.html +30 -0
- django_spire/comment/templates/django_spire/comment/modal/comment_edit_modal.html +17 -0
- django_spire/comment/templates/django_spire/comment/modal/comment_modal.html +17 -0
- django_spire/comment/templates/django_spire/comment/modal/comment_reply_modal.html +23 -0
- django_spire/comment/templates/django_spire/comment/widget/tagging_widget.html +130 -0
- django_spire/comment/templatetags/__init__.py +0 -0
- django_spire/comment/templatetags/comment_tags.py +29 -0
- django_spire/comment/tests/__init__.py +0 -0
- django_spire/comment/urls.py +20 -0
- django_spire/comment/utils.py +45 -0
- django_spire/comment/views.py +136 -0
- django_spire/comment/widgets.py +28 -0
- django_spire/conf.py +32 -0
- django_spire/consts.py +5 -0
- django_spire/contrib/__init__.py +5 -0
- django_spire/contrib/breadcrumb/__init__.py +5 -0
- django_spire/contrib/breadcrumb/apps.py +7 -0
- django_spire/contrib/breadcrumb/breadcrumbs.py +76 -0
- django_spire/contrib/breadcrumb/tests/__init__.py +0 -0
- django_spire/contrib/constructor/__init__.py +9 -0
- django_spire/contrib/constructor/constructor.py +86 -0
- django_spire/contrib/constructor/django_model_constructor.py +40 -0
- django_spire/contrib/constructor/exceptions.py +5 -0
- django_spire/contrib/form/__init__.py +0 -0
- django_spire/contrib/form/confirmation_forms.py +46 -0
- django_spire/contrib/form/templates/django_spire/contrib/form/button/form_submit_button.html +46 -0
- django_spire/contrib/form/utils.py +40 -0
- django_spire/contrib/gamification/__init__.py +0 -0
- django_spire/contrib/gamification/static/django_spire/css/contrib/gamification/gamification.css +0 -0
- django_spire/contrib/gamification/templates/django_spire/contrib/gamification/effect/kapow.html +0 -0
- django_spire/contrib/generic_views/__init__.py +7 -0
- django_spire/contrib/generic_views/modal_views.py +67 -0
- django_spire/contrib/generic_views/portal_views.py +297 -0
- django_spire/contrib/help/__init__.py +0 -0
- django_spire/contrib/help/apps.py +7 -0
- django_spire/contrib/help/templates/django_spire/contrib/help/help_button.html +8 -0
- django_spire/contrib/help/templates/django_spire/contrib/help/help_modal.html +41 -0
- django_spire/contrib/help/templatetags/__init__.py +0 -0
- django_spire/contrib/help/templatetags/help.py +32 -0
- django_spire/contrib/options/__init__.py +0 -0
- django_spire/contrib/options/mixins.py +44 -0
- django_spire/contrib/options/options.py +116 -0
- django_spire/contrib/options/tests/__init__.py +0 -0
- django_spire/contrib/options/tests/factories.py +60 -0
- django_spire/contrib/options/tests/test_unit.py +148 -0
- django_spire/contrib/ordering/__init__.py +0 -0
- django_spire/contrib/ordering/exceptions.py +5 -0
- django_spire/contrib/ordering/mixins.py +14 -0
- django_spire/contrib/ordering/querysets.py +5 -0
- django_spire/contrib/ordering/services/__init__.py +0 -0
- django_spire/contrib/ordering/services/processor_service.py +94 -0
- django_spire/contrib/ordering/services/service.py +16 -0
- django_spire/contrib/ordering/validators.py +46 -0
- django_spire/contrib/pagination/__init__.py +0 -0
- django_spire/contrib/pagination/pagination.py +12 -0
- django_spire/contrib/pagination/templatetags/__init__.py +0 -0
- django_spire/contrib/pagination/templatetags/pagination_tags.py +44 -0
- django_spire/contrib/performance/__init__.py +0 -0
- django_spire/contrib/performance/decorators.py +21 -0
- django_spire/contrib/progress/__init__.py +10 -0
- django_spire/contrib/progress/mixins.py +35 -0
- django_spire/contrib/progress/static/django_spire/css/contrib/progress/progress.css +0 -0
- django_spire/contrib/progress/static/django_spire/js/contrib/progress/progress.js +62 -0
- django_spire/contrib/progress/templates/django_spire/contrib/progress/card/card.html +81 -0
- django_spire/contrib/progress/templates/django_spire/contrib/progress/modal/content.html +90 -0
- django_spire/contrib/progress/tracker.py +39 -0
- django_spire/contrib/progress/views.py +50 -0
- django_spire/contrib/queryset/__init__.py +0 -0
- django_spire/contrib/queryset/enums.py +6 -0
- django_spire/contrib/queryset/filter_tools.py +36 -0
- django_spire/contrib/queryset/mixins.py +72 -0
- django_spire/contrib/seeding/__init__.py +3 -0
- django_spire/contrib/seeding/field/__init__.py +0 -0
- django_spire/contrib/seeding/field/base.py +43 -0
- django_spire/contrib/seeding/field/callable.py +12 -0
- django_spire/contrib/seeding/field/cleaners.py +35 -0
- django_spire/contrib/seeding/field/custom.py +65 -0
- django_spire/contrib/seeding/field/django/__init__.py +0 -0
- django_spire/contrib/seeding/field/django/seeder.py +139 -0
- django_spire/contrib/seeding/field/enums.py +9 -0
- django_spire/contrib/seeding/field/llm.py +43 -0
- django_spire/contrib/seeding/field/override.py +33 -0
- django_spire/contrib/seeding/field/static.py +11 -0
- django_spire/contrib/seeding/field/tests/__init__.py +0 -0
- django_spire/contrib/seeding/field/tests/test_base.py +24 -0
- django_spire/contrib/seeding/field/tests/test_callable.py +18 -0
- django_spire/contrib/seeding/field/tests/test_cleaners.py +61 -0
- django_spire/contrib/seeding/field/tests/test_static.py +18 -0
- django_spire/contrib/seeding/intelligence/__init__.py +0 -0
- django_spire/contrib/seeding/intelligence/bots/__init__.py +0 -0
- django_spire/contrib/seeding/intelligence/bots/field_seeding_bots.py +31 -0
- django_spire/contrib/seeding/intelligence/bots/seeder_generator_bot.py +33 -0
- django_spire/contrib/seeding/intelligence/intel.py +13 -0
- django_spire/contrib/seeding/intelligence/prompts/__init__.py +4 -0
- django_spire/contrib/seeding/intelligence/prompts/factory.py +22 -0
- django_spire/contrib/seeding/intelligence/prompts/foreign_key_selection_prompt.py +22 -0
- django_spire/contrib/seeding/intelligence/prompts/generate_django_model_seeder_prompts.py +72 -0
- django_spire/contrib/seeding/intelligence/prompts/generic_relationship_selection_prompt.py +44 -0
- django_spire/contrib/seeding/intelligence/prompts/hierarchical_selection_prompt.py +55 -0
- django_spire/contrib/seeding/intelligence/prompts/model_field_choices_prompt.py +17 -0
- django_spire/contrib/seeding/intelligence/prompts/negation_prompt.py +12 -0
- django_spire/contrib/seeding/intelligence/prompts/objective_prompt.py +17 -0
- django_spire/contrib/seeding/management/__init__.py +0 -0
- django_spire/contrib/seeding/management/commands/__init__.py +0 -0
- django_spire/contrib/seeding/management/commands/seeding.py +49 -0
- django_spire/contrib/seeding/management/example.py +17 -0
- django_spire/contrib/seeding/model/__init__.py +0 -0
- django_spire/contrib/seeding/model/base.py +119 -0
- django_spire/contrib/seeding/model/config.py +64 -0
- django_spire/contrib/seeding/model/django/__init__.py +0 -0
- django_spire/contrib/seeding/model/django/config.py +58 -0
- django_spire/contrib/seeding/model/django/seeder.py +62 -0
- django_spire/contrib/seeding/model/django/tests/__init__.py +0 -0
- django_spire/contrib/seeding/model/django/tests/test_seeder.py +53 -0
- django_spire/contrib/seeding/model/enums.py +8 -0
- django_spire/contrib/seeding/tests/__init__.py +0 -0
- django_spire/contrib/seeding/tests/test_seeding.py +25 -0
- django_spire/contrib/service/__init__.py +7 -0
- django_spire/contrib/service/django_model_service.py +83 -0
- django_spire/contrib/service/exceptions.py +5 -0
- django_spire/contrib/session/__init__.py +0 -0
- django_spire/contrib/session/apps.py +7 -0
- django_spire/contrib/session/controller.py +94 -0
- django_spire/contrib/session/templatetags/__init__.py +0 -0
- django_spire/contrib/session/templatetags/session_tags.py +15 -0
- django_spire/contrib/session/tests/__init__.py +0 -0
- django_spire/contrib/session/tests/test_session_controller.py +105 -0
- django_spire/contrib/utils.py +2 -0
- django_spire/core/__init__.py +0 -0
- django_spire/core/apps.py +10 -0
- django_spire/core/context_processors.py +54 -0
- django_spire/core/converters/__init__.py +7 -0
- django_spire/core/converters/tests/__init__.py +0 -0
- django_spire/core/converters/tests/test_to_enums.py +75 -0
- django_spire/core/converters/tests/test_to_pydantic.py +234 -0
- django_spire/core/converters/to_data.py +131 -0
- django_spire/core/converters/to_enums.py +9 -0
- django_spire/core/converters/to_pydantic.py +169 -0
- django_spire/core/decorators.py +25 -0
- django_spire/core/forms/__init__.py +0 -0
- django_spire/core/forms/widgets.py +21 -0
- django_spire/core/management/__init__.py +0 -0
- django_spire/core/management/commands/__init__.py +0 -0
- django_spire/core/management/commands/spire_remove_migration.py +62 -0
- django_spire/core/management/commands/spire_startapp.py +118 -0
- django_spire/core/management/commands/spire_startapp_pkg/__init__.py +44 -0
- django_spire/core/management/commands/spire_startapp_pkg/builder.py +91 -0
- django_spire/core/management/commands/spire_startapp_pkg/config.py +115 -0
- django_spire/core/management/commands/spire_startapp_pkg/filesystem.py +107 -0
- django_spire/core/management/commands/spire_startapp_pkg/generator.py +167 -0
- django_spire/core/management/commands/spire_startapp_pkg/maps.py +793 -0
- django_spire/core/management/commands/spire_startapp_pkg/permissions.py +147 -0
- django_spire/core/management/commands/spire_startapp_pkg/processor.py +171 -0
- django_spire/core/management/commands/spire_startapp_pkg/registry.py +73 -0
- django_spire/core/management/commands/spire_startapp_pkg/reporter.py +297 -0
- django_spire/core/management/commands/spire_startapp_pkg/resolver.py +71 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/__init__.py +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/apps.py.template +15 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/forms.py.template +18 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/bots.py.template +18 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/intel.py.template +7 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/intelligence/prompts.py.template +32 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/migrations/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/models.py.template +52 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/querysets.py.template +20 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/seed.py.template +6 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/seeding/seeder.py.template +26 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/services/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/services/factory_service.py.template +12 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/services/intelligence_service.py.template +12 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/services/processor_service.py.template +12 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/services/service.py.template +22 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/services/transformation_service.py.template +12 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_intelligence/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_intelligence/test_bots.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_models.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_factory_service.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_intelligence_service.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_processor_service.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_service.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_services/test_transformation_service.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/test_form_urls.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_urls/test_page_urls.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/test_form_views.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/tests/test_views/test_page_views.py.template +8 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/__init__.py.template +9 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/form_urls.py.template +15 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/urls/page_urls.py.template +11 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/views/__init__.py.template +0 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/views/form_views.py.template +134 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/app/views/page_views.py.template +44 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/${detail_card_template_name}.html.template +24 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/${form_card_template_name}.html.template +9 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/templates/card/${list_card_template_name}.html.template +18 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/templates/form/${form_template_name}.html.template +22 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/templates/item/${item_template_name}.html.template +24 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/${detail_page_template_name}.html.template +13 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/${form_page_template_name}.html.template +13 -0
- django_spire/core/management/commands/spire_startapp_pkg/template/templates/page/${list_page_template_name}.html.template +9 -0
- django_spire/core/management/commands/spire_startapp_pkg/user_input.py +255 -0
- django_spire/core/management/commands/spire_startapp_pkg/validator.py +96 -0
- django_spire/core/maps.py +42 -0
- django_spire/core/middleware/__init__.py +6 -0
- django_spire/core/middleware/maintenance.py +30 -0
- django_spire/core/middleware.py +30 -0
- django_spire/core/migrations/0001_initial.py +26 -0
- django_spire/core/migrations/__init__.py +0 -0
- django_spire/core/models.py +9 -0
- django_spire/core/redirect/__init__.py +1 -0
- django_spire/core/redirect/generic_redirect.py +38 -0
- django_spire/core/redirect/safe_redirect.py +97 -0
- django_spire/core/shortcuts.py +98 -0
- django_spire/core/static/django_spire/css/app-background.css +383 -0
- django_spire/core/static/django_spire/css/app-border.css +130 -0
- django_spire/core/static/django_spire/css/app-button.css +287 -0
- django_spire/core/static/django_spire/css/app-default.css +17 -0
- django_spire/core/static/django_spire/css/app-import.css +13 -0
- django_spire/core/static/django_spire/css/app-layout.css +15 -0
- django_spire/core/static/django_spire/css/app-navigation.css +110 -0
- django_spire/core/static/django_spire/css/app-offcanvas.css +7 -0
- django_spire/core/static/django_spire/css/app-override.css +0 -0
- django_spire/core/static/django_spire/css/app-page.css +17 -0
- django_spire/core/static/django_spire/css/app-side-panel.css +57 -0
- django_spire/core/static/django_spire/css/app-template.css +25 -0
- django_spire/core/static/django_spire/css/app-text.css +340 -0
- django_spire/core/static/django_spire/css/app-theme.css +18 -0
- django_spire/core/static/django_spire/css/bootstrap-extension.css +831 -0
- django_spire/core/static/django_spire/css/bootstrap-override.css +300 -0
- django_spire/core/static/django_spire/css/bootstrap.css +7 -0
- django_spire/core/static/django_spire/css/flatpickr.min.css +13 -0
- django_spire/core/static/django_spire/css/themes/ayu/app-dark.css +76 -0
- django_spire/core/static/django_spire/css/themes/ayu/app-light.css +71 -0
- django_spire/core/static/django_spire/css/themes/catppuccin/app-dark.css +76 -0
- django_spire/core/static/django_spire/css/themes/catppuccin/app-light.css +71 -0
- django_spire/core/static/django_spire/css/themes/default/app-dark.css +76 -0
- django_spire/core/static/django_spire/css/themes/default/app-light.css +76 -0
- django_spire/core/static/django_spire/css/themes/gruvbox/app-dark.css +76 -0
- django_spire/core/static/django_spire/css/themes/gruvbox/app-light.css +71 -0
- django_spire/core/static/django_spire/css/themes/input.css +21 -0
- django_spire/core/static/django_spire/css/themes/material/app-dark.css +76 -0
- django_spire/core/static/django_spire/css/themes/material/app-light.css +71 -0
- django_spire/core/static/django_spire/css/themes/nord/app-dark.css +76 -0
- django_spire/core/static/django_spire/css/themes/nord/app-light.css +71 -0
- django_spire/core/static/django_spire/css/themes/one-dark/app-dark.css +76 -0
- django_spire/core/static/django_spire/css/themes/one-dark/app-light.css +71 -0
- django_spire/core/static/django_spire/css/themes/palenight/app-dark.css +76 -0
- django_spire/core/static/django_spire/css/themes/palenight/app-light.css +71 -0
- django_spire/core/static/django_spire/css/themes/rose-pine/app-dark.css +76 -0
- django_spire/core/static/django_spire/css/themes/rose-pine/app-light.css +71 -0
- django_spire/core/static/django_spire/css/themes/tokyo-night/app-dark.css +76 -0
- django_spire/core/static/django_spire/css/themes/tokyo-night/app-light.css +71 -0
- django_spire/core/static/django_spire/favicons/android-chrome-192x192.png +0 -0
- django_spire/core/static/django_spire/favicons/android-chrome-256x256.png +0 -0
- django_spire/core/static/django_spire/favicons/apple-touch-icon.png +0 -0
- django_spire/core/static/django_spire/favicons/favicon-16x16.png +0 -0
- django_spire/core/static/django_spire/favicons/favicon-32x32.png +0 -0
- django_spire/core/static/django_spire/favicons/mstile-150x150.png +0 -0
- django_spire/core/static/django_spire/font/Poppins-Black.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-BlackItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Bold.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-BoldItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-ExtraBold.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-ExtraBoldItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-ExtraLight.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-ExtraLightItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Italic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Light.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-LightItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Medium.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-MediumItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Regular.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-SemiBold.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-SemiBoldItalic.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-Thin.ttf +0 -0
- django_spire/core/static/django_spire/font/Poppins-ThinItalic.ttf +0 -0
- django_spire/core/static/django_spire/js/Chart.min.js +13 -0
- django_spire/core/static/django_spire/js/ajax.js +11 -0
- django_spire/core/static/django_spire/js/alpine-plugins.min.js +9 -0
- django_spire/core/static/django_spire/js/alpine.min.js +5 -0
- django_spire/core/static/django_spire/js/axios.min.js +3 -0
- django_spire/core/static/django_spire/js/bootstrap.bundle.min.js +7 -0
- django_spire/core/static/django_spire/js/cookie.js +18 -0
- django_spire/core/static/django_spire/js/dropdown.js +33 -0
- django_spire/core/static/django_spire/js/modal.js +16 -0
- django_spire/core/static/django_spire/js/session_controller.js +10 -0
- django_spire/core/static/django_spire/js/theme.js +262 -0
- django_spire/core/static/django_spire/js/ui.js +24 -0
- django_spire/core/table/__init__.py +0 -0
- django_spire/core/table/enums.py +18 -0
- django_spire/core/tag/__init__.py +0 -0
- django_spire/core/tag/intelligence/__init__.py +0 -0
- django_spire/core/tag/intelligence/tag_set_bot.py +42 -0
- django_spire/core/tag/mixins.py +23 -0
- django_spire/core/tag/models.py +37 -0
- django_spire/core/tag/querysets.py +9 -0
- django_spire/core/tag/service/__init__.py +0 -0
- django_spire/core/tag/service/tag_service.py +72 -0
- django_spire/core/tag/tests/__init__.py +0 -0
- django_spire/core/tag/tests/test_intelligence.py +28 -0
- django_spire/core/tag/tests/test_tags.py +102 -0
- django_spire/core/tag/tools.py +66 -0
- django_spire/core/templates/django_spire/403.html +1 -0
- django_spire/core/templates/django_spire/404.html +5 -0
- django_spire/core/templates/django_spire/500.html +5 -0
- django_spire/core/templates/django_spire/accordion/accordion.html +23 -0
- django_spire/core/templates/django_spire/accordion/view_glue_accordion.html +34 -0
- django_spire/core/templates/django_spire/badge/accent_badge.html +3 -0
- django_spire/core/templates/django_spire/badge/base_badge.html +14 -0
- django_spire/core/templates/django_spire/badge/danger_badge.html +3 -0
- django_spire/core/templates/django_spire/badge/primary_badge.html +3 -0
- django_spire/core/templates/django_spire/badge/primary_outlined_badge.html +3 -0
- django_spire/core/templates/django_spire/badge/secondary_badge.html +3 -0
- django_spire/core/templates/django_spire/badge/secondary_outlined_badge.html +3 -0
- django_spire/core/templates/django_spire/badge/success_badge.html +3 -0
- django_spire/core/templates/django_spire/badge/warning_badge.html +3 -0
- django_spire/core/templates/django_spire/base/base.html +96 -0
- django_spire/core/templates/django_spire/button/accent_button.html +3 -0
- django_spire/core/templates/django_spire/button/accent_dark_button.html +3 -0
- django_spire/core/templates/django_spire/button/accent_outlined_button.html +3 -0
- django_spire/core/templates/django_spire/button/base_button.html +16 -0
- django_spire/core/templates/django_spire/button/danger_button.html +3 -0
- django_spire/core/templates/django_spire/button/danger_dark_button.html +3 -0
- django_spire/core/templates/django_spire/button/danger_outlined_button.html +3 -0
- django_spire/core/templates/django_spire/button/primary_button.html +3 -0
- django_spire/core/templates/django_spire/button/primary_dark_button.html +3 -0
- django_spire/core/templates/django_spire/button/primary_dark_outlined_button.html +3 -0
- django_spire/core/templates/django_spire/button/primary_outlined_button.html +3 -0
- django_spire/core/templates/django_spire/button/secondary_button.html +3 -0
- django_spire/core/templates/django_spire/button/secondary_dark_button.html +3 -0
- django_spire/core/templates/django_spire/button/secondary_outlined_button.html +3 -0
- django_spire/core/templates/django_spire/button/success_button.html +3 -0
- django_spire/core/templates/django_spire/button/success_dark_button.html +3 -0
- django_spire/core/templates/django_spire/button/success_outlined_button.html +3 -0
- django_spire/core/templates/django_spire/button/warning_button.html +3 -0
- django_spire/core/templates/django_spire/button/warning_dark_button.html +3 -0
- django_spire/core/templates/django_spire/button/warning_outlined_button.html +3 -0
- django_spire/core/templates/django_spire/card/card.html +7 -0
- django_spire/core/templates/django_spire/card/delete_confirmation_form_card.html +28 -0
- django_spire/core/templates/django_spire/card/delete_form_card.html +9 -0
- django_spire/core/templates/django_spire/card/form_card.html +19 -0
- django_spire/core/templates/django_spire/card/infinite_scroll_card.html +7 -0
- django_spire/core/templates/django_spire/card/title_card.html +32 -0
- django_spire/core/templates/django_spire/container/container.html +27 -0
- django_spire/core/templates/django_spire/container/form_container.html +13 -0
- django_spire/core/templates/django_spire/container/infinite_scroll_container.html +64 -0
- django_spire/core/templates/django_spire/dropdown/dropdown.html +15 -0
- django_spire/core/templates/django_spire/dropdown/element/dropdown_link_element.html +32 -0
- django_spire/core/templates/django_spire/dropdown/element/ellipsis_dropdown_modal_link_element.html +12 -0
- django_spire/core/templates/django_spire/dropdown/ellipsis_dropdown.html +32 -0
- django_spire/core/templates/django_spire/dropdown/ellipsis_modal_dropdown.html +25 -0
- django_spire/core/templates/django_spire/dropdown/ellipsis_table_dropdown.html +26 -0
- django_spire/core/templates/django_spire/element/attribute_element.html +41 -0
- django_spire/core/templates/django_spire/element/breadcrumb_element.html +19 -0
- django_spire/core/templates/django_spire/element/divider_element.html +11 -0
- django_spire/core/templates/django_spire/element/grabber_element.html +7 -0
- django_spire/core/templates/django_spire/element/no_data_element.html +3 -0
- django_spire/core/templates/django_spire/element/page_loading_element.html +10 -0
- django_spire/core/templates/django_spire/element/pagination_element.html +47 -0
- django_spire/core/templates/django_spire/error/error.html +16 -0
- django_spire/core/templates/django_spire/filtering/form/base_session_filter_form.html +29 -0
- django_spire/core/templates/django_spire/filtering/form/filter_form.html +7 -0
- django_spire/core/templates/django_spire/filtering/form/search_form.html +7 -0
- django_spire/core/templates/django_spire/footer/footer.html +9 -0
- django_spire/core/templates/django_spire/form/delete_form.html +18 -0
- django_spire/core/templates/django_spire/forms/elements/dict_element.html +37 -0
- django_spire/core/templates/django_spire/forms/elements/list_element.html +18 -0
- django_spire/core/templates/django_spire/forms/elements/value_element.html +3 -0
- django_spire/core/templates/django_spire/forms/widgets/json_tree_widget.html +45 -0
- django_spire/core/templates/django_spire/infinite_scroll/base.html +348 -0
- django_spire/core/templates/django_spire/infinite_scroll/element/footer.html +11 -0
- django_spire/core/templates/django_spire/infinite_scroll/scroll.html +142 -0
- django_spire/core/templates/django_spire/item/element/item_ellipsis_spacer_element.html +1 -0
- django_spire/core/templates/django_spire/item/infinite_scroll_item.html +33 -0
- django_spire/core/templates/django_spire/item/item.html +29 -0
- django_spire/core/templates/django_spire/item/no_data_item.html +11 -0
- django_spire/core/templates/django_spire/lazy_tab/element/lazy_tab_section_element.html +19 -0
- django_spire/core/templates/django_spire/lazy_tab/element/lazy_tab_trigger_element.html +15 -0
- django_spire/core/templates/django_spire/lazy_tab/lazy_tab.html +157 -0
- django_spire/core/templates/django_spire/maintenance.html +21 -0
- django_spire/core/templates/django_spire/messages/element/messages_element.html +48 -0
- django_spire/core/templates/django_spire/messages/messages.html +28 -0
- django_spire/core/templates/django_spire/modal/center_modal.html +17 -0
- django_spire/core/templates/django_spire/modal/content/dispatch_modal_delete_confirmation_content.html +32 -0
- django_spire/core/templates/django_spire/modal/content/modal_title_content.html +26 -0
- django_spire/core/templates/django_spire/modal/dispatch_modal.html +8 -0
- django_spire/core/templates/django_spire/modal/element/model_close_element.html +1 -0
- django_spire/core/templates/django_spire/modal/modal.html +67 -0
- django_spire/core/templates/django_spire/modal/title_modal.html +22 -0
- django_spire/core/templates/django_spire/navigation/accordion/nav_accordion.html +42 -0
- django_spire/core/templates/django_spire/navigation/accordion/settings_nav_accordion.html +19 -0
- django_spire/core/templates/django_spire/navigation/elements/nav_link.html +4 -0
- django_spire/core/templates/django_spire/navigation/elements/nav_title_divider.html +8 -0
- django_spire/core/templates/django_spire/navigation/elements/search_bar_element.html +15 -0
- django_spire/core/templates/django_spire/navigation/mobile_navigation.html +33 -0
- django_spire/core/templates/django_spire/navigation/navigation_links.html +0 -0
- django_spire/core/templates/django_spire/navigation/side_navigation.html +64 -0
- django_spire/core/templates/django_spire/navigation/top_navigation.html +94 -0
- django_spire/core/templates/django_spire/note/info_note.html +3 -0
- django_spire/core/templates/django_spire/note/note.html +14 -0
- django_spire/core/templates/django_spire/page/center_card_page.html +19 -0
- django_spire/core/templates/django_spire/page/delete_confirmation_form_page.html +5 -0
- django_spire/core/templates/django_spire/page/delete_form_page.html +9 -0
- django_spire/core/templates/django_spire/page/form_full_page.html +15 -0
- django_spire/core/templates/django_spire/page/full_page.html +270 -0
- django_spire/core/templates/django_spire/page/infinite_scroll_list_page.html +7 -0
- django_spire/core/templates/django_spire/page/page.html +18 -0
- django_spire/core/templates/django_spire/speech/speech_recognition.html +24 -0
- django_spire/core/templates/django_spire/speech/speech_synthesis.html +30 -0
- django_spire/core/templates/django_spire/tab/element/tab_section_element.html +8 -0
- django_spire/core/templates/django_spire/tab/element/tab_trigger_element.html +14 -0
- django_spire/core/templates/django_spire/tab/tab.html +67 -0
- django_spire/core/templates/django_spire/table/base.html +221 -0
- django_spire/core/templates/django_spire/table/element/child_row.html +59 -0
- django_spire/core/templates/django_spire/table/element/expandable_row.html +45 -0
- django_spire/core/templates/django_spire/table/element/footer.html +9 -0
- django_spire/core/templates/django_spire/table/element/header.html +9 -0
- django_spire/core/templates/django_spire/table/element/loading_skeleton.html +13 -0
- django_spire/core/templates/django_spire/table/element/refreshing_skeleton.html +13 -0
- django_spire/core/templates/django_spire/table/element/row.html +102 -0
- django_spire/core/templates/django_spire/table/element/trigger.html +1 -0
- django_spire/core/templates/django_spire/table/item/no_data_item.html +11 -0
- django_spire/core/templates/django_spire/tag/element/tag.html +1 -0
- django_spire/core/templates/django_spire/wizard/wizard.html +66 -0
- django_spire/core/templates/django_spire/wizard/wizard_page.html +3 -0
- django_spire/core/templatetags/__init__.py +0 -0
- django_spire/core/templatetags/json.py +14 -0
- django_spire/core/templatetags/message.py +24 -0
- django_spire/core/templatetags/spire_core_tags.py +172 -0
- django_spire/core/templatetags/string_formating.py +23 -0
- django_spire/core/templatetags/variable_types.py +43 -0
- django_spire/core/tests/__init__.py +0 -0
- django_spire/core/tests/test_cases.py +22 -0
- django_spire/core/tests/test_templatetags.py +117 -0
- django_spire/core/tests/tests_redirect.py +215 -0
- django_spire/core/tests/tests_shortcuts.py +73 -0
- django_spire/core/urls.py +11 -0
- django_spire/core/utils.py +32 -0
- django_spire/exceptions.py +2 -0
- django_spire/file/__init__.py +0 -0
- django_spire/file/admin.py +33 -0
- django_spire/file/apps.py +29 -0
- django_spire/file/fields.py +46 -0
- django_spire/file/forms.py +22 -0
- django_spire/file/interfaces.py +209 -0
- django_spire/file/migrations/0001_initial.py +39 -0
- django_spire/file/migrations/__init__.py +0 -0
- django_spire/file/mixins.py +21 -0
- django_spire/file/models.py +48 -0
- django_spire/file/queryset.py +11 -0
- django_spire/file/templates/django_spire/file/card/demo_detail_card.html +9 -0
- django_spire/file/templates/django_spire/file/card/demo_file_list_card.html +20 -0
- django_spire/file/templates/django_spire/file/card/demo_filler_card.html +9 -0
- django_spire/file/templates/django_spire/file/card/demo_list_card.html +20 -0
- django_spire/file/templates/django_spire/file/item/demo_item.html +16 -0
- django_spire/file/templates/django_spire/file/item/file_item.html +22 -0
- django_spire/file/templates/django_spire/file/navigation/file_navigation.html +2 -0
- django_spire/file/templates/django_spire/file/page/demo_detail_page.html +19 -0
- django_spire/file/templates/django_spire/file/page/demo_list_page.html +9 -0
- django_spire/file/templates/django_spire/file/page/version_list_page.html +9 -0
- django_spire/file/templates/django_spire/file/widget/multiple_file_widget.html +1 -0
- django_spire/file/templates/django_spire/file/widget/single_file_widget.html +1 -0
- django_spire/file/tests/__init__.py +0 -0
- django_spire/file/tools.py +34 -0
- django_spire/file/urls.py +18 -0
- django_spire/file/utils.py +8 -0
- django_spire/file/views.py +33 -0
- django_spire/file/widgets.py +39 -0
- django_spire/help_desk/__init__.py +0 -0
- django_spire/help_desk/apps.py +24 -0
- django_spire/help_desk/auth/__init__.py +0 -0
- django_spire/help_desk/auth/controller.py +15 -0
- django_spire/help_desk/choices.py +19 -0
- django_spire/help_desk/enums.py +7 -0
- django_spire/help_desk/exceptions.py +5 -0
- django_spire/help_desk/forms.py +17 -0
- django_spire/help_desk/migrations/0001_initial.py +37 -0
- django_spire/help_desk/migrations/__init__.py +0 -0
- django_spire/help_desk/models.py +47 -0
- django_spire/help_desk/querysets.py +4 -0
- django_spire/help_desk/services/__init__.py +0 -0
- django_spire/help_desk/services/notification_service.py +169 -0
- django_spire/help_desk/services/service.py +25 -0
- django_spire/help_desk/templates/django_spire/help_desk/card/ticket_detail_card.html +34 -0
- django_spire/help_desk/templates/django_spire/help_desk/card/ticket_form_card.html +13 -0
- django_spire/help_desk/templates/django_spire/help_desk/card/ticket_list_card.html +24 -0
- django_spire/help_desk/templates/django_spire/help_desk/element/icon.html +3 -0
- django_spire/help_desk/templates/django_spire/help_desk/element/ticket_priority_badge.html +9 -0
- django_spire/help_desk/templates/django_spire/help_desk/element/ticket_purpose_badge.html +5 -0
- django_spire/help_desk/templates/django_spire/help_desk/element/ticket_status_badge.html +7 -0
- django_spire/help_desk/templates/django_spire/help_desk/form/ticket_form.html +31 -0
- django_spire/help_desk/templates/django_spire/help_desk/item/ticket_item.html +38 -0
- django_spire/help_desk/templates/django_spire/help_desk/page/ticket_detail_page.html +9 -0
- django_spire/help_desk/templates/django_spire/help_desk/page/ticket_form_page.html +9 -0
- django_spire/help_desk/templates/django_spire/help_desk/page/ticket_list_page.html +9 -0
- django_spire/help_desk/tests/__init__.py +0 -0
- django_spire/help_desk/tests/factories.py +25 -0
- django_spire/help_desk/tests/test_services/__init__.py +0 -0
- django_spire/help_desk/tests/test_services/test_notification_service.py +62 -0
- django_spire/help_desk/tests/test_urls/__init__.py +0 -0
- django_spire/help_desk/tests/test_urls/test_form_urls.py +21 -0
- django_spire/help_desk/tests/test_urls/test_page_urls.py +36 -0
- django_spire/help_desk/tests/test_views/__init__.py +0 -0
- django_spire/help_desk/tests/test_views/test_form_views.py +56 -0
- django_spire/help_desk/tests/test_views/test_page_views.py +46 -0
- django_spire/help_desk/urls/__init__.py +8 -0
- django_spire/help_desk/urls/form_urls.py +10 -0
- django_spire/help_desk/urls/page_urls.py +11 -0
- django_spire/help_desk/views/__init__.py +0 -0
- django_spire/help_desk/views/form_views.py +74 -0
- django_spire/help_desk/views/page_views.py +48 -0
- django_spire/history/__init__.py +0 -0
- django_spire/history/activity/__init__.py +0 -0
- django_spire/history/activity/admin.py +50 -0
- django_spire/history/activity/apps.py +14 -0
- django_spire/history/activity/migrations/0001_initial.py +53 -0
- django_spire/history/activity/migrations/__init__.py +0 -0
- django_spire/history/activity/mixins.py +46 -0
- django_spire/history/activity/models.py +86 -0
- django_spire/history/activity/querysets.py +6 -0
- django_spire/history/activity/tests.py +3 -0
- django_spire/history/activity/utils.py +25 -0
- django_spire/history/activity/views.py +3 -0
- django_spire/history/admin.py +25 -0
- django_spire/history/apps.py +16 -0
- django_spire/history/choices.py +9 -0
- django_spire/history/migrations/0001_initial.py +32 -0
- django_spire/history/migrations/__init__.py +0 -0
- django_spire/history/mixins.py +52 -0
- django_spire/history/models.py +38 -0
- django_spire/history/querysets.py +14 -0
- django_spire/history/static/django_spire/js/history.js +0 -0
- django_spire/history/templates/django_spire/activity/card/list_card.html +17 -0
- django_spire/history/templates/django_spire/activity/item/activity_item.html +15 -0
- django_spire/history/tests/__init__.py +0 -0
- django_spire/history/viewed/__init__.py +0 -0
- django_spire/history/viewed/admin.py +31 -0
- django_spire/history/viewed/apps.py +14 -0
- django_spire/history/viewed/migrations/0001_initial.py +34 -0
- django_spire/history/viewed/migrations/__init__.py +0 -0
- django_spire/history/viewed/mixins.py +28 -0
- django_spire/history/viewed/models.py +29 -0
- django_spire/knowledge/__init__.py +0 -0
- django_spire/knowledge/admin.py +8 -0
- django_spire/knowledge/apps.py +27 -0
- django_spire/knowledge/auth/__init__.py +0 -0
- django_spire/knowledge/auth/controller.py +27 -0
- django_spire/knowledge/collection/__init__.py +0 -0
- django_spire/knowledge/collection/admin.py +41 -0
- django_spire/knowledge/collection/forms.py +11 -0
- django_spire/knowledge/collection/models.py +86 -0
- django_spire/knowledge/collection/querysets.py +67 -0
- django_spire/knowledge/collection/seeding/__init__.py +0 -0
- django_spire/knowledge/collection/seeding/seed.py +8 -0
- django_spire/knowledge/collection/seeding/seeder.py +49 -0
- django_spire/knowledge/collection/services/__init__.py +0 -0
- django_spire/knowledge/collection/services/factory_service.py +42 -0
- django_spire/knowledge/collection/services/ordering_service.py +40 -0
- django_spire/knowledge/collection/services/processor_service.py +30 -0
- django_spire/knowledge/collection/services/service.py +55 -0
- django_spire/knowledge/collection/services/tag_service.py +54 -0
- django_spire/knowledge/collection/services/tool_services.py +37 -0
- django_spire/knowledge/collection/services/transformation_service.py +108 -0
- django_spire/knowledge/collection/tests/__init__.py +0 -0
- django_spire/knowledge/collection/tests/factories.py +15 -0
- django_spire/knowledge/collection/tests/test_services/__init__.py +0 -0
- django_spire/knowledge/collection/tests/test_services/test_transformation_service.py +71 -0
- django_spire/knowledge/collection/tests/test_urls/__init__.py +0 -0
- django_spire/knowledge/collection/tests/test_urls/test_form_urls.py +19 -0
- django_spire/knowledge/collection/tests/test_urls/test_json_urls.py +25 -0
- django_spire/knowledge/collection/tests/test_urls/test_page_urls.py +29 -0
- django_spire/knowledge/collection/urls/__init__.py +11 -0
- django_spire/knowledge/collection/urls/form_urls.py +12 -0
- django_spire/knowledge/collection/urls/json_urls.py +10 -0
- django_spire/knowledge/collection/urls/page_urls.py +11 -0
- django_spire/knowledge/collection/views/__init__.py +0 -0
- django_spire/knowledge/collection/views/form_views.py +94 -0
- django_spire/knowledge/collection/views/json_views.py +32 -0
- django_spire/knowledge/collection/views/page_views.py +57 -0
- django_spire/knowledge/entry/__init__.py +0 -0
- django_spire/knowledge/entry/admin.py +44 -0
- django_spire/knowledge/entry/forms.py +14 -0
- django_spire/knowledge/entry/models.py +75 -0
- django_spire/knowledge/entry/querysets.py +37 -0
- django_spire/knowledge/entry/seeding/__init__.py +0 -0
- django_spire/knowledge/entry/seeding/seed.py +3 -0
- django_spire/knowledge/entry/seeding/seeder.py +64 -0
- django_spire/knowledge/entry/services/__init__.py +0 -0
- django_spire/knowledge/entry/services/automation_service.py +51 -0
- django_spire/knowledge/entry/services/factory_service.py +45 -0
- django_spire/knowledge/entry/services/processor_service.py +18 -0
- django_spire/knowledge/entry/services/service.py +51 -0
- django_spire/knowledge/entry/services/tag_service.py +34 -0
- django_spire/knowledge/entry/services/tool_service.py +39 -0
- django_spire/knowledge/entry/services/transformation_services.py +80 -0
- django_spire/knowledge/entry/tests/__init__.py +0 -0
- django_spire/knowledge/entry/tests/factories.py +16 -0
- django_spire/knowledge/entry/tests/test_urls/__init__.py +0 -0
- django_spire/knowledge/entry/tests/test_urls/test_form_urls.py +54 -0
- django_spire/knowledge/entry/tests/test_urls/test_json_urls.py +30 -0
- django_spire/knowledge/entry/tests/test_urls/test_page_urls.py +30 -0
- django_spire/knowledge/entry/urls/__init__.py +12 -0
- django_spire/knowledge/entry/urls/form_urls.py +12 -0
- django_spire/knowledge/entry/urls/json_urls.py +11 -0
- django_spire/knowledge/entry/urls/page_urls.py +10 -0
- django_spire/knowledge/entry/urls/template_urls.py +10 -0
- django_spire/knowledge/entry/version/__init__.py +0 -0
- django_spire/knowledge/entry/version/admin.py +18 -0
- django_spire/knowledge/entry/version/block/__init__.py +0 -0
- django_spire/knowledge/entry/version/block/admin.py +15 -0
- django_spire/knowledge/entry/version/block/choices.py +7 -0
- django_spire/knowledge/entry/version/block/constants.py +1 -0
- django_spire/knowledge/entry/version/block/data/__init__.py +0 -0
- django_spire/knowledge/entry/version/block/data/data.py +34 -0
- django_spire/knowledge/entry/version/block/data/heading_data.py +15 -0
- django_spire/knowledge/entry/version/block/data/list/__init__.py +0 -0
- django_spire/knowledge/entry/version/block/data/list/choices.py +17 -0
- django_spire/knowledge/entry/version/block/data/list/data.py +101 -0
- django_spire/knowledge/entry/version/block/data/list/maps.py +14 -0
- django_spire/knowledge/entry/version/block/data/list/meta.py +15 -0
- django_spire/knowledge/entry/version/block/data/maps.py +21 -0
- django_spire/knowledge/entry/version/block/data/text_data.py +13 -0
- django_spire/knowledge/entry/version/block/models.py +62 -0
- django_spire/knowledge/entry/version/block/querysets.py +25 -0
- django_spire/knowledge/entry/version/block/seeding/__init__.py +0 -0
- django_spire/knowledge/entry/version/block/seeding/constants.py +315 -0
- django_spire/knowledge/entry/version/block/services/__init__.py +0 -0
- django_spire/knowledge/entry/version/block/services/factory_service.py +51 -0
- django_spire/knowledge/entry/version/block/services/service.py +15 -0
- django_spire/knowledge/entry/version/block/tests/__init__.py +0 -0
- django_spire/knowledge/entry/version/block/tests/factories.py +42 -0
- django_spire/knowledge/entry/version/choices.py +7 -0
- django_spire/knowledge/entry/version/consts.py +1 -0
- django_spire/knowledge/entry/version/converters/__init__.py +0 -0
- django_spire/knowledge/entry/version/converters/converter.py +19 -0
- django_spire/knowledge/entry/version/converters/docx_converter.py +66 -0
- django_spire/knowledge/entry/version/converters/markdown_converter.py +221 -0
- django_spire/knowledge/entry/version/intelligence/__init__.py +0 -0
- django_spire/knowledge/entry/version/intelligence/bots/__init__.py +0 -0
- django_spire/knowledge/entry/version/intelligence/bots/markdown_format_llm_bot.py +26 -0
- django_spire/knowledge/entry/version/maps.py +11 -0
- django_spire/knowledge/entry/version/models.py +45 -0
- django_spire/knowledge/entry/version/querysets.py +17 -0
- django_spire/knowledge/entry/version/seeding/__init__.py +0 -0
- django_spire/knowledge/entry/version/seeding/seeder.py +72 -0
- django_spire/knowledge/entry/version/services/__init__.py +0 -0
- django_spire/knowledge/entry/version/services/processor_service.py +64 -0
- django_spire/knowledge/entry/version/services/service.py +16 -0
- django_spire/knowledge/entry/version/services/tests/__init__.py +0 -0
- django_spire/knowledge/entry/version/services/tests/test_processor_service.py +0 -0
- django_spire/knowledge/entry/version/tests/__init__.py +0 -0
- django_spire/knowledge/entry/version/tests/factories.py +18 -0
- django_spire/knowledge/entry/version/tests/test_converters/__init__.py +0 -0
- django_spire/knowledge/entry/version/tests/test_converters/test_docx_converter.py +45 -0
- django_spire/knowledge/entry/version/tests/test_urls/__init__.py +0 -0
- django_spire/knowledge/entry/version/tests/test_urls/test_json_urls.py +34 -0
- django_spire/knowledge/entry/version/tests/test_urls/test_page_urls.py +30 -0
- django_spire/knowledge/entry/version/urls/__init__.py +9 -0
- django_spire/knowledge/entry/version/urls/json_urls.py +20 -0
- django_spire/knowledge/entry/version/urls/page_urls.py +10 -0
- django_spire/knowledge/entry/version/urls/redirect_urls.py +10 -0
- django_spire/knowledge/entry/version/views/__init__.py +0 -0
- django_spire/knowledge/entry/version/views/json_views.py +32 -0
- django_spire/knowledge/entry/version/views/page_views.py +46 -0
- django_spire/knowledge/entry/version/views/redirect_views.py +22 -0
- django_spire/knowledge/entry/views/__init__.py +0 -0
- django_spire/knowledge/entry/views/form_views.py +124 -0
- django_spire/knowledge/entry/views/json_views.py +55 -0
- django_spire/knowledge/entry/views/page_views.py +23 -0
- django_spire/knowledge/entry/views/template_views.py +33 -0
- django_spire/knowledge/exceptions.py +4 -0
- django_spire/knowledge/intelligence/__init__.py +0 -0
- django_spire/knowledge/intelligence/bots/__init__.py +0 -0
- django_spire/knowledge/intelligence/bots/knowledge_answer_bot.py +44 -0
- django_spire/knowledge/intelligence/bots/knowledge_entries_bot.py +45 -0
- django_spire/knowledge/intelligence/intel/__init__.py +0 -0
- django_spire/knowledge/intelligence/intel/answer_intel.py +6 -0
- django_spire/knowledge/intelligence/intel/entry_intel.py +26 -0
- django_spire/knowledge/intelligence/intel/message_intel.py +14 -0
- django_spire/knowledge/intelligence/router.py +26 -0
- django_spire/knowledge/intelligence/workflows/__init__.py +0 -0
- django_spire/knowledge/intelligence/workflows/knowledge_workflow.py +84 -0
- django_spire/knowledge/migrations/0001_initial.py +95 -0
- django_spire/knowledge/migrations/0002_alter_entryversionblock_type.py +18 -0
- django_spire/knowledge/migrations/0003_alter_collection_order_alter_entry_order_and_more.py +28 -0
- django_spire/knowledge/migrations/0004_alter_collection_options_collectiongroup.py +27 -0
- django_spire/knowledge/migrations/0005_entryversionblock__tunes_data_and_more.py +23 -0
- django_spire/knowledge/migrations/0006_alter_entryversionblock_type.py +18 -0
- django_spire/knowledge/migrations/0007_alter_collection_options.py +17 -0
- django_spire/knowledge/migrations/0008_collection_tags_entry_tags.py +24 -0
- django_spire/knowledge/migrations/__init__.py +0 -0
- django_spire/knowledge/models.py +16 -0
- django_spire/knowledge/seeding/__init__.py +0 -0
- django_spire/knowledge/seeding/seed.py +3 -0
- django_spire/knowledge/static/django_spire/knowledge/collection/js/managers.js +148 -0
- django_spire/knowledge/static/django_spire/knowledge/collection/js/x_component.js +26 -0
- django_spire/knowledge/static/django_spire/knowledge/css/editor.css +93 -0
- django_spire/knowledge/static/django_spire/knowledge/css/navigation_items.css +9 -0
- django_spire/knowledge/static/django_spire/knowledge/entry/version/js/editor.js +105 -0
- django_spire/knowledge/static/django_spire/knowledge/entry/version/js/managers.js +98 -0
- django_spire/knowledge/static/django_spire/knowledge/entry/version/js/null_paragraph.js +15 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/card/form_card.html +5 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/card/top_level_list_card.html +20 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/component/x_collection_navigation.html +49 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/container/detail_container.html +13 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/element/ellipsis_dropdown.html +22 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/form/form.html +49 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/item/collection_item.html +19 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/page/display_page.html +67 -0
- django_spire/knowledge/templates/django_spire/knowledge/collection/page/form_page.html +9 -0
- django_spire/knowledge/templates/django_spire/knowledge/container/container.html +33 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/badge/entry_status_badge.html +11 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/card/form_card.html +5 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/card/list_card.html +52 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/container/import_form_container.html +9 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/file/card/list_card.html +35 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/file/item/list_item.html +21 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/file/page/list_page.html +9 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/form/form.html +19 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/form/import_form.html +54 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/item/list_item.html +41 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/modal/publish_confirm_modal.html +21 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/page/form_page.html +9 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/page/import_form_page.html +9 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/version/container/editor_container.html +80 -0
- django_spire/knowledge/templates/django_spire/knowledge/entry/version/page/editor_page.html +76 -0
- django_spire/knowledge/templates/django_spire/knowledge/message/knowledge_message_intel.html +32 -0
- django_spire/knowledge/templates/django_spire/knowledge/page/full_page.html +37 -0
- django_spire/knowledge/templates/django_spire/knowledge/page/home_page.html +11 -0
- django_spire/knowledge/templates/django_spire/knowledge/sub_navigation/element/collection_sub_navigation_ellipsis_dropdown.html +15 -0
- django_spire/knowledge/templates/django_spire/knowledge/sub_navigation/element/entry_sub_navigation_ellipsis_dropdown.html +12 -0
- django_spire/knowledge/templates/django_spire/knowledge/sub_navigation/item/collection_sub_navigation_item.html +29 -0
- django_spire/knowledge/templates/django_spire/knowledge/sub_navigation/item/entry_sub_navigation_item.html +21 -0
- django_spire/knowledge/templates/django_spire/knowledge/sub_navigation/widget/collection_entry_sub_navigation_widget.html +168 -0
- django_spire/knowledge/templatetags/__init__.py +0 -0
- django_spire/knowledge/templatetags/spire_knowledge_tags.py +28 -0
- django_spire/knowledge/urls/__init__.py +10 -0
- django_spire/knowledge/urls/page_urls.py +10 -0
- django_spire/knowledge/views/__init__.py +0 -0
- django_spire/knowledge/views/page_views.py +24 -0
- django_spire/notification/__init__.py +0 -0
- django_spire/notification/admin.py +32 -0
- django_spire/notification/app/__init__.py +0 -0
- django_spire/notification/app/admin.py +10 -0
- django_spire/notification/app/apps.py +14 -0
- django_spire/notification/app/context_data.py +36 -0
- django_spire/notification/app/exceptions.py +5 -0
- django_spire/notification/app/migrations/0001_initial.py +34 -0
- django_spire/notification/app/migrations/__init__.py +0 -0
- django_spire/notification/app/models.py +63 -0
- django_spire/notification/app/processor.py +74 -0
- django_spire/notification/app/querysets.py +43 -0
- django_spire/notification/app/templates/django_spire/notification/app/card/list_card.html +11 -0
- django_spire/notification/app/templates/django_spire/notification/app/dropdown/notification_dropdown.html +48 -0
- django_spire/notification/app/templates/django_spire/notification/app/dropdown/notification_dropdown_content.html +33 -0
- django_spire/notification/app/templates/django_spire/notification/app/element/notification_bell.html +8 -0
- django_spire/notification/app/templates/django_spire/notification/app/item/notification_item.html +25 -0
- django_spire/notification/app/templates/django_spire/notification/app/page/list_page.html +5 -0
- django_spire/notification/app/tests.py +3 -0
- django_spire/notification/app/urls/__init__.py +10 -0
- django_spire/notification/app/urls/json_urls.py +16 -0
- django_spire/notification/app/urls/page_urls.py +13 -0
- django_spire/notification/app/urls/template_urls.py +12 -0
- django_spire/notification/app/views/__init__.py +0 -0
- django_spire/notification/app/views/json_views.py +52 -0
- django_spire/notification/app/views/page_views.py +32 -0
- django_spire/notification/app/views/template_views.py +39 -0
- django_spire/notification/apps.py +22 -0
- django_spire/notification/automations.py +11 -0
- django_spire/notification/choices.py +24 -0
- django_spire/notification/email/__init__.py +0 -0
- django_spire/notification/email/admin.py +10 -0
- django_spire/notification/email/apps.py +14 -0
- django_spire/notification/email/exceptions.py +5 -0
- django_spire/notification/email/helper.py +72 -0
- django_spire/notification/email/migrations/0001_initial.py +29 -0
- django_spire/notification/email/migrations/0002_emailnotification_bcc_emailnotification_cc_and_more.py +33 -0
- django_spire/notification/email/migrations/0003_emailnotification_attachments.py +19 -0
- django_spire/notification/email/migrations/__init__.py +0 -0
- django_spire/notification/email/models.py +42 -0
- django_spire/notification/email/processor.py +86 -0
- django_spire/notification/email/querysets.py +30 -0
- django_spire/notification/exceptions.py +5 -0
- django_spire/notification/managers.py +47 -0
- django_spire/notification/maps.py +12 -0
- django_spire/notification/migrations/0001_initial.py +45 -0
- django_spire/notification/migrations/0002_pushnotification.py +28 -0
- django_spire/notification/migrations/0003_delete_pushnotification.py +16 -0
- django_spire/notification/migrations/__init__.py +0 -0
- django_spire/notification/mixins.py +11 -0
- django_spire/notification/models.py +66 -0
- django_spire/notification/processors/__init__.py +1 -0
- django_spire/notification/processors/notification.py +60 -0
- django_spire/notification/processors/processor.py +29 -0
- django_spire/notification/push/__init__.py +0 -0
- django_spire/notification/push/admin.py +3 -0
- django_spire/notification/push/apps.py +14 -0
- django_spire/notification/push/migrations/0001_initial.py +29 -0
- django_spire/notification/push/migrations/__init__.py +0 -0
- django_spire/notification/push/models.py +11 -0
- django_spire/notification/querysets.py +117 -0
- django_spire/notification/sms/__init__.py +0 -0
- django_spire/notification/sms/admin.py +36 -0
- django_spire/notification/sms/apps.py +19 -0
- django_spire/notification/sms/automations.py +15 -0
- django_spire/notification/sms/choices.py +6 -0
- django_spire/notification/sms/consts.py +3 -0
- django_spire/notification/sms/exceptions.py +17 -0
- django_spire/notification/sms/helper.py +112 -0
- django_spire/notification/sms/migrations/0001_initial.py +29 -0
- django_spire/notification/sms/migrations/0002_smstemporarymedia_smsnotification_media_url_and_more.py +40 -0
- django_spire/notification/sms/migrations/__init__.py +0 -0
- django_spire/notification/sms/models.py +75 -0
- django_spire/notification/sms/processor.py +73 -0
- django_spire/notification/sms/querysets.py +11 -0
- django_spire/notification/sms/tests/__init__.py +0 -0
- django_spire/notification/sms/tests/test_tools.py +55 -0
- django_spire/notification/sms/tools.py +39 -0
- django_spire/notification/sms/urls/__init__.py +8 -0
- django_spire/notification/sms/urls/media_urls.py +12 -0
- django_spire/notification/sms/views/__init__.py +0 -0
- django_spire/notification/sms/views/media_views.py +35 -0
- django_spire/notification/urls.py +9 -0
- django_spire/notification/utils.py +7 -0
- django_spire/profiling/__init__.py +13 -0
- django_spire/profiling/middleware/__init__.py +6 -0
- django_spire/profiling/middleware/profiling.py +196 -0
- django_spire/profiling/panel.py +345 -0
- django_spire/profiling/templates/panel.html +166 -0
- django_spire/settings.py +25 -0
- django_spire/testing/__init__.py +0 -0
- django_spire/testing/playwright/__init__.py +64 -0
- django_spire/testing/playwright/components/__init__.py +45 -0
- django_spire/testing/playwright/components/accordion.py +55 -0
- django_spire/testing/playwright/components/attribute_element.py +73 -0
- django_spire/testing/playwright/components/base_session_filter_form.py +57 -0
- django_spire/testing/playwright/components/breadcrumb_element.py +56 -0
- django_spire/testing/playwright/components/card.py +102 -0
- django_spire/testing/playwright/components/dropdown.py +87 -0
- django_spire/testing/playwright/components/infinite_scroll.py +158 -0
- django_spire/testing/playwright/components/lazy_tab.py +92 -0
- django_spire/testing/playwright/components/modal.py +101 -0
- django_spire/testing/playwright/components/navigation.py +119 -0
- django_spire/testing/playwright/components/notification_bell.py +59 -0
- django_spire/testing/playwright/components/theme_selector.py +46 -0
- django_spire/testing/playwright/components/toast.py +72 -0
- django_spire/testing/playwright/fixtures.py +54 -0
- django_spire/testing/playwright/pages/__init__.py +6 -0
- django_spire/testing/playwright/pages/base.py +24 -0
- django_spire/theme/__init__.py +0 -0
- django_spire/theme/apps.py +19 -0
- django_spire/theme/enums.py +21 -0
- django_spire/theme/models.py +141 -0
- django_spire/theme/templates/django_spire/theme/card/badges_preview_card.html +29 -0
- django_spire/theme/templates/django_spire/theme/card/base_preview_card.html +24 -0
- django_spire/theme/templates/django_spire/theme/card/borders_preview_card.html +42 -0
- django_spire/theme/templates/django_spire/theme/card/buttons_preview_card.html +42 -0
- django_spire/theme/templates/django_spire/theme/card/colors_preview_card.html +40 -0
- django_spire/theme/templates/django_spire/theme/card/django_glue_preview_card.html +42 -0
- django_spire/theme/templates/django_spire/theme/card/example_preview_card.html +34 -0
- django_spire/theme/templates/django_spire/theme/card/preview_card.html +35 -0
- django_spire/theme/templates/django_spire/theme/card/typography_preview_card.html +30 -0
- django_spire/theme/templates/django_spire/theme/element/theme_selector.html +33 -0
- django_spire/theme/templates/django_spire/theme/element/theme_toggle_element.html +8 -0
- django_spire/theme/templates/django_spire/theme/example/card/example_title_card.html +25 -0
- django_spire/theme/templates/django_spire/theme/example/container/example_container.html +17 -0
- django_spire/theme/templates/django_spire/theme/example/form/example_form.html +97 -0
- django_spire/theme/templates/django_spire/theme/example/form/example_form_card.html +5 -0
- django_spire/theme/templates/django_spire/theme/example/item/example_item.html +25 -0
- django_spire/theme/templates/django_spire/theme/example/page/example_page.html +12 -0
- django_spire/theme/templates/django_spire/theme/example/tab/element/example_tab_section_element.html +10 -0
- django_spire/theme/templates/django_spire/theme/example/tab/example_tab.html +13 -0
- django_spire/theme/templates/django_spire/theme/page/badges_page.html +10 -0
- django_spire/theme/templates/django_spire/theme/page/borders_page.html +9 -0
- django_spire/theme/templates/django_spire/theme/page/buttons_page.html +9 -0
- django_spire/theme/templates/django_spire/theme/page/colors_page.html +9 -0
- django_spire/theme/templates/django_spire/theme/page/dashboard_page.html +85 -0
- django_spire/theme/templates/django_spire/theme/page/django_glue_page.html +10 -0
- django_spire/theme/templates/django_spire/theme/page/theme_page.html +24 -0
- django_spire/theme/templates/django_spire/theme/page/typography_page.html +9 -0
- django_spire/theme/templates/django_spire/theme/section/badge_section.html +57 -0
- django_spire/theme/templates/django_spire/theme/section/badge_section_card.html +5 -0
- django_spire/theme/templates/django_spire/theme/section/border_section.html +52 -0
- django_spire/theme/templates/django_spire/theme/section/border_section_card.html +5 -0
- django_spire/theme/templates/django_spire/theme/section/button_section.html +58 -0
- django_spire/theme/templates/django_spire/theme/section/button_section_card.html +5 -0
- django_spire/theme/templates/django_spire/theme/section/color_section.html +342 -0
- django_spire/theme/templates/django_spire/theme/section/color_section_card.html +5 -0
- django_spire/theme/templates/django_spire/theme/section/typography_section.html +149 -0
- django_spire/theme/templates/django_spire/theme/section/typography_section_card.html +5 -0
- django_spire/theme/tests/__init__.py +0 -0
- django_spire/theme/tests/test_context_processor.py +84 -0
- django_spire/theme/tests/test_enums.py +29 -0
- django_spire/theme/tests/test_filesystem.py +181 -0
- django_spire/theme/tests/test_integration.py +48 -0
- django_spire/theme/tests/test_model.py +173 -0
- django_spire/theme/tests/test_views/__init__.py +0 -0
- django_spire/theme/tests/test_views/test_json_views.py +120 -0
- django_spire/theme/urls/__init__.py +9 -0
- django_spire/theme/urls/json_urls.py +10 -0
- django_spire/theme/urls/page_urls.py +16 -0
- django_spire/theme/utils.py +14 -0
- django_spire/theme/views/__init__.py +0 -0
- django_spire/theme/views/json_views.py +73 -0
- django_spire/theme/views/page_views.py +132 -0
- django_spire/urls.py +21 -0
- django_spire/utils.py +31 -0
- django_spire-0.23.4.dist-info/METADATA +116 -0
- django_spire-0.23.4.dist-info/RECORD +1202 -0
- django_spire-0.23.4.dist-info/WHEEL +5 -0
- django_spire-0.23.4.dist-info/licenses/LICENSE.md +22 -0
- django_spire-0.23.4.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
from django_spire.core.management.commands.spire_startapp_pkg.reporter import Reporter
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PermissionInheritanceHandler:
|
|
12
|
+
"""
|
|
13
|
+
Handles permission inheritance configuration for nested Django apps.
|
|
14
|
+
|
|
15
|
+
This class manages the interactive collection of permission inheritance
|
|
16
|
+
settings when creating child apps that may inherit permissions from parent apps.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self, reporter: Reporter):
|
|
20
|
+
"""
|
|
21
|
+
Initializes the handler with a reporter for user interaction.
|
|
22
|
+
|
|
23
|
+
:param reporter: Reporter instance for displaying prompts and messages.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
self.reporter = reporter
|
|
27
|
+
|
|
28
|
+
def collect_inheritance_data(self, components: list[str]) -> dict[str, Any]:
|
|
29
|
+
"""
|
|
30
|
+
Collects permission inheritance configuration from the user.
|
|
31
|
+
|
|
32
|
+
Prompts the user to determine if the new app should inherit permissions
|
|
33
|
+
from its parent app, and if so, collects the necessary parent model information.
|
|
34
|
+
|
|
35
|
+
:param components: List of app path components.
|
|
36
|
+
:return: Dictionary containing inheritance configuration data.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
if len(components) <= 2:
|
|
40
|
+
return {
|
|
41
|
+
'inherit_permissions': False,
|
|
42
|
+
'parent_model_instance_name': '',
|
|
43
|
+
'parent_permission_prefix': '',
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if not self._should_inherit_permissions():
|
|
47
|
+
return {
|
|
48
|
+
'inherit_permissions': False,
|
|
49
|
+
'parent_model_instance_name': '',
|
|
50
|
+
'parent_permission_prefix': '',
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
'inherit_permissions': True,
|
|
55
|
+
'parent_model_instance_name': self._collect_parent_model_instance_name(components),
|
|
56
|
+
'parent_model_path': self._collect_parent_model_path(components),
|
|
57
|
+
'parent_permission_prefix': self._collect_parent_permission_prefix(components),
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
def _build_default_parent_model_path(self, components: list[str]) -> str:
|
|
61
|
+
"""
|
|
62
|
+
Builds a default parent model path based on app components.
|
|
63
|
+
|
|
64
|
+
:param components: List of app path components.
|
|
65
|
+
:return: Default parent model path string.
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
parent_name = components[-2]
|
|
69
|
+
parent_model_class = ''.join(word.title() for word in parent_name.split('_'))
|
|
70
|
+
return '.'.join(components[:-1]) + f'.models.{parent_model_class}'
|
|
71
|
+
|
|
72
|
+
def _build_default_parent_permission_prefix(self, components: list[str]) -> str:
|
|
73
|
+
"""
|
|
74
|
+
Builds a default parent permission prefix based on app components.
|
|
75
|
+
|
|
76
|
+
:param components: List of app path components.
|
|
77
|
+
:return: Default permission prefix string.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
parent_parts = components[1:-1]
|
|
81
|
+
return '_'.join(parent_parts).lower()
|
|
82
|
+
|
|
83
|
+
def _collect_parent_model_instance_name(self, components: list[str]) -> str:
|
|
84
|
+
"""
|
|
85
|
+
Prompts the user for the parent model instance name.
|
|
86
|
+
|
|
87
|
+
:param components: List of app path components.
|
|
88
|
+
:return: User-provided or default parent model instance name.
|
|
89
|
+
"""
|
|
90
|
+
|
|
91
|
+
parent_name = components[-2]
|
|
92
|
+
default = parent_name.lower()
|
|
93
|
+
|
|
94
|
+
self.reporter.write(
|
|
95
|
+
f'\nEnter the parent model instance name (default: "{default}")',
|
|
96
|
+
self.reporter.style_notice
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
user_input = input('Press Enter to use default or type a custom name: ').strip()
|
|
100
|
+
return user_input if user_input else default
|
|
101
|
+
|
|
102
|
+
def _collect_parent_model_path(self, components: list[str]) -> str:
|
|
103
|
+
"""
|
|
104
|
+
Prompts the user for the parent model path.
|
|
105
|
+
|
|
106
|
+
:param components: List of app path components.
|
|
107
|
+
:return: User-provided or default parent model path.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
default = self._build_default_parent_model_path(components)
|
|
111
|
+
|
|
112
|
+
self.reporter.write(
|
|
113
|
+
f'\nEnter the parent model path (default: "{default}")',
|
|
114
|
+
self.reporter.style_notice
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
user_input = input('Press Enter to use default or type a custom path: ').strip()
|
|
118
|
+
return user_input if user_input else default
|
|
119
|
+
|
|
120
|
+
def _collect_parent_permission_prefix(self, components: list[str]) -> str:
|
|
121
|
+
"""
|
|
122
|
+
Prompts the user for the parent permission prefix.
|
|
123
|
+
|
|
124
|
+
:param components: List of app path components.
|
|
125
|
+
:return: User-provided or default parent permission prefix.
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
default = self._build_default_parent_permission_prefix(components)
|
|
129
|
+
|
|
130
|
+
self.reporter.write(
|
|
131
|
+
f'\nEnter the parent permission prefix (default: "{default}")',
|
|
132
|
+
self.reporter.style_notice
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
user_input = input('Press Enter to use default or type a custom prefix: ').strip()
|
|
136
|
+
return user_input if user_input else default
|
|
137
|
+
|
|
138
|
+
def _should_inherit_permissions(self) -> bool:
|
|
139
|
+
"""
|
|
140
|
+
Prompts the user to confirm permission inheritance.
|
|
141
|
+
|
|
142
|
+
:return: True if user wants to inherit permissions, False otherwise.
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
self.reporter.write('\nDo you want this app to inherit permissions from its parent? (y/n)', self.reporter.style_notice)
|
|
146
|
+
user_input = input('Default is "n": ').strip().lower()
|
|
147
|
+
return user_input == 'y'
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from string import Template
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from django_spire.core.management.commands.spire_startapp_pkg.maps import generate_replacement_map
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
from django_spire.core.management.commands.spire_startapp_pkg.filesystem import FileSystem
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class TemplateEngine:
|
|
15
|
+
"""
|
|
16
|
+
Renders template strings with variable replacements.
|
|
17
|
+
|
|
18
|
+
This class uses Python's string.Template to safely substitute
|
|
19
|
+
placeholders in template files with actual values.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def render(self, text: str, replacements: dict[str, str]) -> str:
|
|
23
|
+
"""
|
|
24
|
+
Renders a template string by replacing placeholders with values.
|
|
25
|
+
|
|
26
|
+
:param text: Template string containing ${variable} placeholders.
|
|
27
|
+
:param replacements: Dictionary mapping placeholder names to their values.
|
|
28
|
+
:return: Rendered string with all placeholders replaced.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
template = Template(text)
|
|
32
|
+
return template.safe_substitute(replacements)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class TemplateProcessor:
|
|
36
|
+
"""
|
|
37
|
+
Processes template files for Django app generation.
|
|
38
|
+
|
|
39
|
+
This class handles the replacement of placeholders in template files
|
|
40
|
+
and manages file renaming based on user configuration.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, engine: TemplateEngine, filesystem: FileSystem):
|
|
44
|
+
"""
|
|
45
|
+
Initializes the processor with an engine and file system.
|
|
46
|
+
|
|
47
|
+
:param engine: Template engine for rendering strings.
|
|
48
|
+
:param filesystem: File system for file operations.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
self._engine = engine
|
|
52
|
+
self._filesystem = filesystem
|
|
53
|
+
|
|
54
|
+
def process_app_templates(
|
|
55
|
+
self,
|
|
56
|
+
directory: Path,
|
|
57
|
+
components: list[str],
|
|
58
|
+
user_inputs: dict[str, str] | None = None
|
|
59
|
+
) -> None:
|
|
60
|
+
"""
|
|
61
|
+
Processes all template files in an app directory.
|
|
62
|
+
|
|
63
|
+
Replaces placeholders in .template files, renames them, and updates
|
|
64
|
+
content in .py files based on user inputs.
|
|
65
|
+
|
|
66
|
+
:param directory: Root directory containing template files.
|
|
67
|
+
:param components: List of app path components.
|
|
68
|
+
:param user_inputs: Optional dictionary of user-provided configuration values.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
for file_path in self._filesystem.iterate_files(directory, '*.template'):
|
|
72
|
+
self._process_file(file_path, components, user_inputs)
|
|
73
|
+
|
|
74
|
+
for file_path in self._filesystem.iterate_files(directory, '*.py'):
|
|
75
|
+
self._replace_content(file_path, components, user_inputs)
|
|
76
|
+
self._rename_file(file_path, components, user_inputs)
|
|
77
|
+
|
|
78
|
+
self._rename_template_files(directory)
|
|
79
|
+
|
|
80
|
+
def process_html_templates(
|
|
81
|
+
self,
|
|
82
|
+
directory: Path,
|
|
83
|
+
components: list[str],
|
|
84
|
+
user_inputs: dict[str, str] | None = None
|
|
85
|
+
) -> None:
|
|
86
|
+
"""
|
|
87
|
+
Processes all HTML template files in a directory.
|
|
88
|
+
|
|
89
|
+
Replaces placeholders in .template files and renames them to remove
|
|
90
|
+
the .template extension.
|
|
91
|
+
|
|
92
|
+
:param directory: Root directory containing HTML template files.
|
|
93
|
+
:param components: List of app path components.
|
|
94
|
+
:param user_inputs: Optional dictionary of user-provided configuration values.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
for file_path in self._filesystem.iterate_files(directory, '*.template'):
|
|
98
|
+
self._process_file(file_path, components, user_inputs)
|
|
99
|
+
|
|
100
|
+
self._rename_template_files(directory)
|
|
101
|
+
|
|
102
|
+
def _process_file(
|
|
103
|
+
self,
|
|
104
|
+
path: Path,
|
|
105
|
+
components: list[str],
|
|
106
|
+
user_inputs: dict[str, str] | None = None
|
|
107
|
+
) -> None:
|
|
108
|
+
"""
|
|
109
|
+
Processes a single template file.
|
|
110
|
+
|
|
111
|
+
Replaces content placeholders and renames the file based on configuration.
|
|
112
|
+
|
|
113
|
+
:param path: Path to the template file.
|
|
114
|
+
:param components: List of app path components.
|
|
115
|
+
:param user_inputs: Optional dictionary of user-provided configuration values.
|
|
116
|
+
"""
|
|
117
|
+
|
|
118
|
+
self._replace_content(path, components, user_inputs)
|
|
119
|
+
self._rename_file(path, components, user_inputs)
|
|
120
|
+
|
|
121
|
+
def _rename_file(
|
|
122
|
+
self,
|
|
123
|
+
path: Path,
|
|
124
|
+
components: list[str],
|
|
125
|
+
user_inputs: dict[str, str] | None = None
|
|
126
|
+
) -> None:
|
|
127
|
+
"""
|
|
128
|
+
Renames a file by replacing placeholders in its filename.
|
|
129
|
+
|
|
130
|
+
:param path: Current path of the file.
|
|
131
|
+
:param components: List of app path components.
|
|
132
|
+
:param user_inputs: Optional dictionary of user-provided configuration values.
|
|
133
|
+
"""
|
|
134
|
+
|
|
135
|
+
replacement = generate_replacement_map(components, user_inputs)
|
|
136
|
+
new_name = self._engine.render(path.name, replacement)
|
|
137
|
+
|
|
138
|
+
if new_name != path.name:
|
|
139
|
+
new_path = path.parent / new_name
|
|
140
|
+
self._filesystem.rename(path, new_path)
|
|
141
|
+
|
|
142
|
+
def _rename_template_files(self, directory: Path) -> None:
|
|
143
|
+
"""
|
|
144
|
+
Removes .template extensions from all template files in a directory.
|
|
145
|
+
|
|
146
|
+
:param directory: Directory to search for .template files.
|
|
147
|
+
"""
|
|
148
|
+
|
|
149
|
+
for template_file in self._filesystem.iterate_files(directory, '*.template'):
|
|
150
|
+
new_name = template_file.name.replace('.template', '')
|
|
151
|
+
new_path = template_file.parent / new_name
|
|
152
|
+
self._filesystem.rename(template_file, new_path)
|
|
153
|
+
|
|
154
|
+
def _replace_content(
|
|
155
|
+
self,
|
|
156
|
+
path: Path,
|
|
157
|
+
components: list[str],
|
|
158
|
+
user_inputs: dict[str, str] | None = None
|
|
159
|
+
) -> None:
|
|
160
|
+
"""
|
|
161
|
+
Replaces placeholders in a file's content.
|
|
162
|
+
|
|
163
|
+
:param path: Path to the file to process.
|
|
164
|
+
:param components: List of app path components.
|
|
165
|
+
:param user_inputs: Optional dictionary of user-provided configuration values.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
replacement = generate_replacement_map(components, user_inputs)
|
|
169
|
+
content = self._filesystem.read_file(path)
|
|
170
|
+
updated_content = self._engine.render(content, replacement)
|
|
171
|
+
self._filesystem.write_file(path, updated_content)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from django.apps import apps
|
|
4
|
+
from django.conf import settings
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AppRegistry:
|
|
8
|
+
"""
|
|
9
|
+
Manages Django app registration information.
|
|
10
|
+
|
|
11
|
+
This class provides methods to query which apps are installed in the
|
|
12
|
+
Django project and validate app component hierarchies.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
def get_installed_apps(self) -> list[str]:
|
|
16
|
+
"""
|
|
17
|
+
Gets a list of all installed app names.
|
|
18
|
+
|
|
19
|
+
:return: List of fully qualified app names from Django's app registry.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
return [config.name for config in apps.get_app_configs()]
|
|
23
|
+
|
|
24
|
+
def get_missing_components(self, components: list[str]) -> list[str]:
|
|
25
|
+
"""
|
|
26
|
+
Identifies which app components in a path are not registered.
|
|
27
|
+
|
|
28
|
+
For a path like ['app', 'human_resource', 'employee'], this checks
|
|
29
|
+
if 'app', 'app.human_resource', and 'app.human_resource.employee'
|
|
30
|
+
are registered, and returns those that are missing.
|
|
31
|
+
|
|
32
|
+
:param components: List of app path components to check.
|
|
33
|
+
:return: List of unregistered component paths.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
registry = self.get_installed_apps()
|
|
37
|
+
missing = []
|
|
38
|
+
|
|
39
|
+
total = len(components)
|
|
40
|
+
|
|
41
|
+
for i in range(total):
|
|
42
|
+
component = '.'.join(components[: i + 1])
|
|
43
|
+
|
|
44
|
+
if component not in registry and i > 0:
|
|
45
|
+
missing.append(component)
|
|
46
|
+
|
|
47
|
+
return missing
|
|
48
|
+
|
|
49
|
+
def get_valid_root_apps(self) -> set[str]:
|
|
50
|
+
"""
|
|
51
|
+
Gets all valid root app names from INSTALLED_APPS.
|
|
52
|
+
|
|
53
|
+
Returns root-level apps (first component before a dot) that can be
|
|
54
|
+
used as parent apps, excluding Django's built-in apps.
|
|
55
|
+
|
|
56
|
+
:return: Set of valid root app names.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
return {
|
|
60
|
+
app.split('.')[0]
|
|
61
|
+
for app in settings.INSTALLED_APPS
|
|
62
|
+
if '.' in app and app.split('.')[0] != 'django'
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
def is_app_registered(self, app_path: str) -> bool:
|
|
66
|
+
"""
|
|
67
|
+
Checks if an app path is registered in Django.
|
|
68
|
+
|
|
69
|
+
:param app_path: Dot-separated app path to check.
|
|
70
|
+
:return: True if the app is registered, False otherwise.
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
return app_path in self.get_installed_apps()
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from string import Template
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from django_spire.core.management.commands.spire_startapp_pkg.maps import generate_replacement_map
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Callable
|
|
11
|
+
|
|
12
|
+
from django.core.management.base import BaseCommand
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Reporter:
|
|
16
|
+
"""
|
|
17
|
+
Handles user interaction and console output for the app creation command.
|
|
18
|
+
|
|
19
|
+
This class manages all console output including status messages, tree
|
|
20
|
+
structures, confirmations, and styled text for the app creation process.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
ICON_FILE = '📄'
|
|
24
|
+
ICON_FOLDER_CLOSED = '📁'
|
|
25
|
+
ICON_FOLDER_OPEN = '📂'
|
|
26
|
+
INDENTATION = ' '
|
|
27
|
+
|
|
28
|
+
def __init__(self, command: BaseCommand):
|
|
29
|
+
"""
|
|
30
|
+
Initializes the reporter with a Django management command.
|
|
31
|
+
|
|
32
|
+
:param command: Django BaseCommand instance for accessing stdout and styling.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
self.command = command
|
|
36
|
+
self.style_error = command.style.ERROR
|
|
37
|
+
self.style_notice = command.style.NOTICE
|
|
38
|
+
self.style_success = command.style.SUCCESS
|
|
39
|
+
self.style_warning = command.style.WARNING
|
|
40
|
+
|
|
41
|
+
def format_app_item(self, item: Path) -> str:
|
|
42
|
+
"""
|
|
43
|
+
Formats an app file or directory name for display.
|
|
44
|
+
|
|
45
|
+
Removes the .template extension from Python files.
|
|
46
|
+
|
|
47
|
+
:param item: Path to the item to format.
|
|
48
|
+
:return: Formatted item name.
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
return item.name.replace('.py.template', '.py')
|
|
52
|
+
|
|
53
|
+
def format_html_item(self, item: Path, replacement: dict[str, str]) -> str:
|
|
54
|
+
"""
|
|
55
|
+
Formats an HTML template file or directory name for display.
|
|
56
|
+
|
|
57
|
+
Applies variable replacements and removes .template extensions.
|
|
58
|
+
|
|
59
|
+
:param item: Path to the item to format.
|
|
60
|
+
:param replacement: Dictionary of placeholder replacements.
|
|
61
|
+
:return: Formatted item name with placeholders replaced.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
if item.is_dir():
|
|
65
|
+
return item.name
|
|
66
|
+
|
|
67
|
+
template = Template(item.name)
|
|
68
|
+
filename = template.safe_substitute(replacement)
|
|
69
|
+
|
|
70
|
+
if filename.endswith('.template'):
|
|
71
|
+
filename = filename.replace('.template', '')
|
|
72
|
+
|
|
73
|
+
return filename
|
|
74
|
+
|
|
75
|
+
def prompt_confirmation(self, message: str) -> bool:
|
|
76
|
+
"""
|
|
77
|
+
Prompts the user for yes/no confirmation.
|
|
78
|
+
|
|
79
|
+
:param message: Confirmation prompt message.
|
|
80
|
+
:return: True if user responds with 'y', False otherwise.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
return input(message).strip().lower() == 'y'
|
|
84
|
+
|
|
85
|
+
def report_app_creation_success(self, app: str) -> None:
|
|
86
|
+
"""
|
|
87
|
+
Reports successful creation of an app.
|
|
88
|
+
|
|
89
|
+
:param app: Name of the app that was created.
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
self.write(f'Successfully created app: {app}', self.style_success)
|
|
93
|
+
|
|
94
|
+
def report_app_exists(self, app: str, destination: Path) -> None:
|
|
95
|
+
"""
|
|
96
|
+
Reports that an app already exists at the destination.
|
|
97
|
+
|
|
98
|
+
:param app: Name of the app.
|
|
99
|
+
:param destination: Path where the app already exists.
|
|
100
|
+
"""
|
|
101
|
+
|
|
102
|
+
self.write(f'The app "{app}" already exists at {destination}', self.style_warning)
|
|
103
|
+
|
|
104
|
+
def report_creating_app(self, app: str, destination: Path) -> None:
|
|
105
|
+
"""
|
|
106
|
+
Reports that an app is being created.
|
|
107
|
+
|
|
108
|
+
:param app: Name of the app being created.
|
|
109
|
+
:param destination: Path where the app will be created.
|
|
110
|
+
"""
|
|
111
|
+
|
|
112
|
+
self.write(f'Creating app "{app}" at {destination}', self.style_notice)
|
|
113
|
+
|
|
114
|
+
def report_creating_templates(self, app: str, destination: Path) -> None:
|
|
115
|
+
"""
|
|
116
|
+
Reports that templates are being created for an app.
|
|
117
|
+
|
|
118
|
+
:param app: Name of the app.
|
|
119
|
+
:param destination: Path where templates will be created.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
self.write(f'Creating templates for app "{app}" at {destination}', self.style_notice)
|
|
123
|
+
|
|
124
|
+
def report_installed_apps_suggestion(self, missing_components: list[str]) -> None:
|
|
125
|
+
"""
|
|
126
|
+
Suggests which app to add to INSTALLED_APPS in settings.py.
|
|
127
|
+
|
|
128
|
+
:param missing_components: List of missing app components.
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
self.write('\nPlease add the following to INSTALLED_APPS in settings.py:', self.style_notice)
|
|
132
|
+
self.write(f'\n {missing_components[-1]}', lambda x: x)
|
|
133
|
+
|
|
134
|
+
def report_missing_components(self, missing_components: list[str]) -> None:
|
|
135
|
+
"""
|
|
136
|
+
Reports which app components are not yet registered.
|
|
137
|
+
|
|
138
|
+
:param missing_components: List of unregistered app component paths.
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
self.write('The following are not registered apps:', self.style_warning)
|
|
142
|
+
self.write('\n'.join(f' - {app}' for app in missing_components), lambda x: x)
|
|
143
|
+
|
|
144
|
+
def report_templates_creation_success(self, app: str) -> None:
|
|
145
|
+
"""
|
|
146
|
+
Reports successful creation of templates for an app.
|
|
147
|
+
|
|
148
|
+
:param app: Name of the app whose templates were created.
|
|
149
|
+
"""
|
|
150
|
+
|
|
151
|
+
self.write(f'Successfully created templates for app: {app}', self.style_success)
|
|
152
|
+
|
|
153
|
+
def report_templates_exist(self, app: str, destination: Path) -> None:
|
|
154
|
+
"""
|
|
155
|
+
Reports that templates already exist for an app.
|
|
156
|
+
|
|
157
|
+
:param app: Name of the app.
|
|
158
|
+
:param destination: Path where templates already exist.
|
|
159
|
+
"""
|
|
160
|
+
|
|
161
|
+
self.write(f'The templates for app "{app}" already exist at {destination}', self.style_warning)
|
|
162
|
+
|
|
163
|
+
def report_tree_structure(
|
|
164
|
+
self,
|
|
165
|
+
title: str,
|
|
166
|
+
base: Path,
|
|
167
|
+
components: list[str],
|
|
168
|
+
registry: list[str],
|
|
169
|
+
template: Path,
|
|
170
|
+
formatter: Callable[[Path], str],
|
|
171
|
+
transformation: Callable[[int, str], str] | None = None,
|
|
172
|
+
) -> None:
|
|
173
|
+
"""
|
|
174
|
+
Displays a tree structure of files and directories that will be created.
|
|
175
|
+
|
|
176
|
+
Shows a hierarchical view of the app structure with appropriate icons
|
|
177
|
+
and formatting for files and directories.
|
|
178
|
+
|
|
179
|
+
:param title: Title to display above the tree structure.
|
|
180
|
+
:param base: Base directory path.
|
|
181
|
+
:param components: List of app path components.
|
|
182
|
+
:param registry: List of registered apps.
|
|
183
|
+
:param template: Path to template directory.
|
|
184
|
+
:param formatter: Function to format item names for display.
|
|
185
|
+
:param transformation: Optional function to transform component names.
|
|
186
|
+
"""
|
|
187
|
+
|
|
188
|
+
if transformation is None:
|
|
189
|
+
transformation = self.transform_app_component
|
|
190
|
+
|
|
191
|
+
self.command.stdout.write(title)
|
|
192
|
+
current = base
|
|
193
|
+
|
|
194
|
+
for i, component in enumerate(components):
|
|
195
|
+
latest = components[: i + 1]
|
|
196
|
+
replacement = generate_replacement_map(latest)
|
|
197
|
+
|
|
198
|
+
component = transformation(i, component)
|
|
199
|
+
current = current / component
|
|
200
|
+
app = '.'.join(latest)
|
|
201
|
+
indent = self.INDENTATION * i
|
|
202
|
+
|
|
203
|
+
self.command.stdout.write(f'{indent}{self.ICON_FOLDER_OPEN} {component}/')
|
|
204
|
+
|
|
205
|
+
if i == len(components) - 1 and app not in registry and template.exists():
|
|
206
|
+
def local_formatter(item: Path, mapping: dict[str, str] = replacement) -> str:
|
|
207
|
+
base_name = formatter(item)
|
|
208
|
+
return self._apply_replacement(base_name, mapping)
|
|
209
|
+
|
|
210
|
+
self._show_tree_from_template(template, indent + self.INDENTATION, local_formatter)
|
|
211
|
+
|
|
212
|
+
def transform_app_component(self, _index: int, component: str) -> str:
|
|
213
|
+
"""
|
|
214
|
+
Transforms an app component name (default: no transformation).
|
|
215
|
+
|
|
216
|
+
:param _index: Index of the component in the path.
|
|
217
|
+
:param component: Component name to transform.
|
|
218
|
+
:return: Transformed component name.
|
|
219
|
+
"""
|
|
220
|
+
|
|
221
|
+
return component
|
|
222
|
+
|
|
223
|
+
def transform_html_component(self, index: int, component: str) -> str:
|
|
224
|
+
"""
|
|
225
|
+
Transforms an HTML component name (replaces first component with 'templates').
|
|
226
|
+
|
|
227
|
+
:param index: Index of the component in the path.
|
|
228
|
+
:param component: Component name to transform.
|
|
229
|
+
:return: Transformed component name.
|
|
230
|
+
"""
|
|
231
|
+
|
|
232
|
+
return 'templates' if index == 0 else component
|
|
233
|
+
|
|
234
|
+
def write(self, message: str, style: Callable[[str], str]) -> None:
|
|
235
|
+
"""
|
|
236
|
+
Writes a styled message to the console.
|
|
237
|
+
|
|
238
|
+
:param message: Message to display.
|
|
239
|
+
:param style: Styling function to apply to the message.
|
|
240
|
+
"""
|
|
241
|
+
|
|
242
|
+
self.command.stdout.write(style(message))
|
|
243
|
+
|
|
244
|
+
def _apply_replacement(self, name: str, replacement: dict[str, str]) -> str:
|
|
245
|
+
"""
|
|
246
|
+
Applies placeholder replacements to a name string.
|
|
247
|
+
|
|
248
|
+
:param name: String containing placeholders.
|
|
249
|
+
:param replacement: Dictionary mapping placeholders to values.
|
|
250
|
+
:return: String with placeholders replaced.
|
|
251
|
+
"""
|
|
252
|
+
|
|
253
|
+
for old, new in replacement.items():
|
|
254
|
+
name = name.replace(old, new)
|
|
255
|
+
return name
|
|
256
|
+
|
|
257
|
+
def _show_tree_from_template(
|
|
258
|
+
self,
|
|
259
|
+
template: Path,
|
|
260
|
+
indent: str,
|
|
261
|
+
formatter: Callable[[Path], str]
|
|
262
|
+
) -> None:
|
|
263
|
+
"""
|
|
264
|
+
Recursively displays a tree structure from a template directory.
|
|
265
|
+
|
|
266
|
+
:param template: Template directory path to display.
|
|
267
|
+
:param indent: Current indentation level.
|
|
268
|
+
:param formatter: Function to format item names.
|
|
269
|
+
"""
|
|
270
|
+
|
|
271
|
+
ignore = {'__init__.py', '__pycache__'}
|
|
272
|
+
|
|
273
|
+
items = sorted(template.iterdir(), key=self._sort_template_items)
|
|
274
|
+
|
|
275
|
+
for item in items:
|
|
276
|
+
if item.name in ignore:
|
|
277
|
+
continue
|
|
278
|
+
|
|
279
|
+
icon = self.ICON_FOLDER_CLOSED if item.is_dir() else self.ICON_FILE
|
|
280
|
+
self.command.stdout.write(f'{indent}{icon} {formatter(item)}')
|
|
281
|
+
|
|
282
|
+
if item.is_dir():
|
|
283
|
+
self._show_tree_from_template(
|
|
284
|
+
item,
|
|
285
|
+
indent + self.INDENTATION,
|
|
286
|
+
formatter
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
def _sort_template_items(self, path: Path) -> tuple[bool, str]:
|
|
290
|
+
"""
|
|
291
|
+
Sorts template items with directories first, then by name.
|
|
292
|
+
|
|
293
|
+
:param path: Path to sort.
|
|
294
|
+
:return: Tuple for sorting (is_file, lowercase_name).
|
|
295
|
+
"""
|
|
296
|
+
|
|
297
|
+
return (path.is_file(), path.name.lower())
|