diff --git a/fedireads/goodreads_import.py b/fedireads/goodreads_import.py index 1333f9cc..adcbad3c 100644 --- a/fedireads/goodreads_import.py +++ b/fedireads/goodreads_import.py @@ -2,9 +2,9 @@ import re import csv import itertools -from requests import HTTPError from fedireads import books_manager +from fedireads.models import Edition # Mapping goodreads -> fedireads shelf titles. @@ -42,13 +42,7 @@ class GoodreadsCsv: def __iter__(self): for line in itertools.islice(self.reader, MAX_ENTRIES): - entry = GoodreadsItem(line) - try: - entry.resolve() - except HTTPError: - pass - yield entry - + yield GoodreadsItem(line) class GoodreadsItem: ''' a processed line in a goodreads csv ''' @@ -56,22 +50,27 @@ class GoodreadsItem: self.line = line self.book = None - def resolve(self): ''' try various ways to lookup a book ''' - self.book = self.get_book_from_isbn() - if not self.book: - self.book = self.get_book_from_title_author() + self.book = ( + self.get_book_from_db_isbn() or + self.get_book_from_isbn() or + self.get_book_from_title_author() + ) + def get_book_from_db_isbn(self): + ''' see if we already know about the book ''' + try: + return Edition.objects.get(isbn=self.isbn) + except Edition.DoesNotExist: + return None def get_book_from_isbn(self): ''' search by isbn ''' - isbn = unquote_string(self.line['ISBN13']) - search_results = books_manager.search(isbn) + search_results = books_manager.search(self.isbn) if search_results: return books_manager.get_or_create_book(search_results[0].key) - def get_book_from_title_author(self): ''' search by title and author ''' search_term = construct_search_term( @@ -82,6 +81,10 @@ class GoodreadsItem: if search_results: return books_manager.get_or_create_book(search_results[0].key) + @property + def isbn(self): + return unquote_string(self.line['ISBN13']) + @property def shelf(self): ''' the goodreads shelf field ''' diff --git a/fedireads/view_actions.py b/fedireads/view_actions.py index 7ccf4888..c3134441 100644 --- a/fedireads/view_actions.py +++ b/fedireads/view_actions.py @@ -2,6 +2,7 @@ from io import BytesIO, TextIOWrapper import re from PIL import Image +from requests import HTTPError from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required @@ -424,6 +425,10 @@ def import_data(request): for item in GoodreadsCsv(TextIOWrapper( request.FILES['csv_file'], encoding=request.encoding)): + try: + item.resolve() + except HttpError: + pass if item.book: results.append(item) if item.rating or item.review: