diff --git a/smartsoltech/smartsoltech/settings.py b/smartsoltech/smartsoltech/settings.py index e633236..1e4f766 100644 --- a/smartsoltech/smartsoltech/settings.py +++ b/smartsoltech/smartsoltech/settings.py @@ -73,6 +73,7 @@ TEMPLATES = [ 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'web.context_processors.footer_settings', # Custom context processor + 'web.context_processors.site_settings', # Site settings (currency, etc.) ], }, }, diff --git a/smartsoltech/web/admin.py b/smartsoltech/web/admin.py index 9cdb35a..a4ad17c 100644 --- a/smartsoltech/web/admin.py +++ b/smartsoltech/web/admin.py @@ -2,7 +2,8 @@ from django.contrib import admin from .models import ( Service, Project, Client, Order, Review, BlogPost, Category, ServiceRequest, AboutPage, FooterSettings, TeamMember, - PortfolioItem, PrivacyPolicy, TermsOfUse, NewsArticle, CareerVacancy + PortfolioItem, PrivacyPolicy, TermsOfUse, NewsArticle, CareerVacancy, + SiteSettings ) from .forms import ProjectForm @@ -218,6 +219,25 @@ class TeamMemberAdmin(admin.ModelAdmin): def full_name(self, obj): return obj.full_name - full_name.short_description = 'ФИО' - full_name.admin_order_field = 'last_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 + diff --git a/smartsoltech/web/context_processors.py b/smartsoltech/web/context_processors.py index dc83204..3e36480 100644 --- a/smartsoltech/web/context_processors.py +++ b/smartsoltech/web/context_processors.py @@ -1,4 +1,4 @@ -from .models import FooterSettings +from .models import FooterSettings, SiteSettings def footer_settings(request): @@ -11,3 +11,12 @@ def footer_settings(request): return { 'footer_settings': footer } + + +def site_settings(request): + """Context processor для глобальных настроек сайта""" + settings = SiteSettings.get_settings() + return { + 'site_settings': settings, + 'currency_symbol': settings.currency_symbol, + } diff --git a/smartsoltech/web/models.py b/smartsoltech/web/models.py index c78e6dd..f55c88f 100644 --- a/smartsoltech/web/models.py +++ b/smartsoltech/web/models.py @@ -581,4 +581,33 @@ class TeamMember(models.Model): return f"{self.first_name} {self.last_name}" +class SiteSettings(models.Model): + """Глобальные настройки сайта""" + currency_symbol = models.CharField( + max_length=10, + default='₩', + verbose_name='Символ валюты', + help_text='Символ валюты для отображения на сайте (₩, $, ₽, €, ¥ и т.д.)' + ) + + class Meta: + verbose_name = 'Настройки сайта' + verbose_name_plural = 'Настройки сайта' + + def __str__(self): + return f'Настройки сайта (Валюта: {self.currency_symbol})' + + def save(self, *args, **kwargs): + # Singleton pattern - только одна запись настроек + self.pk = 1 + super().save(*args, **kwargs) + + @classmethod + def get_settings(cls): + """Получить настройки сайта (создать если не существует)""" + settings, created = cls.objects.get_or_create(pk=1) + return settings + + + diff --git a/smartsoltech/web/templates/web/career_detail.html b/smartsoltech/web/templates/web/career_detail.html index 06868a2..7ddfa01 100644 --- a/smartsoltech/web/templates/web/career_detail.html +++ b/smartsoltech/web/templates/web/career_detail.html @@ -35,11 +35,11 @@