# SPDX-License-Identifier: AGPL-3.0-or-later """ Common forms for use by modules. """ import os from itertools import chain from django import forms from django.conf import settings from django.forms import CheckboxInput from django.utils import translation from django.utils.safestring import mark_safe from django.utils.translation import get_language_info from django.utils.translation import ugettext_lazy as _ import plinth class AppForm(forms.Form): """Generic configuration form for an app.""" is_enabled = forms.BooleanField( widget=CheckboxInput(attrs={'id': 'app-toggle-input'}), label=_('Enable application'), required=False) class DomainSelectionForm(forms.Form): """Form for selecting a domain name to be used for distributed federated applications """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) from plinth.modules.names.components import DomainName domains = list(DomainName.list_names()) self.fields['domain_name'].choices = zip(domains, domains) domain_name = forms.ChoiceField( label=_('Select a domain name to be used with this application'), help_text=_( 'Warning! The application may not work properly if domain name is ' 'changed later.'), choices=[]) class LanguageSelectionFormMixin: """Form mixin for selecting the user's preferred language.""" language = forms.ChoiceField( label=_('Language'), help_text=_('Language to use for presenting this web interface'), required=False) def __init__(self, *args, **kwargs): """Initialize the form to fill language choice values.""" super().__init__(*args, **kwargs) supported_languages = [ (None, _('Use the language preference set in the browser')) ] def _get_local_name(language_code, language_name): try: return get_language_info(language_code)['name_local'] except KeyError: return language_name for language_code, language_name in settings.LANGUAGES: locale_code = translation.to_locale(language_code) plinth_dir = os.path.dirname(plinth.__file__) if language_code == 'en' or os.path.exists( os.path.join(plinth_dir, 'locale', locale_code)): supported_languages.append( (language_code, _get_local_name(language_code, language_name))) self.fields['language'].choices = supported_languages class LanguageSelectionForm(LanguageSelectionFormMixin, forms.Form): """Language selection form.""" language = LanguageSelectionFormMixin.language class CheckboxSelectMultipleWithReadOnly(forms.widgets.CheckboxSelectMultiple): """ Subclass of Django's CheckboxSelectMultiple widget that allows setting individual fields as readonly To mark a feature as readonly an option, pass a dict instead of a string for its label, of the form: {'label': 'option label', 'disabled': True} Derived from https://djangosnippets.org/snippets/2786/ """ def render(self, name, value, attrs=None, choices=(), renderer=None): if value is None: value = [] final_attrs = self.build_attrs(attrs) output = [u'') return mark_safe(u'\n'.join(output))