diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index a2641ff11..95b34ec67 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -1,7 +1,8 @@ """ handle reading a csv from an external service, defaults are from Goodreads """ import csv +from datetime import timedelta from django.utils import timezone -from bookwyrm.models import ImportJob, ImportItem +from bookwyrm.models import ImportJob, ImportItem, SiteSettings class Importer: @@ -49,7 +50,24 @@ class Importer: source=self.service, ) + site_settings = SiteSettings.objects.get() + import_size_limit = site_settings.import_size_limit + import_limit_reset = site_settings.import_limit_reset + enforce_limit = import_size_limit and import_limit_reset + + if enforce_limit: + time_range = timezone.now() - timedelta(days=import_limit_reset) + import_jobs = ImportJob.objects.filter( + user=user, created_date__gte=time_range + ) + imported_books = sum([job.successful_item_count for job in import_jobs]) + allowed_imports = import_size_limit - imported_books + if allowed_imports <= 0: + job.complete_job() + return job for index, entry in rows: + if enforce_limit and index >= allowed_imports: + break self.create_item(job, index, entry) return job diff --git a/bookwyrm/migrations/0167_sitesettings_import_size_limit.py b/bookwyrm/migrations/0167_sitesettings_import_size_limit.py new file mode 100644 index 000000000..fdbfaf51d --- /dev/null +++ b/bookwyrm/migrations/0167_sitesettings_import_size_limit.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.16 on 2022-12-05 13:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0166_sitesettings_imports_enabled"), + ] + + operations = [ + migrations.AddField( + model_name="sitesettings", + name="import_size_limit", + field=models.IntegerField(default=0), + ), + migrations.AddField( + model_name="sitesettings", + name="import_limit_reset", + field=models.IntegerField(default=0), + ), + ] diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py index 9e97ede9a..78f35e39b 100644 --- a/bookwyrm/models/site.py +++ b/bookwyrm/models/site.py @@ -88,6 +88,8 @@ class SiteSettings(SiteModel): # controls imports_enabled = models.BooleanField(default=True) + import_size_limit = models.IntegerField(default=0) + import_limit_reset = models.IntegerField(default=0) field_tracker = FieldTracker(fields=["name", "instance_tagline", "logo"]) diff --git a/bookwyrm/static/css/bookwyrm/utilities/_size.scss b/bookwyrm/static/css/bookwyrm/utilities/_size.scss index cbc74d7ab..258aa9a73 100644 --- a/bookwyrm/static/css/bookwyrm/utilities/_size.scss +++ b/bookwyrm/static/css/bookwyrm/utilities/_size.scss @@ -40,6 +40,10 @@ width: 500px !important; } +.is-h-em { + height: 1em !important; +} + .is-h-xs { height: 80px !important; } diff --git a/bookwyrm/templates/import/import.html b/bookwyrm/templates/import/import.html index 325caa92b..deb39f7da 100644 --- a/bookwyrm/templates/import/import.html +++ b/bookwyrm/templates/import/import.html @@ -15,6 +15,11 @@ {% endif %} {% if site.imports_enabled %} +
+

Currently you are allowed to import {{ import_size_limit }} books every {{ import_limit_reset }} days.

+

You have {{ allowed_imports }} left.

+
+ {% if recent_avg_hours or recent_avg_minutes %}

@@ -90,7 +95,12 @@

- + {% if allowed_imports > 0 %} + + {% else %} + +

{% trans "You've reached the import limit." %}

+ {% endif%} {% else %}
diff --git a/bookwyrm/templates/settings/imports/imports.html b/bookwyrm/templates/settings/imports/imports.html index 135af34ed..f498a619f 100644 --- a/bookwyrm/templates/settings/imports/imports.html +++ b/bookwyrm/templates/settings/imports/imports.html @@ -57,8 +57,39 @@
{% endif %} +
+ + + {% trans "Limit the amount of imports" %} + + + +
+
+ {% trans "Some users might try to import a large number of books, which you want to limit." %} + {% trans "Set the value to 0 to not enforce any limit." %} +
+
+ + + + + + {% csrf_token %} +
+ +
+
+
+
-