1
0
Fork 0

csv import and export fixes

Adds shelved and published dates for books and their imported reviews.
Provides option to create new (custom) shelves when importing books.

fixes #3004
fixes #2846
fixes #2666
fixes #2411
This commit is contained in:
Hugh Rundle 2023-11-25 17:34:12 +11:00
parent 7c2de92df3
commit 539a9fa212
No known key found for this signature in database
GPG key ID: A7E35779918253F9
8 changed files with 128 additions and 18 deletions

View file

@ -15,6 +15,7 @@ from django.views import View
from bookwyrm import forms, models
from bookwyrm.importers import (
BookwyrmBooksImporter,
CalibreImporter,
LibrarythingImporter,
GoodreadsImporter,
@ -67,7 +68,7 @@ class Import(View):
return TemplateResponse(request, "import/import.html", data)
def post(self, request):
"""ingest a goodreads csv"""
"""ingest a book data csv"""
site = models.SiteSettings.objects.get()
if not site.imports_enabled:
raise PermissionDenied()
@ -77,11 +78,16 @@ class Import(View):
return HttpResponseBadRequest()
include_reviews = request.POST.get("include_reviews") == "on"
create_shelves = request.POST.get("create_shelves") == "on"
privacy = request.POST.get("privacy")
source = request.POST.get("source")
importer = None
if source == "LibraryThing":
if source == "BookWyrm":
importer = BookwyrmBooksImporter()
print("BookwyrmBooksImporter")
elif source == "LibraryThing":
importer = LibrarythingImporter()
elif source == "Storygraph":
importer = StorygraphImporter()
@ -98,6 +104,7 @@ class Import(View):
request.user,
TextIOWrapper(request.FILES["csv_file"], encoding=importer.encoding),
include_reviews,
create_shelves,
privacy,
)
except (UnicodeDecodeError, ValueError, KeyError):

View file

@ -48,7 +48,16 @@ class Export(View):
fields = (
["title", "author_text"]
+ deduplication_fields
+ ["rating", "review_name", "review_cw", "review_content"]
+ [
"rating",
"review_published",
"review_name",
"review_cw",
"review_content",
"shelf",
"shelf_name",
"date_added",
]
)
writer.writerow(fields)
@ -72,9 +81,23 @@ class Export(View):
.first()
)
if review:
book.review_published = review.published_date
book.review_name = review.name
book.review_cw = review.content_warning
book.review_content = review.raw_content
book.review_content = (
review.raw_content
) # do imported reviews not have raw content?
shelfbook = (
models.ShelfBook.objects.filter(book=book, user=request.user)
.order_by("shelved_date")
.last()
)
if shelfbook:
book.shelf = shelfbook.shelf.identifier
book.shelf_name = shelfbook.shelf.name
book.date_added = shelfbook.shelved_date
writer.writerow([getattr(book, field, "") or "" for field in fields])
return HttpResponse(