diff --git a/BaseModels/base_models.py b/BaseModels/base_models.py index f5ac624..96039eb 100644 --- a/BaseModels/base_models.py +++ b/BaseModels/base_models.py @@ -108,6 +108,8 @@ class BaseModelViewPage(BaseModel): FAQ_title = models.CharField(max_length=250, verbose_name=_(u'FAQ Заголовок'), null=True, blank=True) FAQ_items = GenericRelation('GeneralApp.FAQitem', related_query_name='grel_%(class)s_for_faq_item') + blocks = GenericRelation('GeneralApp.Block', related_query_name='grel_%(class)s_for_block_item') + class Meta: abstract = True diff --git a/GeneralApp/admin.py b/GeneralApp/admin.py index abdc779..c999b89 100644 --- a/GeneralApp/admin.py +++ b/GeneralApp/admin.py @@ -1,17 +1,12 @@ from sets.admin import * from .models import * from django.contrib import admin -from django.forms import widgets + # from nested_inline.admin import NestedStackedInline, NestedTabularInline, NestedModelAdmin, NestedInline from super_inlines.admin import SuperInlineModelAdmin, SuperModelAdmin -def sets_for_formfield_for_dbfield(field, db_field): - if db_field.name == 'url' or db_field.name == 'name' or db_field.name == 'title' or db_field.name == 'name_plural': - field.widget = widgets.TextInput(attrs={'style': 'width: 30%; height: 20px;'}) - if db_field.name == 'description': - field.widget = widgets.Textarea(attrs={'style': 'width: 30%; height: 100px;'}) - return field + class Admin_Inline_WidgetForBlock(SuperInlineModelAdmin, Admin_Trans_BaseIconStackedInline): diff --git a/ServicesApp/admin.py b/ServicesApp/admin.py index d6b63ed..afe645f 100644 --- a/ServicesApp/admin.py +++ b/ServicesApp/admin.py @@ -5,6 +5,7 @@ from django.forms import widgets # from nested_inline.admin import NestedStackedInline, NestedTabularInline, NestedModelAdmin, NestedInline from super_inlines.admin import SuperInlineModelAdmin, SuperModelAdmin from GeneralApp.admin import Admin_StackedInline_Block +from SlidesApp.admin import Admin_StackedInline_Slide def sets_for_formfield_for_dbfield(field, db_field): if db_field.name == 'url' or db_field.name == 'name' or db_field.name == 'title' or db_field.name == 'name_plural': @@ -53,7 +54,7 @@ class Admin_Section(SuperModelAdmin, Admin_Trans_BaseModelViewPage): search_fields = ['name', 'title'] # filter_horizontal = ['options'] - inlines = [Admin_StackedInline_Block] + inlines = [Admin_StackedInline_Slide, Admin_StackedInline_Block] def has_delete_permission(self, request, obj=None): if request.user.is_superuser: diff --git a/ServicesApp/js_urls.py b/ServicesApp/js_urls.py index c4c3606..d2ad1de 100644 --- a/ServicesApp/js_urls.py +++ b/ServicesApp/js_urls.py @@ -5,7 +5,7 @@ from django.conf import settings from .js_views import * urlpatterns = [ - path('get_content_for_section', get_content_for_section_ajax, name='get_content_for_section_ajax'), + path('get_content_for_section/', get_content_for_section_ajax, name='get_content_for_section_ajax'), # path('page//', StaticPageView, name='static_page'), # path('test_code', test_code, name='test_code'), ] \ No newline at end of file diff --git a/SlidesApp/admin.py b/SlidesApp/admin.py index 8c38f3f..857a497 100644 --- a/SlidesApp/admin.py +++ b/SlidesApp/admin.py @@ -1,3 +1,29 @@ +from sets.admin import * +from .models import * from django.contrib import admin +from django.forms import widgets +# from nested_inline.admin import NestedStackedInline, NestedTabularInline, NestedModelAdmin, NestedInline +from super_inlines.admin import SuperInlineModelAdmin, SuperModelAdmin + +class Admin_StackedInline_Slide(Admin_Trans_GenericBaseIconStackedInline): +# class Admin_StackedInline_Block(Admin_Trans_GenericBaseIconStackedInline): + + def formfield_for_dbfield(self, db_field, request, **kwargs): + field = super(Admin_StackedInline_Slide, self).formfield_for_dbfield(db_field, request, **kwargs) + return sets_for_formfield_for_dbfield(field, db_field) + + model = Slide + extra = 0 + fieldsets = [ + (None, { + 'classes': [], + 'fields': [ + ('title', 'description', 'picture'), + ('bg_color', ), + ('but_title', 'but_color'), + ('url',), + ('order'), + ] + }) + ] -# Register your models here. diff --git a/SlidesApp/migrations/0001_initial.py b/SlidesApp/migrations/0001_initial.py new file mode 100644 index 0000000..762b606 --- /dev/null +++ b/SlidesApp/migrations/0001_initial.py @@ -0,0 +1,55 @@ +# Generated by Django 4.2.7 on 2023-11-26 18:45 + +import ckeditor_uploader.fields +import colorfield.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ] + + operations = [ + migrations.CreateModel( + name='Slide', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_ru', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_en', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')), + ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')), + ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')), + ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')), + ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')), + ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')), + ('object_id', models.PositiveIntegerField()), + ('url', models.TextField(blank=True, null=True, verbose_name='URL привязанной страницы')), + ('title', models.TextField(blank=True, null=True, verbose_name='Заголовок')), + ('title_ru', models.TextField(blank=True, null=True, verbose_name='Заголовок')), + ('title_en', models.TextField(blank=True, null=True, verbose_name='Заголовок')), + ('description', ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Краткое описание')), + ('description_ru', ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Краткое описание')), + ('description_en', ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Краткое описание')), + ('text', ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание')), + ('text_ru', ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание')), + ('text_en', ckeditor_uploader.fields.RichTextUploadingField(blank=True, null=True, verbose_name='Полное описание')), + ('picture', models.ImageField(blank=True, null=True, upload_to='uploads/', verbose_name='Фоновое изображение')), + ('bg_color', colorfield.fields.ColorField(default='#FFFFFF', image_field=None, max_length=25, samples=None, verbose_name='Цвет фона')), + ('but_title', models.CharField(blank=True, max_length=100, null=True, verbose_name='Текст на кнопке')), + ('but_title_ru', models.CharField(blank=True, max_length=100, null=True, verbose_name='Текст на кнопке')), + ('but_title_en', models.CharField(blank=True, max_length=100, null=True, verbose_name='Текст на кнопке')), + ('but_color', colorfield.fields.ColorField(default='#000000', image_field=None, max_length=25, samples=None, verbose_name='Цвет кнопки')), + ('content_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='contenttypes.contenttype')), + ], + options={ + 'verbose_name': 'Слайд', + 'verbose_name_plural': 'Слайды', + }, + ), + ] diff --git a/SlidesApp/translation.py b/SlidesApp/translation.py new file mode 100644 index 0000000..bb5de05 --- /dev/null +++ b/SlidesApp/translation.py @@ -0,0 +1,10 @@ +from modeltranslation.translator import translator, TranslationOptions +from .models import * + + +class Slide_TranslationOptions(TranslationOptions): + fields = ( + 'name', 'description', 'text', 'title', 'but_title' + ) +translator.register(Slide, Slide_TranslationOptions) + diff --git a/pAerBim/settings.py b/pAerBim/settings.py index 7896ace..812aad0 100644 --- a/pAerBim/settings.py +++ b/pAerBim/settings.py @@ -52,6 +52,7 @@ INSTALLED_APPS = [ 'GeneralApp', 'ServicesApp', + 'SlidesApp', ] MIDDLEWARE = [ diff --git a/sets/admin.py b/sets/admin.py index 045d611..e44787f 100644 --- a/sets/admin.py +++ b/sets/admin.py @@ -5,6 +5,16 @@ from modeltranslation.admin import (TranslationAdmin, TranslationTabularInline, TranslationStackedInline) from copy import deepcopy +from django.forms import widgets + + +def sets_for_formfield_for_dbfield(field, db_field): + if db_field.name == 'url' or db_field.name == 'name' or db_field.name == 'title' or db_field.name == 'name_plural': + field.widget = widgets.TextInput(attrs={'style': 'width: 30%; height: 20px;'}) + if db_field.name == 'description': + field.widget = widgets.Textarea(attrs={'style': 'width: 30%; height: 100px;'}) + return field + class AdminStacked_FAQitem(Admin_GenericBaseIconStackedInline): from GeneralApp.models import FAQitem