Source code for boardinghouse.contrib.invite.forms
import datetime
import uuid
from django import forms
from django.utils.translation import ugettext_lazy as _
from boardinghouse.schema import get_active_schema
from .models import Invitation
ALREADY_REDEEMED = _('This invitation has already been redeemed.')
EXPIRED = _('This invitation has expired.')
ACCEPTED = _('This invitation has already been accepted.')
DECLINED = _('This invitation has already been declined.')
[docs]class InvitePersonForm(forms.ModelForm):
"""
A form that can be used to create a new invitation for a person
to a schema.
This will only allow you to invite someone to the current schema.
It will automatically generate a redemption code, that will be a
part of the url the user needs to click on in order to accept or
deny the invitation.
The message will be emailed.
"""
class Meta:
model = Invitation
fields = ('email', 'message',)
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(InvitePersonForm, self).__init__(*args, **kwargs)
def save(self, *args, **kwargs):
self.instance.schema = get_active_schema()
self.instance.redemption_code = uuid.uuid4()
self.instance.sender = self.user
# TODO: email the user.
return super(InvitePersonForm, self).save(*args, **kwargs)
[docs]class AcceptForm(forms.ModelForm):
"""
A form that can be used to accept an invitation to a schema.
"""
class Meta:
model = Invitation
fields = ()
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user')
super(AcceptForm, self).__init__(*args, **kwargs)
def clean(self):
if self.instance.expired:
raise forms.ValidationError(EXPIRED)
if self.instance.redeemed:
raise forms.ValidationError(ACCEPTED)
if self.instance.declined:
raise forms.ValidationError(DECLINED)
return self.cleaned_data
def save(self, *args, **kwargs):
self.user.schemata.add(self.instance.schema)
self.instance.accepted_at = datetime.datetime.utcnow()
self.instance.accepted_by = self.user
return super(AcceptForm, self).save(*args, **kwargs)
class DeclineForm(forms.ModelForm):
class Meta:
model = Invitation
fields = ()
def clean(self):
# In this case, we just want to tell the user this object
# has been accepted, since they attempted to decline it.
if self.instance.accepted:
raise forms.ValidationError(ACCEPTED)
return {}
def save(self, *args, **kwargs):
self.instance.declined_at = datetime.datetime.utcnow()
return super(DeclineForm, self).save(*args, **kwargs)