moviewyrm/bookwyrm/goodreads_import.py

74 lines
2.3 KiB
Python
Raw Normal View History

2020-03-29 07:05:09 +00:00
''' handle reading a csv from goodreads '''
import csv
2020-11-13 17:47:35 +00:00
import logging
from bookwyrm import outgoing
from bookwyrm.tasks import app
from bookwyrm.models import ImportJob, ImportItem
from bookwyrm.status import create_notification
2020-03-29 07:05:09 +00:00
2020-11-13 17:47:35 +00:00
logger = logging.getLogger(__name__)
# TODO: remove or increase once we're confident it's not causing problems.
MAX_ENTRIES = 500
2020-03-25 12:58:27 +00:00
2020-03-29 07:05:09 +00:00
def create_job(user, csv_file, include_reviews, privacy):
2020-05-09 21:26:27 +00:00
''' check over a csv and creates a database entry for the job'''
job = ImportJob.objects.create(
user=user,
include_reviews=include_reviews,
privacy=privacy
)
for index, entry in enumerate(list(csv.DictReader(csv_file))[:MAX_ENTRIES]):
if not all(x in entry for x in ('ISBN13', 'Title', 'Author')):
raise ValueError('Author, title, and isbn must be in data.')
ImportItem(job=job, index=index, data=entry).save()
return job
2020-11-13 17:02:41 +00:00
def create_retry_job(user, original_job, items):
''' retry items that didn't import '''
job = ImportJob.objects.create(
user=user,
include_reviews=original_job.include_reviews,
privacy=original_job.privacy,
retry=True
)
for item in items:
ImportItem(job=job, index=item.index, data=item.data).save()
return job
2020-05-09 21:26:27 +00:00
def start_import(job):
2020-05-09 21:26:27 +00:00
''' initalizes a csv import job '''
result = import_data.delay(job.id)
job.task_id = result.id
job.save()
2020-04-20 16:10:19 +00:00
2020-05-09 21:26:27 +00:00
2020-04-20 16:10:19 +00:00
@app.task
def import_data(job_id):
2020-05-09 21:26:27 +00:00
''' does the actual lookup work in a celery task '''
job = ImportJob.objects.get(id=job_id)
2020-04-22 11:43:10 +00:00
try:
results = []
for item in job.items.all():
try:
item.resolve()
2020-11-13 17:47:35 +00:00
except Exception as e:
logger.exception(e)
item.fail_reason = 'Error loading book'
item.save()
continue
2020-04-22 11:43:10 +00:00
if item.book:
item.save()
results.append(item)
# shelves book and handles reviews
outgoing.handle_imported_book(
job.user, item, job.include_reviews, job.privacy)
2020-04-22 11:43:10 +00:00
else:
item.fail_reason = 'Could not find a match for book'
2020-04-22 11:43:10 +00:00
item.save()
finally:
create_notification(job.user, 'IMPORT', related_import=job)