bookwyrm/fedireads/goodreads_import.py

57 lines
1.4 KiB
Python
Raw Normal View History

2020-03-29 07:05:09 +00:00
''' handle reading a csv from goodreads '''
import csv
2020-04-20 16:10:19 +00:00
from requests import HTTPError
2020-04-20 16:10:19 +00:00
from fedireads import outgoing
from fedireads.tasks import app
from fedireads.models import ImportJob, ImportItem
2020-03-29 07:05:09 +00:00
# TODO: remove or notify about this in the UI
MAX_ENTRIES = 20
2020-03-25 12:58:27 +00:00
2020-03-29 07:05:09 +00:00
def create_job(user, csv_file):
job = ImportJob.objects.create(user=user)
for index, entry in enumerate(list(csv.DictReader(csv_file))[:MAX_ENTRIES]):
ImportItem(job=job, index=index, data=entry).save()
return job
def start_import(job):
result = import_data.delay(job.id)
job.task_id = result.id
job.save()
2020-04-20 16:10:19 +00:00
@app.task
def import_data(job_id):
job = ImportJob.objects.get(id=job_id)
user = job.user
2020-04-20 16:10:19 +00:00
results = []
reviews = []
for item in job.items.all():
2020-04-20 16:10:19 +00:00
try:
item.resolve()
except HTTPError:
pass
if item.book:
item.save()
2020-04-20 16:10:19 +00:00
results.append(item)
if item.rating or item.review:
reviews.append(item)
else:
item.fail_reason = "Could not match book on OpenLibrary"
item.save()
2020-04-20 16:10:19 +00:00
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,
)