1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
|
from django import forms
from django.contrib.auth import get_user_model
from django.utils.translation import gettext_lazy as _
from .adapters import get_invitations_adapter
from .exceptions import AlreadyAccepted, AlreadyInvited, UserRegisteredEmail
from .utils import get_invitation_model
Invitation = get_invitation_model()
class CleanEmailMixin:
def validate_invitation(self, email):
if Invitation.objects.all_valid().filter(email__iexact=email, accepted=False):
raise AlreadyInvited
elif Invitation.objects.filter(email__iexact=email, accepted=True):
raise AlreadyAccepted
elif get_user_model().objects.filter(email__iexact=email):
raise UserRegisteredEmail
else:
return True
def clean_email(self):
email = self.cleaned_data["email"]
email = get_invitations_adapter().clean_email(email)
errors = {
"already_invited": _("This e-mail address has already been" " invited."),
"already_accepted": _(
"This e-mail address has already" " accepted an invite.",
),
"email_in_use": _("An active user is using this e-mail address"),
}
try:
self.validate_invitation(email)
except AlreadyInvited:
raise forms.ValidationError(errors["already_invited"])
except AlreadyAccepted:
raise forms.ValidationError(errors["already_accepted"])
except UserRegisteredEmail:
raise forms.ValidationError(errors["email_in_use"])
return email
class InviteForm(forms.Form, CleanEmailMixin):
email = forms.EmailField(
label=_("E-mail"),
required=True,
widget=forms.TextInput(attrs={"type": "email", "size": "30"}),
initial="",
)
def save(self, email):
return Invitation.create(email=email)
class InvitationAdminAddForm(forms.ModelForm, CleanEmailMixin):
email = forms.EmailField(
label=_("E-mail"),
required=True,
widget=forms.TextInput(attrs={"type": "email", "size": "30"}),
)
def save(self, *args, **kwargs):
cleaned_data = super().clean()
email = cleaned_data.get("email")
params = {"email": email}
if cleaned_data.get("inviter"):
params["inviter"] = cleaned_data.get("inviter")
instance = Invitation.create(**params)
instance.send_invitation(self.request)
super().save(*args, **kwargs)
return instance
class Meta:
model = Invitation
fields = ("email", "inviter")
class InvitationAdminChangeForm(forms.ModelForm):
class Meta:
model = Invitation
fields = "__all__"
|