From 1ce516c58654cab6f498d0df7f9b08e458e65ec2 Mon Sep 17 00:00:00 2001
From: Tom Teichler <tom.teichler@teckids.org>
Date: Sun, 12 Dec 2021 16:17:07 +0100
Subject: [PATCH] Rewrite invitations model

---
 aleksis/core/models.py | 31 ++++++++++++++++++++++++++++++-
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index 3ce728b7c..abaff7a01 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -1,4 +1,5 @@
 # flake8: noqa: DJ01
+
 import hmac
 from datetime import date, datetime, timedelta
 from typing import Iterable, List, Optional, Sequence, Union
@@ -29,6 +30,10 @@ from cachalot.api import cachalot_disabled
 from cache_memoize import cache_memoize
 from django_celery_results.models import TaskResult
 from dynamic_preferences.models import PerInstancePreferenceModel
+from invitations import signals
+from invitations.adapters import get_invitations_adapter
+from invitations.base_invitation import AbstractBaseInvitation
+from invitations.models import Invitation
 from model_utils import FieldTracker
 from model_utils.models import TimeStampedModel
 from oauth2_provider.models import (
@@ -59,7 +64,7 @@ from .mixins import (
     SchoolTermRelatedExtensibleModel,
 )
 from .tasks import send_notification
-from .util.core_helpers import get_site_preferences, now_tomorrow
+from .util.core_helpers import generate_random_code, get_site_preferences, now_tomorrow
 from .util.model_helpers import ICONS
 
 FIELD_CHOICES = (
@@ -1062,6 +1067,30 @@ class DataCheckResult(ExtensibleModel):
         )
 
 
+class PersonInvitation(AbstractBaseInvitation, PureDjangoModel):
+    """Custom model for invitations to allow to generate invitations codes without email address."""
+
+    email = models.EmailField(verbose_name=_("E-Mail address"), blank=True)
+    person = models.ForeignKey(
+        Person, on_delete=models.CASCADE, blank=True, related_name="invitation", null=True
+    )
+
+    @classmethod
+    def create(cls, email, inviter=None, **kwargs):
+        length = get_site_preferences()["auth__invite_code_length"]
+        packet_size = get_site_preferences()["auth__invite_code_packet_size"]
+        key = generate_random_code(length, packet_size)
+        instance = cls._default_manager.create(email=email, key=key, inviter=inviter, **kwargs)
+        return instance
+
+    def __str__(self) -> str:
+        return f"{self.email} ({self.inviter})"
+
+    key_expired = Invitation.key_expired
+
+    send_invitation = Invitation.send_invitation
+
+
 class PDFFile(ExtensibleModel):
     """Link to a rendered PDF file."""
 
-- 
GitLab