diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py
index f280f1e28..1c27c2912 100644
--- a/bookwyrm/models/list.py
+++ b/bookwyrm/models/list.py
@@ -150,7 +150,7 @@ class ListItem(CollectionItemMixin, BookWyrmModel):
collection_field = "book_list"
def save(self, *args, **kwargs):
- """create a notification too"""
+ """Update the list's date"""
super().save(*args, **kwargs)
# tick the updated date on the parent list
self.book_list.updated_date = timezone.now()
diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py
index 726dc1beb..e7443b43c 100644
--- a/bookwyrm/models/notification.py
+++ b/bookwyrm/models/notification.py
@@ -66,6 +66,27 @@ class Notification(BookWyrmModel):
notification.read = False
notification.save()
+ @classmethod
+ @transaction.atomic
+ def notify_list_item(cls, user, list_item):
+ """ Group the notifications around the list items, not the user """
+ related_user = list_item.user
+ notification = cls.objects.filter(
+ user=user,
+ related_users=related_user,
+ related_list_items__book_list=list_item.book_list,
+ notification_type=Notification.ADD
+ ).first()
+ if not notification:
+ notification = cls.objects.create(
+ user=user,
+ notification_type=Notification.ADD
+ )
+ notification.related_users.add(related_user)
+ notification.related_list_items.add(list_item)
+ notification.read = False
+ notification.save()
+
@classmethod
def unnotify(cls, user, related_user, **kwargs):
"""Remove a user from a notification and delete it if that was the only user"""
@@ -79,7 +100,6 @@ class Notification(BookWyrmModel):
@receiver(models.signals.post_save, sender=Favorite)
-@transaction.atomic()
# pylint: disable=unused-argument
def notify_on_fav(sender, instance, *args, **kwargs):
"""someone liked your content, you ARE loved"""
@@ -144,7 +164,6 @@ def notify_user_on_mention(sender, instance, *args, **kwargs):
@receiver(models.signals.post_save, sender=Boost)
-@transaction.atomic
# pylint: disable=unused-argument
def notify_user_on_boost(sender, instance, *args, **kwargs):
"""boosting a status"""
@@ -210,7 +229,6 @@ def notify_admins_on_report(sender, instance, *args, **kwargs):
@receiver(models.signals.post_save, sender=GroupMemberInvitation)
-@transaction.atomic
# pylint: disable=unused-argument
def notify_user_on_group_invite(sender, instance, *args, **kwargs):
"""Cool kids club here we come"""
@@ -233,19 +251,16 @@ def notify_user_on_list_item_add(sender, instance, created, *args, **kwargs):
list_owner = instance.book_list.user
# create a notification if somoene ELSE added to a local user's list
if list_owner.local and list_owner != instance.user:
- Notification.notify(
+ # keep the related_user singular, group the items
+ Notification.notify_list_item(
list_owner,
- instance.user,
- related_list_item=instance,
- notification_type=Notification.ADD
+ instance
)
if instance.book_list.group:
for membership in instance.book_list.group.memberships.all():
if membership.user != instance.user:
- Notification.notify(
+ Notification.notify_list_item(
membership.user,
- instance.user,
- related_list_item=instance,
- notification_type=Notification.ADD,
+ instance
)
diff --git a/bookwyrm/templates/notifications/items/add.html b/bookwyrm/templates/notifications/items/add.html
index 6a0183ebe..fdd480ee1 100644
--- a/bookwyrm/templates/notifications/items/add.html
+++ b/bookwyrm/templates/notifications/items/add.html
@@ -1,14 +1,16 @@
{% extends 'notifications/items/layout.html' %}
-
{% load i18n %}
{% load utilities %}
+{% load humanize %}
{% block primary_link %}{% spaceless %}
-{% if notification.related_list_item.approved %}
- {{ notification.related_list_item.book_list.local_path }}
+{% with related_list=notification.related_list_items.first.book_list %}
+{% if related_list.curation != "curated" %}
+ {{ related_list.local_path }}
{% else %}
- {% url 'list-curate' notification.related_list_item.book_list.id %}
+ {% url 'list-curate' related_list.id %}
{% endif %}
+{% endwith %}
{% endspaceless %}{% endblock %}
{% block icon %}
@@ -16,25 +18,89 @@
{% endblock %}
{% block description %}
-{% with book_path=notification.related_list_item.book.local_path %}
-{% with book_title=notification.related_list_item.book|book_title %}
-{% with list_name=notification.related_list_item.book_list.name %}
+{% with related_list=notification.related_list_items.first.book_list %}
+{% with book_path=notification.related_list_items.first.book.local_path %}
+{% with book_title=notification.related_list_items.first.book|book_title %}
+{% with second_book_path=notification.related_list_items.all.1.book.local_path %}
+{% with second_book_title=notification.related_list_items.all.1.book|book_title %}
+{% with list_name=related_list.name %}
- {% if notification.related_list_item.approved %}
- {% blocktrans trimmed with list_path=notification.related_list_item.book_list.local_path %}
+{% url 'list' related_list.id as list_path %}
+{% url 'list-curate' related_list.id as list_curate_path %}
- added {{ book_title }} to your list "{{ list_name }}"
-
- {% endblocktrans %}
+{% if notification.related_list_items.count == 1 %}
+ {% if related_list.curation != "curated" %}
+ {% blocktrans trimmed %}
+ {{ related_user }}
+ added {{ book_title }}
+ to your list "{{ list_name }}"
+ {% endblocktrans %}
{% else %}
- {% url 'list-curate' notification.related_list_item.book_list.id as list_path %}
- {% blocktrans trimmed with list_path=list_path %}
-
- suggested adding {{ book_title }} to your list "{{ list_name }}"
-
- {% endblocktrans %}
+ {% blocktrans trimmed %}
+ {{ related_user }}
+ suggested adding {{ book_title }}
+ to your list "{{ list_name }}"
+ {% endblocktrans %}
{% endif %}
+{% elif notification.related_list_items.count == 2 %}
+ {% if related_list.curation != "curated" %}
+ {% blocktrans trimmed %}
+ {{ related_user }}
+ added {{ book_title }}
+ and {{ second_book_title }}
+ to your list "{{ list_name }}"
+ {% endblocktrans %}
+ {% else %}
+ {% blocktrans trimmed %}
+ {{ related_user }}
+ suggested adding {{ book_title }}
+ and {{ second_book_title }}
+ to your list "{{ list_name }}"
+ {% endblocktrans %}
+ {% endif %}
+{% else %}
+ {% with count=notification.related_list_items.count|add:"-2" %}
+ {% with display_count=count|intcomma %}
+ {% if related_list.curation != "curated" %}
+ {% blocktrans trimmed count counter=count %}
+ {{ related_user }}
+ added {{ book_title }},
+ {{ second_book_title }},
+ and {{ display_count }} other book
+ to your list "{{ list_name }}"
+ {% plural %}
+ {{ related_user }}
+ added {{ book_title }},
+ {{ second_book_title }},
+ and {{ display_count }} other books
+ to your list "{{ list_name }}"
+ {% endblocktrans %}
+
+ {% else %}
+
+ {% blocktrans trimmed count counter=count %}
+ {{ related_user }}
+ suggested adding {{ book_title }},
+ {{ second_book_title }},
+ and {{ display_count }} other book
+ to your list "{{ list_name }}"
+ {% plural %}
+ {{ related_user }}
+ suggested adding {{ book_title }},
+ {{ second_book_title }},
+ and {{ display_count }} other books
+ to your list "{{ list_name }}"
+ {% endblocktrans %}
+
+ {% endif %}
+ {% endwith %}
+ {% endwith %}
+{% endif %}
+
+{% endwith %}
+{% endwith %}
+{% endwith %}
{% endwith %}
{% endwith %}
{% endwith %}