Files
smartsoltech_site/smartsoltech/web/admin.py

244 lines
8.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.contrib import admin
from .models import (
Service, Project, Client, Order, Review, BlogPost,
Category, ServiceRequest, AboutPage, FooterSettings, TeamMember,
PortfolioItem, PrivacyPolicy, TermsOfUse, NewsArticle, CareerVacancy,
SiteSettings
)
from .forms import ProjectForm
@admin.register(Service)
class ServiceAdmin(admin.ModelAdmin):
list_display = ('name', 'category', 'price')
search_fields = ('name', 'category')
@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
form = ProjectForm
list_display = ('name', 'client','service', 'status', 'order', 'description')
list_filter = ('name', 'client','service', 'status', 'order')
search_fields = ('name', 'client','service', 'status', 'order', 'client__first_name', 'client__last_name')
@admin.register(Client)
class ClientAdmin(admin.ModelAdmin):
list_display = ('first_name', 'last_name', 'email', 'phone_number')
search_fields = ('first_name', 'last_name', 'email')
@admin.register(Order)
class OrderAdmin(admin.ModelAdmin):
list_display = ('id', 'service', 'client', 'client__email', 'client__phone_number', 'status')
list_filter = ('status','client', 'order_date')
search_fields = ('client__first_name', 'service__name','status','client', 'order_date')
@admin.register(Review)
class ReviewAdmin(admin.ModelAdmin):
list_display = ('client', 'service', 'rating', 'review_date')
list_filter = ('rating',)
search_fields = ('client__first_name', 'service__name')
@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):
list_display = ('title', 'status', 'author', 'published_date')
list_filter = ('status', 'published_date')
search_fields = ('title', 'excerpt', 'author__username')
prepopulated_fields = {'slug': ('title',)}
@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name','description')
search_fields = ('name',)
@admin.register(PortfolioItem)
class PortfolioItemAdmin(admin.ModelAdmin):
list_display = ('title', 'client_name', 'completion_date', 'featured', 'is_active')
list_filter = ('featured', 'is_active', 'completion_date')
search_fields = ('title', 'client_name')
prepopulated_fields = {'slug': ('title',)}
@admin.register(NewsArticle)
class NewsArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'is_published', 'published_date', 'created_at')
list_filter = ('is_published', 'published_date', 'created_at')
search_fields = ('title', 'excerpt')
prepopulated_fields = {'slug': ('title',)}
@admin.register(CareerVacancy)
class CareerVacancyAdmin(admin.ModelAdmin):
list_display = ('title', 'location', 'employment_type', 'is_active', 'posted_at')
list_filter = ('employment_type', 'is_active', 'posted_at')
search_fields = ('title', 'location')
prepopulated_fields = {'slug': ('title',)}
@admin.register(PrivacyPolicy)
class PrivacyPolicyAdmin(admin.ModelAdmin):
list_display = ('version', 'effective_date', 'is_active')
list_filter = ('is_active', 'effective_date')
search_fields = ('version',)
@admin.register(TermsOfUse)
class TermsOfUseAdmin(admin.ModelAdmin):
list_display = ('version', 'effective_date', 'is_active')
list_filter = ('is_active', 'effective_date')
search_fields = ('version',)
@admin.register(ServiceRequest)
class ServiceRequestAdmin(admin.ModelAdmin):
list_display = ('service','token', 'client', 'created_at')
search_fields = ('service','token', 'client')
list_filter = ('service','token','client')
@admin.register(AboutPage)
class AboutPageAdmin(admin.ModelAdmin):
list_display = ('hero_title', 'is_active', 'updated_at')
list_filter = ('is_active', 'updated_at')
search_fields = ('hero_title', 'mission_title', 'vision_title')
fieldsets = (
('Hero секция', {
'fields': ('hero_badge', 'hero_title', 'hero_description')
}),
('Статистика', {
'fields': ('stat_projects', 'stat_clients', 'stat_years', 'stat_support')
}),
('Миссия', {
'fields': (
'mission_badge', 'mission_title', 'mission_description',
'mission_point_1_title', 'mission_point_1_text',
'mission_point_2_title', 'mission_point_2_text',
'mission_point_3_title', 'mission_point_3_text',
)
}),
('Видение', {
'fields': ('vision_badge', 'vision_title', 'vision_description')
}),
('Навыки', {
'fields': (
'skill_1_name', 'skill_1_percent',
'skill_2_name', 'skill_2_percent',
'skill_3_name', 'skill_3_percent',
'skill_4_name', 'skill_4_percent',
)
}),
('Команда', {
'fields': ('team_badge', 'team_title', 'team_description')
}),
('Ценности', {
'fields': (
'values_badge', 'values_title',
'value_1_icon', 'value_1_title', 'value_1_text',
'value_2_icon', 'value_2_title', 'value_2_text',
'value_3_icon', 'value_3_title', 'value_3_text',
'value_4_icon', 'value_4_title', 'value_4_text',
)
}),
('Контакты', {
'fields': ('contact_title', 'contact_description')
}),
('Настройки', {
'fields': ('is_active',)
}),
)
def has_add_permission(self, request):
return not AboutPage.objects.filter(is_active=True).exists()
@admin.register(FooterSettings)
class FooterSettingsAdmin(admin.ModelAdmin):
list_display = ('company_name', 'email', 'is_active', 'updated_at')
list_filter = ('is_active', 'updated_at')
search_fields = ('company_name', 'email')
fieldsets = (
('Информация о компании', {
'fields': ('company_name', 'company_description', 'company_logo_icon')
}),
('Социальные сети', {
'fields': ('telegram_url', 'instagram_url', 'linkedin_url', 'github_url', 'facebook_url', 'twitter_url'),
'classes': ('collapse',)
}),
('Контактная информация', {
'fields': ('email', 'phone', 'address')
}),
('Меню футера', {
'fields': (
'show_services_menu', 'services_title',
'show_company_menu', 'company_menu_title'
),
'classes': ('collapse',)
}),
('Copyright', {
'fields': ('copyright_text',)
}),
('Интеграция скриптов', {
'fields': ('google_analytics', 'google_adsense', 'yandex_metrika', 'facebook_pixel'),
'description': 'Вставьте коды аналитики без тегов <script></script>',
'classes': ('collapse',)
}),
('Дополнительные скрипты', {
'fields': ('custom_head_scripts', 'custom_body_scripts'),
'description': 'Вставьте дополнительные скрипты С тегами <script></script>',
'classes': ('collapse',)
}),
('Настройки', {
'fields': ('is_active',)
}),
)
def has_add_permission(self, request):
return not FooterSettings.objects.filter(is_active=True).exists()
@admin.register(TeamMember)
class TeamMemberAdmin(admin.ModelAdmin):
list_display = ('full_name', 'position', 'order', 'is_active', 'email', 'updated_at')
list_filter = ('is_active', 'position')
search_fields = ('first_name', 'last_name', 'position', 'email')
list_editable = ('order', 'is_active')
fieldsets = (
('Основная информация', {
'fields': ('first_name', 'last_name', 'position', 'photo')
}),
('О специалисте', {
'fields': ('bio', 'specialization')
}),
('Контакты', {
'fields': ('email', 'phone', 'telegram', 'linkedin', 'github'),
'classes': ('collapse',)
}),
('Настройки отображения', {
'fields': ('order', 'is_active')
}),
)
def full_name(self, obj):
return obj.full_name
full_name.short_description = 'ФИО' # type: ignore
full_name.admin_order_field = 'last_name' # type: ignore
@admin.register(SiteSettings)
class SiteSettingsAdmin(admin.ModelAdmin):
list_display = ('currency_symbol',)
fieldsets = (
('Настройки валюты', {
'fields': ('currency_symbol',)
}),
)
def has_add_permission(self, request):
# Запретить создание новых записей (singleton)
return not SiteSettings.objects.exists()
def has_delete_permission(self, request, obj=None):
# Запретить удаление настроек
return False