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 84 85 86 87 88 89 90 91 92 93 94 95 96
|
import datetime
from django.conf import settings
from django.contrib.sites.shortcuts import get_current_site
try:
from django.urls import reverse
except ImportError:
from django.core.urlresolvers import reverse
from django.db import models
from django.utils import timezone
from django.utils.crypto import get_random_string
from django.utils.translation import gettext_lazy as _
from . import signals
from .adapters import get_invitations_adapter
from .app_settings import app_settings
from .base_invitation import AbstractBaseInvitation
class Invitation(AbstractBaseInvitation):
email = models.EmailField(
unique=True,
verbose_name=_("e-mail address"),
max_length=app_settings.EMAIL_MAX_LENGTH,
)
created = models.DateTimeField(verbose_name=_("created"), default=timezone.now)
@classmethod
def create(cls, email, inviter=None, **kwargs):
key = get_random_string(64).lower()
instance = cls._default_manager.create(
email=email, key=key, inviter=inviter, **kwargs
)
return instance
def key_expired(self):
expiration_date = self.sent + datetime.timedelta(
days=app_settings.INVITATION_EXPIRY,
)
return expiration_date <= timezone.now()
def send_invitation(self, request, **kwargs):
current_site = get_current_site(request)
invite_url = reverse(app_settings.CONFIRMATION_URL_NAME, args=[self.key])
invite_url = request.build_absolute_uri(invite_url)
ctx = kwargs
ctx.update(
{
"invite_url": invite_url,
"site_name": current_site.name,
"email": self.email,
"key": self.key,
"inviter": self.inviter,
},
)
email_template = "invitations/email/email_invite"
get_invitations_adapter().send_mail(email_template, self.email, ctx)
self.sent = timezone.now()
self.save()
signals.invite_url_sent.send(
sender=self.__class__,
instance=self,
invite_url_sent=invite_url,
inviter=self.inviter,
)
def __str__(self):
return f"Invite: {self.email}"
# here for backwards compatibility, historic allauth adapter
if hasattr(settings, "ACCOUNT_ADAPTER"):
if settings.ACCOUNT_ADAPTER == "invitations.models.InvitationsAdapter":
from allauth.account.adapter import DefaultAccountAdapter
from allauth.account.signals import user_signed_up
class InvitationsAdapter(DefaultAccountAdapter):
def is_open_for_signup(self, request):
if hasattr(request, "session") and request.session.get(
"account_verified_email",
):
return True
elif app_settings.INVITATION_ONLY is True:
# Site is ONLY open for invites
return False
else:
# Site is open to signup
return True
def get_user_signed_up_signal(self):
return user_signed_up
|