| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- from django.contrib import admin
- from django.utils.html import format_html
- from landing.models import (
- FAQmodel,
- LandingMainPageSettings,
- LandingPage,
- LandingTeamMember,
- )
- from landing.utils import create_pages_clean_admin
- @admin.register(LandingPage)
- class LandingPageAdmin(admin.ModelAdmin):
- from landing.admin_rich_text import LandingPageAdminForm
- form = LandingPageAdminForm
- list_display = ('title', 'slug')
- actions = [create_pages_clean_admin]
- @admin.register(FAQmodel)
- class FAQAdmin(admin.ModelAdmin):
- list_display = ('question',)
- @admin.register(LandingTeamMember)
- class LandingTeamMemberAdmin(admin.ModelAdmin):
- list_display = (
- 'display_name',
- 'caption',
- 'sort_order',
- 'is_active',
- )
- list_filter = ('is_active',)
- autocomplete_fields = ('user',)
- fields = (
- 'user',
- 'avatar_preview',
- 'caption',
- 'sort_order',
- 'is_active',
- )
- readonly_fields = ('avatar_preview',)
- def avatar_preview(self, obj):
- if not obj or not obj.avatar_src:
- return 'Аватар не задан'
- return format_html(
- '<img src="{}" style="width: 48px; height: 48px; object-fit: cover; border-radius: 50%;" />',
- obj.avatar_src,
- )
- avatar_preview.short_description = 'Аватар'
- @admin.register(LandingMainPageSettings)
- class LandingMainPageSettingsAdmin(admin.ModelAdmin):
- list_display = (
- 'id',
- 'title',
- 'hero_title',
- 'is_active',
- 'team_count',
- 'updated_at',
- )
- list_filter = ('is_active',)
- fieldsets = (
- ('Основные настройки', {
- 'fields': (
- 'title',
- 'is_active',
- )
- }),
- ('Шапка лендинга', {
- 'fields': (
- 'hero_title',
- 'hero_text',
- 'hero_image',
- 'hero_image_preview',
- )
- }),
- ('Раздел услуг', {
- 'fields': (
- 'services_title',
- 'services_text',
- )
- }),
- ('Раздел "О компании"', {
- 'fields': (
- 'about_title',
- 'about_text',
- 'video_url',
- )
- }),
- ('Дополнительный раздел с изображением', {
- 'fields': (
- 'extra_section_title',
- 'image_block_title',
- 'image_block_text',
- 'image_block_image',
- 'image_block_image_preview',
- )
- }),
- ('Раздел FAQ', {
- 'fields': (
- 'faq_csv',
- 'faq_csv_help',
- )
- }),
- ('Раздел команды', {
- 'fields': (
- 'team_title',
- 'team_text',
- )
- }),
- )
- readonly_fields = (
- 'hero_image_preview',
- 'image_block_image_preview',
- 'faq_csv_help',
- )
- def hero_image_preview(self, obj):
- if not obj or not obj.hero_image:
- return 'Изображение не выбрано'
- return format_html(
- '<img src="{}" style="max-width: 360px; max-height: 180px; object-fit: cover; border-radius: 8px;" />',
- obj.hero_image.url,
- )
- hero_image_preview.short_description = 'Предпросмотр изображения шапки'
- def image_block_image_preview(self, obj):
- if not obj or not obj.image_block_image:
- return 'Изображение не выбрано'
- return format_html(
- '<img src="{}" style="max-width: 360px; max-height: 180px; object-fit: cover; border-radius: 8px;" />',
- obj.image_block_image.url,
- )
- image_block_image_preview.short_description = 'Предпросмотр изображения блока'
- def faq_csv_help(self, obj):
- return format_html(
- '<div style="max-width: 720px; line-height: 1.55;">'
- '<strong>Формат CSV:</strong> <code>question;answer;keywords</code><br>'
- 'Первая строка может быть заголовком. Поле <code>keywords</code> необязательно. '
- 'В нем можно перечислить слова для поиска ответа через запятую или точку с запятой. '
- 'Если файл не загружен или подходящий ответ не найден, раздел FAQ обратится к нейросети.'
- '</div>'
- )
- faq_csv_help.short_description = 'Справка по CSV для FAQ'
-
- def has_add_permission(self, request):
- if LandingMainPageSettings.objects.exists():
- return False
- return super().has_add_permission(request)
- def team_count(self, obj):
- return LandingTeamMember.objects.filter(is_active=True).count()
- team_count.short_description = 'Активных участников команды'
|