The following books could not be imported:
+Import
--
- {% for item in failures %}
-
- - {{ item }} - - {% endfor %} -
{{ success_count }} books imported successfully
+ Import uploaded successfully. The import is being processed.diff --git a/fedireads/goodreads_import.py b/fedireads/goodreads_import.py index 884cd76a..163aa90c 100644 --- a/fedireads/goodreads_import.py +++ b/fedireads/goodreads_import.py @@ -1,11 +1,13 @@ ''' handle reading a csv from goodreads ''' import re import csv -import itertools import dateutil.parser +from requests import HTTPError from fedireads import books_manager -from fedireads.models import Edition, ReadThrough +from fedireads import outgoing +from fedireads.models import Edition, ReadThrough, User +from fedireads.tasks import app # Mapping goodreads -> fedireads shelf titles. @@ -36,14 +38,42 @@ def construct_search_term(title, author): return ' '.join([title, author]) -class GoodreadsCsv: - ''' define a goodreads csv ''' - def __init__(self, csv_file): - self.reader = csv.DictReader(csv_file) +def async_import(user, csv_file): + entries = list(csv.DictReader(csv_file))[:MAX_ENTRIES] + return import_data.delay(user.id, entries) + +@app.task +def import_data(user_id, entries): + user = User.objects.get(pk=user_id) + results = [] + reviews = [] + failures = [] + for item in entries: + item = GoodreadsItem(item) + try: + item.resolve() + except HTTPError: + pass + if item.book: + results.append(item) + if item.rating or item.review: + reviews.append(item) + else: + failures.append(item) + + outgoing.handle_import_books(user, results) + for item in reviews: + review_title = "Review of {!r} on Goodreads".format( + item.book.title, + ) if item.review else "" + outgoing.handle_review( + user, + item.book, + review_title, + item.review, + item.rating, + ) - def __iter__(self): - for line in itertools.islice(self.reader, MAX_ENTRIES): - yield GoodreadsItem(line) class GoodreadsItem: ''' a processed line in a goodreads csv ''' diff --git a/fedireads/incoming.py b/fedireads/incoming.py index f14b7d62..49c9e9b0 100644 --- a/fedireads/incoming.py +++ b/fedireads/incoming.py @@ -14,6 +14,7 @@ from fedireads import models, outgoing from fedireads import status as status_builder from fedireads.remote_user import get_or_create_remote_user from fedireads.tasks import app +from fedireads.status import create_notification @csrf_exempt diff --git a/fedireads/models/status.py b/fedireads/models/status.py index 6f19fe28..7136eb53 100644 --- a/fedireads/models/status.py +++ b/fedireads/models/status.py @@ -150,7 +150,8 @@ class ReadThrough(FedireadsModel): NotificationType = models.TextChoices( - 'NotificationType', 'FAVORITE REPLY TAG FOLLOW FOLLOW_REQUEST BOOST') + 'NotificationType', + 'FAVORITE REPLY TAG FOLLOW FOLLOW_REQUEST BOOST IMPORT_RESULT') class Notification(FedireadsModel): ''' you've been tagged, liked, followed, etc ''' diff --git a/fedireads/outgoing.py b/fedireads/outgoing.py index 435843c0..42b659df 100644 --- a/fedireads/outgoing.py +++ b/fedireads/outgoing.py @@ -203,6 +203,7 @@ def handle_import_books(user, items): status.status_type = 'Update' status.save() + create_notification(user, 'IMPORT_RESULT', related_status=status) create_activity = activitypub.get_create( user, activitypub.get_status(status)) broadcast(user, create_activity) @@ -356,4 +357,3 @@ def handle_update_user(user): actor = activitypub.get_actor(user) update_activity = activitypub.get_update(user, actor) broadcast(user, update_activity) - diff --git a/fedireads/templates/import_results.html b/fedireads/templates/import_results.html index 2994b6ff..376f64cb 100644 --- a/fedireads/templates/import_results.html +++ b/fedireads/templates/import_results.html @@ -2,17 +2,9 @@ {% block content %}
{{ success_count }} books imported successfully
+ Import uploaded successfully. The import is being processed.