From 015af2c1e7f41d872e779b0d2c93e592f1aa7adb Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 25 Nov 2022 10:35:16 -0800 Subject: [PATCH 1/3] Don't start imports with empty csvs Fixes #2353 --- bookwyrm/importers/importer.py | 3 +++ bookwyrm/templates/import/import.html | 6 ++++++ bookwyrm/views/imports/import_data.py | 6 +++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index a3cfba198..388dcf91f 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -37,6 +37,9 @@ class Importer: """check over a csv and creates a database entry for the job""" csv_reader = csv.DictReader(csv_file, delimiter=self.delimiter) rows = enumerate(list(csv_reader)) + if rows: + raise ValueError("CSV file is empty") + job = ImportJob.objects.create( user=user, include_reviews=include_reviews, diff --git a/bookwyrm/templates/import/import.html b/bookwyrm/templates/import/import.html index 141e5671e..325caa92b 100644 --- a/bookwyrm/templates/import/import.html +++ b/bookwyrm/templates/import/import.html @@ -8,6 +8,12 @@

{% trans "Import Books" %}

+ {% if invalid %} +
+ {% trans "Not a valid CSV file" %} +
+ {% endif %} + {% if site.imports_enabled %} {% if recent_avg_hours or recent_avg_minutes %}
diff --git a/bookwyrm/views/imports/import_data.py b/bookwyrm/views/imports/import_data.py index 4956bfb7d..f0bb2e698 100644 --- a/bookwyrm/views/imports/import_data.py +++ b/bookwyrm/views/imports/import_data.py @@ -11,7 +11,6 @@ from django.shortcuts import redirect from django.template.response import TemplateResponse from django.utils import timezone from django.utils.decorators import method_decorator -from django.utils.translation import gettext_lazy as _ from django.views import View from bookwyrm import forms, models @@ -30,7 +29,7 @@ from bookwyrm.utils.cache import get_or_set class Import(View): """import view""" - def get(self, request): + def get(self, request, invalid=False): """load import page""" jobs = models.ImportJob.objects.filter(user=request.user).order_by( "-created_date" @@ -43,6 +42,7 @@ class Import(View): "page_range": paginated.get_elided_page_range( page.number, on_each_side=2, on_ends=1 ), + "invalid": invalid, } seconds = get_or_set("avg-import-time", get_average_import_time, timeout=86400) @@ -88,7 +88,7 @@ class Import(View): privacy, ) except (UnicodeDecodeError, ValueError, KeyError): - return HttpResponseBadRequest(_("Not a valid csv file")) + return self.get(request, invalid=True) job.start_job() From 304757091eca4147ec662b76a04a2688108f3e8a Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 25 Nov 2022 10:53:42 -0800 Subject: [PATCH 2/3] Fixes checking csv length to consider headers --- bookwyrm/importers/importer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index 388dcf91f..e4b19f20a 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -36,9 +36,10 @@ class Importer: def create_job(self, user, csv_file, include_reviews, privacy): """check over a csv and creates a database entry for the job""" csv_reader = csv.DictReader(csv_file, delimiter=self.delimiter) - rows = enumerate(list(csv_reader)) - if rows: + rows = list(csv_reader) + if len(rows) <= 1: raise ValueError("CSV file is empty") + rows = enumerate(rows) job = ImportJob.objects.create( user=user, From 8b068e94d5d4242e3e5e25909bd6fbe54666935c Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 25 Nov 2022 12:19:49 -0800 Subject: [PATCH 3/3] Headers aren't one of the rows --- bookwyrm/importers/importer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index e4b19f20a..a2641ff11 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -37,7 +37,7 @@ class Importer: """check over a csv and creates a database entry for the job""" csv_reader = csv.DictReader(csv_file, delimiter=self.delimiter) rows = list(csv_reader) - if len(rows) <= 1: + if len(rows) < 1: raise ValueError("CSV file is empty") rows = enumerate(rows)