import json from django import forms from django.utils.translation import gettext_lazy as _ from dynamic_preferences.preferences import Section from dynamic_preferences.registries import global_preferences_registry from dynamic_preferences.types import ( BasePreferenceType, BaseSerializer, LongStringPreference, StringPreference, BooleanPreference, ) from unfold.contrib.forms.widgets import WysiwygWidget from unfold.widgets import UnfoldAdminTextareaWidget # --------------------------------------------------------- # Preference Types & Custom Serializers # --------------------------------------------------------- class EditorPreferences(LongStringPreference): widget = WysiwygWidget(attrs={'class': 'editor-field'}) class EditorTextPreferences(LongStringPreference): widget = UnfoldAdminTextareaWidget(attrs={'class': 'editor-field', 'rows': 15}) class JsonSerializer(BaseSerializer): @classmethod def serialize(cls, value, **kwargs): return json.dumps(value, ensure_ascii=False) @classmethod def to_python(cls, value, **kwargs): if isinstance(value, str) and len(value.strip()) > 0: try: return json.loads(value) except json.JSONDecodeError: return {} return value if isinstance(value, dict) else {} # --------------------------------------------------------- # Sections # --------------------------------------------------------- general_section = Section('general', verbose_name=_('General Settings')) contact_section = Section('contact', verbose_name=_('Contact & Support')) content_section = Section('content', verbose_name=_('Content Pages')) # --------------------------------------------------------- # Registered Preferences # --------------------------------------------------------- @global_preferences_registry.register class SiteName(StringPreference): section = general_section name = 'site_name' verbose_name = _('Site Name') default = 'My Application' required = True @global_preferences_registry.register class MaintenanceMode(BooleanPreference): section = general_section name = 'maintenance_mode' verbose_name = _('Maintenance Mode') default = False @global_preferences_registry.register class ContactEmail(StringPreference): section = contact_section name = 'contact_email' verbose_name = _('Support Email') default = 'support@example.com' required = False @global_preferences_registry.register class SupportPhone(StringPreference): section = contact_section name = 'support_phone' verbose_name = _('Support Phone Number') default = '+1 555 1234567' required = False @global_preferences_registry.register class AboutUs(EditorPreferences): section = content_section name = 'about_us' verbose_name = _('About Us Page') default = '
Welcome to our application.
' required = False @global_preferences_registry.register class TermsAndConditions(EditorPreferences): section = content_section name = 'terms_and_conditions' verbose_name = _('Terms & Conditions') default = 'Standard terms and conditions.
' required = False