From 4c0f22fa5c7d15e1936aba0b92821d73ff7415c2 Mon Sep 17 00:00:00 2001 From: Marnanel Thurman Date: Sat, 28 Mar 2020 17:33:31 +0000 Subject: [PATCH] intermediate --- kepi/bowler_pub/create.py | 1 - kepi/bowler_pub/side_effects.py | 1 - .../migrations/0020_auto_20200328_1640.py | 34 +++++ kepi/trilby_api/models.py | 116 ++---------------- kepi/trilby_api/receivers.py | 42 +++++++ kepi/trilby_api/serializers.py | 2 +- kepi/{bowler_pub => trilby_api}/signals.py | 10 +- kepi/trilby_api/views.py | 9 +- 8 files changed, 102 insertions(+), 113 deletions(-) create mode 100644 kepi/trilby_api/migrations/0020_auto_20200328_1640.py create mode 100644 kepi/trilby_api/receivers.py rename kepi/{bowler_pub => trilby_api}/signals.py (63%) diff --git a/kepi/bowler_pub/create.py b/kepi/bowler_pub/create.py index fd20f2e..929e4af 100644 --- a/kepi/bowler_pub/create.py +++ b/kepi/bowler_pub/create.py @@ -11,7 +11,6 @@ This module contains create(), which creates objects. import django.db.utils import logging import json -from kepi.bowler_pub import signals logger = logging.getLogger(name='kepi') diff --git a/kepi/bowler_pub/side_effects.py b/kepi/bowler_pub/side_effects.py index 26170eb..4c4da73 100644 --- a/kepi/bowler_pub/side_effects.py +++ b/kepi/bowler_pub/side_effects.py @@ -15,7 +15,6 @@ import logging from django.conf import settings from kepi.bowler_pub.find import find, is_local from kepi.bowler_pub.delivery import deliver -from kepi.bowler_pub import signals from kepi.bowler_pub.utils import short_id_to_url logger = logging.getLogger(name='kepi') diff --git a/kepi/trilby_api/migrations/0020_auto_20200328_1640.py b/kepi/trilby_api/migrations/0020_auto_20200328_1640.py new file mode 100644 index 0000000..b42b039 --- /dev/null +++ b/kepi/trilby_api/migrations/0020_auto_20200328_1640.py @@ -0,0 +1,34 @@ +# Generated by Django 2.2.4 on 2020-03-28 16:40 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('trilby_api', '0019_auto_20200328_1611'), + ] + + operations = [ + migrations.AlterField( + model_name='notification', + name='about_account', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='notifications_about', to='trilby_api.Person'), + ), + migrations.AlterField( + model_name='notification', + name='for_account', + field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='notifications_for', to='trilby_api.Person'), + ), + migrations.AlterField( + model_name='notification', + name='notification_type', + field=models.CharField(choices=[('F', 'follow'), ('M', 'mention'), ('R', 'reblog'), ('L', 'favourite')], max_length=1), + ), + migrations.AlterField( + model_name='notification', + name='status', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='trilby_api.Status'), + ), + ] diff --git a/kepi/trilby_api/models.py b/kepi/trilby_api/models.py index f70b1c0..479fbc2 100644 --- a/kepi/trilby_api/models.py +++ b/kepi/trilby_api/models.py @@ -1,11 +1,7 @@ from django.db import models from django.db.models.constraints import UniqueConstraint from django.contrib.auth.models import AbstractUser -from django.dispatch import receiver from django.conf import settings -import kepi.bowler_pub.models as kepi_models -import kepi.bowler_pub.signals as kepi_signals -import kepi.bowler_pub.find as kepi_find from kepi.bowler_pub.create import create import kepi.bowler_pub.crypto as crypto from kepi.bowler_pub.utils import uri_to_url @@ -370,7 +366,7 @@ class Notification(models.Model): ] notification_type = models.CharField( - max_length = 256, + max_length = 1, choices = TYPE_CHOICES, ) @@ -381,23 +377,23 @@ class Notification(models.Model): for_account = models.ForeignKey( Person, on_delete = models.DO_NOTHING, + related_name = 'notifications_for', ) - about_account = models.CharField( - max_length = 256, - default='', - ) - - status = models.ForeignKey( - kepi_models.AcItem, + about_account = models.ForeignKey( + Person, on_delete = models.DO_NOTHING, + related_name = 'notifications_about', blank = True, null = True, ) - @property - def about_account_actor(self): - return kepi_models.AcActor.get_by_url(self.about_account) + status = models.ForeignKey( + Status, + on_delete = models.DO_NOTHING, + blank = True, + null = True, + ) def __str__(self): @@ -441,93 +437,3 @@ class Like(models.Model): def __str__(self): return '[%s likes %s]' % (liker, liked) - -################################################## -# Notification handlers - -# FIXME these are really similar. Can we refactor? - -@receiver(kepi_signals.created) -def on_follow(sender, **kwargs): - - value = kwargs['value'] - - if isinstance(value, kepi_models.AcFollow): - - follower_acperson = kepi_find.find( - value['object'], - local_only = True, - ) - - if follower_acperson is None: - logger.info(' -- not storing a notification, because '+\ - 'nobody\'s being followed') - return - - try: - follower = TrilbyUser.objects.get(actor=follower_acperson) - except TrilbyUser.DoesNotExist: - logger.info(' -- not storing a notification, because '+\ - 'we don\'t know the person being followed') - return - - logger.info(' -- storing a notification about this follow') - - following = value['actor'] - - notification = Notification( - notification_type = Notification.FOLLOW, - for_account = follower, - about_account = following, - ) - - notification.save() - - logger.info(' -- notification is: %s', - notification) - -@receiver(kepi_signals.created) -def on_like(sender, **kwargs): - - value = kwargs['value'] - - if isinstance(value, kepi_models.AcLike): - - status = kepi_find.find( - value['object'], - local_only = True) - - if status is None: - logger.info(' -- not storing a notification, because '+\ - "there's no local object") - return - - owner_acperson = status['attributedTo__obj'] - - if owner_acperson is None: - logger.info(' -- not storing a notification, because '+\ - 'there\'s no owner') - return - - try: - owner = TrilbyUser.objects.get(actor=owner_acperson) - except TrilbyUser.DoesNotExist: - logger.info(' -- not storing a notification, because '+\ - 'we don\'t know the owner') - return - - logger.info(' -- storing a notification about this like') - - sender = value['actor'] - - notification = Notification( - notification_type = Notification.FAVOURITE, - for_account = owner, - about_account = sender, - status = status, - ) - - notification.save() - - logger.info(' -- notification is: %s', - notification) diff --git a/kepi/trilby_api/receivers.py b/kepi/trilby_api/receivers.py new file mode 100644 index 0000000..76d03f0 --- /dev/null +++ b/kepi/trilby_api/receivers.py @@ -0,0 +1,42 @@ +import kepi.trilby_api.signals as kepi_signals +import kepi.trilby_api.models as kepi_models +from django.dispatch import receiver +import logging + +logger = logging.Logger('kepi') + +################################################## +# Notification handlers + +# FIXME these are really similar. Can we refactor? + +@receiver(kepi_signals.followed) +def on_follow(sender, **kwargs): + + print(11); + notification = kepi_models.Notification( + notification_type = kepi_models.Notification.FOLLOW, + for_account = sender.followed, + about_account = sender.follower, + ) + + notification.save() + + logger.info(' -- storing a notification: %s', + notification) + +@receiver(kepi_signals.liked) +def on_like(sender, **kwargs): + + print(11); + notification = kepi_models.Notification( + notification_type = kepi_models.Notification.FAVOURITE, + for_account = sender.liked.account, + about_account = sender.liker, + status = sender.liked, + ) + + notification.save() + + logger.info(' -- storing a notification: %s', + notification) diff --git a/kepi/trilby_api/serializers.py b/kepi/trilby_api/serializers.py index 5717ad1..50253e0 100644 --- a/kepi/trilby_api/serializers.py +++ b/kepi/trilby_api/serializers.py @@ -222,7 +222,7 @@ class NotificationSerializer(serializers.ModelSerializer): 'status', ] - account = UserSerializer(source='about_account_actor') + account = UserSerializer(source='about_account') status = StatusSerializer() diff --git a/kepi/bowler_pub/signals.py b/kepi/trilby_api/signals.py similarity index 63% rename from kepi/bowler_pub/signals.py rename to kepi/trilby_api/signals.py index 196a635..1d62166 100644 --- a/kepi/bowler_pub/signals.py +++ b/kepi/trilby_api/signals.py @@ -1,13 +1,15 @@ from django.dispatch import Signal -created = Signal( +liked = Signal( providing_args=[ - 'value', + 'liker', + 'liked', ]) -updated = Signal( +followed = Signal( providing_args=[ - 'value', + 'follower', + 'followed', ]) deleted = Signal( diff --git a/kepi/trilby_api/views.py b/kepi/trilby_api/views.py index 614cd85..e49fb40 100644 --- a/kepi/trilby_api/views.py +++ b/kepi/trilby_api/views.py @@ -11,10 +11,12 @@ from django.core.exceptions import SuspiciousOperation from django.conf import settings from .models import TrilbyUser, Notification, Status from .serializers import * +import kepi.trilby_api.signals as kepi_signals from rest_framework import generics, response from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.renderers import JSONRenderer +import kepi.trilby_api.receivers import logging import json import re @@ -103,7 +105,12 @@ class Favourite(DoSomethingWithStatus): like.save() logger.info(' -- created a Like') - except db.IntegrityError: + + print(1); + kepi_signals.liked.send(sender=like) + print(2); + + except IntegrityError: logger.info(' -- not creating a Like; it already exists') ###########################