- {{ import_form.as_p }}
+
+
+
+
+
+
+
-
-
-
-
-
diff --git a/bookwyrm/tests/importers/__init__.py b/bookwyrm/tests/importers/__init__.py
new file mode 100644
index 00000000..b6e690fd
--- /dev/null
+++ b/bookwyrm/tests/importers/__init__.py
@@ -0,0 +1 @@
+from . import *
diff --git a/bookwyrm/tests/test_goodreads_import.py b/bookwyrm/tests/importers/test_goodreads_import.py
similarity index 90%
rename from bookwyrm/tests/test_goodreads_import.py
rename to bookwyrm/tests/importers/test_goodreads_import.py
index c06b49fc..6e9caaf4 100644
--- a/bookwyrm/tests/test_goodreads_import.py
+++ b/bookwyrm/tests/importers/test_goodreads_import.py
@@ -7,8 +7,9 @@ from unittest.mock import patch
from django.test import TestCase
import responses
-from bookwyrm import models, importer
-from bookwyrm.goodreads_import import GoodreadsImporter
+from bookwyrm import models
+from bookwyrm.importers import GoodreadsImporter
+from bookwyrm.importers.importer import import_data, handle_imported_book
from bookwyrm.settings import DOMAIN
@@ -18,7 +19,7 @@ class GoodreadsImport(TestCase):
def setUp(self):
""" use a test csv """
self.importer = GoodreadsImporter()
- datafile = pathlib.Path(__file__).parent.joinpath("data/goodreads.csv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv")
self.csv = open(datafile, "r", encoding=self.importer.encoding)
self.user = models.User.objects.create_user(
"mouse", "mouse@mouse.mouse", "password", local=True
@@ -81,7 +82,7 @@ class GoodreadsImport(TestCase):
import_job = self.importer.create_job(self.user, self.csv, False, "unlisted")
MockTask = namedtuple("Task", ("id"))
mock_task = MockTask(7)
- with patch("bookwyrm.importer.import_data.delay") as start:
+ with patch("bookwyrm.importers.importer.import_data.delay") as start:
start.return_value = mock_task
self.importer.start_import(import_job)
import_job.refresh_from_db()
@@ -97,8 +98,8 @@ class GoodreadsImport(TestCase):
"bookwyrm.models.import_job.ImportItem.get_book_from_isbn"
) as resolve:
resolve.return_value = book
- with patch("bookwyrm.importer.handle_imported_book"):
- importer.import_data(self.importer.service, import_job.id)
+ with patch("bookwyrm.importers.importer.handle_imported_book"):
+ import_data(self.importer.service, import_job.id)
import_item = models.ImportItem.objects.get(job=import_job, index=0)
self.assertEqual(import_item.book.id, book.id)
@@ -109,7 +110,7 @@ class GoodreadsImport(TestCase):
self.assertIsNone(shelf.books.first())
import_job = models.ImportJob.objects.create(user=self.user)
- datafile = pathlib.Path(__file__).parent.joinpath("data/goodreads.csv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv")
csv_file = open(datafile, "r")
for index, entry in enumerate(list(csv.DictReader(csv_file))):
entry = self.importer.parse_fields(entry)
@@ -119,7 +120,7 @@ class GoodreadsImport(TestCase):
break
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, False, "public"
)
@@ -143,7 +144,7 @@ class GoodreadsImport(TestCase):
models.ShelfBook.objects.create(shelf=shelf, user=self.user, book=self.book)
import_job = models.ImportJob.objects.create(user=self.user)
- datafile = pathlib.Path(__file__).parent.joinpath("data/goodreads.csv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv")
csv_file = open(datafile, "r")
for index, entry in enumerate(list(csv.DictReader(csv_file))):
entry = self.importer.parse_fields(entry)
@@ -153,7 +154,7 @@ class GoodreadsImport(TestCase):
break
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, False, "public"
)
@@ -173,7 +174,7 @@ class GoodreadsImport(TestCase):
""" re-importing books """
shelf = self.user.shelf_set.filter(identifier="read").first()
import_job = models.ImportJob.objects.create(user=self.user)
- datafile = pathlib.Path(__file__).parent.joinpath("data/goodreads.csv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv")
csv_file = open(datafile, "r")
for index, entry in enumerate(list(csv.DictReader(csv_file))):
entry = self.importer.parse_fields(entry)
@@ -183,10 +184,10 @@ class GoodreadsImport(TestCase):
break
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, False, "public"
)
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, False, "public"
)
@@ -207,7 +208,7 @@ class GoodreadsImport(TestCase):
def test_handle_imported_book_review(self, _):
""" goodreads review import """
import_job = models.ImportJob.objects.create(user=self.user)
- datafile = pathlib.Path(__file__).parent.joinpath("data/goodreads.csv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv")
csv_file = open(datafile, "r")
entry = list(csv.DictReader(csv_file))[2]
entry = self.importer.parse_fields(entry)
@@ -216,7 +217,7 @@ class GoodreadsImport(TestCase):
)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, True, "unlisted"
)
review = models.Review.objects.get(book=self.book, user=self.user)
@@ -230,7 +231,7 @@ class GoodreadsImport(TestCase):
def test_handle_imported_book_reviews_disabled(self):
""" goodreads review import """
import_job = models.ImportJob.objects.create(user=self.user)
- datafile = pathlib.Path(__file__).parent.joinpath("data/goodreads.csv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv")
csv_file = open(datafile, "r")
entry = list(csv.DictReader(csv_file))[2]
entry = self.importer.parse_fields(entry)
@@ -239,7 +240,7 @@ class GoodreadsImport(TestCase):
)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, False, "unlisted"
)
self.assertFalse(
diff --git a/bookwyrm/tests/test_librarything_import.py b/bookwyrm/tests/importers/test_librarything_import.py
similarity index 90%
rename from bookwyrm/tests/test_librarything_import.py
rename to bookwyrm/tests/importers/test_librarything_import.py
index 54b8b422..5e1d778e 100644
--- a/bookwyrm/tests/test_librarything_import.py
+++ b/bookwyrm/tests/importers/test_librarything_import.py
@@ -6,8 +6,9 @@ from unittest.mock import patch
from django.test import TestCase
import responses
-from bookwyrm import models, importer
-from bookwyrm.librarything_import import LibrarythingImporter
+from bookwyrm import models
+from bookwyrm.importers import LibrarythingImporter
+from bookwyrm.importers.importer import import_data, handle_imported_book
from bookwyrm.settings import DOMAIN
@@ -17,7 +18,7 @@ class LibrarythingImport(TestCase):
def setUp(self):
""" use a test tsv """
self.importer = LibrarythingImporter()
- datafile = pathlib.Path(__file__).parent.joinpath("data/librarything.tsv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv")
# Librarything generates latin encoded exports...
self.csv = open(datafile, "r", encoding=self.importer.encoding)
@@ -87,8 +88,8 @@ class LibrarythingImport(TestCase):
"bookwyrm.models.import_job.ImportItem.get_book_from_isbn"
) as resolve:
resolve.return_value = book
- with patch("bookwyrm.importer.handle_imported_book"):
- importer.import_data(self.importer.service, import_job.id)
+ with patch("bookwyrm.importers.importer.handle_imported_book"):
+ import_data(self.importer.service, import_job.id)
import_item = models.ImportItem.objects.get(job=import_job, index=0)
self.assertEqual(import_item.book.id, book.id)
@@ -99,7 +100,7 @@ class LibrarythingImport(TestCase):
self.assertIsNone(shelf.books.first())
import_job = models.ImportJob.objects.create(user=self.user)
- datafile = pathlib.Path(__file__).parent.joinpath("data/librarything.tsv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv")
csv_file = open(datafile, "r", encoding=self.importer.encoding)
for index, entry in enumerate(
list(csv.DictReader(csv_file, delimiter=self.importer.delimiter))
@@ -111,7 +112,7 @@ class LibrarythingImport(TestCase):
break
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, False, "public"
)
@@ -135,7 +136,7 @@ class LibrarythingImport(TestCase):
models.ShelfBook.objects.create(shelf=shelf, user=self.user, book=self.book)
import_job = models.ImportJob.objects.create(user=self.user)
- datafile = pathlib.Path(__file__).parent.joinpath("data/librarything.tsv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv")
csv_file = open(datafile, "r", encoding=self.importer.encoding)
for index, entry in enumerate(
list(csv.DictReader(csv_file, delimiter=self.importer.delimiter))
@@ -147,7 +148,7 @@ class LibrarythingImport(TestCase):
break
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, False, "public"
)
@@ -167,7 +168,7 @@ class LibrarythingImport(TestCase):
""" re-importing books """
shelf = self.user.shelf_set.filter(identifier="read").first()
import_job = models.ImportJob.objects.create(user=self.user)
- datafile = pathlib.Path(__file__).parent.joinpath("data/librarything.tsv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv")
csv_file = open(datafile, "r", encoding=self.importer.encoding)
for index, entry in enumerate(
list(csv.DictReader(csv_file, delimiter=self.importer.delimiter))
@@ -179,10 +180,10 @@ class LibrarythingImport(TestCase):
break
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, False, "public"
)
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, False, "public"
)
@@ -203,7 +204,7 @@ class LibrarythingImport(TestCase):
def test_handle_imported_book_review(self, _):
""" librarything review import """
import_job = models.ImportJob.objects.create(user=self.user)
- datafile = pathlib.Path(__file__).parent.joinpath("data/librarything.tsv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv")
csv_file = open(datafile, "r", encoding=self.importer.encoding)
entry = list(csv.DictReader(csv_file, delimiter=self.importer.delimiter))[0]
entry = self.importer.parse_fields(entry)
@@ -212,7 +213,7 @@ class LibrarythingImport(TestCase):
)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, True, "unlisted"
)
review = models.Review.objects.get(book=self.book, user=self.user)
@@ -226,7 +227,7 @@ class LibrarythingImport(TestCase):
def test_handle_imported_book_reviews_disabled(self):
""" librarything review import """
import_job = models.ImportJob.objects.create(user=self.user)
- datafile = pathlib.Path(__file__).parent.joinpath("data/librarything.tsv")
+ datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv")
csv_file = open(datafile, "r", encoding=self.importer.encoding)
entry = list(csv.DictReader(csv_file, delimiter=self.importer.delimiter))[2]
entry = self.importer.parse_fields(entry)
@@ -235,7 +236,7 @@ class LibrarythingImport(TestCase):
)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- importer.handle_imported_book(
+ handle_imported_book(
self.importer.service, self.user, import_item, False, "unlisted"
)
self.assertFalse(
diff --git a/bookwyrm/tests/views/test_import.py b/bookwyrm/tests/views/test_import.py
index b98b2516..4de2cfb9 100644
--- a/bookwyrm/tests/views/test_import.py
+++ b/bookwyrm/tests/views/test_import.py
@@ -45,3 +45,22 @@ class ImportViews(TestCase):
self.assertIsInstance(result, TemplateResponse)
result.render()
self.assertEqual(result.status_code, 200)
+
+ def test_retry_import(self):
+ """ retry failed items """
+ view = views.ImportStatus.as_view()
+ import_job = models.ImportJob.objects.create(
+ user=self.local_user, privacy="unlisted"
+ )
+ request = self.factory.post("")
+ request.user = self.local_user
+
+ with patch("bookwyrm.importers.Importer.start_import"):
+ view(request, import_job.id)
+
+ self.assertEqual(models.ImportJob.objects.count(), 2)
+ retry_job = models.ImportJob.objects.last()
+
+ self.assertTrue(retry_job.retry)
+ self.assertEqual(retry_job.user, self.local_user)
+ self.assertEqual(retry_job.privacy, "unlisted")
diff --git a/bookwyrm/views/import_data.py b/bookwyrm/views/import_data.py
index 8f9ea27f..5bdbe915 100644
--- a/bookwyrm/views/import_data.py
+++ b/bookwyrm/views/import_data.py
@@ -9,7 +9,8 @@ from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
from django.views import View
-from bookwyrm import forms, goodreads_import, librarything_import, models
+from bookwyrm import forms, models
+from bookwyrm.importers import Importer, LibrarythingImporter, GoodreadsImporter
from bookwyrm.tasks import app
# pylint: disable= no-self-use
@@ -40,10 +41,10 @@ class Import(View):
importer = None
if source == "LibraryThing":
- importer = librarything_import.LibrarythingImporter()
+ importer = LibrarythingImporter()
else:
# Default : GoodReads
- importer = goodreads_import.GoodreadsImporter()
+ importer = GoodreadsImporter()
try:
job = importer.create_job(
@@ -89,10 +90,11 @@ class ImportStatus(View):
for item in request.POST.getlist("import_item"):
items.append(get_object_or_404(models.ImportItem, id=item))
- job = goodreads_import.create_retry_job(
+ importer = Importer()
+ job = importer.create_retry_job(
request.user,
job,
items,
)
- goodreads_import.start_import(job)
+ importer.start_import(job)
return redirect("/import/%d" % job.id)