Fixing up notifications.

This commit is contained in:
Adam Kelly 2020-04-22 12:43:10 +01:00
parent 0bf73fef24
commit 22b2a95fd3
6 changed files with 80 additions and 33 deletions

View file

@ -5,7 +5,7 @@ from requests import HTTPError
from fedireads import outgoing from fedireads import outgoing
from fedireads.tasks import app from fedireads.tasks import app
from fedireads.models import ImportJob, ImportItem from fedireads.models import ImportJob, ImportItem
from fedireads.status import create_notification
# TODO: remove or notify about this in the UI # TODO: remove or notify about this in the UI
MAX_ENTRIES = 20 MAX_ENTRIES = 20
@ -25,7 +25,7 @@ def start_import(job):
@app.task @app.task
def import_data(job_id): def import_data(job_id):
job = ImportJob.objects.get(id=job_id) job = ImportJob.objects.get(id=job_id)
user = job.user try:
results = [] results = []
reviews = [] reviews = []
for item in job.items.all(): for item in job.items.all():
@ -42,15 +42,17 @@ def import_data(job_id):
item.fail_reason = "Could not match book on OpenLibrary" item.fail_reason = "Could not match book on OpenLibrary"
item.save() item.save()
outgoing.handle_import_books(user, results) outgoing.handle_import_books(job.user, results)
for item in reviews: for item in reviews:
review_title = "Review of {!r} on Goodreads".format( review_title = "Review of {!r} on Goodreads".format(
item.book.title, item.book.title,
) if item.review else "" ) if item.review else ""
outgoing.handle_review( outgoing.handle_review(
user, job.user,
item.book, item.book,
review_title, review_title,
item.review, item.review,
item.rating, item.rating,
) )
finally:
create_notification(job.user, 'IMPORT', related_import=job)

View file

@ -0,0 +1,43 @@
# Generated by Django 3.0.3 on 2020-04-22 12:49
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('fedireads', '0032_auto_20200421_1347'),
]
operations = [
migrations.RemoveConstraint(
model_name='notification',
name='notification_type_valid',
),
migrations.AddField(
model_name='importitem',
name='fail_reason',
field=models.TextField(null=True),
),
migrations.AddField(
model_name='importitem',
name='index',
field=models.IntegerField(default=1),
preserve_default=False,
),
migrations.AddField(
model_name='notification',
name='related_import',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='fedireads.ImportJob'),
),
migrations.AlterField(
model_name='notification',
name='notification_type',
field=models.CharField(choices=[('FAVORITE', 'Favorite'), ('REPLY', 'Reply'), ('TAG', 'Tag'), ('FOLLOW', 'Follow'), ('FOLLOW_REQUEST', 'Follow Request'), ('BOOST', 'Boost'), ('IMPORT', 'Import')], max_length=255),
),
migrations.AddConstraint(
model_name='notification',
constraint=models.CheckConstraint(check=models.Q(notification_type__in=['FAVORITE', 'REPLY', 'TAG', 'FOLLOW', 'FOLLOW_REQUEST', 'BOOST', 'IMPORT']), name='notification_type_valid'),
),
]

View file

@ -151,7 +151,7 @@ class ReadThrough(FedireadsModel):
NotificationType = models.TextChoices( NotificationType = models.TextChoices(
'NotificationType', 'NotificationType',
'FAVORITE REPLY TAG FOLLOW FOLLOW_REQUEST BOOST IMPORT_RESULT') 'FAVORITE REPLY TAG FOLLOW FOLLOW_REQUEST BOOST IMPORT')
class Notification(FedireadsModel): class Notification(FedireadsModel):
''' you've been tagged, liked, followed, etc ''' ''' you've been tagged, liked, followed, etc '''
@ -163,6 +163,8 @@ class Notification(FedireadsModel):
on_delete=models.PROTECT, null=True, related_name='related_user') on_delete=models.PROTECT, null=True, related_name='related_user')
related_status = models.ForeignKey( related_status = models.ForeignKey(
'Status', on_delete=models.PROTECT, null=True) 'Status', on_delete=models.PROTECT, null=True)
related_import = models.ForeignKey(
'ImportJob', on_delete=models.PROTECT, null=True)
read = models.BooleanField(default=False) read = models.BooleanField(default=False)
notification_type = models.CharField( notification_type = models.CharField(
max_length=255, choices=NotificationType.choices) max_length=255, choices=NotificationType.choices)

View file

@ -203,7 +203,6 @@ def handle_import_books(user, items):
status.status_type = 'Update' status.status_type = 'Update'
status.save() status.save()
create_notification(user, 'IMPORT_RESULT', related_status=status)
create_activity = activitypub.get_create( create_activity = activitypub.get_create(
user, activitypub.get_status(status)) user, activitypub.get_status(status))
broadcast(user, create_activity) broadcast(user, create_activity)

View file

@ -234,7 +234,7 @@ def create_tag(user, possible_book, name):
def create_notification(user, notification_type, related_user=None, \ def create_notification(user, notification_type, related_user=None, \
related_book=None, related_status=None): related_book=None, related_status=None, related_import=None):
''' let a user know when someone interacts with their content ''' ''' let a user know when someone interacts with their content '''
if user == related_user: if user == related_user:
# don't create notification when you interact with your own stuff # don't create notification when you interact with your own stuff
@ -244,6 +244,7 @@ def create_notification(user, notification_type, related_user=None, \
related_book=related_book, related_book=related_book,
related_user=related_user, related_user=related_user,
related_status=related_status, related_status=related_status,
related_import=related_import,
notification_type=notification_type, notification_type=notification_type,
) )

View file

@ -38,7 +38,7 @@
boosted your <a href="{{ notification.related_status.absolute_id}}">status</a> boosted your <a href="{{ notification.related_status.absolute_id}}">status</a>
{% endif %} {% endif %}
{% else %} {% else %}
your <a href="{{ notification.related_status.absolute_id }}">import</a> succeeded. your <a href="/import_status/{{ notification.related_import.id }}">import</a> completed.
{% endif %} {% endif %}
</div> </div>