From 77841909fe7f40ff9955b7063e08bfd4a55d8245 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 19 Feb 2020 00:22:55 -0800 Subject: [PATCH] Don't fav things multiple times Fixes #28 --- ...20200219_0804.py => 0002_auto_20200219_0816.py} | 4 ++-- fedireads/models/activity.py | 4 ++++ fedireads/outgoing.py | 14 ++++++++++---- fedireads/templates/feed.html | 5 +++++ 4 files changed, 21 insertions(+), 6 deletions(-) rename fedireads/migrations/{0002_auto_20200219_0804.py => 0002_auto_20200219_0816.py} (92%) diff --git a/fedireads/migrations/0002_auto_20200219_0804.py b/fedireads/migrations/0002_auto_20200219_0816.py similarity index 92% rename from fedireads/migrations/0002_auto_20200219_0804.py rename to fedireads/migrations/0002_auto_20200219_0816.py index 7288eff79..ab96687dd 100644 --- a/fedireads/migrations/0002_auto_20200219_0804.py +++ b/fedireads/migrations/0002_auto_20200219_0816.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.3 on 2020-02-19 08:04 +# Generated by Django 3.0.3 on 2020-02-19 08:16 from django.conf import settings from django.db import migrations, models @@ -22,7 +22,7 @@ class Migration(migrations.Migration): ('user', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), ], options={ - 'abstract': False, + 'unique_together': {('user', 'status')}, }, ), migrations.AddField( diff --git a/fedireads/models/activity.py b/fedireads/models/activity.py index 165151e5e..1977e46bc 100644 --- a/fedireads/models/activity.py +++ b/fedireads/models/activity.py @@ -50,3 +50,7 @@ class Favorite(FedireadsModel): ''' fav'ing a post ''' user = models.ForeignKey('User', on_delete=models.PROTECT) status = models.ForeignKey('Status', on_delete=models.PROTECT) + + class Meta: + unique_together = ('user', 'status') + diff --git a/fedireads/outgoing.py b/fedireads/outgoing.py index 5b158d779..7253ea20a 100644 --- a/fedireads/outgoing.py +++ b/fedireads/outgoing.py @@ -1,4 +1,5 @@ ''' handles all the activity coming out of the server ''' +from django.db import IntegrityError from django.http import HttpResponseNotFound, JsonResponse from django.views.decorators.csrf import csrf_exempt import requests @@ -172,10 +173,15 @@ def handle_comment(user, review, content): def handle_outgoing_favorite(user, status): ''' a user likes a status ''' - favorite = models.Favorite.objects.create( - status=status, - user=user - ) + try: + favorite = models.Favorite.objects.create( + status=status, + user=user + ) + except IntegrityError: + # you already fav'ed that + return + fav_activity = activitypub.get_favorite(favorite) recipients = get_recipients(user, 'direct', [status.user]) broadcast(user, fav_activity, recipients) diff --git a/fedireads/templates/feed.html b/fedireads/templates/feed.html index 5350b54d2..3f6089008 100644 --- a/fedireads/templates/feed.html +++ b/fedireads/templates/feed.html @@ -67,6 +67,11 @@

{{ activity.content | safe }}

+ {% if activity.favorites.all %} + + {{ activity.favorites.count }} like(s) + + {% endif %}
{% csrf_token %}