from django import forms from django.utils.translation import gettext_lazy as _ from ....admin.forms import ColorField, YesNoSwitch from ...models import SocialAuthProvider from ..ordering import get_next_free_order class ProviderForm(forms.ModelForm): button_text = forms.CharField(label=_("Button text"), required=False) button_color = ColorField(label=_("Button color"), required=False) is_active = YesNoSwitch(label=_("Enable this provider")) class Meta: model = SocialAuthProvider fields = ["button_text", "button_color", "is_active"] def __init__(self, *args, **kwargs): self.request = kwargs.pop("request") super().__init__(*args, **kwargs) def save(self): settings = {} for setting, value in self.cleaned_data.items(): if setting not in ["button_text", "button_color", "is_active"]: settings[setting] = value self.instance.settings = settings if "is_active" in self.changed_data and self.cleaned_data.get("is_active"): self.instance.order = get_next_free_order() self.instance.save() class OAuthProviderForm(ProviderForm): associate_by_email = YesNoSwitch( label=_("Associate existing users by email"), help_text=_( "Enabling this option will result in the user being signed in if their " "forum account was registered using same e-mail address as used on the " "social site. Otherwise they will be asked to specify a different e-mail " "to continue sign in using social site." ), ) def clean(self): cleaned_data = super().clean() if cleaned_data.get("is_active"): if not cleaned_data.get("key"): self.add_error("key", _("This field is required.")) if not cleaned_data.get("secret"): self.add_error("secret", _("This field is required.")) return cleaned_data