From 21e6ed7388db16113b49807ab41bd04df913fe1f Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sat, 2 Oct 2021 15:48:55 +1000 Subject: [PATCH] complete group notifications - notify group members when a new member accepts an invitation - notify all group members when a member leaves or is removed - notify ex-member when they are removed --- bookwyrm/models/group.py | 16 +++++++++++----- bookwyrm/models/notification.py | 2 +- bookwyrm/templates/notifications.html | 20 ++++++++++++++++++-- bookwyrm/views/group.py | 21 +++++++++++++++------ 4 files changed, 45 insertions(+), 14 deletions(-) diff --git a/bookwyrm/models/group.py b/bookwyrm/models/group.py index fdba04ea..dbded115 100644 --- a/bookwyrm/models/group.py +++ b/bookwyrm/models/group.py @@ -133,21 +133,27 @@ class GroupMemberInvitation(models.Model): with transaction.atomic(): BookwyrmGroupMember.from_request(self) - # let the other members know about it model = apps.get_model("bookwyrm.Notification", require_ready=True) + # tell the group owner + model.objects.create( + user=self.group.user, + related_user=self.user, + related_group=self.group, + notification_type="ACCEPT", + ) + + # let the other members know about it for membership in self.group.memberships.all(): member = membership.user - if member != self.user: + if member != self.user and member != self.group.user: model.objects.create( user=member, related_user=self.user, related_group=self.group, - notification_type="ACCEPT", + notification_type="JOIN", ) def reject(self): """generate a Reject for this membership request""" self.delete() - - # TODO: send notification \ No newline at end of file diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py index 3632fa10..a2ddb874 100644 --- a/bookwyrm/models/notification.py +++ b/bookwyrm/models/notification.py @@ -7,7 +7,7 @@ from . import Boost, Favorite, ImportJob, Report, Status, User NotificationType = models.TextChoices( "NotificationType", - "FAVORITE REPLY MENTION TAG FOLLOW FOLLOW_REQUEST BOOST IMPORT ADD REPORT INVITE ACCEPT", + "FAVORITE REPLY MENTION TAG FOLLOW FOLLOW_REQUEST BOOST IMPORT ADD REPORT INVITE ACCEPT JOIN LEAVE REMOVE", ) diff --git a/bookwyrm/templates/notifications.html b/bookwyrm/templates/notifications.html index 8dba38c6..8c076ccb 100644 --- a/bookwyrm/templates/notifications.html +++ b/bookwyrm/templates/notifications.html @@ -42,7 +42,7 @@ {% elif notification.notification_type == 'REPLY' %} - {% elif notification.notification_type == 'FOLLOW' or notification.notification_type == 'FOLLOW_REQUEST' or notification.notification_type == 'INVITE' or notification.notification_type == 'ACCEPT' %} + {% elif notification.notification_type == 'FOLLOW' or notification.notification_type == 'FOLLOW_REQUEST' or notification.notification_type == 'INVITE' or notification.notification_type == 'ACCEPT' or notification.notification_type == 'JOIN' or notification.notification_type == 'LEAVE' or notification.notification_type == 'REMOVE'%} {% elif notification.notification_type == 'BOOST' %} @@ -131,9 +131,25 @@ {% endif %} {% elif notification.notification_type == 'ACCEPT' %} {% if notification.related_group %} - {% blocktrans with group_name=notification.related_group.name group_path=notification.related_group.local_path %} accepted an invitation to join your group "{{ group_name }}"{% endblocktrans %} + {% blocktrans with group_name=notification.related_group.name group_path=notification.related_group.local_path %} accepted your invitation to join group "{{ group_name }}"{% endblocktrans %} + {% endif %} + {% elif notification.notification_type == 'JOIN' %} + {% if notification.related_group %} + {% blocktrans with group_name=notification.related_group.name group_path=notification.related_group.local_path %} has joined your group "{{ group_name }}"{% endblocktrans %} + {% endif %} + {% elif notification.notification_type == 'LEAVE' %} + {% if notification.related_group %} + {% blocktrans with group_name=notification.related_group.name group_path=notification.related_group.local_path %} has left your group "{{ group_name }}"{% endblocktrans %} + {% endif %} + {% elif notification.notification_type == 'REMOVE' %} + {% if notification.related_group %} + {% blocktrans with group_name=notification.related_group.name group_path=notification.related_group.local_path %} has been removed from your group "{{ group_name }}"{% endblocktrans %} {% endif %} {% endif %} + {% elif notification.notification_type == 'REMOVE' and notification.related_group %} + {% blocktrans with group_name=notification.related_group.name group_path=notification.related_group.local_path %} + You have been removed from the "{{ group_name }} group" + {% endblocktrans %} {% elif notification.related_import %} {% url 'import-status' notification.related_import.id as url %} {% blocktrans %}Your import completed.{% endblocktrans %} diff --git a/bookwyrm/views/group.py b/bookwyrm/views/group.py index 5ae2cecd..b8c45a4d 100644 --- a/bookwyrm/views/group.py +++ b/bookwyrm/views/group.py @@ -158,7 +158,7 @@ def invite_member(request): @require_POST @login_required def remove_member(request): - """invite a member to the group""" + """remove a member from the group""" group = get_object_or_404(models.BookwyrmGroup, id=request.POST.get("group")) if not group: @@ -192,19 +192,28 @@ def remove_member(request): except IntegrityError: pass - # let the other members know about it + memberships = models.BookwyrmGroupMember.objects.filter(group=group) model = apps.get_model("bookwyrm.Notification", require_ready=True) - memberships = models.BookwyrmGroupMember.objects.get(group=group) + notification_type = "LEAVE" if "self_removal" in request.POST and request.POST["self_removal"] else "REMOVE" + # let the other members know about it for membership in memberships: member = membership.user if member != request.user: model.objects.create( user=member, - related_user=request.user, - related_group=request.group, - notification_type="REMOVE", + related_user=user, + related_group=group, + notification_type=notification_type, ) + # let the user (now ex-member) know as well, if they were removed + if notification_type == "REMOVE": + model.objects.create( + user=user, + related_group=group, + notification_type=notification_type, + ) + return redirect(user.local_path) @require_POST