From 5937d9e380f0d0bae4dde73eb424f59ed2d7a322 Mon Sep 17 00:00:00 2001 From: SDE Date: Tue, 5 Dec 2023 18:52:24 +0300 Subject: [PATCH] 0.0.30 3th section main_block_w_subblocks --- BaseModels/base_models.py | 21 +++++++ BaseModels/inter.py | 1 + GeneralApp/admin.py | 23 +++++++- GeneralApp/models.py | 15 ++++- PortfolioApp/__init__.py | 0 PortfolioApp/admin.py | 3 + PortfolioApp/apps.py | 6 ++ PortfolioApp/migrations/__init__.py | 0 PortfolioApp/models.py | 18 ++++++ PortfolioApp/tests.py | 3 + PortfolioApp/views.py | 3 + ServicesApp/models.py | 16 +++++- templates/blocks/b_functional_features.html | 55 +++++++++++-------- .../pages/content/c_blocks_constructor.html | 11 +++- .../widgets/w_functuional_features_item.html | 24 +++++--- 15 files changed, 159 insertions(+), 40 deletions(-) create mode 100644 PortfolioApp/__init__.py create mode 100644 PortfolioApp/admin.py create mode 100644 PortfolioApp/apps.py create mode 100644 PortfolioApp/migrations/__init__.py create mode 100644 PortfolioApp/models.py create mode 100644 PortfolioApp/tests.py create mode 100644 PortfolioApp/views.py diff --git a/BaseModels/base_models.py b/BaseModels/base_models.py index c568edc..4f31d06 100644 --- a/BaseModels/base_models.py +++ b/BaseModels/base_models.py @@ -33,6 +33,19 @@ class Manager_Enabled(models.Manager): self).get_queryset().filter(enable=True) +def get_unique_url_for_new_instance(instance, sender): + url = instance.url + if not instance.pk: + if not instance.url: + name = sender.objects.model.__name__ + else: + name = instance.url + from BaseModels.inter import get_unique_url + url = get_unique_url(sender, name) + + return url + + class BaseModel(models.Model): name = models.TextField(verbose_name=_('Название'), @@ -150,6 +163,14 @@ class BaseModelViewPage(BaseModel): # @receiver(pre_save, sender=User) def preSaveBaseModelViewPage(sender, instance, **kwargs): + if instance: + if not instance.url: + name = 'section' + else: + name = instance.url + from BaseModels.inter import get_unique_url + instance.url = get_unique_url(sender, name) + if not sender.url: sender.url = slugify(sender.name) diff --git a/BaseModels/inter.py b/BaseModels/inter.py index 660aa7a..b76c9f6 100644 --- a/BaseModels/inter.py +++ b/BaseModels/inter.py @@ -16,6 +16,7 @@ def get_fieldsNames_of_model(model): return fields_names + def get_unique_url(model, name, url=None): from .functions import url_translit diff --git a/GeneralApp/admin.py b/GeneralApp/admin.py index e22bfce..63af784 100644 --- a/GeneralApp/admin.py +++ b/GeneralApp/admin.py @@ -119,10 +119,27 @@ class Admin_StaticPage(SuperModelAdmin, Admin_Trans_BaseModelViewPage): admin.site.register(StaticPage,Admin_StaticPage) class Admin_Block(Admin_Trans_BaseModelViewPage): + fieldsets = [ + (None, { + 'classes': [], + 'fields': [ + ('block_type', + # 'title', + 'name', 'description', 'picture'), + ('bg_color', 'bg_image'), + ('but_title', 'but_color', 'but_icon'), + ('url',), + ('child_in_row_count', 'order'), + ] + }) + ] + inlines = [Admin_Inline_WidgetForBlock] - - inlines = [Admin_StackedInline_Block] + list_display = ['name', 'block_type', 'enable', 'content_type', 'object_id'] + list_editable = ['enable'] + search_fields = ['name'] + list_filter = ['block_type', 'enable', 'content_type'] def has_delete_permission(self, request, obj=None): if request.user.is_superuser: @@ -131,7 +148,7 @@ class Admin_Block(Admin_Trans_BaseModelViewPage): if obj.name in ('About US', 'machines', 'works'): return False -admin.site.register(Block,Admin_Block) +admin.site.register(Block, Admin_Block) class Admin_Option(Admin_Trans_BaseModel): diff --git a/GeneralApp/models.py b/GeneralApp/models.py index d23fd97..f9251b4 100644 --- a/GeneralApp/models.py +++ b/GeneralApp/models.py @@ -1,5 +1,5 @@ from django.db import models -from BaseModels.base_models import BaseModelViewPage, BaseModel, validate_file_extension +from BaseModels.base_models import * from django.utils.translation import gettext_lazy as _ # from ckeditor.fields import RichTextField from ckeditor_uploader.fields import RichTextUploadingField @@ -16,9 +16,14 @@ class StaticPage(BaseModelViewPage): verbose_name = _('Статическая страница') verbose_name_plural = _('Статические страницы') +def preSave_StaticPage(sender, instance, **kwargs): + instance.url = get_unique_url_for_new_instance(instance, sender) +pre_save.connect(preSave_StaticPage, sender=StaticPage, dispatch_uid='pre_save_connect') + block_type_choices = ( ('photo_n_text', _('Фото с одной стороны + Текст с другой стороны')), + ('main_block_w_subblocks', _('Блок с подблоками')), ('present_technology_block', _('описание и НАЗВАНИЕ слева + Картинка справа')), ('photo150_n_title', _('Фото 150x150 сверху + заголовок под фото')), ('how_work', _('Как с нами работать')), @@ -65,12 +70,18 @@ class Block(Block_Abstract): child_in_row_count = models.PositiveSmallIntegerField( verbose_name=_('Количество дочерних элементов в строке'), default=3) + + def get_widgets(self): + return self.rel_widgets_for_block.filter(enable=True).order_by('order') + class Meta: verbose_name = _('Блок на странице') verbose_name_plural = _('Блоки на странице') - +def preSave_Block(sender, instance, **kwargs): + instance.url = get_unique_url_for_new_instance(instance, sender) +pre_save.connect(preSave_Block, sender=Block, dispatch_uid='pre_save_connect') diff --git a/PortfolioApp/__init__.py b/PortfolioApp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PortfolioApp/admin.py b/PortfolioApp/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/PortfolioApp/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/PortfolioApp/apps.py b/PortfolioApp/apps.py new file mode 100644 index 0000000..1800c6e --- /dev/null +++ b/PortfolioApp/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PortfolioappConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'PortfolioApp' diff --git a/PortfolioApp/migrations/__init__.py b/PortfolioApp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/PortfolioApp/models.py b/PortfolioApp/models.py new file mode 100644 index 0000000..41b2185 --- /dev/null +++ b/PortfolioApp/models.py @@ -0,0 +1,18 @@ +from django.db import models +from BaseModels.base_models import BaseModelViewPage, BaseModel, validate_file_extension +from django.utils.translation import gettext_lazy as _ +# from ckeditor.fields import RichTextField +from ckeditor_uploader.fields import RichTextUploadingField +# from colorfield.fields import ColorField +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.fields import GenericRelation +from colorfield.fields import ColorField + +class Project(BaseModelViewPage): + + + class Meta: + verbose_name = _('Проект') + verbose_name_plural = _('Проекты') + diff --git a/PortfolioApp/tests.py b/PortfolioApp/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/PortfolioApp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/PortfolioApp/views.py b/PortfolioApp/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/PortfolioApp/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/ServicesApp/models.py b/ServicesApp/models.py index b31731d..091a005 100644 --- a/ServicesApp/models.py +++ b/ServicesApp/models.py @@ -38,6 +38,11 @@ class BlockPluginPresentation(Block_Abstract): verbose_name_plural = _('Блок презентации плагина') +def preSave_BlockPluginPresentation(sender, instance, **kwargs): + instance.url = get_unique_url_for_new_instance(instance, sender) +pre_save.connect(preSave_BlockPluginPresentation, sender=BlockPluginPresentation, dispatch_uid='pre_save_connect') + + class Section(BaseModelViewPage): plugin_presentation = GenericRelation('ServicesApp.BlockPluginPresentation', @@ -49,6 +54,11 @@ class Section(BaseModelViewPage): verbose_name_plural = _('Разделы сайта') +def preSave_Section(sender, instance, **kwargs): + instance.url = get_unique_url_for_new_instance(instance, sender) +pre_save.connect(preSave_Section, sender=Section, dispatch_uid='pre_save_connect') + + class Service(BaseModelViewPage): url = models.TextField(verbose_name=_('URL привязанной страницы'), null=True, blank=True) @@ -68,4 +78,8 @@ class Service(BaseModelViewPage): class Meta: verbose_name = _('Услуга') - verbose_name_plural = _('Услуги') \ No newline at end of file + verbose_name_plural = _('Услуги') + +def preSave_Service(sender, instance, **kwargs): + instance.url = get_unique_url_for_new_instance(instance, sender) +pre_save.connect(preSave_Service, sender=Service, dispatch_uid='pre_save_connect') \ No newline at end of file diff --git a/templates/blocks/b_functional_features.html b/templates/blocks/b_functional_features.html index f17d9dd..d198d36 100644 --- a/templates/blocks/b_functional_features.html +++ b/templates/blocks/b_functional_features.html @@ -4,36 +4,45 @@
- +{# #} + {% if block.picture %} + + {% endif %}
-
- Функциональные возможности -
-
-
- Плагин 3D Security Designer автоматизирует ряд рутинных процессов. + {% if block.name %} +
+ {{ block.name }}
-
- Значительно сокращает время проектирования в среде Autodesk Revit + {% endif %} + {% if block.description %} +
+
+ {{ block.description|safe|linebreaksbr }} +
+{#
#} +{# Значительно сокращает время проектирования в среде Autodesk Revit#} +{#
#} +{#
#} +{# Значительно сокращает время проектирования в среде Autodesk Revit#} +{#
#}
-
- Значительно сокращает время проектирования в среде Autodesk Revit -
-
+ {% endif %}
- {% include 'widgets/w_functuional_features_item.html' %} - {% include 'widgets/w_functuional_features_item.html' %} - {% include 'widgets/w_functuional_features_item.html' %} - {% include 'widgets/w_functuional_features_item.html' %} - {% include 'widgets/w_functuional_features_item.html' %} - {% include 'widgets/w_functuional_features_item.html' %} - {% include 'widgets/w_functuional_features_item.html' %} - {% include 'widgets/w_functuional_features_item.html' %} - {% include 'widgets/w_functuional_features_item.html' %} - {% include 'widgets/w_functuional_features_item.html' %} + {% for widget in block.get_widgets %} + {% include 'widgets/w_functuional_features_item.html' %} + {% endfor %} +{# {% include 'widgets/w_functuional_features_item.html' %}#} +{# {% include 'widgets/w_functuional_features_item.html' %}#} +{# {% include 'widgets/w_functuional_features_item.html' %}#} +{# {% include 'widgets/w_functuional_features_item.html' %}#} +{# {% include 'widgets/w_functuional_features_item.html' %}#} +{# {% include 'widgets/w_functuional_features_item.html' %}#} +{# {% include 'widgets/w_functuional_features_item.html' %}#} +{# {% include 'widgets/w_functuional_features_item.html' %}#} +{# {% include 'widgets/w_functuional_features_item.html' %}#}
diff --git a/templates/pages/content/c_blocks_constructor.html b/templates/pages/content/c_blocks_constructor.html index 2a168d1..d95daac 100644 --- a/templates/pages/content/c_blocks_constructor.html +++ b/templates/pages/content/c_blocks_constructor.html @@ -5,6 +5,10 @@ {# {% include 'blocks/b_service_2_col.html' %}#} {#{% endif %}#} +{% if page.url == '3d-security-designer' and page.plugin_presentation.all %} + {% include 'blocks/b_3d_s_d.html' with block=page.plugin_presentation.all.0 %} +{% endif %} + {#{% include 'blocks/b_how_with_us_working.html' %}#} {% for block in page.get_blocks %} @@ -18,9 +22,12 @@ {% include 'blocks/b_how_dev.html' %} {% elif block.block_type == 'present_technology_block' %} {% include 'blocks/b_present_technology.html' %} + {% elif block.block_type == 'main_block_w_subblocks' %} + {% include 'blocks/b_functional_features.html' %} {% endif %} {% endfor %} -{% if page.plugin_presentation.all %} + +{% if page.url != '3d-security-designer' and page.plugin_presentation.all %} {% include 'blocks/b_3d_s_d.html' with block=page.plugin_presentation.all.0 %} {% endif %} -{% include 'blocks/b_functional_features.html' %} + diff --git a/templates/widgets/w_functuional_features_item.html b/templates/widgets/w_functuional_features_item.html index 89bf31c..d2f2090 100644 --- a/templates/widgets/w_functuional_features_item.html +++ b/templates/widgets/w_functuional_features_item.html @@ -1,14 +1,20 @@ {% load static %}
-
- -
+ {% if widget.picture %} +
+ +
+ {% endif %}
-
- Автоматическая вставка -
-
- ускоряет расстановку пожарных извещателей более, чем в 10 раз -
+ {% if widget.name %} +
+ {{ widget.name }} +
+ {% endif %} + {% if widget.description %} +
+ {{ widget.description|safe|linebreaksbr }} +
+ {% endif %}
\ No newline at end of file