diff --git a/.env.dev.example b/.env.dev.example index 4e21f1ca..0036e607 100644 --- a/.env.dev.example +++ b/.env.dev.example @@ -34,10 +34,8 @@ REDIS_ACTIVITY_PORT=6379 #REDIS_ACTIVITY_PASSWORD=redispassword345 # Redis as celery broker -#REDIS_BROKER_PORT=6379 +REDIS_BROKER_PORT=6379 #REDIS_BROKER_PASSWORD=redispassword123 -CELERY_BROKER=redis://redis_broker:6379/0 -CELERY_RESULT_BACKEND=redis://redis_broker:6379/0 FLOWER_PORT=8888 #FLOWER_USER=mouse diff --git a/.env.prod.example b/.env.prod.example index b947ac56..e950b2d5 100644 --- a/.env.prod.example +++ b/.env.prod.example @@ -36,8 +36,6 @@ REDIS_ACTIVITY_PASSWORD=redispassword345 # Redis as celery broker REDIS_BROKER_PORT=6379 REDIS_BROKER_PASSWORD=redispassword123 -CELERY_BROKER=redis://:${REDIS_BROKER_PASSWORD}@redis_broker:${REDIS_BROKER_PORT}/0 -CELERY_RESULT_BACKEND=redis://:${REDIS_BROKER_PASSWORD}@redis_broker:${REDIS_BROKER_PORT}/0 FLOWER_PORT=8888 FLOWER_USER=mouse diff --git a/.github/workflows/django-tests.yml b/.github/workflows/django-tests.yml index 3ce368ec..75c1c4b4 100644 --- a/.github/workflows/django-tests.yml +++ b/.github/workflows/django-tests.yml @@ -58,7 +58,8 @@ jobs: POSTGRES_DB: github_actions POSTGRES_HOST: 127.0.0.1 CELERY_BROKER: "" - CELERY_RESULT_BACKEND: "" + REDIS_BROKER_PORT: 6379 + FLOWER_PORT: 8888 EMAIL_HOST: "smtp.mailgun.org" EMAIL_PORT: 587 EMAIL_HOST_USER: "" diff --git a/Dockerfile b/Dockerfile index 3d04ea60..abfc4138 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,5 +8,3 @@ WORKDIR /app COPY requirements.txt /app/ RUN pip install -r requirements.txt --no-cache-dir - -COPY ./bookwyrm ./celerywyrm /app/ diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index 123b3efa..caa22fcd 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -9,6 +9,7 @@ from django.contrib.postgres.fields import ArrayField as DjangoArrayField from django.core.exceptions import ValidationError from django.core.files.base import ContentFile from django.db import models +from django.forms import ClearableFileInput, ImageField from django.utils import timezone from django.utils.translation import gettext_lazy as _ from bookwyrm import activitypub @@ -332,6 +333,14 @@ class TagField(ManyToManyField): return items +class ClearableFileInputWithWarning(ClearableFileInput): + template_name = "widgets/clearable_file_input_with_warning.html" + + +class CustomImageField(ImageField): + widget = ClearableFileInputWithWarning + + def image_serializer(value, alt): """helper for serializing images""" if value and hasattr(value, "url"): @@ -395,6 +404,14 @@ class ImageField(ActivitypubFieldMixin, models.ImageField): image_content = ContentFile(response.content) return [image_name, image_content] + def formfield(self, **kwargs): + return super().formfield( + **{ + "form_class": CustomImageField, + **kwargs, + } + ) + class DateTimeField(ActivitypubFieldMixin, models.DateTimeField): """activitypub-aware datetime field""" diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index d694e33f..48e02b67 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -14,13 +14,18 @@ PAGE_LENGTH = env("PAGE_LENGTH", 15) DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English") # celery -CELERY_BROKER = env("CELERY_BROKER") -CELERY_RESULT_BACKEND = env("CELERY_RESULT_BACKEND") +CELERY_BROKER = "redis://:{}@redis_broker:{}/0".format( + requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT") +) +CELERY_RESULT_BACKEND = "redis://:{}@redis_broker:{}/0".format( + requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT") +) CELERY_ACCEPT_CONTENT = ["application/json"] CELERY_TASK_SERIALIZER = "json" CELERY_RESULT_SERIALIZER = "json" # email +EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend") EMAIL_HOST = env("EMAIL_HOST") EMAIL_PORT = env("EMAIL_PORT", 587) EMAIL_HOST_USER = env("EMAIL_HOST_USER") diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js index 3659a20e..598dd93a 100644 --- a/bookwyrm/static/js/bookwyrm.js +++ b/bookwyrm/static/js/bookwyrm.js @@ -3,6 +3,7 @@ let BookWyrm = new class { constructor() { + this.MAX_FILE_SIZE_BYTES = 10 * 1000000 this.initOnDOMLoaded(); this.initReccuringTasks(); this.initEventListeners(); @@ -32,15 +33,26 @@ let BookWyrm = new class { 'click', this.back) ); + + document.querySelectorAll('input[type="file"]') + .forEach(node => node.addEventListener( + 'change', + this.disableIfTooLarge.bind(this) + )); } /** * Execute code once the DOM is loaded. */ initOnDOMLoaded() { + const bookwyrm = this + window.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('.tab-group') .forEach(tabs => new TabGroup(tabs)); + document.querySelectorAll('input[type="file"]').forEach( + bookwyrm.disableIfTooLarge.bind(bookwyrm) + ) }); } @@ -284,4 +296,27 @@ let BookWyrm = new class { node.classList.remove(classname); } } + + disableIfTooLarge(eventOrElement) { + const { addRemoveClass, MAX_FILE_SIZE_BYTES } = this + const element = eventOrElement.currentTarget || eventOrElement + + const submits = element.form.querySelectorAll('[type="submit"]') + const warns = element.parentElement.querySelectorAll('.file-too-big') + const isTooBig = element.files && + element.files[0] && + element.files[0].size > MAX_FILE_SIZE_BYTES + + if (isTooBig) { + submits.forEach(submitter => submitter.disabled = true) + warns.forEach( + sib => addRemoveClass(sib, 'is-hidden', false) + ) + } else { + submits.forEach(submitter => submitter.disabled = false) + warns.forEach( + sib => addRemoveClass(sib, 'is-hidden', true) + ) + } + } } diff --git a/bookwyrm/templates/author/author.html b/bookwyrm/templates/author/author.html index aa99cbe2..f4f308f2 100644 --- a/bookwyrm/templates/author/author.html +++ b/bookwyrm/templates/author/author.html @@ -22,42 +22,76 @@ -
- {% if author.aliases or author.born or author.died or author.wikipedia_link %} -
-
+
+ + + {% if author.aliases or author.born or author.died or author.wikipedia_link or author.openlibrary_key or author.inventaire_id %} +
+
{% if author.aliases %} -
-
{% trans "Aliases:" %}
-
{{ author.aliases|join:', ' }}
+
+
{% trans "Aliases:" %}
+ {% for alias in author.aliases %} +
+ {{alias}}{% if not forloop.last %}, {% endif %} +
+ {% endfor %}
{% endif %} + {% if author.born %} -
-
{% trans "Born:" %}
-
{{ author.born|naturalday }}
+
+
{% trans "Born:" %}
+
{{ author.born|naturalday }}
{% endif %} + {% if author.died %} -
-
{% trans "Died:" %}
-
{{ author.died|naturalday }}
+
+
{% trans "Died:" %}
+
{{ author.died|naturalday }}
{% endif %}
{% if author.wikipedia_link %} -

{% trans "Wikipedia" %}

- {% endif %} - {% if author.openlibrary_key %} -

- {% trans "View on OpenLibrary" %} +

+ + {% trans "Wikipedia" %} +

{% endif %} + + {% if author.openlibrary_key %} +

+ + {% trans "View on OpenLibrary" %} + +

+ {% endif %} + {% if author.inventaire_id %} -

- {% trans "View on Inventaire" %} +

+ + {% trans "View on Inventaire" %} + +

+ {% endif %} + + {% if author.librarything_key %} +

+ + {% trans "View on LibraryThing" %} + +

+ {% endif %} + + {% if author.goodreads_key %} +

+ + {% trans "View on Goodreads" %} +

{% endif %}
diff --git a/bookwyrm/templates/author/edit_author.html b/bookwyrm/templates/author/edit_author.html index 010d36ef..103341bf 100644 --- a/bookwyrm/templates/author/edit_author.html +++ b/bookwyrm/templates/author/edit_author.html @@ -29,67 +29,85 @@

{% trans "Metadata" %}

-

{{ form.name }}

- {% for error in form.name.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.name }} + {% for error in form.name.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

+

{{ form.aliases }} {% trans "Separate multiple values with commas." %} -

- {% for error in form.aliases.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.aliases.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.bio }}

- {% for error in form.bio.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.bio }} + {% for error in form.bio.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.wikipedia_link }}

+

{{ form.wikipedia_link }}

{% for error in form.wikipedia_link.errors %}

{{ error | escape }}

{% endfor %} -

+

-

- {% for error in form.born.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.born.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

+

-

- {% for error in form.died.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.died.errors %} +

{{ error | escape }}

+ {% endfor %} +

{% trans "Author Identifiers" %}

-

{{ form.openlibrary_key }}

- {% for error in form.openlibrary_key.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.openlibrary_key }} + {% for error in form.openlibrary_key.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.inventaire_id }}

- {% for error in form.inventaire_id.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.inventaire_id }} + {% for error in form.inventaire_id.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.librarything_key }}

- {% for error in form.librarything_key.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.librarything_key }} + {% for error in form.librarything_key.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.goodreads_key }}

- {% for error in form.goodreads_key.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.goodreads_key }} + {% for error in form.goodreads_key.errors %} +

{{ error | escape }}

+ {% endfor %} +
diff --git a/bookwyrm/templates/book/edit_book.html b/bookwyrm/templates/book/edit_book.html index 8dae1d04..32018a25 100644 --- a/bookwyrm/templates/book/edit_book.html +++ b/bookwyrm/templates/book/edit_book.html @@ -14,11 +14,25 @@ {% endif %} {% if book %} -
-

{% trans "Added:" %} {{ book.created_date | naturaltime }}

-

{% trans "Updated:" %} {{ book.updated_date | naturaltime }}

-

{% trans "Last edited by:" %} {{ book.last_edited_by.display_name }}

-
+
+
+
{% trans "Added:" %}
+
{{ book.created_date | naturaltime }}
+
+ +
+
{% trans "Updated:" %}
+
{{ book.updated_date | naturaltime }}
+
+ + {% if book.last_edited_by %} +
+
{% trans "Last edited by:" %}
+
{{ book.last_edited_by.display_name }}
+
+ {% endif %} + +
{% endif %} @@ -38,21 +52,28 @@ {% if confirm_mode %}

{% trans "Confirm Book Info" %}

-
+
{% if author_matches %}
{% for author in author_matches %} -
- {% blocktrans with name=author.name %}Is "{{ name }}" an existing author?{% endblocktrans %} +
+ + {% blocktrans with name=author.name %}Is "{{ name }}" an existing author?{% endblocktrans %} + {% with forloop.counter0 as counter %} {% for match in author.matches %} - +

{% blocktrans with book_title=match.book_set.first.title %}Author of {{ book_title }}{% endblocktrans %}

{% endfor %} - + {% endwith %}
{% endfor %} @@ -64,11 +85,17 @@ {% if not book %}
- {% trans "Is this an edition of an existing work?" %} + + {% trans "Is this an edition of an existing work?" %} + {% for match in book_matches %} - + {% endfor %} - +
{% endif %} @@ -89,76 +116,79 @@

{% trans "Metadata" %}

-

+

-

- {% for error in form.title.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.title.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

+

-

- {% for error in form.subtitle.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.subtitle.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.description }}

- {% for error in form.description.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.description }} + {% for error in form.description.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

+

-

- {% for error in form.series.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.series.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

+

{{ form.series_number }} -

- {% for error in form.series_number.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.series_number.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

+

{{ form.languages }} {% trans "Separate multiple values with commas." %} -

- {% for error in form.languages.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.languages.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

+

{{ form.publishers }} {% trans "Separate multiple values with commas." %} -

- {% for error in form.publishers.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.publishers.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

+

-

- {% for error in form.first_published_date.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.first_published_date.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

+

-

- {% for error in form.published_date.errors %} -

{{ error | escape }}

- {% endfor %} + {% for error in form.published_date.errors %} +

{{ error | escape }}

+ {% endfor %} +
@@ -166,16 +196,23 @@ {% if book.authors.exists %}
{% for author in book.authors.all %} - +
+ +

+ {% blocktrans with name=author.name %}Author page for {{ name }}{% endblocktrans %} +

+
{% endfor %}
{% endif %} - - - {% trans "Separate multiple values with commas." %} +
+ + + {% trans "Separate multiple values with commas." %} +
@@ -188,17 +225,17 @@
-

+

{{ form.cover }} -

+
{% if book %} -

+

-

+
{% endif %} {% for error in form.cover.errors %}

{{ error | escape }}

@@ -209,51 +246,72 @@

{% trans "Physical Properties" %}

-

{{ form.physical_format }}

- {% for error in form.physical_format.errors %} -

{{ error | escape }}

- {% endfor %} - {% for error in form.physical_format.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.physical_format }} + {% for error in form.physical_format.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.pages }}

- {% for error in form.pages.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.pages }} + {% for error in form.pages.errors %} +

{{ error | escape }}

+ {% endfor %} +

{% trans "Book Identifiers" %}

-

{{ form.isbn_13 }}

- {% for error in form.isbn_13.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.isbn_13 }} + {% for error in form.isbn_13.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.isbn_10 }}

- {% for error in form.isbn_10.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.isbn_10 }} + {% for error in form.isbn_10.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.openlibrary_key }}

- {% for error in form.openlibrary_key.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.openlibrary_key }} + {% for error in form.openlibrary_key.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.inventaire_id }}

- {% for error in form.inventaire_id.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.inventaire_id }} + {% for error in form.inventaire_id.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.oclc_number }}

- {% for error in form.oclc_number.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.oclc_number }} + {% for error in form.oclc_number.errors %} +

{{ error | escape }}

+ {% endfor %} +
-

{{ form.asin }}

- {% for error in form.ASIN.errors %} -

{{ error | escape }}

- {% endfor %} +
+ + {{ form.asin }} + {% for error in form.ASIN.errors %} +

{{ error | escape }}

+ {% endfor %} +
@@ -261,7 +319,7 @@ {% if not confirm_mode %} {% endif %} diff --git a/bookwyrm/templates/components/modal.html b/bookwyrm/templates/components/modal.html index 0a05f951..74dcadac 100644 --- a/bookwyrm/templates/components/modal.html +++ b/bookwyrm/templates/components/modal.html @@ -11,7 +11,7 @@ {% trans "Close" as label %}
-
diff --git a/bookwyrm/templates/import_status.html b/bookwyrm/templates/import_status.html index b1145611..ff80ad71 100644 --- a/bookwyrm/templates/import_status.html +++ b/bookwyrm/templates/import_status.html @@ -8,13 +8,17 @@

{% trans "Import Status" %}

-

- {% trans "Import started:" %} {{ job.created_date | naturaltime }} -

- {% if job.complete %} -

- {% trans "Import completed:" %} {{ task.date_done | naturaltime }} -

+
+
+
{% trans "Import started:" %}
+
{{ job.created_date | naturaltime }}
+
+ {% if job.complete %} +
+
{% trans "Import completed:" %}
+
{{ task.date_done | naturaltime }}
+
+
{% elif task.failed %}
{% trans "TASK FAILED" %}
{% endif %} @@ -22,8 +26,9 @@
{% if not job.complete %} - {% trans "Import still in progress." %}

+ {% trans "Import still in progress." %} +
{% trans "(Hit reload to update!)" %}

{% endif %} @@ -49,16 +54,13 @@
    {% for item in failed_items %} -
  • - - -

    +

  • + +
  • {% endfor %}
diff --git a/bookwyrm/templates/settings/edit_server.html b/bookwyrm/templates/settings/edit_server.html index c5702c84..04585fe5 100644 --- a/bookwyrm/templates/settings/edit_server.html +++ b/bookwyrm/templates/settings/edit_server.html @@ -26,14 +26,14 @@ {% csrf_token %}
-
+
{% for error in form.server_name.errors %}

{{ error | escape }}

{% endfor %}
-
+
{% for error in form.application_type.errors %}

{{ error | escape }}

{% endfor %}
-
+
{% for error in form.application_version.errors %} @@ -60,10 +60,10 @@
-

+

-

+
diff --git a/bookwyrm/templates/settings/site.html b/bookwyrm/templates/settings/site.html index 1b942452..d36371a4 100644 --- a/bookwyrm/templates/settings/site.html +++ b/bookwyrm/templates/settings/site.html @@ -11,23 +11,23 @@ {% csrf_token %}

{% trans "Instance Info" %}

-
+
{{ site_form.name }}
-
+
{{ site_form.instance_tagline }}
-
+
{{ site_form.instance_description }}
-
+
{{ site_form.code_of_conduct }}
-
+
{{ site_form.privacy_policy }}
@@ -57,19 +57,19 @@