Repository: bookwyrm-social/bookwyrm

Issue:
Create notification for admins about pending domains
Right now you have to go to the dashboard to see if any domains are pending


Discussion:

Resolving patch:
diff --git a/bookwyrm/migrations/0174_auto_20230222_1742.py b/bookwyrm/migrations/0174_auto_20230222_1742.py
new file mode 100644
--- /dev/null
+++ b/bookwyrm/migrations/0174_auto_20230222_1742.py
@@ -0,0 +1,46 @@
+# Generated by Django 3.2.18 on 2023-02-22 17:42
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("bookwyrm", "0173_default_user_auth_group_setting"),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name="notification",
+            name="related_link_domains",
+            field=models.ManyToManyField(to="bookwyrm.LinkDomain"),
+        ),
+        migrations.AlterField(
+            model_name="notification",
+            name="notification_type",
+            field=models.CharField(
+                choices=[
+                    ("FAVORITE", "Favorite"),
+                    ("REPLY", "Reply"),
+                    ("MENTION", "Mention"),
+                    ("TAG", "Tag"),
+                    ("FOLLOW", "Follow"),
+                    ("FOLLOW_REQUEST", "Follow Request"),
+                    ("BOOST", "Boost"),
+                    ("IMPORT", "Import"),
+                    ("ADD", "Add"),
+                    ("REPORT", "Report"),
+                    ("LINK_DOMAIN", "Link Domain"),
+                    ("INVITE", "Invite"),
+                    ("ACCEPT", "Accept"),
+                    ("JOIN", "Join"),
+                    ("LEAVE", "Leave"),
+                    ("REMOVE", "Remove"),
+                    ("GROUP_PRIVACY", "Group Privacy"),
+                    ("GROUP_NAME", "Group Name"),
+                    ("GROUP_DESCRIPTION", "Group Description"),
+                ],
+                max_length=255,
+            ),
+        ),
+    ]
diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py
--- a/bookwyrm/models/notification.py
+++ b/bookwyrm/models/notification.py
@@ -2,8 +2,8 @@
 from django.db import models, transaction
 from django.dispatch import receiver
 from .base_model import BookWyrmModel
-from . import Boost, Favorite, GroupMemberInvitation, ImportJob, ListItem, Report
-from . import Status, User, UserFollowRequest
+from . import Boost, Favorite, GroupMemberInvitation, ImportJob, LinkDomain
+from . import ListItem, Report, Status, User, UserFollowRequest
 
 
 class Notification(BookWyrmModel):
@@ -28,6 +28,7 @@ class Notification(BookWyrmModel):
 
     # Admin
     REPORT = "REPORT"
+    LINK_DOMAIN = "LINK_DOMAIN"
 
     # Groups
     INVITE = "INVITE"
@@ -43,7 +44,7 @@ class Notification(BookWyrmModel):
     NotificationType = models.TextChoices(
         # there has got be a better way to do this
         "NotificationType",
-        f"{FAVORITE} {REPLY} {MENTION} {TAG} {FOLLOW} {FOLLOW_REQUEST} {BOOST} {IMPORT} {ADD} {REPORT} {INVITE} {ACCEPT} {JOIN} {LEAVE} {REMOVE} {GROUP_PRIVACY} {GROUP_NAME} {GROUP_DESCRIPTION}",
+        f"{FAVORITE} {REPLY} {MENTION} {TAG} {FOLLOW} {FOLLOW_REQUEST} {BOOST} {IMPORT} {ADD} {REPORT} {LINK_DOMAIN} {INVITE} {ACCEPT} {JOIN} {LEAVE} {REMOVE} {GROUP_PRIVACY} {GROUP_NAME} {GROUP_DESCRIPTION}",
     )
 
     user = models.ForeignKey("User", on_delete=models.CASCADE)
@@ -64,6 +65,7 @@ class Notification(BookWyrmModel):
         "ListItem", symmetrical=False, related_name="notifications"
     )
     related_reports = models.ManyToManyField("Report", symmetrical=False)
+    related_link_domains = models.ManyToManyField("LinkDomain", symmetrical=False)
 
     @classmethod
     @transaction.atomic
@@ -241,6 +243,26 @@ def notify_admins_on_report(sender, instance, created, *args, **kwargs):
         notification.related_reports.add(instance)
 
 
+@receiver(models.signals.post_save, sender=LinkDomain)
+@transaction.atomic
+# pylint: disable=unused-argument
+def notify_admins_on_link_domain(sender, instance, created, *args, **kwargs):
+    """a new link domain needs to be verified"""
+    if not created:
+        # otherwise you'll get a notification when you approve a domain
+        return
+
+    # moderators and superusers should be notified
+    admins = User.admins()
+    for admin in admins:
+        notification, _ = Notification.objects.get_or_create(
+            user=admin,
+            notification_type=Notification.LINK_DOMAIN,
+            read=False,
+        )
+        notification.related_link_domains.add(instance)
+
+
 @receiver(models.signals.post_save, sender=GroupMemberInvitation)
 # pylint: disable=unused-argument
 def notify_user_on_group_invite(sender, instance, *args, **kwargs):


Test patch: