From bb2eaf54c4ff0d06b9c133fdb7d0b1e056cc387f Mon Sep 17 00:00:00 2001 From: SDE Date: Thu, 30 Nov 2023 17:14:10 +0300 Subject: [PATCH] 0.0.28 get filtered and ordered blocks --- BaseModels/base_models.py | 3 + GeneralApp/admin.py | 38 +++++++---- GeneralApp/funcs_options.py | 27 ++++++++ GeneralApp/init_options.py | 66 +++++++++++++++++++ ...ption_name_ru_option_prefix_en_and_more.py | 48 ++++++++++++++ GeneralApp/models.py | 1 + GeneralApp/translation.py | 6 ++ ServicesApp/models.py | 1 + .../pages/content/c_blocks_constructor.html | 2 +- 9 files changed, 178 insertions(+), 14 deletions(-) create mode 100644 GeneralApp/funcs_options.py create mode 100644 GeneralApp/init_options.py create mode 100644 GeneralApp/migrations/0015_option_name_en_option_name_ru_option_prefix_en_and_more.py diff --git a/BaseModels/base_models.py b/BaseModels/base_models.py index 2249fe1..c568edc 100644 --- a/BaseModels/base_models.py +++ b/BaseModels/base_models.py @@ -133,6 +133,9 @@ class BaseModelViewPage(BaseModel): class Meta: abstract = True + def get_blocks(self): + return self.blocks.filter(enable=True).order_by('order') + def get_description_exists(self): if self.description: diff --git a/GeneralApp/admin.py b/GeneralApp/admin.py index c54f79d..e22bfce 100644 --- a/GeneralApp/admin.py +++ b/GeneralApp/admin.py @@ -1,7 +1,7 @@ from sets.admin import * from .models import * from django.contrib import admin - +from django.utils.translation import gettext_lazy as _ # from nested_inline.admin import NestedStackedInline, NestedTabularInline, NestedModelAdmin, NestedInline from super_inlines.admin import SuperInlineModelAdmin, SuperModelAdmin @@ -133,19 +133,31 @@ class Admin_Block(Admin_Trans_BaseModelViewPage): admin.site.register(Block,Admin_Block) -class Admin_Option(Admin_BaseModel): +class Admin_Option(Admin_Trans_BaseModel): - def get_fieldsets(self, request, obj=None): - fieldsets = super(type(self), self).get_fieldsets(request, obj) - fieldsets.insert( - 1, ('Контент', { - 'classes': ['wide'], - 'fields': ( - 'opt_type', 'prefix', 'value', 'picture' - ) + # def get_fieldsets(self, request, obj=None): + # fieldsets = super(type(self), self).get_fieldsets(request, obj) + # fieldsets.insert( + # 1, ('Контент', { + # 'classes': ['wide'], + # 'fields': ( + # 'opt_type', 'prefix', 'value', 'picture' + # ) + # + # }) + # ) + # return fieldsets + fieldsets = [ + (_('Контент'), { + 'classes': ['wide'], + 'fields': ( + 'name', 'opt_type', 'prefix', 'value', 'picture' + ) + }), + ] - }) - ) - return fieldsets + list_display = ['image_thumb', 'opt_type', 'name', 'prefix', 'value'] + list_editable = ['value', 'prefix'] + list_filter = ['opt_type'] admin.site.register(Option,Admin_Option) diff --git a/GeneralApp/funcs_options.py b/GeneralApp/funcs_options.py new file mode 100644 index 0000000..bf34d9d --- /dev/null +++ b/GeneralApp/funcs_options.py @@ -0,0 +1,27 @@ +from .models import * + +def get_options_by_opt_types(opt_types, only_vals=False): + if type(opt_types) == str: + kwargs = {'opt_type': opt_types} + elif type(opt_types) == dict: + kwargs = opt_types + else: + kwargs = {'opt_type__in': opt_types} + + opts = Option.objects.filter(**kwargs) + if opts and only_vals: + opts = opts.values('opt_type', 'value') + opts = {item['opt_type']: item['value'] for item in opts} + return opts + +def get_first_option_value_by_opt_type(opt_type): + opts = get_options_by_opt_types(opt_type) + if opts: + return opts[0].value + else: + return None + +def get_mail_send_options(): + opt_types = ['mail_server_url', 'mail_server_smtp_port', 'sender_mail_login', 'sender_mail_password', 'sender_email'] + + return get_options_by_opt_types(opt_types, only_vals=True) diff --git a/GeneralApp/init_options.py b/GeneralApp/init_options.py new file mode 100644 index 0000000..bc8ce1f --- /dev/null +++ b/GeneralApp/init_options.py @@ -0,0 +1,66 @@ +from .models import * +from django.utils.translation import gettext as _ + + +required_options_Dict = { + 'Адрес почтового сервера': { + 'name_ru': 'Адрес почтового сервера', + 'opt_type': 'mail_server_url', + 'value': '213.142.147.40', + }, + 'SMTP порт почтового сервера': { + 'name_ru': 'SMTP порт почтового сервера', + 'opt_type': 'mail_server_smtp_port', + 'value': 587, + }, + 'login для отправки писем с сайта': { + 'name_ru': 'email для отправки писем с сайта', + 'opt_type': 'sender_mail_login', + 'value': 'admin@tripwb.com', + }, + 'email для отправки': { + 'name_ru': 'email для отправки', + 'opt_type': 'sender_email', + 'value': 'admin@tripwb.com', + }, + 'Пароль для отправки писем с сайта': { + 'name_ru': 'пароль для отправки писем с сайта', + 'opt_type': 'sender_mail_password', + 'value': 't5Fdcah^gdajY', + }, + 'Название проекта': { + 'name_ru': 'Название проекта', + 'opt_type': 'project_name', + 'value': 'TWB', + }, + 'Адрес сайта': { + 'name_ru': 'Адрес сайта', + 'opt_type': 'domain', + 'value': 'tripwb.com', + }, + 'email техподдержки': { + 'name_ru': 'email техподдержки', + 'opt_type': 'support_email', + 'value': 'admin@tripwb.com', + }, + 'корпоративный email': { + 'name_ru': 'корпоративный email', + 'opt_type': 'corp_email', + 'value': 'admin@tripwb.com', + }, + + } + +def init_options(): + options = Option.objects.all() + option_names = options.values_list('name', flat=True) + + opts_for_create = [] + for name, data_Dict in required_options_Dict.items(): + if not name in option_names: + opt = Option(**data_Dict) + opts_for_create.append(opt) + + Option.objects.bulk_create(opts_for_create) + + return True diff --git a/GeneralApp/migrations/0015_option_name_en_option_name_ru_option_prefix_en_and_more.py b/GeneralApp/migrations/0015_option_name_en_option_name_ru_option_prefix_en_and_more.py new file mode 100644 index 0000000..a59cd95 --- /dev/null +++ b/GeneralApp/migrations/0015_option_name_en_option_name_ru_option_prefix_en_and_more.py @@ -0,0 +1,48 @@ +# Generated by Django 4.2.7 on 2023-11-30 16:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('GeneralApp', '0014_widgetforblock_text_widgetforblock_text_en_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='option', + name='name_en', + field=models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название'), + ), + migrations.AddField( + model_name='option', + name='name_ru', + field=models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название'), + ), + migrations.AddField( + model_name='option', + name='prefix_en', + field=models.CharField(blank=True, max_length=250, null=True, verbose_name='Префикс'), + ), + migrations.AddField( + model_name='option', + name='prefix_ru', + field=models.CharField(blank=True, max_length=250, null=True, verbose_name='Префикс'), + ), + migrations.AddField( + model_name='option', + name='value_en', + field=models.CharField(max_length=250, null=True, verbose_name='Значение'), + ), + migrations.AddField( + model_name='option', + name='value_ru', + field=models.CharField(max_length=250, null=True, verbose_name='Значение'), + ), + migrations.AlterField( + model_name='block', + name='block_type', + field=models.CharField(choices=[('photo_n_text', 'Фото с одной стороны + Текст с другой стороны'), ('present_technology_block', 'описание и НАЗВАНИЕ слева + Картинка справа'), ('photo150_n_title', 'Фото 150x150 сверху + заголовок под фото'), ('how_work', 'Как с нами работать'), ('how_dev', 'Как ведется разработка'), ('feedback_form', 'Форма обратной связи')], default='photo_n_text', max_length=100, verbose_name='Тип блока'), + ), + ] diff --git a/GeneralApp/models.py b/GeneralApp/models.py index beb1957..d23fd97 100644 --- a/GeneralApp/models.py +++ b/GeneralApp/models.py @@ -34,6 +34,7 @@ class Block_Abstract(BaseModelViewPage): verbose_name = _('Блок') verbose_name_plural = _('Блоки') abstract = True + ordering = ['order'] class Block(Block_Abstract): diff --git a/GeneralApp/translation.py b/GeneralApp/translation.py index e327b40..5eb9549 100644 --- a/GeneralApp/translation.py +++ b/GeneralApp/translation.py @@ -15,6 +15,12 @@ class Block_TranslationOptions(TranslationOptions): translator.register(Block, Block_TranslationOptions) +class Option_TranslationOptions(TranslationOptions): + fields = ( + 'name', 'value', 'prefix' + ) +translator.register(Option, Option_TranslationOptions) + class WidgetForBlock_TranslationOptions(TranslationOptions): fields = ( diff --git a/ServicesApp/models.py b/ServicesApp/models.py index e98d3a2..b31731d 100644 --- a/ServicesApp/models.py +++ b/ServicesApp/models.py @@ -43,6 +43,7 @@ class Section(BaseModelViewPage): plugin_presentation = GenericRelation('ServicesApp.BlockPluginPresentation', related_query_name='grel_%(class)s_for_block_plugin_presentation') + class Meta: verbose_name = _('Раздел сайта') verbose_name_plural = _('Разделы сайта') diff --git a/templates/pages/content/c_blocks_constructor.html b/templates/pages/content/c_blocks_constructor.html index ecb824d..597ee25 100644 --- a/templates/pages/content/c_blocks_constructor.html +++ b/templates/pages/content/c_blocks_constructor.html @@ -7,7 +7,7 @@ {#{% include 'blocks/b_how_with_us_working.html' %}#} -{% for block in page.blocks.all %} +{% for block in page.get_blocks %} {% if block.block_type == 'photo150_n_title' %} {% include 'blocks/b_photo150_n_title.html' %} {% elif block.block_type == 'how_work' %}