From 9c6db614d48cb7e5e345ec7516f7577061d7e965 Mon Sep 17 00:00:00 2001 From: "Andrew K. Choi" Date: Mon, 24 Nov 2025 14:00:05 +0900 Subject: [PATCH] Add SiteSettings model with currency_symbol field and replace hardcoded currency symbols in templates --- smartsoltech/smartsoltech/settings.py | 1 + smartsoltech/web/admin.py | 26 +++++++++++++++-- smartsoltech/web/context_processors.py | 11 ++++++- smartsoltech/web/models.py | 29 +++++++++++++++++++ .../web/templates/web/career_detail.html | 6 ++-- .../web/templates/web/career_list.html | 6 ++-- .../templates/web/service_detail_modern.html | 2 +- .../web/templates/web/services_modern.html | 8 ++--- 8 files changed, 74 insertions(+), 15 deletions(-) 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 @@
{% if vacancy.salary_min and vacancy.salary_max %} - ${{ vacancy.salary_min|floatformat:0 }} - ${{ vacancy.salary_max|floatformat:0 }} + {{ currency_symbol }}{{ vacancy.salary_min|floatformat:0 }} - {{ currency_symbol }}{{ vacancy.salary_max|floatformat:0 }} {% elif vacancy.salary_min %} - От ${{ vacancy.salary_min|floatformat:0 }} + От {{ currency_symbol }}{{ vacancy.salary_min|floatformat:0 }} {% else %} - До ${{ vacancy.salary_max|floatformat:0 }} + До {{ currency_symbol }}{{ vacancy.salary_max|floatformat:0 }} {% endif %}
diff --git a/smartsoltech/web/templates/web/career_list.html b/smartsoltech/web/templates/web/career_list.html index 490fa23..eace277 100644 --- a/smartsoltech/web/templates/web/career_list.html +++ b/smartsoltech/web/templates/web/career_list.html @@ -46,11 +46,11 @@
{% if vacancy.salary_min and vacancy.salary_max %} - ${{ vacancy.salary_min|floatformat:0 }} - ${{ vacancy.salary_max|floatformat:0 }} + {{ currency_symbol }}{{ vacancy.salary_min|floatformat:0 }} - {{ currency_symbol }}{{ vacancy.salary_max|floatformat:0 }} {% elif vacancy.salary_min %} - От ${{ vacancy.salary_min|floatformat:0 }} + От {{ currency_symbol }}{{ vacancy.salary_min|floatformat:0 }} {% else %} - До ${{ vacancy.salary_max|floatformat:0 }} + До {{ currency_symbol }}{{ vacancy.salary_max|floatformat:0 }} {% endif %}
diff --git a/smartsoltech/web/templates/web/service_detail_modern.html b/smartsoltech/web/templates/web/service_detail_modern.html index 8e26846..8591896 100644 --- a/smartsoltech/web/templates/web/service_detail_modern.html +++ b/smartsoltech/web/templates/web/service_detail_modern.html @@ -42,7 +42,7 @@
от {{ service.price|floatformat:0 }} - + {{ currency_symbol }}
diff --git a/smartsoltech/web/templates/web/services_modern.html b/smartsoltech/web/templates/web/services_modern.html index 2871a8f..073ec98 100644 --- a/smartsoltech/web/templates/web/services_modern.html +++ b/smartsoltech/web/templates/web/services_modern.html @@ -85,7 +85,7 @@
От - ₩ {{ service.price|default:"По запросу" }} + {{ currency_symbol }} {{ service.price|default:"По запросу" }}
Срок @@ -309,9 +309,9 @@