From 230d989e5fbe74a1529c3fb45a5e3914a363ff4b Mon Sep 17 00:00:00 2001
From: Julian Leucker <leuckerj@gmail.com>
Date: Sun, 20 Mar 2022 22:32:17 +0100
Subject: [PATCH] Assign calendar urls to users using a new model

---
 .../core/migrations/0039_personal_ical_url.py | 31 +++++++++++++++++
 aleksis/core/models.py                        | 34 +++++++++++++++++++
 2 files changed, 65 insertions(+)
 create mode 100644 aleksis/core/migrations/0039_personal_ical_url.py

diff --git a/aleksis/core/migrations/0039_personal_ical_url.py b/aleksis/core/migrations/0039_personal_ical_url.py
new file mode 100644
index 000000000..02d9cb3a9
--- /dev/null
+++ b/aleksis/core/migrations/0039_personal_ical_url.py
@@ -0,0 +1,31 @@
+# Generated by Django 3.2.12 on 2022-02-20 21:04
+
+from django.db import migrations, models
+import django.db.models.deletion
+import uuid
+
+from aleksis.core.feeds import PersonalICalFeedBase
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0038_notification_send_at'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='PersonalICalUrl',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True, verbose_name='UUID')),
+                ('name', models.CharField(max_length=255, verbose_name='Name')),
+                ('ical_feed', models.CharField(choices=PersonalICalFeedBase.subclass_choices, max_length=255, verbose_name='Selected ICal feed')),
+                ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='calendar_urls', to='core.person', verbose_name='Person')),
+            ],
+            options={
+                'verbose_name': 'Personal Calendar URL',
+                'verbose_name_plural': 'Personal Calendar URLs',
+            },
+        ),
+    ]
diff --git a/aleksis/core/models.py b/aleksis/core/models.py
index 7c555b409..3d2c31fef 100644
--- a/aleksis/core/models.py
+++ b/aleksis/core/models.py
@@ -4,6 +4,7 @@ import hmac
 from datetime import date, datetime, timedelta
 from typing import Any, Iterable, List, Optional, Sequence, Union
 from urllib.parse import urlparse
+import uuid
 
 from django.conf import settings
 from django.contrib.auth import get_user_model
@@ -51,6 +52,7 @@ from phonenumber_field.modelfields import PhoneNumberField
 from polymorphic.models import PolymorphicModel
 
 from aleksis.core.data_checks import BrokenDashboardWidgetDataCheck, DataCheck, DataCheckRegistry
+from .feeds import PersonalICalFeedBase
 
 from .managers import (
     CurrentSiteManagerWithoutMigrations,
@@ -1351,3 +1353,35 @@ class OAuthRefreshToken(AbstractRefreshToken):
     """Placeholder for customising the RefreshToken model."""
 
     pass
+
+
+class PersonalICalUrl(models.Model):
+    """Calendar URL for a person"""
+
+    person = models.ForeignKey(
+        "Person",
+        on_delete=models.CASCADE,
+        related_name="calendar_urls",
+        verbose_name=_("Person"),
+    )
+    uuid = models.UUIDField(default=uuid.uuid4, editable=False, verbose_name=_("UUID"), unique=True)
+    name = models.CharField(max_length=255, verbose_name=_("Name"))
+    ical_feed = models.CharField(
+        max_length=255,
+        verbose_name=_("Selected ICal feed"),
+        choices=PersonalICalFeedBase.subclass_choices,
+    )
+
+    @property
+    def ical_feed_object(self):
+        return PersonalICalFeedBase.subclasses_dict.get(self.ical_feed)
+
+    class Meta:
+        verbose_name = _("Personal Calendar URL")
+        verbose_name_plural = _("Personal Calendar URLs")
+
+    def __str__(self):
+        return self.name
+
+    def get_absolute_url(self):
+        return reverse("ical_feed", kwargs={"slug": self.uuid})
-- 
GitLab