From 95e911981726a4087ce52053e854468cc8e3b24d Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Sat, 26 Feb 2022 08:44:19 -0800
Subject: [PATCH 01/18] Adds django celery beat
---
bookwyrm/settings.py | 1 +
bw-dev | 1 +
docker-compose.yml | 13 +++++++++++++
requirements.txt | 1 +
4 files changed, 16 insertions(+)
diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py
index 0fbe3b731..5d4eb7812 100644
--- a/bookwyrm/settings.py
+++ b/bookwyrm/settings.py
@@ -90,6 +90,7 @@ INSTALLED_APPS = [
"sass_processor",
"bookwyrm",
"celery",
+ 'django_celery_beat',
"imagekit",
"storages",
]
diff --git a/bw-dev b/bw-dev
index 89cc8d8c3..d4b5263df 100755
--- a/bw-dev
+++ b/bw-dev
@@ -215,6 +215,7 @@ case "$CMD" in
;;
setup)
migrate
+ migrate django_celery_beat
initdb
runweb python manage.py collectstatic --no-input
admin_code
diff --git a/docker-compose.yml b/docker-compose.yml
index 0994aa00f..e45cae0d1 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -70,6 +70,19 @@ services:
- db
- redis_broker
restart: on-failure
+ celery_beat:
+ env_file: .env
+ build: .
+ networks:
+ - main
+ command: celery -A celerywyrm beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
+ volumes:
+ - .:/app
+ - static_volume:/app/static
+ - media_volume:/app/images
+ depends_on:
+ - celery_worker
+ restart: on-failure
flower:
build: .
command: celery -A celerywyrm flower --basic_auth=${FLOWER_USER}:${FLOWER_PASSWORD}
diff --git a/requirements.txt b/requirements.txt
index 26582e00d..8eb44d958 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,6 +1,7 @@
celery==5.2.2
colorthief==0.2.1
Django==3.2.12
+django-celery-beat==2.2.1
django-compressor==2.4.1
django-imagekit==4.1.0
django-model-utils==4.0.0
From 2a436800c4f801715631993aa95818fe66a18d64 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Sat, 26 Feb 2022 10:13:44 -0800
Subject: [PATCH 02/18] Schedules automod task
---
bookwyrm/forms.py | 7 +++
bookwyrm/models/antispam.py | 1 +
bookwyrm/settings.py | 2 +-
.../templates/settings/automod/rules.html | 41 +++++++++++++--
bookwyrm/urls.py | 11 +++-
bookwyrm/views/__init__.py | 2 +-
bookwyrm/views/admin/automod.py | 50 ++++++++++++++++---
celerywyrm/settings.py | 5 ++
8 files changed, 105 insertions(+), 14 deletions(-)
diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py
index 7ae4e446f..00e6d5d8c 100644
--- a/bookwyrm/forms.py
+++ b/bookwyrm/forms.py
@@ -8,6 +8,7 @@ from django.forms import ModelForm, PasswordInput, widgets, ChoiceField
from django.forms.widgets import Textarea
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
+from django_celery_beat.models import IntervalSchedule
from bookwyrm import models
from bookwyrm.models.fields import ClearableFileInputWithWarning
@@ -556,3 +557,9 @@ class AutoModRuleForm(CustomForm):
class Meta:
model = models.AutoMod
fields = ["string_match", "flag_users", "flag_statuses", "created_by"]
+
+
+class IntervalScheduleForm(CustomForm):
+ class Meta:
+ model = IntervalSchedule
+ fields = ["every", "period"]
diff --git a/bookwyrm/models/antispam.py b/bookwyrm/models/antispam.py
index f506b6f19..bce02780d 100644
--- a/bookwyrm/models/antispam.py
+++ b/bookwyrm/models/antispam.py
@@ -54,6 +54,7 @@ class AutoMod(models.Model):
@app.task(queue="low_priority")
def automod_task():
"""Create reports"""
+ print("TASK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
if not AutoMod.objects.exists():
return
reporter = AutoMod.objects.first().created_by
diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py
index 5d4eb7812..16e5ccb30 100644
--- a/bookwyrm/settings.py
+++ b/bookwyrm/settings.py
@@ -90,7 +90,7 @@ INSTALLED_APPS = [
"sass_processor",
"bookwyrm",
"celery",
- 'django_celery_beat',
+ "django_celery_beat",
"imagekit",
"storages",
]
diff --git a/bookwyrm/templates/settings/automod/rules.html b/bookwyrm/templates/settings/automod/rules.html
index 8205b3d71..2a28cb641 100644
--- a/bookwyrm/templates/settings/automod/rules.html
+++ b/bookwyrm/templates/settings/automod/rules.html
@@ -1,5 +1,6 @@
{% extends 'settings/layout.html' %}
{% load i18n %}
+{% load humanize %}
{% load utilities %}
{% block title %}
@@ -16,12 +17,46 @@
{% trans "Auto-moderation rules will create reports for any local user or status with fields matching the provided string." %}
{% trans "Users or statuses that have already been reported (regardless of whether the report was resolved) will not be flagged." %}
- {% trans "At this time, reports are not being generated automatically, and you must manually trigger a scan." %}
-
+ {% endif %}
{% if success %}
diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py
index d2caa76ea..5abe7ac2e 100644
--- a/bookwyrm/urls.py
+++ b/bookwyrm/urls.py
@@ -217,11 +217,18 @@ urlpatterns = [
# auto-moderation rules
re_path(r"^settings/automod/?$", views.AutoMod.as_view(), name="settings-automod"),
re_path(
- r"^settings/automod/(?P\d+)/delete?$",
+ r"^settings/automod/(?P\d+)/delete/?$",
views.automod_delete,
name="settings-automod-delete",
),
- re_path(r"^settings/automod/run?$", views.run_automod, name="settings-automod-run"),
+ re_path(
+ r"^settings/automod/schedule/?$",
+ views.schedule_automod_task,
+ name="settings-automod-schedule",
+ ),
+ re_path(
+ r"^settings/automod/run/?$", views.run_automod, name="settings-automod-run"
+ ),
# moderation
re_path(
r"^settings/reports/?$", views.ReportsAdmin.as_view(), name="settings-reports"
diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py
index 76e9ff024..aa4d72999 100644
--- a/bookwyrm/views/__init__.py
+++ b/bookwyrm/views/__init__.py
@@ -2,7 +2,7 @@
# site admin
from .admin.announcements import Announcements, Announcement
from .admin.announcements import EditAnnouncement, delete_announcement
-from .admin.automod import AutoMod, automod_delete, run_automod
+from .admin.automod import AutoMod, automod_delete, run_automod, schedule_automod_task
from .admin.dashboard import Dashboard
from .admin.federation import Federation, FederatedServer
from .admin.federation import AddFederatedServer, ImportServerBlocklist
diff --git a/bookwyrm/views/admin/automod.py b/bookwyrm/views/admin/automod.py
index d9901d01c..fbe6408c6 100644
--- a/bookwyrm/views/admin/automod.py
+++ b/bookwyrm/views/admin/automod.py
@@ -1,10 +1,12 @@
""" moderation via flagged posts and users """
from django.contrib.auth.decorators import login_required, permission_required
+from django.db import transaction
from django.shortcuts import get_object_or_404, redirect
from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.http import require_POST
+from django_celery_beat.models import PeriodicTask
from bookwyrm import forms, models
@@ -24,8 +26,9 @@ class AutoMod(View):
def get(self, request):
"""view rules"""
- data = {"rules": models.AutoMod.objects.all(), "form": forms.AutoModRuleForm()}
- return TemplateResponse(request, "settings/automod/rules.html", data)
+ return TemplateResponse(
+ request, "settings/automod/rules.html", automod_view_data()
+ )
def post(self, request):
"""add rule"""
@@ -35,14 +38,32 @@ class AutoMod(View):
form.save()
form = forms.AutoModRuleForm()
- data = {
- "rules": models.AutoMod.objects.all(),
- "form": form,
- "success": success,
- }
+ data = automod_view_data()
+ data["form"] = form
return TemplateResponse(request, "settings/automod/rules.html", data)
+@require_POST
+@permission_required("bookwyrm.moderate_user", raise_exception=True)
+@permission_required("bookwyrm.moderate_post", raise_exception=True)
+def schedule_automod_task(request):
+ """scheduler"""
+ form = forms.IntervalScheduleForm(request.POST)
+ if not form.is_valid():
+ data = automod_view_data()
+ data["task_form"] = form
+ return TemplateResponse(request, "settings/automod/rules.html", data)
+
+ with transaction.atomic():
+ schedule = form.save()
+ PeriodicTask.objects.get_or_create(
+ interval=schedule,
+ name="automod-task",
+ task="bookwyrm.models.antispam.automod_task",
+ )
+ return redirect("settings-automod")
+
+
@require_POST
@permission_required("bookwyrm.moderate_user", raise_exception=True)
@permission_required("bookwyrm.moderate_post", raise_exception=True)
@@ -62,3 +83,18 @@ def run_automod(request):
"""run scan"""
models.automod_task.delay()
return redirect("settings-automod")
+
+
+def automod_view_data():
+ """helper to get data used in the template"""
+ try:
+ task = PeriodicTask.objects.get(name="automod-task")
+ except PeriodicTask.DoesNotExist:
+ task = None
+
+ return {
+ "task": task,
+ "task_form": forms.IntervalScheduleForm(),
+ "rules": models.AutoMod.objects.all(),
+ "form": forms.AutoModRuleForm(),
+ }
diff --git a/celerywyrm/settings.py b/celerywyrm/settings.py
index bd7805e51..35eb3933f 100644
--- a/celerywyrm/settings.py
+++ b/celerywyrm/settings.py
@@ -3,6 +3,7 @@
# pylint: disable=unused-wildcard-import
from bookwyrm.settings import *
+# pylint: disable=line-too-long
REDIS_BROKER_PASSWORD = requests.utils.quote(env("REDIS_BROKER_PASSWORD", None))
REDIS_BROKER_HOST = env("REDIS_BROKER_HOST", "redis_broker")
REDIS_BROKER_PORT = env("REDIS_BROKER_PORT", 6379)
@@ -16,6 +17,10 @@ CELERY_DEFAULT_QUEUE = "low_priority"
CELERY_ACCEPT_CONTENT = ["json"]
CELERY_TASK_SERIALIZER = "json"
CELERY_RESULT_SERIALIZER = "json"
+
+CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"
+CELERY_TIMEZONE = env("TIME_ZONE", "UTC")
+
FLOWER_PORT = env("FLOWER_PORT")
INSTALLED_APPS = INSTALLED_APPS + [
From 0870eccad98c28026096f06eb520fc13ebcc4dc9 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Sat, 26 Feb 2022 10:24:23 -0800
Subject: [PATCH 03/18] Adds unscheduler
---
bookwyrm/templates/settings/automod/rules.html | 13 +++++++++++++
bookwyrm/urls.py | 5 +++++
bookwyrm/views/__init__.py | 3 ++-
bookwyrm/views/admin/automod.py | 13 +++++++++++--
4 files changed, 31 insertions(+), 3 deletions(-)
diff --git a/bookwyrm/templates/settings/automod/rules.html b/bookwyrm/templates/settings/automod/rules.html
index 2a28cb641..0a1b1c3f9 100644
--- a/bookwyrm/templates/settings/automod/rules.html
+++ b/bookwyrm/templates/settings/automod/rules.html
@@ -50,6 +50,19 @@
+
+
+
{% else %}
+
+
{% if task %}
-
+
-
{% trans "Schedule:" %}
@@ -51,7 +53,7 @@
-
+
{% else %}
+
{% trans "Schedule scan" %}
{% endif %}
From c7c90f9e9b43ad322b0e382da2fceb2d4790f92f Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Tue, 1 Mar 2022 10:09:53 -0800
Subject: [PATCH 05/18] Removes test print statement
---
bookwyrm/models/antispam.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/bookwyrm/models/antispam.py b/bookwyrm/models/antispam.py
index bce02780d..f506b6f19 100644
--- a/bookwyrm/models/antispam.py
+++ b/bookwyrm/models/antispam.py
@@ -54,7 +54,6 @@ class AutoMod(models.Model):
@app.task(queue="low_priority")
def automod_task():
"""Create reports"""
- print("TASK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
if not AutoMod.objects.exists():
return
reporter = AutoMod.objects.first().created_by
From 7169f7ba2030eef10023f3518b0a5e45a52b7219 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Mon, 14 Mar 2022 11:43:58 -0700
Subject: [PATCH 06/18] Creates forms directory
---
bookwyrm/forms/__init__.py | 3 +++
bookwyrm/{ => forms}/forms.py | 0
2 files changed, 3 insertions(+)
create mode 100644 bookwyrm/forms/__init__.py
rename bookwyrm/{ => forms}/forms.py (100%)
diff --git a/bookwyrm/forms/__init__.py b/bookwyrm/forms/__init__.py
new file mode 100644
index 000000000..dac2007b8
--- /dev/null
+++ b/bookwyrm/forms/__init__.py
@@ -0,0 +1,3 @@
+""" make forms available to the app """
+# site admin
+from .forms import *
diff --git a/bookwyrm/forms.py b/bookwyrm/forms/forms.py
similarity index 100%
rename from bookwyrm/forms.py
rename to bookwyrm/forms/forms.py
From d3f723a07dd95ddf96c5b96d7fb23fea6abd54c2 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Mon, 14 Mar 2022 11:46:08 -0700
Subject: [PATCH 07/18] Splits forms into separate files
---
bookwyrm/forms/__init__.py | 9 +
bookwyrm/forms/admin.py | 129 +++++++++
bookwyrm/forms/author.py | 47 +++
bookwyrm/forms/books.py | 81 ++++++
bookwyrm/forms/custom_form.py | 26 ++
bookwyrm/forms/edit_user.py | 68 +++++
bookwyrm/forms/forms.py | 529 +---------------------------------
bookwyrm/forms/groups.py | 16 +
bookwyrm/forms/landing.py | 45 +++
bookwyrm/forms/links.py | 48 +++
bookwyrm/forms/lists.py | 37 +++
bookwyrm/forms/status.py | 82 ++++++
12 files changed, 590 insertions(+), 527 deletions(-)
create mode 100644 bookwyrm/forms/admin.py
create mode 100644 bookwyrm/forms/author.py
create mode 100644 bookwyrm/forms/books.py
create mode 100644 bookwyrm/forms/custom_form.py
create mode 100644 bookwyrm/forms/edit_user.py
create mode 100644 bookwyrm/forms/groups.py
create mode 100644 bookwyrm/forms/landing.py
create mode 100644 bookwyrm/forms/links.py
create mode 100644 bookwyrm/forms/lists.py
create mode 100644 bookwyrm/forms/status.py
diff --git a/bookwyrm/forms/__init__.py b/bookwyrm/forms/__init__.py
index dac2007b8..a6f704339 100644
--- a/bookwyrm/forms/__init__.py
+++ b/bookwyrm/forms/__init__.py
@@ -1,3 +1,12 @@
""" make forms available to the app """
# site admin
+from .admin import *
+from .author import *
+from .books import *
from .forms import *
+from .groups import *
+from .landing import *
+from .links import *
+from .lists import *
+from .status import *
+from .user import *
diff --git a/bookwyrm/forms/admin.py b/bookwyrm/forms/admin.py
new file mode 100644
index 000000000..6b2984b3b
--- /dev/null
+++ b/bookwyrm/forms/admin.py
@@ -0,0 +1,129 @@
+""" using django model forms """
+import datetime
+
+from django import forms
+from django.forms import widgets
+from django.utils import timezone
+from django.utils.translation import gettext_lazy as _
+
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class ExpiryWidget(widgets.Select):
+ def value_from_datadict(self, data, files, name):
+ """human-readable exiration time buckets"""
+ selected_string = super().value_from_datadict(data, files, name)
+
+ if selected_string == "day":
+ interval = datetime.timedelta(days=1)
+ elif selected_string == "week":
+ interval = datetime.timedelta(days=7)
+ elif selected_string == "month":
+ interval = datetime.timedelta(days=31) # Close enough?
+ elif selected_string == "forever":
+ return None
+ else:
+ return selected_string # This will raise
+
+ return timezone.now() + interval
+
+
+class CreateInviteForm(CustomForm):
+ class Meta:
+ model = models.SiteInvite
+ exclude = ["code", "user", "times_used", "invitees"]
+ widgets = {
+ "expiry": ExpiryWidget(
+ choices=[
+ ("day", _("One Day")),
+ ("week", _("One Week")),
+ ("month", _("One Month")),
+ ("forever", _("Does Not Expire")),
+ ]
+ ),
+ "use_limit": widgets.Select(
+ choices=[(i, _(f"{i} uses")) for i in [1, 5, 10, 25, 50, 100]]
+ + [(None, _("Unlimited"))]
+ ),
+ }
+
+
+class SiteForm(CustomForm):
+ class Meta:
+ model = models.SiteSettings
+ exclude = ["admin_code", "install_mode"]
+ widgets = {
+ "instance_short_description": forms.TextInput(
+ attrs={"aria-describedby": "desc_instance_short_description"}
+ ),
+ "require_confirm_email": forms.CheckboxInput(
+ attrs={"aria-describedby": "desc_require_confirm_email"}
+ ),
+ "invite_request_text": forms.Textarea(
+ attrs={"aria-describedby": "desc_invite_request_text"}
+ ),
+ }
+
+
+class ThemeForm(CustomForm):
+ class Meta:
+ model = models.Theme
+ fields = ["name", "path"]
+ widgets = {
+ "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
+ "path": forms.TextInput(
+ attrs={
+ "aria-describedby": "desc_path",
+ "placeholder": "css/themes/theme-name.scss",
+ }
+ ),
+ }
+
+
+class AnnouncementForm(CustomForm):
+ class Meta:
+ model = models.Announcement
+ exclude = ["remote_id"]
+ widgets = {
+ "preview": forms.TextInput(attrs={"aria-describedby": "desc_preview"}),
+ "content": forms.Textarea(attrs={"aria-describedby": "desc_content"}),
+ "event_date": forms.SelectDateWidget(
+ attrs={"aria-describedby": "desc_event_date"}
+ ),
+ "start_date": forms.SelectDateWidget(
+ attrs={"aria-describedby": "desc_start_date"}
+ ),
+ "end_date": forms.SelectDateWidget(
+ attrs={"aria-describedby": "desc_end_date"}
+ ),
+ "active": forms.CheckboxInput(attrs={"aria-describedby": "desc_active"}),
+ }
+
+
+class EmailBlocklistForm(CustomForm):
+ class Meta:
+ model = models.EmailBlocklist
+ fields = ["domain"]
+ widgets = {
+ "avatar": forms.TextInput(attrs={"aria-describedby": "desc_domain"}),
+ }
+
+
+class IPBlocklistForm(CustomForm):
+ class Meta:
+ model = models.IPBlocklist
+ fields = ["address"]
+
+
+class ServerForm(CustomForm):
+ class Meta:
+ model = models.FederatedServer
+ exclude = ["remote_id"]
+
+
+class AutoModRuleForm(CustomForm):
+ class Meta:
+ model = models.AutoMod
+ fields = ["string_match", "flag_users", "flag_statuses", "created_by"]
diff --git a/bookwyrm/forms/author.py b/bookwyrm/forms/author.py
new file mode 100644
index 000000000..ca59426de
--- /dev/null
+++ b/bookwyrm/forms/author.py
@@ -0,0 +1,47 @@
+""" using django model forms """
+from django import forms
+
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class AuthorForm(CustomForm):
+ class Meta:
+ model = models.Author
+ fields = [
+ "last_edited_by",
+ "name",
+ "aliases",
+ "bio",
+ "wikipedia_link",
+ "born",
+ "died",
+ "openlibrary_key",
+ "inventaire_id",
+ "librarything_key",
+ "goodreads_key",
+ "isni",
+ ]
+ widgets = {
+ "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
+ "aliases": forms.TextInput(attrs={"aria-describedby": "desc_aliases"}),
+ "bio": forms.Textarea(attrs={"aria-describedby": "desc_bio"}),
+ "wikipedia_link": forms.TextInput(
+ attrs={"aria-describedby": "desc_wikipedia_link"}
+ ),
+ "born": forms.SelectDateWidget(attrs={"aria-describedby": "desc_born"}),
+ "died": forms.SelectDateWidget(attrs={"aria-describedby": "desc_died"}),
+ "oepnlibrary_key": forms.TextInput(
+ attrs={"aria-describedby": "desc_oepnlibrary_key"}
+ ),
+ "inventaire_id": forms.TextInput(
+ attrs={"aria-describedby": "desc_inventaire_id"}
+ ),
+ "librarything_key": forms.TextInput(
+ attrs={"aria-describedby": "desc_librarything_key"}
+ ),
+ "goodreads_key": forms.TextInput(
+ attrs={"aria-describedby": "desc_goodreads_key"}
+ ),
+ }
diff --git a/bookwyrm/forms/books.py b/bookwyrm/forms/books.py
new file mode 100644
index 000000000..64b85d0b2
--- /dev/null
+++ b/bookwyrm/forms/books.py
@@ -0,0 +1,81 @@
+""" using django model forms """
+from django import forms
+
+from bookwyrm import models
+from bookwyrm.models.fields import ClearableFileInputWithWarning
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class CoverForm(CustomForm):
+ class Meta:
+ model = models.Book
+ fields = ["cover"]
+ help_texts = {f: None for f in fields}
+
+
+class EditionForm(CustomForm):
+ class Meta:
+ model = models.Edition
+ exclude = [
+ "remote_id",
+ "origin_id",
+ "created_date",
+ "updated_date",
+ "edition_rank",
+ "authors",
+ "parent_work",
+ "shelves",
+ "connector",
+ "search_vector",
+ "links",
+ "file_links",
+ ]
+ widgets = {
+ "title": forms.TextInput(attrs={"aria-describedby": "desc_title"}),
+ "subtitle": forms.TextInput(attrs={"aria-describedby": "desc_subtitle"}),
+ "description": forms.Textarea(
+ attrs={"aria-describedby": "desc_description"}
+ ),
+ "series": forms.TextInput(attrs={"aria-describedby": "desc_series"}),
+ "series_number": forms.TextInput(
+ attrs={"aria-describedby": "desc_series_number"}
+ ),
+ "languages": forms.TextInput(
+ attrs={"aria-describedby": "desc_languages_help desc_languages"}
+ ),
+ "subjects": forms.TextInput(
+ attrs={"aria-describedby": "desc_subjects_help desc_subjects"}
+ ),
+ "publishers": forms.TextInput(
+ attrs={"aria-describedby": "desc_publishers_help desc_publishers"}
+ ),
+ "first_published_date": forms.SelectDateWidget(
+ attrs={"aria-describedby": "desc_first_published_date"}
+ ),
+ "published_date": forms.SelectDateWidget(
+ attrs={"aria-describedby": "desc_published_date"}
+ ),
+ "cover": ClearableFileInputWithWarning(
+ attrs={"aria-describedby": "desc_cover"}
+ ),
+ "physical_format": forms.Select(
+ attrs={"aria-describedby": "desc_physical_format"}
+ ),
+ "physical_format_detail": forms.TextInput(
+ attrs={"aria-describedby": "desc_physical_format_detail"}
+ ),
+ "pages": forms.NumberInput(attrs={"aria-describedby": "desc_pages"}),
+ "isbn_13": forms.TextInput(attrs={"aria-describedby": "desc_isbn_13"}),
+ "isbn_10": forms.TextInput(attrs={"aria-describedby": "desc_isbn_10"}),
+ "openlibrary_key": forms.TextInput(
+ attrs={"aria-describedby": "desc_openlibrary_key"}
+ ),
+ "inventaire_id": forms.TextInput(
+ attrs={"aria-describedby": "desc_inventaire_id"}
+ ),
+ "oclc_number": forms.TextInput(
+ attrs={"aria-describedby": "desc_oclc_number"}
+ ),
+ "ASIN": forms.TextInput(attrs={"aria-describedby": "desc_ASIN"}),
+ }
diff --git a/bookwyrm/forms/custom_form.py b/bookwyrm/forms/custom_form.py
new file mode 100644
index 000000000..74a3417a2
--- /dev/null
+++ b/bookwyrm/forms/custom_form.py
@@ -0,0 +1,26 @@
+""" Overrides django's default form class """
+from collections import defaultdict
+from django.forms import ModelForm
+from django.forms.widgets import Textarea
+
+
+class CustomForm(ModelForm):
+ """add css classes to the forms"""
+
+ def __init__(self, *args, **kwargs):
+ css_classes = defaultdict(lambda: "")
+ css_classes["text"] = "input"
+ css_classes["password"] = "input"
+ css_classes["email"] = "input"
+ css_classes["number"] = "input"
+ css_classes["checkbox"] = "checkbox"
+ css_classes["textarea"] = "textarea"
+ # pylint: disable=super-with-arguments
+ super(CustomForm, self).__init__(*args, **kwargs)
+ for visible in self.visible_fields():
+ if hasattr(visible.field.widget, "input_type"):
+ input_type = visible.field.widget.input_type
+ if isinstance(visible.field.widget, Textarea):
+ input_type = "textarea"
+ visible.field.widget.attrs["rows"] = 5
+ visible.field.widget.attrs["class"] = css_classes[input_type]
diff --git a/bookwyrm/forms/edit_user.py b/bookwyrm/forms/edit_user.py
new file mode 100644
index 000000000..d609f15dc
--- /dev/null
+++ b/bookwyrm/forms/edit_user.py
@@ -0,0 +1,68 @@
+""" using django model forms """
+from django import forms
+
+from bookwyrm import models
+from bookwyrm.models.fields import ClearableFileInputWithWarning
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class EditUserForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = [
+ "avatar",
+ "name",
+ "email",
+ "summary",
+ "show_goal",
+ "show_suggested_users",
+ "manually_approves_followers",
+ "default_post_privacy",
+ "discoverable",
+ "hide_follows",
+ "preferred_timezone",
+ "preferred_language",
+ "theme",
+ ]
+ help_texts = {f: None for f in fields}
+ widgets = {
+ "avatar": ClearableFileInputWithWarning(
+ attrs={"aria-describedby": "desc_avatar"}
+ ),
+ "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
+ "summary": forms.Textarea(attrs={"aria-describedby": "desc_summary"}),
+ "email": forms.EmailInput(attrs={"aria-describedby": "desc_email"}),
+ "discoverable": forms.CheckboxInput(
+ attrs={"aria-describedby": "desc_discoverable"}
+ ),
+ }
+
+
+class LimitedEditUserForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = [
+ "avatar",
+ "name",
+ "summary",
+ "manually_approves_followers",
+ "discoverable",
+ ]
+ help_texts = {f: None for f in fields}
+ widgets = {
+ "avatar": ClearableFileInputWithWarning(
+ attrs={"aria-describedby": "desc_avatar"}
+ ),
+ "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
+ "summary": forms.Textarea(attrs={"aria-describedby": "desc_summary"}),
+ "discoverable": forms.CheckboxInput(
+ attrs={"aria-describedby": "desc_discoverable"}
+ ),
+ }
+
+
+class DeleteUserForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = ["password"]
diff --git a/bookwyrm/forms/forms.py b/bookwyrm/forms/forms.py
index ff35a9486..8af8fb812 100644
--- a/bookwyrm/forms/forms.py
+++ b/bookwyrm/forms/forms.py
@@ -1,212 +1,14 @@
""" using django model forms """
-import datetime
-from collections import defaultdict
-from urllib.parse import urlparse
-
from django import forms
-from django.forms import ModelForm, PasswordInput, widgets, ChoiceField
-from django.forms.widgets import Textarea
-from django.utils import timezone
+from django.forms import widgets
from django.utils.translation import gettext_lazy as _
from bookwyrm import models
-from bookwyrm.models.fields import ClearableFileInputWithWarning
from bookwyrm.models.user import FeedFilterChoices
-
-
-class CustomForm(ModelForm):
- """add css classes to the forms"""
-
- def __init__(self, *args, **kwargs):
- css_classes = defaultdict(lambda: "")
- css_classes["text"] = "input"
- css_classes["password"] = "input"
- css_classes["email"] = "input"
- css_classes["number"] = "input"
- css_classes["checkbox"] = "checkbox"
- css_classes["textarea"] = "textarea"
- # pylint: disable=super-with-arguments
- super(CustomForm, self).__init__(*args, **kwargs)
- for visible in self.visible_fields():
- if hasattr(visible.field.widget, "input_type"):
- input_type = visible.field.widget.input_type
- if isinstance(visible.field.widget, Textarea):
- input_type = "textarea"
- visible.field.widget.attrs["rows"] = 5
- visible.field.widget.attrs["class"] = css_classes[input_type]
+from .custom_form import CustomForm
# pylint: disable=missing-class-docstring
-class LoginForm(CustomForm):
- class Meta:
- model = models.User
- fields = ["localname", "password"]
- help_texts = {f: None for f in fields}
- widgets = {
- "password": PasswordInput(),
- }
-
-
-class RegisterForm(CustomForm):
- class Meta:
- model = models.User
- fields = ["localname", "email", "password"]
- help_texts = {f: None for f in fields}
- widgets = {"password": PasswordInput()}
-
- def clean(self):
- """Check if the username is taken"""
- cleaned_data = super().clean()
- localname = cleaned_data.get("localname").strip()
- if models.User.objects.filter(localname=localname).first():
- self.add_error("localname", _("User with this username already exists"))
-
-
-class RatingForm(CustomForm):
- class Meta:
- model = models.ReviewRating
- fields = ["user", "book", "rating", "privacy"]
-
-
-class ReviewForm(CustomForm):
- class Meta:
- model = models.Review
- fields = [
- "user",
- "book",
- "name",
- "content",
- "rating",
- "content_warning",
- "sensitive",
- "privacy",
- ]
-
-
-class CommentForm(CustomForm):
- class Meta:
- model = models.Comment
- fields = [
- "user",
- "book",
- "content",
- "content_warning",
- "sensitive",
- "privacy",
- "progress",
- "progress_mode",
- "reading_status",
- ]
-
-
-class QuotationForm(CustomForm):
- class Meta:
- model = models.Quotation
- fields = [
- "user",
- "book",
- "quote",
- "content",
- "content_warning",
- "sensitive",
- "privacy",
- "position",
- "position_mode",
- ]
-
-
-class ReplyForm(CustomForm):
- class Meta:
- model = models.Status
- fields = [
- "user",
- "content",
- "content_warning",
- "sensitive",
- "reply_parent",
- "privacy",
- ]
-
-
-class StatusForm(CustomForm):
- class Meta:
- model = models.Status
- fields = ["user", "content", "content_warning", "sensitive", "privacy"]
-
-
-class DirectForm(CustomForm):
- class Meta:
- model = models.Status
- fields = ["user", "content", "content_warning", "sensitive", "privacy"]
-
-
-class EditUserForm(CustomForm):
- class Meta:
- model = models.User
- fields = [
- "avatar",
- "name",
- "email",
- "summary",
- "show_goal",
- "show_suggested_users",
- "manually_approves_followers",
- "default_post_privacy",
- "discoverable",
- "hide_follows",
- "preferred_timezone",
- "preferred_language",
- "theme",
- ]
- help_texts = {f: None for f in fields}
- widgets = {
- "avatar": ClearableFileInputWithWarning(
- attrs={"aria-describedby": "desc_avatar"}
- ),
- "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
- "summary": forms.Textarea(attrs={"aria-describedby": "desc_summary"}),
- "email": forms.EmailInput(attrs={"aria-describedby": "desc_email"}),
- "discoverable": forms.CheckboxInput(
- attrs={"aria-describedby": "desc_discoverable"}
- ),
- }
-
-
-class LimitedEditUserForm(CustomForm):
- class Meta:
- model = models.User
- fields = [
- "avatar",
- "name",
- "summary",
- "manually_approves_followers",
- "discoverable",
- ]
- help_texts = {f: None for f in fields}
- widgets = {
- "avatar": ClearableFileInputWithWarning(
- attrs={"aria-describedby": "desc_avatar"}
- ),
- "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
- "summary": forms.Textarea(attrs={"aria-describedby": "desc_summary"}),
- "discoverable": forms.CheckboxInput(
- attrs={"aria-describedby": "desc_discoverable"}
- ),
- }
-
-
-class DeleteUserForm(CustomForm):
- class Meta:
- model = models.User
- fields = ["password"]
-
-
-class UserGroupForm(CustomForm):
- class Meta:
- model = models.User
- fields = ["groups"]
-
-
class FeedStatusTypesForm(CustomForm):
class Meta:
model = models.User
@@ -219,217 +21,10 @@ class FeedStatusTypesForm(CustomForm):
}
-class CoverForm(CustomForm):
- class Meta:
- model = models.Book
- fields = ["cover"]
- help_texts = {f: None for f in fields}
-
-
-class LinkDomainForm(CustomForm):
- class Meta:
- model = models.LinkDomain
- fields = ["name"]
-
-
-class FileLinkForm(CustomForm):
- class Meta:
- model = models.FileLink
- fields = ["url", "filetype", "availability", "book", "added_by"]
-
- def clean(self):
- """make sure the domain isn't blocked or pending"""
- cleaned_data = super().clean()
- url = cleaned_data.get("url")
- filetype = cleaned_data.get("filetype")
- book = cleaned_data.get("book")
- domain = urlparse(url).netloc
- if models.LinkDomain.objects.filter(domain=domain).exists():
- status = models.LinkDomain.objects.get(domain=domain).status
- if status == "blocked":
- # pylint: disable=line-too-long
- self.add_error(
- "url",
- _(
- "This domain is blocked. Please contact your administrator if you think this is an error."
- ),
- )
- elif models.FileLink.objects.filter(
- url=url, book=book, filetype=filetype
- ).exists():
- # pylint: disable=line-too-long
- self.add_error(
- "url",
- _(
- "This link with file type has already been added for this book. If it is not visible, the domain is still pending."
- ),
- )
-
-
-class EditionForm(CustomForm):
- class Meta:
- model = models.Edition
- exclude = [
- "remote_id",
- "origin_id",
- "created_date",
- "updated_date",
- "edition_rank",
- "authors",
- "parent_work",
- "shelves",
- "connector",
- "search_vector",
- "links",
- "file_links",
- ]
- widgets = {
- "title": forms.TextInput(attrs={"aria-describedby": "desc_title"}),
- "subtitle": forms.TextInput(attrs={"aria-describedby": "desc_subtitle"}),
- "description": forms.Textarea(
- attrs={"aria-describedby": "desc_description"}
- ),
- "series": forms.TextInput(attrs={"aria-describedby": "desc_series"}),
- "series_number": forms.TextInput(
- attrs={"aria-describedby": "desc_series_number"}
- ),
- "languages": forms.TextInput(
- attrs={"aria-describedby": "desc_languages_help desc_languages"}
- ),
- "subjects": forms.TextInput(
- attrs={"aria-describedby": "desc_subjects_help desc_subjects"}
- ),
- "publishers": forms.TextInput(
- attrs={"aria-describedby": "desc_publishers_help desc_publishers"}
- ),
- "first_published_date": forms.SelectDateWidget(
- attrs={"aria-describedby": "desc_first_published_date"}
- ),
- "published_date": forms.SelectDateWidget(
- attrs={"aria-describedby": "desc_published_date"}
- ),
- "cover": ClearableFileInputWithWarning(
- attrs={"aria-describedby": "desc_cover"}
- ),
- "physical_format": forms.Select(
- attrs={"aria-describedby": "desc_physical_format"}
- ),
- "physical_format_detail": forms.TextInput(
- attrs={"aria-describedby": "desc_physical_format_detail"}
- ),
- "pages": forms.NumberInput(attrs={"aria-describedby": "desc_pages"}),
- "isbn_13": forms.TextInput(attrs={"aria-describedby": "desc_isbn_13"}),
- "isbn_10": forms.TextInput(attrs={"aria-describedby": "desc_isbn_10"}),
- "openlibrary_key": forms.TextInput(
- attrs={"aria-describedby": "desc_openlibrary_key"}
- ),
- "inventaire_id": forms.TextInput(
- attrs={"aria-describedby": "desc_inventaire_id"}
- ),
- "oclc_number": forms.TextInput(
- attrs={"aria-describedby": "desc_oclc_number"}
- ),
- "ASIN": forms.TextInput(attrs={"aria-describedby": "desc_ASIN"}),
- }
-
-
-class AuthorForm(CustomForm):
- class Meta:
- model = models.Author
- fields = [
- "last_edited_by",
- "name",
- "aliases",
- "bio",
- "wikipedia_link",
- "born",
- "died",
- "openlibrary_key",
- "inventaire_id",
- "librarything_key",
- "goodreads_key",
- "isni",
- ]
- widgets = {
- "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
- "aliases": forms.TextInput(attrs={"aria-describedby": "desc_aliases"}),
- "bio": forms.Textarea(attrs={"aria-describedby": "desc_bio"}),
- "wikipedia_link": forms.TextInput(
- attrs={"aria-describedby": "desc_wikipedia_link"}
- ),
- "born": forms.SelectDateWidget(attrs={"aria-describedby": "desc_born"}),
- "died": forms.SelectDateWidget(attrs={"aria-describedby": "desc_died"}),
- "oepnlibrary_key": forms.TextInput(
- attrs={"aria-describedby": "desc_oepnlibrary_key"}
- ),
- "inventaire_id": forms.TextInput(
- attrs={"aria-describedby": "desc_inventaire_id"}
- ),
- "librarything_key": forms.TextInput(
- attrs={"aria-describedby": "desc_librarything_key"}
- ),
- "goodreads_key": forms.TextInput(
- attrs={"aria-describedby": "desc_goodreads_key"}
- ),
- }
-
-
class ImportForm(forms.Form):
csv_file = forms.FileField()
-class ExpiryWidget(widgets.Select):
- def value_from_datadict(self, data, files, name):
- """human-readable exiration time buckets"""
- selected_string = super().value_from_datadict(data, files, name)
-
- if selected_string == "day":
- interval = datetime.timedelta(days=1)
- elif selected_string == "week":
- interval = datetime.timedelta(days=7)
- elif selected_string == "month":
- interval = datetime.timedelta(days=31) # Close enough?
- elif selected_string == "forever":
- return None
- else:
- return selected_string # This will raise
-
- return timezone.now() + interval
-
-
-class InviteRequestForm(CustomForm):
- def clean(self):
- """make sure the email isn't in use by a registered user"""
- cleaned_data = super().clean()
- email = cleaned_data.get("email")
- if email and models.User.objects.filter(email=email).exists():
- self.add_error("email", _("A user with this email already exists."))
-
- class Meta:
- model = models.InviteRequest
- fields = ["email"]
-
-
-class CreateInviteForm(CustomForm):
- class Meta:
- model = models.SiteInvite
- exclude = ["code", "user", "times_used", "invitees"]
- widgets = {
- "expiry": ExpiryWidget(
- choices=[
- ("day", _("One Day")),
- ("week", _("One Week")),
- ("month", _("One Month")),
- ("forever", _("Does Not Expire")),
- ]
- ),
- "use_limit": widgets.Select(
- choices=[(i, _(f"{i} uses")) for i in [1, 5, 10, 25, 50, 100]]
- + [(None, _("Unlimited"))]
- ),
- }
-
-
class ShelfForm(CustomForm):
class Meta:
model = models.Shelf
@@ -442,126 +37,12 @@ class GoalForm(CustomForm):
fields = ["user", "year", "goal", "privacy"]
-class SiteForm(CustomForm):
- class Meta:
- model = models.SiteSettings
- exclude = ["admin_code", "install_mode"]
- widgets = {
- "instance_short_description": forms.TextInput(
- attrs={"aria-describedby": "desc_instance_short_description"}
- ),
- "require_confirm_email": forms.CheckboxInput(
- attrs={"aria-describedby": "desc_require_confirm_email"}
- ),
- "invite_request_text": forms.Textarea(
- attrs={"aria-describedby": "desc_invite_request_text"}
- ),
- }
-
-
-class SiteThemeForm(CustomForm):
- class Meta:
- model = models.SiteSettings
- fields = ["default_theme"]
-
-
-class ThemeForm(CustomForm):
- class Meta:
- model = models.Theme
- fields = ["name", "path"]
- widgets = {
- "name": forms.TextInput(attrs={"aria-describedby": "desc_name"}),
- "path": forms.TextInput(
- attrs={
- "aria-describedby": "desc_path",
- "placeholder": "css/themes/theme-name.scss",
- }
- ),
- }
-
-
-class AnnouncementForm(CustomForm):
- class Meta:
- model = models.Announcement
- exclude = ["remote_id"]
- widgets = {
- "preview": forms.TextInput(attrs={"aria-describedby": "desc_preview"}),
- "content": forms.Textarea(attrs={"aria-describedby": "desc_content"}),
- "event_date": forms.SelectDateWidget(
- attrs={"aria-describedby": "desc_event_date"}
- ),
- "start_date": forms.SelectDateWidget(
- attrs={"aria-describedby": "desc_start_date"}
- ),
- "end_date": forms.SelectDateWidget(
- attrs={"aria-describedby": "desc_end_date"}
- ),
- "active": forms.CheckboxInput(attrs={"aria-describedby": "desc_active"}),
- }
-
-
-class ListForm(CustomForm):
- class Meta:
- model = models.List
- fields = ["user", "name", "description", "curation", "privacy", "group"]
-
-
-class ListItemForm(CustomForm):
- class Meta:
- model = models.ListItem
- fields = ["user", "book", "book_list", "notes"]
-
-
-class GroupForm(CustomForm):
- class Meta:
- model = models.Group
- fields = ["user", "privacy", "name", "description"]
-
-
class ReportForm(CustomForm):
class Meta:
model = models.Report
fields = ["user", "reporter", "status", "links", "note"]
-class EmailBlocklistForm(CustomForm):
- class Meta:
- model = models.EmailBlocklist
- fields = ["domain"]
- widgets = {
- "avatar": forms.TextInput(attrs={"aria-describedby": "desc_domain"}),
- }
-
-
-class IPBlocklistForm(CustomForm):
- class Meta:
- model = models.IPBlocklist
- fields = ["address"]
-
-
-class ServerForm(CustomForm):
- class Meta:
- model = models.FederatedServer
- exclude = ["remote_id"]
-
-
-class SortListForm(forms.Form):
- sort_by = ChoiceField(
- choices=(
- ("order", _("List Order")),
- ("title", _("Book Title")),
- ("rating", _("Rating")),
- ),
- label=_("Sort By"),
- )
- direction = ChoiceField(
- choices=(
- ("ascending", _("Ascending")),
- ("descending", _("Descending")),
- ),
- )
-
-
class ReadThroughForm(CustomForm):
def clean(self):
"""make sure the email isn't in use by a registered user"""
@@ -576,9 +57,3 @@ class ReadThroughForm(CustomForm):
class Meta:
model = models.ReadThrough
fields = ["user", "book", "start_date", "finish_date"]
-
-
-class AutoModRuleForm(CustomForm):
- class Meta:
- model = models.AutoMod
- fields = ["string_match", "flag_users", "flag_statuses", "created_by"]
diff --git a/bookwyrm/forms/groups.py b/bookwyrm/forms/groups.py
new file mode 100644
index 000000000..15b27c0ae
--- /dev/null
+++ b/bookwyrm/forms/groups.py
@@ -0,0 +1,16 @@
+""" using django model forms """
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class UserGroupForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = ["groups"]
+
+
+class GroupForm(CustomForm):
+ class Meta:
+ model = models.Group
+ fields = ["user", "privacy", "name", "description"]
diff --git a/bookwyrm/forms/landing.py b/bookwyrm/forms/landing.py
new file mode 100644
index 000000000..61b92ee83
--- /dev/null
+++ b/bookwyrm/forms/landing.py
@@ -0,0 +1,45 @@
+""" Forms for the landing pages """
+from django.forms import PasswordInput
+from django.utils.translation import gettext_lazy as _
+
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class LoginForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = ["localname", "password"]
+ help_texts = {f: None for f in fields}
+ widgets = {
+ "password": PasswordInput(),
+ }
+
+
+class RegisterForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = ["localname", "email", "password"]
+ help_texts = {f: None for f in fields}
+ widgets = {"password": PasswordInput()}
+
+ def clean(self):
+ """Check if the username is taken"""
+ cleaned_data = super().clean()
+ localname = cleaned_data.get("localname").strip()
+ if models.User.objects.filter(localname=localname).first():
+ self.add_error("localname", _("User with this username already exists"))
+
+
+class InviteRequestForm(CustomForm):
+ def clean(self):
+ """make sure the email isn't in use by a registered user"""
+ cleaned_data = super().clean()
+ email = cleaned_data.get("email")
+ if email and models.User.objects.filter(email=email).exists():
+ self.add_error("email", _("A user with this email already exists."))
+
+ class Meta:
+ model = models.InviteRequest
+ fields = ["email"]
diff --git a/bookwyrm/forms/links.py b/bookwyrm/forms/links.py
new file mode 100644
index 000000000..de229bc2d
--- /dev/null
+++ b/bookwyrm/forms/links.py
@@ -0,0 +1,48 @@
+""" using django model forms """
+from urllib.parse import urlparse
+
+from django.utils.translation import gettext_lazy as _
+
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class LinkDomainForm(CustomForm):
+ class Meta:
+ model = models.LinkDomain
+ fields = ["name"]
+
+
+class FileLinkForm(CustomForm):
+ class Meta:
+ model = models.FileLink
+ fields = ["url", "filetype", "availability", "book", "added_by"]
+
+ def clean(self):
+ """make sure the domain isn't blocked or pending"""
+ cleaned_data = super().clean()
+ url = cleaned_data.get("url")
+ filetype = cleaned_data.get("filetype")
+ book = cleaned_data.get("book")
+ domain = urlparse(url).netloc
+ if models.LinkDomain.objects.filter(domain=domain).exists():
+ status = models.LinkDomain.objects.get(domain=domain).status
+ if status == "blocked":
+ # pylint: disable=line-too-long
+ self.add_error(
+ "url",
+ _(
+ "This domain is blocked. Please contact your administrator if you think this is an error."
+ ),
+ )
+ elif models.FileLink.objects.filter(
+ url=url, book=book, filetype=filetype
+ ).exists():
+ # pylint: disable=line-too-long
+ self.add_error(
+ "url",
+ _(
+ "This link with file type has already been added for this book. If it is not visible, the domain is still pending."
+ ),
+ )
diff --git a/bookwyrm/forms/lists.py b/bookwyrm/forms/lists.py
new file mode 100644
index 000000000..647db3bfe
--- /dev/null
+++ b/bookwyrm/forms/lists.py
@@ -0,0 +1,37 @@
+""" using django model forms """
+from django import forms
+from django.forms import ChoiceField
+from django.utils.translation import gettext_lazy as _
+
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class ListForm(CustomForm):
+ class Meta:
+ model = models.List
+ fields = ["user", "name", "description", "curation", "privacy", "group"]
+
+
+class ListItemForm(CustomForm):
+ class Meta:
+ model = models.ListItem
+ fields = ["user", "book", "book_list", "notes"]
+
+
+class SortListForm(forms.Form):
+ sort_by = ChoiceField(
+ choices=(
+ ("order", _("List Order")),
+ ("title", _("Book Title")),
+ ("rating", _("Rating")),
+ ),
+ label=_("Sort By"),
+ )
+ direction = ChoiceField(
+ choices=(
+ ("ascending", _("Ascending")),
+ ("descending", _("Descending")),
+ ),
+ )
diff --git a/bookwyrm/forms/status.py b/bookwyrm/forms/status.py
new file mode 100644
index 000000000..0800166bf
--- /dev/null
+++ b/bookwyrm/forms/status.py
@@ -0,0 +1,82 @@
+""" using django model forms """
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class RatingForm(CustomForm):
+ class Meta:
+ model = models.ReviewRating
+ fields = ["user", "book", "rating", "privacy"]
+
+
+class ReviewForm(CustomForm):
+ class Meta:
+ model = models.Review
+ fields = [
+ "user",
+ "book",
+ "name",
+ "content",
+ "rating",
+ "content_warning",
+ "sensitive",
+ "privacy",
+ ]
+
+
+class CommentForm(CustomForm):
+ class Meta:
+ model = models.Comment
+ fields = [
+ "user",
+ "book",
+ "content",
+ "content_warning",
+ "sensitive",
+ "privacy",
+ "progress",
+ "progress_mode",
+ "reading_status",
+ ]
+
+
+class QuotationForm(CustomForm):
+ class Meta:
+ model = models.Quotation
+ fields = [
+ "user",
+ "book",
+ "quote",
+ "content",
+ "content_warning",
+ "sensitive",
+ "privacy",
+ "position",
+ "position_mode",
+ ]
+
+
+class ReplyForm(CustomForm):
+ class Meta:
+ model = models.Status
+ fields = [
+ "user",
+ "content",
+ "content_warning",
+ "sensitive",
+ "reply_parent",
+ "privacy",
+ ]
+
+
+class StatusForm(CustomForm):
+ class Meta:
+ model = models.Status
+ fields = ["user", "content", "content_warning", "sensitive", "privacy"]
+
+
+class DirectForm(CustomForm):
+ class Meta:
+ model = models.Status
+ fields = ["user", "content", "content_warning", "sensitive", "privacy"]
From 19202e2cd77fddb0cd267e911d713e3562ba4617 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Mon, 14 Mar 2022 12:12:51 -0700
Subject: [PATCH 08/18] Fixes name of user forms file
---
bookwyrm/forms/__init__.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bookwyrm/forms/__init__.py b/bookwyrm/forms/__init__.py
index a6f704339..075752936 100644
--- a/bookwyrm/forms/__init__.py
+++ b/bookwyrm/forms/__init__.py
@@ -3,10 +3,10 @@
from .admin import *
from .author import *
from .books import *
+from .edit_user import *
from .forms import *
from .groups import *
from .landing import *
from .links import *
from .lists import *
from .status import *
-from .user import *
From 486f70c7fbd9147ca1ed4a58cee162676b7a5404 Mon Sep 17 00:00:00 2001
From: Mouse Reeve
Date: Mon, 14 Mar 2022 12:31:29 -0700
Subject: [PATCH 09/18] Adds scanner translation strings
---
locale/de_DE/LC_MESSAGES/django.po | 122 +++++-----
locale/en_US/LC_MESSAGES/django.po | 348 +++++++++++++++------------
locale/es_ES/LC_MESSAGES/django.mo | Bin 83719 -> 83594 bytes
locale/es_ES/LC_MESSAGES/django.po | 130 +++++-----
locale/fr_FR/LC_MESSAGES/django.po | 128 +++++-----
locale/gl_ES/LC_MESSAGES/django.mo | Bin 89448 -> 89154 bytes
locale/gl_ES/LC_MESSAGES/django.po | 126 +++++-----
locale/it_IT/LC_MESSAGES/django.mo | Bin 90758 -> 90522 bytes
locale/it_IT/LC_MESSAGES/django.po | 126 +++++-----
locale/lt_LT/LC_MESSAGES/django.mo | Bin 84886 -> 84689 bytes
locale/lt_LT/LC_MESSAGES/django.po | 122 +++++-----
locale/no_NO/LC_MESSAGES/django.mo | Bin 79871 -> 79689 bytes
locale/no_NO/LC_MESSAGES/django.po | 122 +++++-----
locale/pt_BR/LC_MESSAGES/django.mo | Bin 90058 -> 89997 bytes
locale/pt_BR/LC_MESSAGES/django.po | 124 +++++-----
locale/pt_PT/LC_MESSAGES/django.mo | Bin 72909 -> 72742 bytes
locale/pt_PT/LC_MESSAGES/django.po | 124 +++++-----
locale/sv_SE/LC_MESSAGES/django.mo | Bin 87935 -> 87729 bytes
locale/sv_SE/LC_MESSAGES/django.po | 122 +++++-----
locale/zh_Hans/LC_MESSAGES/django.po | 126 +++++-----
locale/zh_Hant/LC_MESSAGES/django.po | 122 +++++-----
21 files changed, 909 insertions(+), 933 deletions(-)
diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po
index f7ed0969d..31e44a7b9 100644
--- a/locale/de_DE/LC_MESSAGES/django.po
+++ b/locale/de_DE/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-08 19:55+0000\n"
-"PO-Revision-Date: 2022-03-08 21:16\n"
+"POT-Creation-Date: 2022-03-13 18:56+0000\n"
+"PO-Revision-Date: 2022-03-13 19:52\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: German\n"
"Language: de\n"
@@ -220,7 +220,7 @@ msgid "Followers"
msgstr "Follower*innen"
#: bookwyrm/models/fields.py:208
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:8
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:6
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
#: bookwyrm/templates/snippets/privacy_select.html:20
@@ -261,73 +261,73 @@ msgstr "Zitate"
msgid "Everything else"
msgstr "Alles andere"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home Timeline"
msgstr "Start-Zeitleiste"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home"
msgstr "Startseite"
-#: bookwyrm/settings.py:208
+#: bookwyrm/settings.py:209
msgid "Books Timeline"
msgstr "Bücher-Zeitleiste"
-#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:209 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Bücher"
-#: bookwyrm/settings.py:280
+#: bookwyrm/settings.py:281
msgid "English"
msgstr "English (Englisch)"
-#: bookwyrm/settings.py:281
+#: bookwyrm/settings.py:282
msgid "Deutsch (German)"
msgstr "Deutsch"
-#: bookwyrm/settings.py:282
+#: bookwyrm/settings.py:283
msgid "Español (Spanish)"
msgstr "Español (Spanisch)"
-#: bookwyrm/settings.py:283
+#: bookwyrm/settings.py:284
msgid "Galego (Galician)"
msgstr "Galego (Galizisch)"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:285
msgid "Italiano (Italian)"
msgstr "Italiano (Italienisch)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:286
msgid "Français (French)"
msgstr "Français (Französisch)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:287
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litauisch)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:288
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norwegisch)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:289
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (brasilianisches Portugiesisch)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:290
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugiesisch)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:291
msgid "Svenska (Swedish)"
msgstr "Svenska (Schwedisch)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:292
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (vereinfachtes Chinesisch)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:293
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinesisch, traditionell)"
@@ -727,14 +727,14 @@ msgstr "ISNI:"
#: bookwyrm/templates/author/edit_author.html:115
#: bookwyrm/templates/book/book.html:193
#: bookwyrm/templates/book/edit/edit_book.html:121
-#: bookwyrm/templates/book/file_links/add_link_modal.html:58
+#: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:82
-#: bookwyrm/templates/groups/form.html:30
+#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
#: bookwyrm/templates/lists/form.html:130
#: bookwyrm/templates/preferences/edit_user.html:136
-#: bookwyrm/templates/readthrough/readthrough_modal.html:72
+#: bookwyrm/templates/readthrough/readthrough_modal.html:74
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
@@ -748,20 +748,20 @@ msgstr "Speichern"
#: bookwyrm/templates/author/edit_author.html:116
#: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/book.html:194
-#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/file_links/add_link_modal.html:59
-#: bookwyrm/templates/book/file_links/verification_modal.html:21
+#: bookwyrm/templates/book/file_links/verification_modal.html:25
#: bookwyrm/templates/book/sync_modal.html:23
-#: bookwyrm/templates/groups/delete_group_modal.html:17
-#: bookwyrm/templates/lists/add_item_modal.html:42
-#: bookwyrm/templates/lists/delete_list_modal.html:18
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:23
+#: bookwyrm/templates/groups/delete_group_modal.html:15
+#: bookwyrm/templates/lists/add_item_modal.html:36
+#: bookwyrm/templates/lists/delete_list_modal.html:16
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27
#: bookwyrm/templates/readthrough/readthrough_modal.html:73
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
-#: bookwyrm/templates/snippets/report_modal.html:53
+#: bookwyrm/templates/snippets/report_modal.html:52
msgid "Cancel"
msgstr "Abbrechen"
@@ -770,9 +770,9 @@ msgstr "Abbrechen"
msgid "Loading data will connect to %(source_name)s and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr "Das Laden von Daten wird eine Verbindung zu %(source_name)s aufbauen und überprüfen, ob Autor*in-Informationen vorliegen, die hier noch nicht bekannt sind. Bestehende Informationen werden nicht überschrieben."
-#: bookwyrm/templates/author/sync_modal.html:22
+#: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:108
-#: bookwyrm/templates/book/sync_modal.html:22
+#: bookwyrm/templates/book/sync_modal.html:24
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
@@ -873,8 +873,8 @@ msgid "Add to list"
msgstr "Zur Liste hinzufügen"
#: bookwyrm/templates/book/book.html:370
-#: bookwyrm/templates/book/cover_add_modal.html:31
-#: bookwyrm/templates/lists/add_item_modal.html:37
+#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
@@ -1182,7 +1182,7 @@ msgid "Actions"
msgstr "Aktionen"
#: bookwyrm/templates/book/file_links/edit_links.html:53
-#: bookwyrm/templates/book/file_links/verification_modal.html:25
+#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Spam melden"
@@ -1216,7 +1216,7 @@ msgstr "BookWyrm verlassen"
msgid "This link is taking you to: %(link_url)s
.
Is that where you'd like to go?"
msgstr "Dieser Link führt zu: %(link_url)s
.
Möchtest du dorthin wechseln?"
-#: bookwyrm/templates/book/file_links/verification_modal.html:20
+#: bookwyrm/templates/book/file_links/verification_modal.html:26
#: bookwyrm/templates/setup/config.html:139
msgid "Continue"
msgstr "Weiter"
@@ -1292,7 +1292,7 @@ msgstr "Bestätigungscode:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:73
#: bookwyrm/templates/settings/dashboard/dashboard.html:116
-#: bookwyrm/templates/snippets/report_modal.html:52
+#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Absenden"
@@ -1806,7 +1806,8 @@ msgid "No users found for \"%(query)s\""
msgstr "Keine Benutzer*innen für „%(query)s“ gefunden"
#: bookwyrm/templates/groups/create_form.html:5
-msgid "Create Group"
+#: bookwyrm/templates/user/groups.html:17
+msgid "Create group"
msgstr "Gruppe erstellen"
#: bookwyrm/templates/groups/created_text.html:4
@@ -1824,9 +1825,9 @@ msgstr "Diese Gruppe löschen?"
msgid "This action cannot be un-done"
msgstr "Diese Aktion kann nicht rückgängig gemacht werden"
-#: bookwyrm/templates/groups/delete_group_modal.html:15
-#: bookwyrm/templates/lists/delete_list_modal.html:15
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:21
+#: bookwyrm/templates/groups/delete_group_modal.html:17
+#: bookwyrm/templates/lists/delete_list_modal.html:19
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:29
#: bookwyrm/templates/settings/announcements/announcement.html:23
#: bookwyrm/templates/settings/announcements/announcements.html:56
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
@@ -2298,7 +2299,7 @@ msgstr "\"%(title)s\" zu dieser Liste hinzufügen"
msgid "Suggest \"%(title)s\" for this list"
msgstr "\"%(title)s\" für diese Liste vorschlagen"
-#: bookwyrm/templates/lists/add_item_modal.html:39
+#: bookwyrm/templates/lists/add_item_modal.html:41
#: bookwyrm/templates/lists/list.html:257
msgid "Suggest"
msgstr "Vorschlagen"
@@ -2468,7 +2469,7 @@ msgid "List position"
msgstr "Listenposition"
#: bookwyrm/templates/lists/list.html:152
-#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
+#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:23
msgid "Set"
msgstr "Übernehmen"
@@ -3923,7 +3924,7 @@ msgid "Copy the theme file into the bookwyrm/static/css/themes
dire
msgstr ""
#: bookwyrm/templates/settings/themes.html:32
-msgid "Run ./bw-dev compilescss
."
+msgid "Run ./bw-dev collectstatic
."
msgstr ""
#: bookwyrm/templates/settings/themes.html:35
@@ -4200,7 +4201,8 @@ msgid "Need help?"
msgstr ""
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-msgid "Create Shelf"
+#: bookwyrm/templates/shelf/shelf.html:72
+msgid "Create shelf"
msgstr "Regal erstellen"
#: bookwyrm/templates/shelf/edit_shelf_form.html:5
@@ -4216,10 +4218,6 @@ msgstr "Benutzer*inprofil"
msgid "All books"
msgstr "Alle Bücher"
-#: bookwyrm/templates/shelf/shelf.html:72
-msgid "Create shelf"
-msgstr "Regal erstellen"
-
#: bookwyrm/templates/shelf/shelf.html:96
#, python-format
msgid "%(formatted_count)s book"
@@ -4343,24 +4341,24 @@ msgstr "Antworten"
msgid "Content"
msgstr "Inhalt"
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10
-msgid "Content warning:"
-msgstr "Inhaltswarnung:"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
-msgid "Spoilers ahead!"
-msgstr "Spoileralarm!"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_toggle.html:13
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:9
msgid "Include spoiler alert"
msgstr "Spoileralarm aktivieren"
-#: bookwyrm/templates/snippets/create_status/layout.html:47
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
+msgid "Spoilers/content warnings:"
+msgstr ""
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:27
+msgid "Spoilers ahead!"
+msgstr "Spoileralarm!"
+
+#: bookwyrm/templates/snippets/create_status/layout.html:45
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Kommentar:"
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:18
msgid "Post"
msgstr "Veröffentlichen"
@@ -4851,10 +4849,6 @@ msgstr "Deine Gruppen"
msgid "Groups: %(username)s"
msgstr "Gruppen: %(username)s"
-#: bookwyrm/templates/user/groups.html:17
-msgid "Create group"
-msgstr "Gruppe erstellen"
-
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "Benutzer*inprofil"
diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po
index 76cfb32bd..c5d3ad3fa 100644
--- a/locale/en_US/LC_MESSAGES/django.po
+++ b/locale/en_US/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-13 18:56+0000\n"
+"POT-Creation-Date: 2022-03-14 19:30+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: English \n"
@@ -18,77 +18,77 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: bookwyrm/forms.py:62
-msgid "User with this username already exists"
-msgstr ""
-
-#: bookwyrm/forms.py:254
-msgid "This domain is blocked. Please contact your administrator if you think this is an error."
-msgstr ""
-
-#: bookwyrm/forms.py:264
-msgid "This link with file type has already been added for this book. If it is not visible, the domain is still pending."
-msgstr ""
-
-#: bookwyrm/forms.py:403
-msgid "A user with this email already exists."
-msgstr ""
-
-#: bookwyrm/forms.py:417
+#: bookwyrm/forms/admin.py:40
msgid "One Day"
msgstr ""
-#: bookwyrm/forms.py:418
+#: bookwyrm/forms/admin.py:41
msgid "One Week"
msgstr ""
-#: bookwyrm/forms.py:419
+#: bookwyrm/forms/admin.py:42
msgid "One Month"
msgstr ""
-#: bookwyrm/forms.py:420
+#: bookwyrm/forms/admin.py:43
msgid "Does Not Expire"
msgstr ""
-#: bookwyrm/forms.py:424
+#: bookwyrm/forms/admin.py:47
#, python-brace-format
msgid "{i} uses"
msgstr ""
-#: bookwyrm/forms.py:425
+#: bookwyrm/forms/admin.py:48
msgid "Unlimited"
msgstr ""
-#: bookwyrm/forms.py:543
+#: bookwyrm/forms/forms.py:54
+msgid "Reading finish date cannot be before start date."
+msgstr ""
+
+#: bookwyrm/forms/landing.py:32
+msgid "User with this username already exists"
+msgstr ""
+
+#: bookwyrm/forms/landing.py:41
+msgid "A user with this email already exists."
+msgstr ""
+
+#: bookwyrm/forms/links.py:36
+msgid "This domain is blocked. Please contact your administrator if you think this is an error."
+msgstr ""
+
+#: bookwyrm/forms/links.py:46
+msgid "This link with file type has already been added for this book. If it is not visible, the domain is still pending."
+msgstr ""
+
+#: bookwyrm/forms/lists.py:26
msgid "List Order"
msgstr ""
-#: bookwyrm/forms.py:544
+#: bookwyrm/forms/lists.py:27
msgid "Book Title"
msgstr ""
-#: bookwyrm/forms.py:545 bookwyrm/templates/shelf/shelf.html:155
+#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:155
#: bookwyrm/templates/shelf/shelf.html:187
#: bookwyrm/templates/snippets/create_status/review.html:32
msgid "Rating"
msgstr ""
-#: bookwyrm/forms.py:547 bookwyrm/templates/lists/list.html:185
+#: bookwyrm/forms/lists.py:30 bookwyrm/templates/lists/list.html:185
msgid "Sort By"
msgstr ""
-#: bookwyrm/forms.py:551
+#: bookwyrm/forms/lists.py:34
msgid "Ascending"
msgstr ""
-#: bookwyrm/forms.py:552
+#: bookwyrm/forms/lists.py:35
msgid "Descending"
msgstr ""
-#: bookwyrm/forms.py:565
-msgid "Reading finish date cannot be before start date."
-msgstr ""
-
#: bookwyrm/importers/importer.py:145 bookwyrm/importers/importer.py:167
msgid "Error loading book"
msgstr ""
@@ -188,7 +188,7 @@ msgstr ""
msgid "%(value)s is not a valid username"
msgstr ""
-#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171
+#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:179
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr ""
@@ -246,7 +246,7 @@ msgstr ""
msgid "Approved"
msgstr ""
-#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:272
+#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:281
msgid "Reviews"
msgstr ""
@@ -400,7 +400,7 @@ msgstr ""
msgid "Moderator"
msgstr ""
-#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:132
+#: bookwyrm/templates/about/about.html:117 bookwyrm/templates/layout.html:140
msgid "Admin"
msgstr ""
@@ -431,7 +431,7 @@ msgid "Software version:"
msgstr ""
#: bookwyrm/templates/about/layout.html:30
-#: bookwyrm/templates/embed-layout.html:34 bookwyrm/templates/layout.html:230
+#: bookwyrm/templates/embed-layout.html:34 bookwyrm/templates/layout.html:238
#, python-format
msgid "About %(site_name)s"
msgstr ""
@@ -534,7 +534,7 @@ msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:155
#: bookwyrm/templates/annual_summary/layout.html:176
#: bookwyrm/templates/annual_summary/layout.html:245
-#: bookwyrm/templates/book/book.html:47
+#: bookwyrm/templates/book/book.html:56
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:26
#: bookwyrm/templates/landing/small-book.html:18
@@ -619,18 +619,18 @@ msgstr ""
#: bookwyrm/templates/author/author.html:83
#: bookwyrm/templates/author/sync_modal.html:5
-#: bookwyrm/templates/book/book.html:122
+#: bookwyrm/templates/book/book.html:131
#: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data"
msgstr ""
#: bookwyrm/templates/author/author.html:87
-#: bookwyrm/templates/book/book.html:126
+#: bookwyrm/templates/book/book.html:135
msgid "View on OpenLibrary"
msgstr ""
#: bookwyrm/templates/author/author.html:102
-#: bookwyrm/templates/book/book.html:140
+#: bookwyrm/templates/book/book.html:149
msgid "View on Inventaire"
msgstr ""
@@ -667,7 +667,7 @@ msgid "Last edited by:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:33
-#: bookwyrm/templates/book/edit/edit_book_form.html:16
+#: bookwyrm/templates/book/edit/edit_book_form.html:17
msgid "Metadata"
msgstr ""
@@ -679,8 +679,9 @@ msgid "Name:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:44
-#: bookwyrm/templates/book/edit/edit_book_form.html:75
-#: bookwyrm/templates/book/edit/edit_book_form.html:94
+#: bookwyrm/templates/book/edit/edit_book_form.html:76
+#: bookwyrm/templates/book/edit/edit_book_form.html:88
+#: bookwyrm/templates/book/edit/edit_book_form.html:107
msgid "Separate multiple values with commas."
msgstr ""
@@ -709,7 +710,7 @@ msgid "Openlibrary key:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:84
-#: bookwyrm/templates/book/edit/edit_book_form.html:265
+#: bookwyrm/templates/book/edit/edit_book_form.html:278
msgid "Inventaire ID:"
msgstr ""
@@ -726,7 +727,7 @@ msgid "ISNI:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:115
-#: bookwyrm/templates/book/book.html:193
+#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:121
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:82
@@ -748,7 +749,7 @@ msgstr ""
#: bookwyrm/templates/author/edit_author.html:116
#: bookwyrm/templates/author/sync_modal.html:23
-#: bookwyrm/templates/book/book.html:194
+#: bookwyrm/templates/book/book.html:203
#: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
@@ -760,6 +761,7 @@ msgstr ""
#: bookwyrm/templates/lists/delete_list_modal.html:16
#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27
#: bookwyrm/templates/readthrough/readthrough_modal.html:73
+#: bookwyrm/templates/search/barcode_modal.html:45
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
#: bookwyrm/templates/snippets/report_modal.html:52
@@ -780,87 +782,91 @@ msgstr ""
msgid "Confirm"
msgstr ""
-#: bookwyrm/templates/book/book.html:55 bookwyrm/templates/book/book.html:56
+#: bookwyrm/templates/book/book.html:19
+msgid "Unable to connect to remote source."
+msgstr ""
+
+#: bookwyrm/templates/book/book.html:64 bookwyrm/templates/book/book.html:65
msgid "Edit Book"
msgstr ""
-#: bookwyrm/templates/book/book.html:79 bookwyrm/templates/book/book.html:82
+#: bookwyrm/templates/book/book.html:88 bookwyrm/templates/book/book.html:91
msgid "Click to add cover"
msgstr ""
-#: bookwyrm/templates/book/book.html:88
+#: bookwyrm/templates/book/book.html:97
msgid "Failed to load cover"
msgstr ""
-#: bookwyrm/templates/book/book.html:99
+#: bookwyrm/templates/book/book.html:108
msgid "Click to enlarge"
msgstr ""
-#: bookwyrm/templates/book/book.html:170
+#: bookwyrm/templates/book/book.html:179
#, python-format
msgid "(%(review_count)s review)"
msgid_plural "(%(review_count)s reviews)"
msgstr[0] ""
msgstr[1] ""
-#: bookwyrm/templates/book/book.html:182
+#: bookwyrm/templates/book/book.html:191
msgid "Add Description"
msgstr ""
-#: bookwyrm/templates/book/book.html:189
-#: bookwyrm/templates/book/edit/edit_book_form.html:39
+#: bookwyrm/templates/book/book.html:198
+#: bookwyrm/templates/book/edit/edit_book_form.html:40
#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17
msgid "Description:"
msgstr ""
-#: bookwyrm/templates/book/book.html:203
+#: bookwyrm/templates/book/book.html:212
#, python-format
msgid "%(count)s editions"
msgstr ""
-#: bookwyrm/templates/book/book.html:211
+#: bookwyrm/templates/book/book.html:220
msgid "You have shelved this edition in:"
msgstr ""
-#: bookwyrm/templates/book/book.html:226
+#: bookwyrm/templates/book/book.html:235
#, python-format
msgid "A different edition of this book is on your %(shelf_name)s shelf."
msgstr ""
-#: bookwyrm/templates/book/book.html:237
+#: bookwyrm/templates/book/book.html:246
msgid "Your reading activity"
msgstr ""
-#: bookwyrm/templates/book/book.html:243
+#: bookwyrm/templates/book/book.html:252
msgid "Add read dates"
msgstr ""
-#: bookwyrm/templates/book/book.html:251
+#: bookwyrm/templates/book/book.html:260
msgid "You don't have any reading activity for this book."
msgstr ""
-#: bookwyrm/templates/book/book.html:277
+#: bookwyrm/templates/book/book.html:286
msgid "Your reviews"
msgstr ""
-#: bookwyrm/templates/book/book.html:283
+#: bookwyrm/templates/book/book.html:292
msgid "Your comments"
msgstr ""
-#: bookwyrm/templates/book/book.html:289
+#: bookwyrm/templates/book/book.html:298
msgid "Your quotes"
msgstr ""
-#: bookwyrm/templates/book/book.html:325
+#: bookwyrm/templates/book/book.html:334
msgid "Subjects"
msgstr ""
-#: bookwyrm/templates/book/book.html:337
+#: bookwyrm/templates/book/book.html:346
msgid "Places"
msgstr ""
-#: bookwyrm/templates/book/book.html:348
-#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:75
+#: bookwyrm/templates/book/book.html:357
+#: bookwyrm/templates/groups/group.html:19 bookwyrm/templates/layout.html:83
#: bookwyrm/templates/lists/curate.html:8 bookwyrm/templates/lists/list.html:12
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
@@ -869,11 +875,11 @@ msgstr ""
msgid "Lists"
msgstr ""
-#: bookwyrm/templates/book/book.html:360
+#: bookwyrm/templates/book/book.html:369
msgid "Add to list"
msgstr ""
-#: bookwyrm/templates/book/book.html:370
+#: bookwyrm/templates/book/book.html:379
#: bookwyrm/templates/book/cover_add_modal.html:32
#: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255
@@ -887,12 +893,12 @@ msgid "ISBN:"
msgstr ""
#: bookwyrm/templates/book/book_identifiers.html:15
-#: bookwyrm/templates/book/edit/edit_book_form.html:274
+#: bookwyrm/templates/book/edit/edit_book_form.html:287
msgid "OCLC Number:"
msgstr ""
#: bookwyrm/templates/book/book_identifiers.html:22
-#: bookwyrm/templates/book/edit/edit_book_form.html:283
+#: bookwyrm/templates/book/edit/edit_book_form.html:296
msgid "ASIN:"
msgstr ""
@@ -901,12 +907,12 @@ msgid "Add cover"
msgstr ""
#: bookwyrm/templates/book/cover_add_modal.html:17
-#: bookwyrm/templates/book/edit/edit_book_form.html:173
+#: bookwyrm/templates/book/edit/edit_book_form.html:186
msgid "Upload cover:"
msgstr ""
#: bookwyrm/templates/book/cover_add_modal.html:23
-#: bookwyrm/templates/book/edit/edit_book_form.html:179
+#: bookwyrm/templates/book/edit/edit_book_form.html:192
msgid "Load cover from url:"
msgstr ""
@@ -976,110 +982,114 @@ msgstr ""
msgid "Back"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:21
+#: bookwyrm/templates/book/edit/edit_book_form.html:22
#: bookwyrm/templates/snippets/create_status/review.html:15
msgid "Title:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:30
+#: bookwyrm/templates/book/edit/edit_book_form.html:31
msgid "Subtitle:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:50
+#: bookwyrm/templates/book/edit/edit_book_form.html:51
msgid "Series:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:60
+#: bookwyrm/templates/book/edit/edit_book_form.html:61
msgid "Series number:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:71
+#: bookwyrm/templates/book/edit/edit_book_form.html:72
msgid "Languages:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:85
+#: bookwyrm/templates/book/edit/edit_book_form.html:84
+msgid "Subjects:"
+msgstr ""
+
+#: bookwyrm/templates/book/edit/edit_book_form.html:98
msgid "Publication"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:90
+#: bookwyrm/templates/book/edit/edit_book_form.html:103
msgid "Publisher:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:102
+#: bookwyrm/templates/book/edit/edit_book_form.html:115
msgid "First published date:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:111
+#: bookwyrm/templates/book/edit/edit_book_form.html:124
msgid "Published date:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:122
+#: bookwyrm/templates/book/edit/edit_book_form.html:135
msgid "Authors"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:131
+#: bookwyrm/templates/book/edit/edit_book_form.html:144
#, python-format
msgid "Remove %(name)s"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:134
+#: bookwyrm/templates/book/edit/edit_book_form.html:147
#, python-format
msgid "Author page for %(name)s"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:142
+#: bookwyrm/templates/book/edit/edit_book_form.html:155
msgid "Add Authors:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:145
-#: bookwyrm/templates/book/edit/edit_book_form.html:148
+#: bookwyrm/templates/book/edit/edit_book_form.html:158
+#: bookwyrm/templates/book/edit/edit_book_form.html:161
msgid "Add Author"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:146
-#: bookwyrm/templates/book/edit/edit_book_form.html:149
+#: bookwyrm/templates/book/edit/edit_book_form.html:159
+#: bookwyrm/templates/book/edit/edit_book_form.html:162
msgid "Jane Doe"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:152
+#: bookwyrm/templates/book/edit/edit_book_form.html:165
msgid "Add Another Author"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:160
+#: bookwyrm/templates/book/edit/edit_book_form.html:173
#: bookwyrm/templates/shelf/shelf.html:146
msgid "Cover"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:192
+#: bookwyrm/templates/book/edit/edit_book_form.html:205
msgid "Physical Properties"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:199
+#: bookwyrm/templates/book/edit/edit_book_form.html:212
#: bookwyrm/templates/book/editions/format_filter.html:6
msgid "Format:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:211
+#: bookwyrm/templates/book/edit/edit_book_form.html:224
msgid "Format details:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:222
+#: bookwyrm/templates/book/edit/edit_book_form.html:235
msgid "Pages:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:233
+#: bookwyrm/templates/book/edit/edit_book_form.html:246
msgid "Book Identifiers"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:238
+#: bookwyrm/templates/book/edit/edit_book_form.html:251
msgid "ISBN 13:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:247
+#: bookwyrm/templates/book/edit/edit_book_form.html:260
msgid "ISBN 10:"
msgstr ""
-#: bookwyrm/templates/book/edit/edit_book_form.html:256
+#: bookwyrm/templates/book/edit/edit_book_form.html:269
msgid "Openlibrary ID:"
msgstr ""
@@ -1168,7 +1178,7 @@ msgstr ""
#: bookwyrm/templates/settings/federation/instance_list.html:46
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44
#: bookwyrm/templates/settings/invites/status_filter.html:5
-#: bookwyrm/templates/settings/users/user_admin.html:34
+#: bookwyrm/templates/settings/users/user_admin.html:52
#: bookwyrm/templates/settings/users/user_info.html:20
msgid "Status"
msgstr ""
@@ -1177,7 +1187,7 @@ msgstr ""
#: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/reports/report_links_table.html:6
-#: bookwyrm/templates/settings/themes.html:118
+#: bookwyrm/templates/settings/themes.html:100
msgid "Actions"
msgstr ""
@@ -1321,16 +1331,18 @@ msgid "Community"
msgstr ""
#: bookwyrm/templates/directory/community_filter.html:8
+#: bookwyrm/templates/settings/users/user_admin.html:25
msgid "Local users"
msgstr ""
#: bookwyrm/templates/directory/community_filter.html:12
+#: bookwyrm/templates/settings/users/user_admin.html:29
msgid "Federated community"
msgstr ""
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
-#: bookwyrm/templates/layout.html:101
+#: bookwyrm/templates/layout.html:109
msgid "Directory"
msgstr ""
@@ -1450,7 +1462,7 @@ msgstr ""
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
-#: bookwyrm/templates/layout.html:78
+#: bookwyrm/templates/layout.html:86
msgid "Discover"
msgstr ""
@@ -1573,7 +1585,7 @@ msgstr ""
msgid "%(site_name)s home page"
msgstr ""
-#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:234
+#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:242
msgid "Contact site admin"
msgstr ""
@@ -1587,7 +1599,7 @@ msgid "Direct Messages with %(username)s"
msgstr ""
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/layout.html:111
+#: bookwyrm/templates/layout.html:119
msgid "Direct Messages"
msgstr ""
@@ -1624,7 +1636,7 @@ msgid "Updates"
msgstr ""
#: bookwyrm/templates/feed/suggested_books.html:6
-#: bookwyrm/templates/layout.html:106
+#: bookwyrm/templates/layout.html:114
msgid "Your Books"
msgstr ""
@@ -2176,7 +2188,7 @@ msgid "Login"
msgstr ""
#: bookwyrm/templates/landing/login.html:7
-#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:179
+#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:187
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr ""
@@ -2185,7 +2197,7 @@ msgstr ""
msgid "Success! Email address confirmed."
msgstr ""
-#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:170
+#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@@ -2193,12 +2205,12 @@ msgstr ""
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
-#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:32
+#: bookwyrm/templates/layout.html:182 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:45
msgid "Password:"
msgstr ""
-#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:176
+#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:184
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr ""
@@ -2230,19 +2242,23 @@ msgstr ""
msgid "Search for a book, user, or list"
msgstr ""
-#: bookwyrm/templates/layout.html:64
-msgid "Main navigation menu"
+#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62
+msgid "Scan Barcode"
msgstr ""
#: bookwyrm/templates/layout.html:72
+msgid "Main navigation menu"
+msgstr ""
+
+#: bookwyrm/templates/layout.html:80
msgid "Feed"
msgstr ""
-#: bookwyrm/templates/layout.html:116 bookwyrm/templates/setup/config.html:52
+#: bookwyrm/templates/layout.html:124 bookwyrm/templates/setup/config.html:52
msgid "Settings"
msgstr ""
-#: bookwyrm/templates/layout.html:125
+#: bookwyrm/templates/layout.html:133
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15
#: bookwyrm/templates/settings/invites/manage_invites.html:3
#: bookwyrm/templates/settings/invites/manage_invites.html:15
@@ -2250,42 +2266,42 @@ msgstr ""
msgid "Invites"
msgstr ""
-#: bookwyrm/templates/layout.html:139
+#: bookwyrm/templates/layout.html:147
msgid "Log out"
msgstr ""
-#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148
+#: bookwyrm/templates/layout.html:155 bookwyrm/templates/layout.html:156
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr ""
-#: bookwyrm/templates/layout.html:175 bookwyrm/templates/ostatus/error.html:33
+#: bookwyrm/templates/layout.html:183 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr ""
-#: bookwyrm/templates/layout.html:187
+#: bookwyrm/templates/layout.html:195
msgid "Join"
msgstr ""
-#: bookwyrm/templates/layout.html:221
+#: bookwyrm/templates/layout.html:229
msgid "Successfully posted status"
msgstr ""
-#: bookwyrm/templates/layout.html:222
+#: bookwyrm/templates/layout.html:230
msgid "Error posting status"
msgstr ""
-#: bookwyrm/templates/layout.html:238
+#: bookwyrm/templates/layout.html:246
msgid "Documentation"
msgstr ""
-#: bookwyrm/templates/layout.html:245
+#: bookwyrm/templates/layout.html:253
#, python-format
msgid "Support %(site_name)s on %(support_title)s"
msgstr ""
-#: bookwyrm/templates/layout.html:249
+#: bookwyrm/templates/layout.html:257
msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub."
msgstr ""
@@ -3013,6 +3029,44 @@ msgstr ""
msgid "Report"
msgstr ""
+#: bookwyrm/templates/search/barcode_modal.html:5
+msgid ""
+"\n"
+" Scan Barcode\n"
+" "
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:23
+msgid "Requesting camera..."
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:24
+msgid "Grant access to the camera to scan a book's barcode."
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:29
+msgid "Could not access camera"
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:33
+msgctxt "barcode scanner"
+msgid "Scanning..."
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:34
+msgid "Align your book's barcode with the camera."
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:38
+msgctxt "barcode scanner"
+msgid "ISBN scanned"
+msgstr ""
+
+#: bookwyrm/templates/search/barcode_modal.html:39
+msgctxt "followed by ISBN"
+msgid "Searching for book:"
+msgstr ""
+
#: bookwyrm/templates/search/book.html:44
msgid "Results from"
msgstr ""
@@ -3046,8 +3100,9 @@ msgstr ""
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:27
#: bookwyrm/templates/settings/federation/instance_list.html:44
#: bookwyrm/templates/settings/layout.html:36
-#: bookwyrm/templates/settings/users/user_admin.html:3
-#: bookwyrm/templates/settings/users/user_admin.html:10
+#: bookwyrm/templates/settings/users/user.html:13
+#: bookwyrm/templates/settings/users/user_admin.html:5
+#: bookwyrm/templates/settings/users/user_admin.html:12
msgid "Users"
msgstr ""
@@ -3514,6 +3569,7 @@ msgid "Date accepted"
msgstr ""
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:42
+#: bookwyrm/templates/settings/users/email_filter.html:5
msgid "Email"
msgstr ""
@@ -3932,7 +3988,7 @@ msgid "Add the file name using the form below to make it available in the applic
msgstr ""
#: bookwyrm/templates/settings/themes.html:42
-#: bookwyrm/templates/settings/themes.html:101
+#: bookwyrm/templates/settings/themes.html:83
msgid "Add theme"
msgstr ""
@@ -3940,28 +3996,24 @@ msgstr ""
msgid "Unable to save theme"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:61
-msgid "No available theme files detected"
-msgstr ""
-
-#: bookwyrm/templates/settings/themes.html:69
-#: bookwyrm/templates/settings/themes.html:112
+#: bookwyrm/templates/settings/themes.html:64
+#: bookwyrm/templates/settings/themes.html:94
msgid "Theme name"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:79
+#: bookwyrm/templates/settings/themes.html:74
msgid "Theme filename"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:107
+#: bookwyrm/templates/settings/themes.html:89
msgid "Available Themes"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:115
+#: bookwyrm/templates/settings/themes.html:97
msgid "File"
msgstr ""
-#: bookwyrm/templates/settings/themes.html:130
+#: bookwyrm/templates/settings/themes.html:112
msgid "Remove theme"
msgstr ""
@@ -3979,43 +4031,39 @@ msgstr ""
msgid "Your password:"
msgstr ""
-#: bookwyrm/templates/settings/users/user.html:7
-msgid "Back to users"
-msgstr ""
-
-#: bookwyrm/templates/settings/users/user_admin.html:7
+#: bookwyrm/templates/settings/users/user_admin.html:9
#, python-format
msgid "Users: %(instance_name)s"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:22
+#: bookwyrm/templates/settings/users/user_admin.html:40
#: bookwyrm/templates/settings/users/username_filter.html:5
msgid "Username"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:26
+#: bookwyrm/templates/settings/users/user_admin.html:44
msgid "Date Added"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:30
+#: bookwyrm/templates/settings/users/user_admin.html:48
msgid "Last Active"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:38
+#: bookwyrm/templates/settings/users/user_admin.html:57
msgid "Remote instance"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:47
+#: bookwyrm/templates/settings/users/user_admin.html:67
#: bookwyrm/templates/settings/users/user_info.html:24
msgid "Active"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:47
+#: bookwyrm/templates/settings/users/user_admin.html:67
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Inactive"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:52
+#: bookwyrm/templates/settings/users/user_admin.html:73
#: bookwyrm/templates/settings/users/user_info.html:120
msgid "Not set"
msgstr ""
diff --git a/locale/es_ES/LC_MESSAGES/django.mo b/locale/es_ES/LC_MESSAGES/django.mo
index 43db15d9d564c104654b5a2f27f668fb4ecbd918..ff4ad1d4996bb4a39f8a210854b7bfa648db2dfc 100644
GIT binary patch
delta 21021
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
z
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
OKKoyyIR954>i-{pfg{`i
delta 21094
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
DOhGAq
diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po
index 98d4e124f..b68cde705 100644
--- a/locale/es_ES/LC_MESSAGES/django.po
+++ b/locale/es_ES/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-08 19:55+0000\n"
-"PO-Revision-Date: 2022-03-08 21:16\n"
+"POT-Creation-Date: 2022-03-13 18:56+0000\n"
+"PO-Revision-Date: 2022-03-13 20:49\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Spanish\n"
"Language: es\n"
@@ -220,7 +220,7 @@ msgid "Followers"
msgstr "Seguidores"
#: bookwyrm/models/fields.py:208
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:8
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:6
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
#: bookwyrm/templates/snippets/privacy_select.html:20
@@ -261,73 +261,73 @@ msgstr "Citas"
msgid "Everything else"
msgstr "Todo lo demás"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home Timeline"
msgstr "Línea de tiempo principal"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home"
msgstr "Inicio"
-#: bookwyrm/settings.py:208
+#: bookwyrm/settings.py:209
msgid "Books Timeline"
msgstr "Línea temporal de libros"
-#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:209 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Libros"
-#: bookwyrm/settings.py:280
+#: bookwyrm/settings.py:281
msgid "English"
msgstr "English (Inglés)"
-#: bookwyrm/settings.py:281
+#: bookwyrm/settings.py:282
msgid "Deutsch (German)"
msgstr "Deutsch (Alemán)"
-#: bookwyrm/settings.py:282
+#: bookwyrm/settings.py:283
msgid "Español (Spanish)"
msgstr "Español"
-#: bookwyrm/settings.py:283
+#: bookwyrm/settings.py:284
msgid "Galego (Galician)"
msgstr "Galego (Gallego)"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:285
msgid "Italiano (Italian)"
msgstr "Italiano"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:286
msgid "Français (French)"
msgstr "Français (Francés)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:287
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:288
msgid "Norsk (Norwegian)"
msgstr "Norsk (Noruego)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:289
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugués brasileño)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:290
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:291
msgid "Svenska (Swedish)"
msgstr "Svenska (Sueco)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:292
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chino simplificado)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:293
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chino tradicional)"
@@ -598,11 +598,11 @@ msgstr "Alias:"
#: bookwyrm/templates/author/author.html:48
msgid "Born:"
-msgstr "Nacido:"
+msgstr "Fecha de nacimiento:"
#: bookwyrm/templates/author/author.html:55
msgid "Died:"
-msgstr "Muerto:"
+msgstr "Fecha de defunción:"
#: bookwyrm/templates/author/author.html:65
msgid "External links"
@@ -727,14 +727,14 @@ msgstr "ISNI:"
#: bookwyrm/templates/author/edit_author.html:115
#: bookwyrm/templates/book/book.html:193
#: bookwyrm/templates/book/edit/edit_book.html:121
-#: bookwyrm/templates/book/file_links/add_link_modal.html:58
+#: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:82
-#: bookwyrm/templates/groups/form.html:30
+#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
#: bookwyrm/templates/lists/form.html:130
#: bookwyrm/templates/preferences/edit_user.html:136
-#: bookwyrm/templates/readthrough/readthrough_modal.html:72
+#: bookwyrm/templates/readthrough/readthrough_modal.html:74
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
@@ -748,20 +748,20 @@ msgstr "Guardar"
#: bookwyrm/templates/author/edit_author.html:116
#: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/book.html:194
-#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/file_links/add_link_modal.html:59
-#: bookwyrm/templates/book/file_links/verification_modal.html:21
+#: bookwyrm/templates/book/file_links/verification_modal.html:25
#: bookwyrm/templates/book/sync_modal.html:23
-#: bookwyrm/templates/groups/delete_group_modal.html:17
-#: bookwyrm/templates/lists/add_item_modal.html:42
-#: bookwyrm/templates/lists/delete_list_modal.html:18
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:23
+#: bookwyrm/templates/groups/delete_group_modal.html:15
+#: bookwyrm/templates/lists/add_item_modal.html:36
+#: bookwyrm/templates/lists/delete_list_modal.html:16
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27
#: bookwyrm/templates/readthrough/readthrough_modal.html:73
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
-#: bookwyrm/templates/snippets/report_modal.html:53
+#: bookwyrm/templates/snippets/report_modal.html:52
msgid "Cancel"
msgstr "Cancelar"
@@ -770,9 +770,9 @@ msgstr "Cancelar"
msgid "Loading data will connect to %(source_name)s and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr "La carga de datos se conectará a %(source_name)s y comprobará si hay metadatos sobre este autor que no están presentes aquí. Los metadatos existentes no serán sobrescritos."
-#: bookwyrm/templates/author/sync_modal.html:22
+#: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:108
-#: bookwyrm/templates/book/sync_modal.html:22
+#: bookwyrm/templates/book/sync_modal.html:24
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
@@ -873,8 +873,8 @@ msgid "Add to list"
msgstr "Agregar a lista"
#: bookwyrm/templates/book/book.html:370
-#: bookwyrm/templates/book/cover_add_modal.html:31
-#: bookwyrm/templates/lists/add_item_modal.html:37
+#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
@@ -1182,7 +1182,7 @@ msgid "Actions"
msgstr "Acciones"
#: bookwyrm/templates/book/file_links/edit_links.html:53
-#: bookwyrm/templates/book/file_links/verification_modal.html:25
+#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Denunciar spam"
@@ -1216,7 +1216,7 @@ msgstr "Saliendo de BookWyrm"
msgid "This link is taking you to: %(link_url)s
.
Is that where you'd like to go?"
msgstr "Este enlace te lleva a: %(link_url)s
.
¿Es ahí adonde quieres ir?"
-#: bookwyrm/templates/book/file_links/verification_modal.html:20
+#: bookwyrm/templates/book/file_links/verification_modal.html:26
#: bookwyrm/templates/setup/config.html:139
msgid "Continue"
msgstr "Continuar"
@@ -1292,7 +1292,7 @@ msgstr "Código de confirmación:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:73
#: bookwyrm/templates/settings/dashboard/dashboard.html:116
-#: bookwyrm/templates/snippets/report_modal.html:52
+#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Enviar"
@@ -1326,7 +1326,7 @@ msgstr "Usuarios locales"
#: bookwyrm/templates/directory/community_filter.html:12
msgid "Federated community"
-msgstr "Comunidad federalizada"
+msgstr "Comunidad federada"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
@@ -1806,7 +1806,8 @@ msgid "No users found for \"%(query)s\""
msgstr "No se encontró ningún usuario correspondiente a \"%(query)s\""
#: bookwyrm/templates/groups/create_form.html:5
-msgid "Create Group"
+#: bookwyrm/templates/user/groups.html:17
+msgid "Create group"
msgstr "Crear grupo"
#: bookwyrm/templates/groups/created_text.html:4
@@ -1824,9 +1825,9 @@ msgstr "¿Eliminar este grupo?"
msgid "This action cannot be un-done"
msgstr "Esta acción no se puede deshacer"
-#: bookwyrm/templates/groups/delete_group_modal.html:15
-#: bookwyrm/templates/lists/delete_list_modal.html:15
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:21
+#: bookwyrm/templates/groups/delete_group_modal.html:17
+#: bookwyrm/templates/lists/delete_list_modal.html:19
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:29
#: bookwyrm/templates/settings/announcements/announcement.html:23
#: bookwyrm/templates/settings/announcements/announcements.html:56
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
@@ -2298,7 +2299,7 @@ msgstr "Añadir «%(title)s» a esta lista"
msgid "Suggest \"%(title)s\" for this list"
msgstr "Sugerir «%(title)s» para esta lista"
-#: bookwyrm/templates/lists/add_item_modal.html:39
+#: bookwyrm/templates/lists/add_item_modal.html:41
#: bookwyrm/templates/lists/list.html:257
msgid "Suggest"
msgstr "Sugerir"
@@ -2468,7 +2469,7 @@ msgid "List position"
msgstr "Posición"
#: bookwyrm/templates/lists/list.html:152
-#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
+#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:23
msgid "Set"
msgstr "Establecido"
@@ -3923,7 +3924,7 @@ msgid "Copy the theme file into the bookwyrm/static/css/themes
dire
msgstr ""
#: bookwyrm/templates/settings/themes.html:32
-msgid "Run ./bw-dev compilescss
."
+msgid "Run ./bw-dev collectstatic
."
msgstr ""
#: bookwyrm/templates/settings/themes.html:35
@@ -4200,8 +4201,9 @@ msgid "Need help?"
msgstr ""
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-msgid "Create Shelf"
-msgstr "Crear Estantería"
+#: bookwyrm/templates/shelf/shelf.html:72
+msgid "Create shelf"
+msgstr "Crear estantería"
#: bookwyrm/templates/shelf/edit_shelf_form.html:5
msgid "Edit Shelf"
@@ -4216,10 +4218,6 @@ msgstr "Perfil de usuario"
msgid "All books"
msgstr "Todos los libros"
-#: bookwyrm/templates/shelf/shelf.html:72
-msgid "Create shelf"
-msgstr "Crear estantería"
-
#: bookwyrm/templates/shelf/shelf.html:96
#, python-format
msgid "%(formatted_count)s book"
@@ -4343,24 +4341,24 @@ msgstr "Responder"
msgid "Content"
msgstr "Contenido"
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10
-msgid "Content warning:"
-msgstr "Advertencia de contenido:"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
-msgid "Spoilers ahead!"
-msgstr "¡Advertencia, ya vienen spoilers!"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_toggle.html:13
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:9
msgid "Include spoiler alert"
msgstr "Incluir alerta de spoiler"
-#: bookwyrm/templates/snippets/create_status/layout.html:47
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
+msgid "Spoilers/content warnings:"
+msgstr ""
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:27
+msgid "Spoilers ahead!"
+msgstr "¡Advertencia, ya vienen spoilers!"
+
+#: bookwyrm/templates/snippets/create_status/layout.html:45
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Comentario:"
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:18
msgid "Post"
msgstr "Compartir"
@@ -4851,10 +4849,6 @@ msgstr "Tus grupos"
msgid "Groups: %(username)s"
msgstr "Grupos: %(username)s"
-#: bookwyrm/templates/user/groups.html:17
-msgid "Create group"
-msgstr "Crear grupo"
-
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "Perfil de usuario"
diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po
index 6c5d17c4d..4e3d049b6 100644
--- a/locale/fr_FR/LC_MESSAGES/django.po
+++ b/locale/fr_FR/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-03-08 19:55+0000\n"
-"PO-Revision-Date: 2022-03-08 21:16\n"
+"POT-Creation-Date: 2022-03-13 18:56+0000\n"
+"PO-Revision-Date: 2022-03-14 16:32\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: French\n"
"Language: fr\n"
@@ -220,7 +220,7 @@ msgid "Followers"
msgstr "Abonné(e)s"
#: bookwyrm/models/fields.py:208
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:8
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:6
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
#: bookwyrm/templates/snippets/privacy_select.html:20
@@ -261,73 +261,73 @@ msgstr "Citations"
msgid "Everything else"
msgstr "Tout le reste"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home Timeline"
msgstr "Mon fil d’actualité"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home"
msgstr "Accueil"
-#: bookwyrm/settings.py:208
+#: bookwyrm/settings.py:209
msgid "Books Timeline"
msgstr "Actualité de mes livres"
-#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:209 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Livres"
-#: bookwyrm/settings.py:280
+#: bookwyrm/settings.py:281
msgid "English"
msgstr "English"
-#: bookwyrm/settings.py:281
+#: bookwyrm/settings.py:282
msgid "Deutsch (German)"
msgstr "Deutsch"
-#: bookwyrm/settings.py:282
+#: bookwyrm/settings.py:283
msgid "Español (Spanish)"
msgstr "Español"
-#: bookwyrm/settings.py:283
+#: bookwyrm/settings.py:284
msgid "Galego (Galician)"
msgstr "Galego (Galicien)"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:285
msgid "Italiano (Italian)"
msgstr "Italiano (italien)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:286
msgid "Français (French)"
msgstr "Français"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:287
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituanien)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:288
msgid "Norsk (Norwegian)"
msgstr "Norsk (norvégien)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:289
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugais brésilien)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:290
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugais européen)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:291
msgid "Svenska (Swedish)"
msgstr "Svenska (Suédois)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:292
msgid "简体中文 (Simplified Chinese)"
msgstr "简化字"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:293
msgid "繁體中文 (Traditional Chinese)"
msgstr "Infos supplémentaires :"
@@ -727,14 +727,14 @@ msgstr "ISNI :"
#: bookwyrm/templates/author/edit_author.html:115
#: bookwyrm/templates/book/book.html:193
#: bookwyrm/templates/book/edit/edit_book.html:121
-#: bookwyrm/templates/book/file_links/add_link_modal.html:58
+#: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:82
-#: bookwyrm/templates/groups/form.html:30
+#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
#: bookwyrm/templates/lists/form.html:130
#: bookwyrm/templates/preferences/edit_user.html:136
-#: bookwyrm/templates/readthrough/readthrough_modal.html:72
+#: bookwyrm/templates/readthrough/readthrough_modal.html:74
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
@@ -748,20 +748,20 @@ msgstr "Enregistrer"
#: bookwyrm/templates/author/edit_author.html:116
#: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/book.html:194
-#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/file_links/add_link_modal.html:59
-#: bookwyrm/templates/book/file_links/verification_modal.html:21
+#: bookwyrm/templates/book/file_links/verification_modal.html:25
#: bookwyrm/templates/book/sync_modal.html:23
-#: bookwyrm/templates/groups/delete_group_modal.html:17
-#: bookwyrm/templates/lists/add_item_modal.html:42
-#: bookwyrm/templates/lists/delete_list_modal.html:18
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:23
+#: bookwyrm/templates/groups/delete_group_modal.html:15
+#: bookwyrm/templates/lists/add_item_modal.html:36
+#: bookwyrm/templates/lists/delete_list_modal.html:16
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27
#: bookwyrm/templates/readthrough/readthrough_modal.html:73
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
-#: bookwyrm/templates/snippets/report_modal.html:53
+#: bookwyrm/templates/snippets/report_modal.html:52
msgid "Cancel"
msgstr "Annuler"
@@ -770,9 +770,9 @@ msgstr "Annuler"
msgid "Loading data will connect to %(source_name)s and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr "Le chargement des données se connectera à %(source_name)s et vérifiera les métadonnées de cet auteur ou autrice qui ne sont pas présentes ici. Les métadonnées existantes ne seront pas écrasées."
-#: bookwyrm/templates/author/sync_modal.html:22
+#: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:108
-#: bookwyrm/templates/book/sync_modal.html:22
+#: bookwyrm/templates/book/sync_modal.html:24
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
@@ -873,8 +873,8 @@ msgid "Add to list"
msgstr "Ajouter à la liste"
#: bookwyrm/templates/book/book.html:370
-#: bookwyrm/templates/book/cover_add_modal.html:31
-#: bookwyrm/templates/lists/add_item_modal.html:37
+#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
@@ -1182,7 +1182,7 @@ msgid "Actions"
msgstr "Actions"
#: bookwyrm/templates/book/file_links/edit_links.html:53
-#: bookwyrm/templates/book/file_links/verification_modal.html:25
+#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Signaler un spam"
@@ -1216,7 +1216,7 @@ msgstr "Vous quittez BookWyrm"
msgid "This link is taking you to: %(link_url)s
.
Is that where you'd like to go?"
msgstr "Ce lien vous amène à %(link_url)s
.
Est-ce là que vous souhaitez aller ?"
-#: bookwyrm/templates/book/file_links/verification_modal.html:20
+#: bookwyrm/templates/book/file_links/verification_modal.html:26
#: bookwyrm/templates/setup/config.html:139
msgid "Continue"
msgstr "Continuer"
@@ -1292,7 +1292,7 @@ msgstr "Code de confirmation :"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:73
#: bookwyrm/templates/settings/dashboard/dashboard.html:116
-#: bookwyrm/templates/snippets/report_modal.html:52
+#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Valider"
@@ -1806,8 +1806,9 @@ msgid "No users found for \"%(query)s\""
msgstr "Aucun compte trouvé pour « %(query)s »"
#: bookwyrm/templates/groups/create_form.html:5
-msgid "Create Group"
-msgstr "Créer un Groupe"
+#: bookwyrm/templates/user/groups.html:17
+msgid "Create group"
+msgstr "Créer un groupe"
#: bookwyrm/templates/groups/created_text.html:4
#, python-format
@@ -1824,9 +1825,9 @@ msgstr "Supprimer ce groupe ?"
msgid "This action cannot be un-done"
msgstr "Cette action ne peut pas être annulée"
-#: bookwyrm/templates/groups/delete_group_modal.html:15
-#: bookwyrm/templates/lists/delete_list_modal.html:15
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:21
+#: bookwyrm/templates/groups/delete_group_modal.html:17
+#: bookwyrm/templates/lists/delete_list_modal.html:19
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:29
#: bookwyrm/templates/settings/announcements/announcement.html:23
#: bookwyrm/templates/settings/announcements/announcements.html:56
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
@@ -2298,7 +2299,7 @@ msgstr "Ajouter « %(title)s » à cette liste"
msgid "Suggest \"%(title)s\" for this list"
msgstr "Suggérer « %(title)s » pour cette liste"
-#: bookwyrm/templates/lists/add_item_modal.html:39
+#: bookwyrm/templates/lists/add_item_modal.html:41
#: bookwyrm/templates/lists/list.html:257
msgid "Suggest"
msgstr "Suggérer"
@@ -2468,7 +2469,7 @@ msgid "List position"
msgstr "Position"
#: bookwyrm/templates/lists/list.html:152
-#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
+#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:23
msgid "Set"
msgstr "Appliquer"
@@ -3923,8 +3924,8 @@ msgid "Copy the theme file into the bookwyrm/static/css/themes
dire
msgstr "Copiez le fichier de thème dans le répertoire bookwyrm/static/css/themes
de votre serveur depuis la ligne de commande."
#: bookwyrm/templates/settings/themes.html:32
-msgid "Run ./bw-dev compilescss
."
-msgstr "Exécutez ./bw-dev compilescss
."
+msgid "Run ./bw-dev collectstatic
."
+msgstr "Exécutez ./bw-dev collectstatic
."
#: bookwyrm/templates/settings/themes.html:35
msgid "Add the file name using the form below to make it available in the application interface."
@@ -4200,7 +4201,8 @@ msgid "Need help?"
msgstr "Besoin d’aide ?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-msgid "Create Shelf"
+#: bookwyrm/templates/shelf/shelf.html:72
+msgid "Create shelf"
msgstr "Créer une étagère"
#: bookwyrm/templates/shelf/edit_shelf_form.html:5
@@ -4216,10 +4218,6 @@ msgstr "Profil utilisateur·rice"
msgid "All books"
msgstr "Tous les livres"
-#: bookwyrm/templates/shelf/shelf.html:72
-msgid "Create shelf"
-msgstr "Créer une étagère"
-
#: bookwyrm/templates/shelf/shelf.html:96
#, python-format
msgid "%(formatted_count)s book"
@@ -4343,24 +4341,24 @@ msgstr "Répondre"
msgid "Content"
msgstr "Contenu"
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10
-msgid "Content warning:"
-msgstr "Avertissement sur le contenu :"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
-msgid "Spoilers ahead!"
-msgstr "Attention spoilers !"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_toggle.html:13
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:9
msgid "Include spoiler alert"
msgstr "Afficher une alerte spoiler"
-#: bookwyrm/templates/snippets/create_status/layout.html:47
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
+msgid "Spoilers/content warnings:"
+msgstr "Avertissements de contenu/spoilers :"
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:27
+msgid "Spoilers ahead!"
+msgstr "Attention spoilers !"
+
+#: bookwyrm/templates/snippets/create_status/layout.html:45
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Commentaire :"
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:18
msgid "Post"
msgstr "Publier"
@@ -4497,7 +4495,7 @@ msgstr "Critique de « %(book_title)s » : %(review_title)s"
#: bookwyrm/templates/snippets/goal_form.html:4
#, python-format
msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year."
-msgstr "Définissez un nombre de livre à lire comme objectif pour %(year)s, et suivezvotre progression au fil de l’année."
+msgstr "Définissez un nombre de livres à lire comme objectif pour %(year)s, et suivez votre progression au fil de l’année."
#: bookwyrm/templates/snippets/goal_form.html:16
msgid "Reading goal:"
@@ -4851,10 +4849,6 @@ msgstr "Vos Groupes"
msgid "Groups: %(username)s"
msgstr "Groupes : %(username)s"
-#: bookwyrm/templates/user/groups.html:17
-msgid "Create group"
-msgstr "Créer un groupe"
-
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "Profil"
diff --git a/locale/gl_ES/LC_MESSAGES/django.mo b/locale/gl_ES/LC_MESSAGES/django.mo
index 691d4246e087603ac0f44e63c0f842b22202e1a0..8958c625aa2159fb6d31240e3ad57c6309aa0a96 100644
GIT binary patch
delta 22785
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
delta 23057
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\n"
"Language-Team: Galician\n"
"Language: gl\n"
@@ -220,7 +220,7 @@ msgid "Followers"
msgstr "Seguidoras"
#: bookwyrm/models/fields.py:208
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:8
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:6
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
#: bookwyrm/templates/snippets/privacy_select.html:20
@@ -261,73 +261,73 @@ msgstr "Citas"
msgid "Everything else"
msgstr "As outras cousas"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home Timeline"
msgstr "Cronoloxía de Inicio"
-#: bookwyrm/settings.py:207
+#: bookwyrm/settings.py:208
msgid "Home"
msgstr "Inicio"
-#: bookwyrm/settings.py:208
+#: bookwyrm/settings.py:209
msgid "Books Timeline"
msgstr "Cronoloxía de libros"
-#: bookwyrm/settings.py:208 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/settings.py:209 bookwyrm/templates/search/layout.html:21
#: bookwyrm/templates/search/layout.html:42
#: bookwyrm/templates/user/layout.html:91
msgid "Books"
msgstr "Libros"
-#: bookwyrm/settings.py:280
+#: bookwyrm/settings.py:281
msgid "English"
msgstr "English (Inglés)"
-#: bookwyrm/settings.py:281
+#: bookwyrm/settings.py:282
msgid "Deutsch (German)"
msgstr "Alemán (Alemaña)"
-#: bookwyrm/settings.py:282
+#: bookwyrm/settings.py:283
msgid "Español (Spanish)"
msgstr "Español (España)"
-#: bookwyrm/settings.py:283
+#: bookwyrm/settings.py:284
msgid "Galego (Galician)"
msgstr "Galego (Galician)"
-#: bookwyrm/settings.py:284
+#: bookwyrm/settings.py:285
msgid "Italiano (Italian)"
msgstr "Italiano (Italian)"
-#: bookwyrm/settings.py:285
+#: bookwyrm/settings.py:286
msgid "Français (French)"
msgstr "Francés (Francia)"
-#: bookwyrm/settings.py:286
+#: bookwyrm/settings.py:287
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lithuanian)"
-#: bookwyrm/settings.py:287
+#: bookwyrm/settings.py:288
msgid "Norsk (Norwegian)"
msgstr "Noruegués (Norwegian)"
-#: bookwyrm/settings.py:288
+#: bookwyrm/settings.py:289
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugués brasileiro)"
-#: bookwyrm/settings.py:289
+#: bookwyrm/settings.py:290
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)"
-#: bookwyrm/settings.py:290
+#: bookwyrm/settings.py:291
msgid "Svenska (Swedish)"
msgstr "Sueco (Swedish)"
-#: bookwyrm/settings.py:291
+#: bookwyrm/settings.py:292
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chinés simplificado)"
-#: bookwyrm/settings.py:292
+#: bookwyrm/settings.py:293
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinés tradicional)"
@@ -727,14 +727,14 @@ msgstr "ISNI:"
#: bookwyrm/templates/author/edit_author.html:115
#: bookwyrm/templates/book/book.html:193
#: bookwyrm/templates/book/edit/edit_book.html:121
-#: bookwyrm/templates/book/file_links/add_link_modal.html:58
+#: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:82
-#: bookwyrm/templates/groups/form.html:30
+#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
#: bookwyrm/templates/lists/form.html:130
#: bookwyrm/templates/preferences/edit_user.html:136
-#: bookwyrm/templates/readthrough/readthrough_modal.html:72
+#: bookwyrm/templates/readthrough/readthrough_modal.html:74
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
@@ -748,20 +748,20 @@ msgstr "Gardar"
#: bookwyrm/templates/author/edit_author.html:116
#: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/book.html:194
-#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:123
#: bookwyrm/templates/book/edit/edit_book.html:126
#: bookwyrm/templates/book/file_links/add_link_modal.html:59
-#: bookwyrm/templates/book/file_links/verification_modal.html:21
+#: bookwyrm/templates/book/file_links/verification_modal.html:25
#: bookwyrm/templates/book/sync_modal.html:23
-#: bookwyrm/templates/groups/delete_group_modal.html:17
-#: bookwyrm/templates/lists/add_item_modal.html:42
-#: bookwyrm/templates/lists/delete_list_modal.html:18
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:23
+#: bookwyrm/templates/groups/delete_group_modal.html:15
+#: bookwyrm/templates/lists/add_item_modal.html:36
+#: bookwyrm/templates/lists/delete_list_modal.html:16
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:27
#: bookwyrm/templates/readthrough/readthrough_modal.html:73
#: bookwyrm/templates/settings/federation/instance.html:106
#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22
-#: bookwyrm/templates/snippets/report_modal.html:53
+#: bookwyrm/templates/snippets/report_modal.html:52
msgid "Cancel"
msgstr "Cancelar"
@@ -770,9 +770,9 @@ msgstr "Cancelar"
msgid "Loading data will connect to %(source_name)s and check for any metadata about this author which aren't present here. Existing metadata will not be overwritten."
msgstr "Ao cargar os datos vas conectar con %(source_name)s e comprobar se existen metadatos desta persoa autora que non están aquí presentes. Non se sobrescribirán os datos existentes."
-#: bookwyrm/templates/author/sync_modal.html:22
+#: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:108
-#: bookwyrm/templates/book/sync_modal.html:22
+#: bookwyrm/templates/book/sync_modal.html:24
#: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:42
#: bookwyrm/templates/snippets/remove_from_group_button.html:17
@@ -873,8 +873,8 @@ msgid "Add to list"
msgstr "Engadir a listaxe"
#: bookwyrm/templates/book/book.html:370
-#: bookwyrm/templates/book/cover_add_modal.html:31
-#: bookwyrm/templates/lists/add_item_modal.html:37
+#: bookwyrm/templates/book/cover_add_modal.html:32
+#: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
@@ -1182,7 +1182,7 @@ msgid "Actions"
msgstr "Accións"
#: bookwyrm/templates/book/file_links/edit_links.html:53
-#: bookwyrm/templates/book/file_links/verification_modal.html:25
+#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Denunciar spam"
@@ -1216,7 +1216,7 @@ msgstr "Saír de BookWyrm"
msgid "This link is taking you to:
%(link_url)s
.
Is that where you'd like to go?"
msgstr "Esta ligazón vaite levar a: %(link_url)s
.
É ahí a onde queres ir?"
-#: bookwyrm/templates/book/file_links/verification_modal.html:20
+#: bookwyrm/templates/book/file_links/verification_modal.html:26
#: bookwyrm/templates/setup/config.html:139
msgid "Continue"
msgstr "Continuar"
@@ -1292,7 +1292,7 @@ msgstr "Código de confirmación:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:73
#: bookwyrm/templates/settings/dashboard/dashboard.html:116
-#: bookwyrm/templates/snippets/report_modal.html:52
+#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Enviar"
@@ -1806,7 +1806,8 @@ msgid "No users found for \"%(query)s\""
msgstr "Non se atopan usuarias para \"%(query)s\""
#: bookwyrm/templates/groups/create_form.html:5
-msgid "Create Group"
+#: bookwyrm/templates/user/groups.html:17
+msgid "Create group"
msgstr "Crear grupo"
#: bookwyrm/templates/groups/created_text.html:4
@@ -1824,9 +1825,9 @@ msgstr "Eliminar este grupo?"
msgid "This action cannot be un-done"
msgstr "Esta acción non ten volta atrás"
-#: bookwyrm/templates/groups/delete_group_modal.html:15
-#: bookwyrm/templates/lists/delete_list_modal.html:15
-#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:21
+#: bookwyrm/templates/groups/delete_group_modal.html:17
+#: bookwyrm/templates/lists/delete_list_modal.html:19
+#: bookwyrm/templates/readthrough/delete_readthrough_modal.html:29
#: bookwyrm/templates/settings/announcements/announcement.html:23
#: bookwyrm/templates/settings/announcements/announcements.html:56
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49
@@ -2298,7 +2299,7 @@ msgstr "Engadir \"%(title)s\" a esta lista"
msgid "Suggest \"%(title)s\" for this list"
msgstr "Suxerir \"%(title)s\" para esta lista"
-#: bookwyrm/templates/lists/add_item_modal.html:39
+#: bookwyrm/templates/lists/add_item_modal.html:41
#: bookwyrm/templates/lists/list.html:257
msgid "Suggest"
msgstr "Suxire"
@@ -2468,7 +2469,7 @@ msgid "List position"
msgstr "Posición da lista"
#: bookwyrm/templates/lists/list.html:152
-#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:21
+#: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:23
msgid "Set"
msgstr "Establecer"
@@ -3923,8 +3924,8 @@ msgid "Copy the theme file into the bookwyrm/static/css/themes
dire
msgstr "Copia o ficheiro do decorado no cartafol bookwyrm/static/css/themes
do teu servidor usando a liña de comandos."
#: bookwyrm/templates/settings/themes.html:32
-msgid "Run ./bw-dev compilescss
."
-msgstr "Executa ./bw-dev compilescss
."
+msgid "Run ./bw-dev collectstatic
."
+msgstr ""
#: bookwyrm/templates/settings/themes.html:35
msgid "Add the file name using the form below to make it available in the application interface."
@@ -4200,8 +4201,9 @@ msgid "Need help?"
msgstr "Precisas axuda?"
#: bookwyrm/templates/shelf/create_shelf_form.html:5
-msgid "Create Shelf"
-msgstr "Crear Estante"
+#: bookwyrm/templates/shelf/shelf.html:72
+msgid "Create shelf"
+msgstr "Crear estante"
#: bookwyrm/templates/shelf/edit_shelf_form.html:5
msgid "Edit Shelf"
@@ -4216,10 +4218,6 @@ msgstr "Perfil da usuaria"
msgid "All books"
msgstr "Tódolos libros"
-#: bookwyrm/templates/shelf/shelf.html:72
-msgid "Create shelf"
-msgstr "Crear estante"
-
#: bookwyrm/templates/shelf/shelf.html:96
#, python-format
msgid "%(formatted_count)s book"
@@ -4343,24 +4341,24 @@ msgstr "Responder"
msgid "Content"
msgstr "Contido"
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10
-msgid "Content warning:"
-msgstr "Aviso sobre o contido:"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
-msgid "Spoilers ahead!"
-msgstr "Contén Spoilers!"
-
-#: bookwyrm/templates/snippets/create_status/content_warning_toggle.html:13
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:9
msgid "Include spoiler alert"
msgstr "Incluír alerta de spoiler"
-#: bookwyrm/templates/snippets/create_status/layout.html:47
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18
+msgid "Spoilers/content warnings:"
+msgstr ""
+
+#: bookwyrm/templates/snippets/create_status/content_warning_field.html:27
+msgid "Spoilers ahead!"
+msgstr "Contén Spoilers!"
+
+#: bookwyrm/templates/snippets/create_status/layout.html:45
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Comentario:"
-#: bookwyrm/templates/snippets/create_status/post_options_block.html:21
+#: bookwyrm/templates/snippets/create_status/post_options_block.html:18
msgid "Post"
msgstr "Publicación"
@@ -4851,10 +4849,6 @@ msgstr "Os teus grupos"
msgid "Groups: %(username)s"
msgstr "Grupos: %(username)s"
-#: bookwyrm/templates/user/groups.html:17
-msgid "Create group"
-msgstr "Crear grupo"
-
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "Perfil da usuaria"
diff --git a/locale/it_IT/LC_MESSAGES/django.mo b/locale/it_IT/LC_MESSAGES/django.mo
index 2be0c3ac01a7057cabd8b69e3f99520ca5e585ef..911ed76e7d249a6e33903385d49658f07dc52aed 100644
GIT binary patch
delta 22663
zcmYk^2Y8NGG>Z^sG6s0hcI;o~@EDk;}-
z1~+${f;a^8;#y3H7cmPy!djTJh2yA66D))CumE1frs&<$aoS-kJcxVnq2sttY%9mf
zOh)(Cj#C)Np$6KC>G3vZ!*^H&v$S!X3fKVa<1Ew!Z(|syZR21X{?M=hOn1%FJY>e+PC)Vp=@&}>X%|=ad4MyN8%!*G?JLUJK
z<7C9_sB~FmElwj$!}!idB1Q3MOocC1fKErpiG%?3$6~0Rs){|Z1CGH{m>uhPGCMc`
zzb3uP8q(QudXt`jjqnw=$C_Q(f9g2vh;STEKv&1%xSXD-86H8MVYY6bxi}4wMLF9r
zKZbO7oItFK1F;!K;c3)@-k~NM&40pi0an31I24_poWBMf*3+EnMbw$6@8vi#m>=_C
zN34g_Z2C{sQ6&G$aeT0VwI~LYE``akE~daH=!b1FIrc)85BQ4xSH>`#F$T4w$>@iR
zP~~e;9c{*>xCbL~KL+7lOoeaI7n8Ezsvm$UF(c|ov!g#2L6ui>iKs#?YZFvQ?a&W<
zpgJ6k0XWV&2i0yB`r{_dg+HS@et_E9MD+B}g-A`h32K2IQ1#sYL<$iZj@puV)Ii%%
zD?f_b;xnj;B%mgE6aDcqs-yR)o$>Bt225cM!ZhTEqS{AcG?qlhb)D`+^xiK-y&h*!
zTY3j|2VUcH%-`2sqO(|xbRz1K=I&=Y9*24zXQ6g(6>5UpP!l_hTrcMsMqttY8kh5L
zN<wW1~XEv`mQpxgi^gEvuI`ujk$rMFQX|AWeJHOTB_XAC0U3pEiJwR6)k
z1J1|fdjB^QNr$_U#X4tEA0QR~XC~Gj14#Eqb?BldIt#sV0jk3#sIA_KTF^0DehGE<
zf1r-?KI$m`MpqrZBccXL2Aj(ffSPeO)BuH06DWpSK{eDw8e%EzjJj+~QSIL0H<)sW
z8E^qAe<=py2Ah9i2>Y*@{9-c_P&;u2bs3+cR`eQ+V{$$`^B^r#H_-a%?+ffrc
zgqrXr^sE@w-`}YIUf6Q)VeG#O(hW0P8j3pm9M=4(Gc9JzE1*_T9W`)EYd4!e2s4pC
z5jBzTt=n-1>Eoy!Z!z3Vq=QRD1NKD~3`MPEw5>1$xo^%A48yb|%!-O)FzHgLiPS}%
zack68cSB9|f2jT@+44Cyy&Tov-C!e!uoM};VF3(^HMhDVYT)ojQ%0XaZ{BtEhn<
z+VX!B4)m`yJO(26!N21ylG-=l