From c77436fc12cde9919e896610c4e2c09dd5af6c7b Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 29 Mar 2023 20:15:09 -0700 Subject: [PATCH 001/114] Catch value errors when parsing imported ratings --- bookwyrm/models/import_job.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/bookwyrm/models/import_job.py b/bookwyrm/models/import_job.py index 5f564d390..92c7b240d 100644 --- a/bookwyrm/models/import_job.py +++ b/bookwyrm/models/import_job.py @@ -252,9 +252,12 @@ class ImportItem(models.Model): @property def rating(self): """x/5 star rating for a book""" - if self.normalized_data.get("rating"): + if not self.normalized_data.get("rating"): + return None + try: return float(self.normalized_data.get("rating")) - return None + except ValueError: + return None @property def date_added(self): From b1962ef75d71a1fdbf2fc9301499d2effad95a6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Wall=C3=B8e?= Date: Sat, 1 Apr 2023 11:23:27 +0200 Subject: [PATCH 002/114] Added command 'down', to bring down containers Added the command 'down', which can be used to bring down the docker containers. Equivalent to running 'docker-compose down' --- bw-dev | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bw-dev b/bw-dev index 9fae5dcde..7e2ef0b0f 100755 --- a/bw-dev +++ b/bw-dev @@ -77,6 +77,9 @@ case "$CMD" in up) docker-compose up --build "$@" ;; + down) + docker-compose down + ;; service_ports_web) prod_error docker-compose run --rm --service-ports web From 0495da07a4ceb8d3adfeb5a62b552405049b1de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Wall=C3=B8e?= Date: Tue, 4 Apr 2023 12:08:39 +0200 Subject: [PATCH 003/114] Update bw-dev Added 'down' to list of of commands --- bw-dev | 1 + 1 file changed, 1 insertion(+) diff --git a/bw-dev b/bw-dev index 7e2ef0b0f..b2a23d852 100755 --- a/bw-dev +++ b/bw-dev @@ -287,6 +287,7 @@ case "$CMD" in echo "Unrecognised command. Try:" echo " setup" echo " up [container]" + echo " down [container]" echo " service_ports_web" echo " initdb" echo " resetdb" From def58a3e18a29894ceea44e7a87235e74f7c04c2 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:12:58 -0400 Subject: [PATCH 004/114] spelling: activity Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/activitypub/test_quotation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/activitypub/test_quotation.py b/bookwyrm/tests/activitypub/test_quotation.py index c90348bc3..74728274b 100644 --- a/bookwyrm/tests/activitypub/test_quotation.py +++ b/bookwyrm/tests/activitypub/test_quotation.py @@ -1,4 +1,4 @@ -""" quotation activty object serializer class """ +""" quotation activity object serializer class """ import json import pathlib from unittest.mock import patch From 797d339132faaaeba05136af3b6e745aa6de07eb Mon Sep 17 00:00:00 2001 From: Jacob Torrey Date: Tue, 4 Apr 2023 16:01:53 +0000 Subject: [PATCH 005/114] Move the search request logic into the AbstractConnector to allow for more flexibility Signed-off-by: Jacob Torrey --- bookwyrm/connectors/abstract_connector.py | 37 +++++++++++++++++++++++ bookwyrm/connectors/connector_manager.py | 37 +---------------------- 2 files changed, 38 insertions(+), 36 deletions(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 0e04ffaf2..0dad48e9a 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -4,6 +4,8 @@ from urllib.parse import quote_plus import imghdr import logging import re +import aiohttp +import asyncio from django.core.files.base import ContentFile from django.db import transaction @@ -11,6 +13,7 @@ import requests from requests.exceptions import RequestException from bookwyrm import activitypub, models, settings +from bookwyrm.settings import SEARCH_TIMEOUT, USER_AGENT from .connector_manager import load_more_data, ConnectorException, raise_not_valid_url from .format_mappings import format_mappings @@ -57,6 +60,40 @@ class AbstractMinimalConnector(ABC): return list(self.parse_isbn_search_data(data))[:10] return list(self.parse_search_data(data, min_confidence))[:10] + async def get_results(self, session, url, min_confidence, query): + """try this specific connector""" + # pylint: disable=line-too-long + headers = { + "Accept": ( + 'application/json, application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"; charset=utf-8' + ), + "User-Agent": USER_AGENT, + } + params = {"min_confidence": min_confidence} + try: + async with session.get(url, headers=headers, params=params) as response: + if not response.ok: + logger.info("Unable to connect to %s: %s", url, response.reason) + return + + try: + raw_data = await response.json() + except aiohttp.client_exceptions.ContentTypeError as err: + logger.exception(err) + return + + return { + "connector": self, + "results": self.process_search_response( + query, raw_data, min_confidence + ), + } + except asyncio.TimeoutError: + logger.info("Connection timed out for url: %s", url) + except aiohttp.ClientError as err: + logger.info(err) + + @abstractmethod def get_or_create_book(self, remote_id): """pull up a book record by whatever means possible""" diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 4330d4ac2..8e85c37ee 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -21,41 +21,6 @@ logger = logging.getLogger(__name__) class ConnectorException(HTTPError): """when the connector can't do what was asked""" - -async def get_results(session, url, min_confidence, query, connector): - """try this specific connector""" - # pylint: disable=line-too-long - headers = { - "Accept": ( - 'application/json, application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"; charset=utf-8' - ), - "User-Agent": USER_AGENT, - } - params = {"min_confidence": min_confidence} - try: - async with session.get(url, headers=headers, params=params) as response: - if not response.ok: - logger.info("Unable to connect to %s: %s", url, response.reason) - return - - try: - raw_data = await response.json() - except aiohttp.client_exceptions.ContentTypeError as err: - logger.exception(err) - return - - return { - "connector": connector, - "results": connector.process_search_response( - query, raw_data, min_confidence - ), - } - except asyncio.TimeoutError: - logger.info("Connection timed out for url: %s", url) - except aiohttp.ClientError as err: - logger.info(err) - - async def async_connector_search(query, items, min_confidence): """Try a number of requests simultaneously""" timeout = aiohttp.ClientTimeout(total=SEARCH_TIMEOUT) @@ -64,7 +29,7 @@ async def async_connector_search(query, items, min_confidence): for url, connector in items: tasks.append( asyncio.ensure_future( - get_results(session, url, min_confidence, query, connector) + connector.get_results(session, url, min_confidence, query) ) ) From f9c75a43aed3a5a8650e18418a983db9c71a4227 Mon Sep 17 00:00:00 2001 From: Jacob Torrey Date: Tue, 4 Apr 2023 16:46:32 +0000 Subject: [PATCH 006/114] Fixing pylint issues Signed-off-by: Jacob Torrey --- bookwyrm/connectors/abstract_connector.py | 14 +++++++------- bookwyrm/connectors/connector_manager.py | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 0dad48e9a..b023caff9 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -4,16 +4,16 @@ from urllib.parse import quote_plus import imghdr import logging import re -import aiohttp import asyncio +import requests +from requests.exceptions import RequestException +import aiohttp from django.core.files.base import ContentFile from django.db import transaction -import requests -from requests.exceptions import RequestException from bookwyrm import activitypub, models, settings -from bookwyrm.settings import SEARCH_TIMEOUT, USER_AGENT +from bookwyrm.settings import USER_AGENT from .connector_manager import load_more_data, ConnectorException, raise_not_valid_url from .format_mappings import format_mappings @@ -75,13 +75,13 @@ class AbstractMinimalConnector(ABC): if not response.ok: logger.info("Unable to connect to %s: %s", url, response.reason) return - + try: raw_data = await response.json() except aiohttp.client_exceptions.ContentTypeError as err: logger.exception(err) return - + return { "connector": self, "results": self.process_search_response( @@ -93,7 +93,7 @@ class AbstractMinimalConnector(ABC): except aiohttp.ClientError as err: logger.info(err) - + @abstractmethod def get_or_create_book(self, remote_id): """pull up a book record by whatever means possible""" diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 8e85c37ee..304baf91e 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -12,7 +12,7 @@ from django.db.models import signals from requests import HTTPError from bookwyrm import book_search, models -from bookwyrm.settings import SEARCH_TIMEOUT, USER_AGENT +from bookwyrm.settings import SEARCH_TIMEOUT from bookwyrm.tasks import app, LOW logger = logging.getLogger(__name__) From 118b5bfda73812b9c32cec9b31c096cdcccd13e1 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Tue, 4 Apr 2023 14:21:08 -0400 Subject: [PATCH 007/114] Add more information to get_audience telemetry This will assist with debugging #2720, by letting us see which kinds of requests take the longest. --- bookwyrm/activitystreams.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 74471883e..4bac49957 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -102,8 +102,15 @@ class ActivityStream(RedisStore): """go from zero to a timeline""" self.populate_store(self.stream_id(user.id)) + @tracer.start_as_current_span("ActivityStream._get_audience") def _get_audience(self, status): # pylint: disable=no-self-use """given a status, what users should see it""" + trace.get_current_span().set_attribute("status_type", status.status_type) + trace.get_current_span().set_attribute("status_privacy", status.privacy) + trace.get_current_span().set_attribute( + "status_reply_parent_privacy", + status.reply_parent.privacy if status.reply_parent else None, + ) # direct messages don't appeard in feeds, direct comments/reviews/etc do if status.privacy == "direct" and status.status_type == "Note": return [] From 94c573b469c31d383090fca151450ab3b2e2bb36 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 20:02:47 -0400 Subject: [PATCH 008/114] spelling: appear Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/activitystreams.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 74471883e..7f6a8d105 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -104,7 +104,7 @@ class ActivityStream(RedisStore): def _get_audience(self, status): # pylint: disable=no-self-use """given a status, what users should see it""" - # direct messages don't appeard in feeds, direct comments/reviews/etc do + # direct messages don't appear in feeds, direct comments/reviews/etc do if status.privacy == "direct" and status.status_type == "Note": return [] From 06fa1adc27d55544daf7f9935f003e881c653082 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:12:59 -0400 Subject: [PATCH 009/114] spelling: arbitrary Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/connectors/connector_manager.py | 2 +- bookwyrm/templatetags/utilities.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 4330d4ac2..d7e2aad4b 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -73,7 +73,7 @@ async def async_connector_search(query, items, min_confidence): def search(query, min_confidence=0.1, return_first=False): - """find books based on arbitary keywords""" + """find books based on arbitrary keywords""" if not query: return [] results = [] diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py index 834d39a14..4aaf6b8a7 100644 --- a/bookwyrm/templatetags/utilities.py +++ b/bookwyrm/templatetags/utilities.py @@ -19,7 +19,7 @@ def get_uuid(identifier): @register.simple_tag(takes_context=False) def join(*args): - """concatenate an arbitary set of values""" + """concatenate an arbitrary set of values""" return "_".join(str(a) for a in args) From 319be60c8041bc64bf48f30300f28090d603290a Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:00 -0400 Subject: [PATCH 010/114] spelling: assigning Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/fields.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index 6cfe4c10c..cd967c393 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -71,7 +71,7 @@ class ActivitypubFieldMixin: def set_field_from_activity( self, instance, data, overwrite=True, allow_external_connections=True ): - """helper function for assinging a value to the field. Returns if changed""" + """helper function for assigning a value to the field. Returns if changed""" try: value = getattr(data, self.get_activitypub_field()) except AttributeError: @@ -431,7 +431,7 @@ class ImageField(ActivitypubFieldMixin, models.ImageField): def set_field_from_activity( self, instance, data, save=True, overwrite=True, allow_external_connections=True ): - """helper function for assinging a value to the field""" + """helper function for assigning a value to the field""" value = getattr(data, self.get_activitypub_field()) formatted = self.field_from_activity( value, allow_external_connections=allow_external_connections From b3edeca295e380f188eaaac8c6cf953f767f439b Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:00 -0400 Subject: [PATCH 011/114] spelling: associated Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/link.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/link.py b/bookwyrm/models/link.py index 56b096bc2..d334a9d29 100644 --- a/bookwyrm/models/link.py +++ b/bookwyrm/models/link.py @@ -31,7 +31,7 @@ class Link(ActivitypubMixin, BookWyrmModel): @property def name(self): - """link name via the assocaited domain""" + """link name via the associated domain""" return self.domain.name def save(self, *args, **kwargs): From 54285e4bcde9a110f41a7a330a6809102de40ef7 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:01 -0400 Subject: [PATCH 012/114] spelling: auxiliary Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/activitypub_mixin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 83ca90b0a..36685152e 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -235,7 +235,7 @@ class ObjectMixin(ActivitypubMixin): self.broadcast(activity, user, software=software, queue=priority) except AttributeError: # janky as heck, this catches the mutliple inheritence chain - # for boosts and ignores this auxilliary broadcast + # for boosts and ignores this auxiliary broadcast return return From fb74c1977ebb27727a673ce8fd51e95064c71414 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:02 -0400 Subject: [PATCH 013/114] spelling: because Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/views/status.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index a8c874c13..e3a7481f8 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -232,7 +232,7 @@ def find_mentions(user, content): if not content: return {} # The regex has nested match groups, so the 0th entry has the full (outer) match - # And beacuse the strict username starts with @, the username is 1st char onward + # And because the strict username starts with @, the username is 1st char onward usernames = [m[0][1:] for m in re.findall(regex.STRICT_USERNAME, content)] known_users = ( From 72c292d2c3a7eddfc55994828c6e3aae920654b2 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:02 -0400 Subject: [PATCH 014/114] spelling: breakpoints Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/static/css/bookwyrm/components/_book_cover.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/static/css/bookwyrm/components/_book_cover.scss b/bookwyrm/static/css/bookwyrm/components/_book_cover.scss index d1125197e..db9391cc1 100644 --- a/bookwyrm/static/css/bookwyrm/components/_book_cover.scss +++ b/bookwyrm/static/css/bookwyrm/components/_book_cover.scss @@ -5,7 +5,7 @@ * - .book-cover is positioned and sized based on its container. * * To have the cover within specific dimensions, specify a width or height for - * standard bulma’s named breapoints: + * standard bulma’s named breakpoints: * * `is-(w|h)-(auto|xs|s|m|l|xl|xxl)[-(mobile|tablet|desktop)]` * From be31a4b576b906a02128c183faba96876ea0882e Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:20:55 -0400 Subject: [PATCH 015/114] spelling: creating Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/views/books/edit_book.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/books/edit_book.py b/bookwyrm/views/books/edit_book.py index 167bd4b46..97b012db8 100644 --- a/bookwyrm/views/books/edit_book.py +++ b/bookwyrm/views/books/edit_book.py @@ -154,7 +154,7 @@ def add_authors(request, data): data["author_matches"] = [] data["isni_matches"] = [] - # creting a book or adding an author to a book needs another step + # creating a book or adding an author to a book needs another step data["confirm_mode"] = True # this isn't preserved because it isn't part of the form obj data["remove_authors"] = request.POST.getlist("remove_authors") From 6b0e51caf45b19abe527dc70c4e643a7c9c5697f Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:03 -0400 Subject: [PATCH 016/114] spelling: currently Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/templatetags/test_rating_tags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/templatetags/test_rating_tags.py b/bookwyrm/tests/templatetags/test_rating_tags.py index a06ee9402..5abfa471a 100644 --- a/bookwyrm/tests/templatetags/test_rating_tags.py +++ b/bookwyrm/tests/templatetags/test_rating_tags.py @@ -41,7 +41,7 @@ class RatingTags(TestCase): @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_get_rating(self, *_): """privacy filtered rating. Commented versions are how it ought to work with - subjective ratings, which are currenly not used for performance reasons.""" + subjective ratings, which are currently not used for performance reasons.""" # follows-only: not included models.ReviewRating.objects.create( user=self.remote_user, From cfe388896bb88fbe0fc36ee5d90cb7594e97c136 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:04 -0400 Subject: [PATCH 017/114] spelling: dashboard Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/views/admin/dashboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/admin/dashboard.py b/bookwyrm/views/admin/dashboard.py index b49c5a238..9d256fc6c 100644 --- a/bookwyrm/views/admin/dashboard.py +++ b/bookwyrm/views/admin/dashboard.py @@ -76,7 +76,7 @@ class Dashboard(View): def get_charts_and_stats(request): - """Defines the dashbaord charts""" + """Defines the dashboard charts""" interval = int(request.GET.get("days", 1)) now = timezone.now() start = request.GET.get("start") From 9ea5a3b89c1202f18343a65cd55d9461e42880b8 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:03 -0400 Subject: [PATCH 018/114] spelling: data Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/connectors/inventaire.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index a330b2c4a..f3e24c0ec 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -97,7 +97,7 @@ class Connector(AbstractConnector): ) def parse_isbn_search_data(self, data): - """got some daaaata""" + """got some data""" results = data.get("entities") if not results: return From c2022acf67457caf377d01a48ceec05ceef9393a Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:04 -0400 Subject: [PATCH 019/114] spelling: deduplicate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/management/commands/deduplicate_book_data.py | 2 +- bookwyrm/management/commands/remove_editions.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/management/commands/deduplicate_book_data.py b/bookwyrm/management/commands/deduplicate_book_data.py index ed01a7843..5c5888d36 100644 --- a/bookwyrm/management/commands/deduplicate_book_data.py +++ b/bookwyrm/management/commands/deduplicate_book_data.py @@ -68,7 +68,7 @@ def dedupe_model(model): class Command(BaseCommand): - """dedplucate allllll the book data models""" + """deduplicate allllll the book data models""" help = "merges duplicate book data" # pylint: disable=no-self-use,unused-argument diff --git a/bookwyrm/management/commands/remove_editions.py b/bookwyrm/management/commands/remove_editions.py index 9eb9b7da8..ee7253543 100644 --- a/bookwyrm/management/commands/remove_editions.py +++ b/bookwyrm/management/commands/remove_editions.py @@ -33,7 +33,7 @@ def remove_editions(): class Command(BaseCommand): - """dedplucate allllll the book data models""" + """deduplicate allllll the book data models""" help = "merges duplicate book data" # pylint: disable=no-self-use,unused-argument From 9cad11b2b341d7fb8dc7f3ef1a025aef488337e7 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:05 -0400 Subject: [PATCH 020/114] spelling: deduplication Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/activitypub_mixin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 36685152e..7f444b673 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -91,7 +91,7 @@ class ActivitypubMixin: @classmethod def find_existing(cls, data): - """compare data to fields that can be used for deduplation. + """compare data to fields that can be used for deduplication. This always includes remote_id, but can also be unique identifiers like an isbn for an edition""" filters = [] From 45a1457a4f7ec034644f484954b820f02284a4d5 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:06 -0400 Subject: [PATCH 021/114] spelling: deduplications Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/management/commands/deduplicate_book_data.py | 2 +- bookwyrm/management/commands/remove_editions.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/management/commands/deduplicate_book_data.py b/bookwyrm/management/commands/deduplicate_book_data.py index 5c5888d36..5ca8496b0 100644 --- a/bookwyrm/management/commands/deduplicate_book_data.py +++ b/bookwyrm/management/commands/deduplicate_book_data.py @@ -73,7 +73,7 @@ class Command(BaseCommand): help = "merges duplicate book data" # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): - """run deudplications""" + """run deduplications""" dedupe_model(models.Edition) dedupe_model(models.Work) dedupe_model(models.Author) diff --git a/bookwyrm/management/commands/remove_editions.py b/bookwyrm/management/commands/remove_editions.py index ee7253543..5cb430a93 100644 --- a/bookwyrm/management/commands/remove_editions.py +++ b/bookwyrm/management/commands/remove_editions.py @@ -38,5 +38,5 @@ class Command(BaseCommand): help = "merges duplicate book data" # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): - """run deudplications""" + """run deduplications""" remove_editions() From c92cdec36e58f2fc73d33ff7400b8968d45e1727 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:05 -0400 Subject: [PATCH 022/114] spelling: default Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- .env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 3b541eb7c..fb0f7308d 100644 --- a/.env.example +++ b/.env.example @@ -8,7 +8,7 @@ USE_HTTPS=true DOMAIN=your.domain.here EMAIL=your@email.here -# Instance defualt language (see options at bookwyrm/settings.py "LANGUAGES" +# Instance default language (see options at bookwyrm/settings.py "LANGUAGES" LANGUAGE_CODE="en-us" # Used for deciding which editions to prefer DEFAULT_LANGUAGE="English" From f6a6cb281b3e0a6115c55ed5d045eb566a9ac79d Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:21:10 -0400 Subject: [PATCH 023/114] spelling: different Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index cd967c393..6fd94d019 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -221,7 +221,7 @@ PrivacyLevels = [ class PrivacyField(ActivitypubFieldMixin, models.CharField): - """this maps to two differente activitypub fields""" + """this maps to two different activitypub fields""" public = "https://www.w3.org/ns/activitystreams#Public" From 8d4b69927bbd0bb956d74cd25ceadfb03bb8892d Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:06 -0400 Subject: [PATCH 024/114] spelling: directly Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/connectors/abstract_connector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 0e04ffaf2..ccb987ee2 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -321,7 +321,7 @@ def infer_physical_format(format_text): def unique_physical_format(format_text): - """only store the format if it isn't diretly in the format mappings""" + """only store the format if it isn't directly in the format mappings""" format_text = format_text.lower() if format_text in format_mappings: # try a direct match, so saving this would be redundant From 3850183e953f25f5efec50716ce89f4938f7c7d4 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:07 -0400 Subject: [PATCH 025/114] spelling: doesn't Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/views/inbox/test_inbox_delete.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/tests/views/inbox/test_inbox_delete.py b/bookwyrm/tests/views/inbox/test_inbox_delete.py index b4863aad5..0fb108e22 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_delete.py +++ b/bookwyrm/tests/views/inbox/test_inbox_delete.py @@ -58,7 +58,7 @@ class InboxActivities(TestCase): with patch("bookwyrm.activitystreams.remove_status_task.delay") as redis_mock: views.inbox.activity_task(activity) self.assertTrue(redis_mock.called) - # deletion doens't remove the status, it turns it into a tombstone + # deletion doesn't remove the status, it turns it into a tombstone status = models.Status.objects.get() self.assertTrue(status.deleted) self.assertIsInstance(status.deleted_date, datetime) @@ -87,7 +87,7 @@ class InboxActivities(TestCase): with patch("bookwyrm.activitystreams.remove_status_task.delay") as redis_mock: views.inbox.activity_task(activity) self.assertTrue(redis_mock.called) - # deletion doens't remove the status, it turns it into a tombstone + # deletion doesn't remove the status, it turns it into a tombstone status = models.Status.objects.get() self.assertTrue(status.deleted) self.assertIsInstance(status.deleted_date, datetime) From b949259c5760b2cd6f607bd5128b3384e146a991 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:08 -0400 Subject: [PATCH 026/114] spelling: embedded Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/views/list/embed.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/list/embed.py b/bookwyrm/views/list/embed.py index 9d0078b65..a62c9c1ba 100644 --- a/bookwyrm/views/list/embed.py +++ b/bookwyrm/views/list/embed.py @@ -14,7 +14,7 @@ from bookwyrm.settings import PAGE_LENGTH # pylint: disable=no-self-use class EmbedList(View): - """embeded book list page""" + """embedded book list page""" def get(self, request, list_id, list_key): """display a book list""" From 445cb60f2c7962806bdc6473d746cda30204b7d0 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:08 -0400 Subject: [PATCH 027/114] spelling: example Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/models/test_fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py index 961fbd522..e5ca56a37 100644 --- a/bookwyrm/tests/models/test_fields.py +++ b/bookwyrm/tests/models/test_fields.py @@ -125,7 +125,7 @@ class ModelFields(TestCase): instance.run_validators("@example.com") instance.run_validators("mouse@examplecom") instance.run_validators("one two@fish.aaaa") - instance.run_validators("a*&@exampke.com") + instance.run_validators("a*&@example.com") instance.run_validators("trailingwhite@example.com ") self.assertIsNone(instance.run_validators("mouse@example.com")) self.assertIsNone(instance.run_validators("mo-2use@ex3ample.com")) From 3b9828c0fc6618512e2e808a1ecdd286023eb332 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:09 -0400 Subject: [PATCH 028/114] spelling: existing Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/views/test_status.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index 7c64fdb0c..7e749112c 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -356,12 +356,12 @@ class StatusViews(TestCase): self.assertEqual(len(hashtags), 2) self.assertEqual(list(status.mention_hashtags.all()), list(hashtags)) - hashtag_exising = models.Hashtag.objects.filter(name="#existing").first() + hashtag_existing = models.Hashtag.objects.filter(name="#existing").first() hashtag_new = models.Hashtag.objects.filter(name="#NewTag").first() self.assertEqual( status.content, "

this is an " - + f'' + + f'' + "#EXISTING hashtag but all uppercase, this one is " + f'' + "#NewTag.

", From 050cd583df24a0bd62116058b6d402bb6bfbeb1d Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:09 -0400 Subject: [PATCH 029/114] spelling: expiration Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/forms/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/forms/admin.py b/bookwyrm/forms/admin.py index 1ad158119..72f50ccb8 100644 --- a/bookwyrm/forms/admin.py +++ b/bookwyrm/forms/admin.py @@ -15,7 +15,7 @@ from .custom_form import CustomForm, StyledForm # pylint: disable=missing-class-docstring class ExpiryWidget(widgets.Select): def value_from_datadict(self, data, files, name): - """human-readable exiration time buckets""" + """human-readable expiration time buckets""" selected_string = super().value_from_datadict(data, files, name) if selected_string == "day": From 9c5d588630035ff1d790300b94b26fc369d5cca1 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:10 -0400 Subject: [PATCH 030/114] spelling: fields Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/models/test_fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py index e5ca56a37..d58cf97af 100644 --- a/bookwyrm/tests/models/test_fields.py +++ b/bookwyrm/tests/models/test_fields.py @@ -29,7 +29,7 @@ from bookwyrm.settings import DOMAIN @patch("bookwyrm.activitystreams.populate_stream_task.delay") @patch("bookwyrm.lists_stream.populate_lists_task.delay") class ModelFields(TestCase): - """overwrites standard model feilds to work with activitypub""" + """overwrites standard model fields to work with activitypub""" def test_validate_remote_id(self, *_): """should look like a url""" From 802a150c7651cef541fcb823be9f0b5ea9c45dfa Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:10 -0400 Subject: [PATCH 031/114] spelling: flex Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/templates/settings/dashboard/dashboard.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/settings/dashboard/dashboard.html b/bookwyrm/templates/settings/dashboard/dashboard.html index 99c0e9621..ead0d275e 100644 --- a/bookwyrm/templates/settings/dashboard/dashboard.html +++ b/bookwyrm/templates/settings/dashboard/dashboard.html @@ -16,7 +16,7 @@

{{ users|intcomma }}

-
+

{% trans "Active this month" %}

{{ active_users|intcomma }}

From 7f8279fe543634920cdd6af9d4b38ca59d08ed26 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:11 -0400 Subject: [PATCH 032/114] spelling: format Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/connectors/abstract_connector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index ccb987ee2..bbe40f928 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -52,7 +52,7 @@ class AbstractMinimalConnector(ABC): return f"{self.search_url}{quote_plus(query)}" def process_search_response(self, query, data, min_confidence): - """Format the search results based on the formt of the query""" + """Format the search results based on the format of the query""" if maybe_isbn(query): return list(self.parse_isbn_search_data(data))[:10] return list(self.parse_search_data(data, min_confidence))[:10] From cee2de41cab7c4ffeecba53bbdee3bdbdb2c589f Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:11 -0400 Subject: [PATCH 033/114] spelling: handling Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/connectors/test_openlibrary_connector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/connectors/test_openlibrary_connector.py b/bookwyrm/tests/connectors/test_openlibrary_connector.py index 05ba39ab9..01b9b9f6a 100644 --- a/bookwyrm/tests/connectors/test_openlibrary_connector.py +++ b/bookwyrm/tests/connectors/test_openlibrary_connector.py @@ -46,7 +46,7 @@ class Openlibrary(TestCase): data = {"key": "/work/OL1234W"} result = self.connector.get_remote_id_from_data(data) self.assertEqual(result, "https://openlibrary.org/work/OL1234W") - # error handlding + # error handling with self.assertRaises(ConnectorException): self.connector.get_remote_id_from_data({}) From 7ec56505ea7a0f7eed9088f1283497d76070f71c Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:23:49 -0400 Subject: [PATCH 034/114] spelling: having a Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/book.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index a5be51a29..4e7ffcad3 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -321,7 +321,7 @@ class Edition(Book): def get_rank(self): """calculate how complete the data is on this edition""" rank = 0 - # big ups for havinga cover + # big ups for having a cover rank += int(bool(self.cover)) * 3 # is it in the instance's preferred language? rank += int(bool(DEFAULT_LANGUAGE in self.languages)) From d2d087dcb7d268036d115e9248ef4a9a92317a56 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 12:22:08 -0400 Subject: [PATCH 035/114] spelling: identifiername Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/templatetags/shelf_tags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templatetags/shelf_tags.py b/bookwyrm/templatetags/shelf_tags.py index 1fb799883..6166cd6f1 100644 --- a/bookwyrm/templatetags/shelf_tags.py +++ b/bookwyrm/templatetags/shelf_tags.py @@ -37,7 +37,7 @@ def get_next_shelf(current_shelf): @register.filter(name="translate_shelf_name") def get_translated_shelf_name(shelf): - """produced translated shelf nidentifierame""" + """produced translated shelf identifiername""" if not shelf: return "" # support obj or dict From 649c782782c2fdc8c6614b1682143fdf16092b5e Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:12 -0400 Subject: [PATCH 036/114] spelling: inheritance Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/activitypub_mixin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 7f444b673..06f68068b 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -234,7 +234,7 @@ class ObjectMixin(ActivitypubMixin): activity = self.to_create_activity(user) self.broadcast(activity, user, software=software, queue=priority) except AttributeError: - # janky as heck, this catches the mutliple inheritence chain + # janky as heck, this catches the mutliple inheritance chain # for boosts and ignores this auxiliary broadcast return return From e8894b159fd4ad3520068de6e606e6c3503e620a Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:13 -0400 Subject: [PATCH 037/114] spelling: irrelevant Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/test_postgres.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/test_postgres.py b/bookwyrm/tests/test_postgres.py index 94a8090f4..95ed06b0c 100644 --- a/bookwyrm/tests/test_postgres.py +++ b/bookwyrm/tests/test_postgres.py @@ -30,7 +30,7 @@ class PostgresTriggers(TestCase): title="The Long Goodbye", subtitle="wow cool", series="series name", - languages=["irrelevent"], + languages=["irrelevant"], ) book.authors.add(author) book.refresh_from_db() From 132010870364c6f2c0784d194882b6c6a0372cfb Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:13 -0400 Subject: [PATCH 038/114] spelling: markdown Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/templatetags/test_markdown.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/templatetags/test_markdown.py b/bookwyrm/tests/templatetags/test_markdown.py index ba283a4f2..5b5959ad3 100644 --- a/bookwyrm/tests/templatetags/test_markdown.py +++ b/bookwyrm/tests/templatetags/test_markdown.py @@ -7,7 +7,7 @@ class MarkdownTags(TestCase): """lotta different things here""" def test_get_markdown(self): - """mardown format data""" + """markdown format data""" result = markdown.get_markdown("_hi_") self.assertEqual(result, "

hi

") From c216937dc4649193fc9ad8866e72aa56c8c51904 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:14 -0400 Subject: [PATCH 039/114] spelling: massively Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index 6fd94d019..df4bb2e4a 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -75,7 +75,7 @@ class ActivitypubFieldMixin: try: value = getattr(data, self.get_activitypub_field()) except AttributeError: - # masssively hack-y workaround for boosts + # massively hack-y workaround for boosts if self.get_activitypub_field() != "attributedTo": raise value = getattr(data, "actor") From 0b30373bd3154c2b3d67790f455f554c2505cfe0 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:15 -0400 Subject: [PATCH 040/114] spelling: mention'd Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/views/test_status.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index 7e749112c..5874d9f2f 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -234,7 +234,7 @@ class StatusViews(TestCase): ) def test_create_status_reply_with_mentions(self, *_): - """reply to a post with an @mention'ed user""" + """reply to a post with an @mention'd user""" view = views.CreateStatus.as_view() user = models.User.objects.create_user( "rat", "rat@rat.com", "password", local=True, localname="rat" From 40632b2486326316ee7b1d4a73248a31a29ea162 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:15 -0400 Subject: [PATCH 041/114] spelling: multiple Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/activitypub_mixin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 06f68068b..f8268b22a 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -25,7 +25,7 @@ from bookwyrm.tasks import app, MEDIUM, BROADCAST from bookwyrm.models.fields import ImageField, ManyToManyField logger = logging.getLogger(__name__) -# I tried to separate these classes into mutliple files but I kept getting +# I tried to separate these classes into multiple files but I kept getting # circular import errors so I gave up. I'm sure it could be done though! PropertyField = namedtuple("PropertyField", ("set_activity_from_field")) @@ -234,7 +234,7 @@ class ObjectMixin(ActivitypubMixin): activity = self.to_create_activity(user) self.broadcast(activity, user, software=software, queue=priority) except AttributeError: - # janky as heck, this catches the mutliple inheritance chain + # janky as heck, this catches the multiple inheritance chain # for boosts and ignores this auxiliary broadcast return return From d640bc9b1c708832a43663389a00474497fa255b Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:16 -0400 Subject: [PATCH 042/114] spelling: nonexistent Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/views/landing/test_password.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/views/landing/test_password.py b/bookwyrm/tests/views/landing/test_password.py index c7c7e05d5..c1adf61e9 100644 --- a/bookwyrm/tests/views/landing/test_password.py +++ b/bookwyrm/tests/views/landing/test_password.py @@ -72,7 +72,7 @@ class PasswordViews(TestCase): validate_html(result.render()) self.assertEqual(result.status_code, 200) - def test_password_reset_nonexistant_code(self): + def test_password_reset_nonexistent_code(self): """there are so many views, this just makes sure it LOADS""" view = views.PasswordReset.as_view() request = self.factory.get("") From d9a305a0f2428a87dd768b59f027b375d5f97d92 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 18:29:51 -0400 Subject: [PATCH 043/114] spelling: optimizequality Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/static/css/bookwyrm/components/_book_cover.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/static/css/bookwyrm/components/_book_cover.scss b/bookwyrm/static/css/bookwyrm/components/_book_cover.scss index db9391cc1..48b564a0b 100644 --- a/bookwyrm/static/css/bookwyrm/components/_book_cover.scss +++ b/bookwyrm/static/css/bookwyrm/components/_book_cover.scss @@ -43,7 +43,7 @@ max-height: 100%; /* Useful when stretching under-sized images. */ - image-rendering: optimizequality; + image-rendering: optimizeQuality; image-rendering: smooth; } From 56f38c178c4f4c68e856ad42d9ebc7832f49ef28 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:16 -0400 Subject: [PATCH 044/114] spelling: ordered Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/activitypub_mixin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index f8268b22a..295807e21 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -339,7 +339,7 @@ class OrderedCollectionPageMixin(ObjectMixin): activity["id"] = remote_id paginated = Paginator(queryset, PAGE_LENGTH) - # add computed fields specific to orderd collections + # add computed fields specific to ordered collections activity["totalItems"] = paginated.count activity["first"] = f"{remote_id}?page=1" activity["last"] = f"{remote_id}?page={paginated.num_pages}" From c009f6e4dfae0bdf1bddf91daf1f238382590c9d Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:17 -0400 Subject: [PATCH 045/114] spelling: overridden Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/activitypub_mixin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 295807e21..96002d4e0 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -311,7 +311,7 @@ class OrderedCollectionPageMixin(ObjectMixin): @property def collection_remote_id(self): - """this can be overriden if there's a special remote id, ie outbox""" + """this can be overridden if there's a special remote id, ie outbox""" return self.remote_id def to_ordered_collection( From 7b59f38cc8ebe19f3795c1b34b032e4f77ab2a7b Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 18:32:13 -0400 Subject: [PATCH 046/114] spelling: owner Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/lists_stream.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/lists_stream.py b/bookwyrm/lists_stream.py index 7426488ce..2881e4880 100644 --- a/bookwyrm/lists_stream.py +++ b/bookwyrm/lists_stream.py @@ -86,14 +86,14 @@ class ListsStream(RedisStore): if group: audience = audience.filter( Q(id=book_list.user.id) # if the user is the list's owner - | Q(following=book_list.user) # if the user is following the pwmer + | Q(following=book_list.user) # if the user is following the owner # if a user is in the group | Q(memberships__group__id=book_list.group.id) ) else: audience = audience.filter( Q(id=book_list.user.id) # if the user is the list's owner - | Q(following=book_list.user) # if the user is following the pwmer + | Q(following=book_list.user) # if the user is following the owner ) return audience.distinct() From 9cddea11c774882139357b4dd142e58b423f3907 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:17 -0400 Subject: [PATCH 047/114] spelling: paginate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/activitypub_mixin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 96002d4e0..44f2919dd 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -565,7 +565,7 @@ async def sign_and_send( def to_ordered_collection_page( queryset, remote_id, id_only=False, page=1, pure=False, **kwargs ): - """serialize and pagiante a queryset""" + """serialize and paginate a queryset""" paginated = Paginator(queryset, PAGE_LENGTH) activity_page = paginated.get_page(page) From 44b4b10eb88b2705bc14e912bdc7dfd2e1e1681d Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:18 -0400 Subject: [PATCH 048/114] spelling: password Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- ...06_auto_20200221_1702_squashed_0064_merge_20201101_1913.py | 2 +- bookwyrm/models/site.py | 4 ++-- bookwyrm/tests/views/landing/test_login.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bookwyrm/migrations/0006_auto_20200221_1702_squashed_0064_merge_20201101_1913.py b/bookwyrm/migrations/0006_auto_20200221_1702_squashed_0064_merge_20201101_1913.py index c06fa40a0..f25bafe15 100644 --- a/bookwyrm/migrations/0006_auto_20200221_1702_squashed_0064_merge_20201101_1913.py +++ b/bookwyrm/migrations/0006_auto_20200221_1702_squashed_0064_merge_20201101_1913.py @@ -1467,7 +1467,7 @@ class Migration(migrations.Migration): ( "expiry", models.DateTimeField( - default=bookwyrm.models.site.get_passowrd_reset_expiry + default=bookwyrm.models.site.get_password_reset_expiry ), ), ( diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py index 35f007be2..a27c4b70d 100644 --- a/bookwyrm/models/site.py +++ b/bookwyrm/models/site.py @@ -209,7 +209,7 @@ class InviteRequest(BookWyrmModel): super().save(*args, **kwargs) -def get_passowrd_reset_expiry(): +def get_password_reset_expiry(): """give people a limited time to use the link""" now = timezone.now() return now + datetime.timedelta(days=1) @@ -219,7 +219,7 @@ class PasswordReset(models.Model): """gives someone access to create an account on the instance""" code = models.CharField(max_length=32, default=new_access_code) - expiry = models.DateTimeField(default=get_passowrd_reset_expiry) + expiry = models.DateTimeField(default=get_password_reset_expiry) user = models.OneToOneField(User, on_delete=models.CASCADE) def valid(self): diff --git a/bookwyrm/tests/views/landing/test_login.py b/bookwyrm/tests/views/landing/test_login.py index d76e9a55f..eab082609 100644 --- a/bookwyrm/tests/views/landing/test_login.py +++ b/bookwyrm/tests/views/landing/test_login.py @@ -114,7 +114,7 @@ class LoginViews(TestCase): view = views.Login.as_view() form = forms.LoginForm() form.data["localname"] = "mouse" - form.data["password"] = "passsword1" + form.data["password"] = "password1" request = self.factory.post("", form.data) request.user = self.anonymous_user From 1fdf5a7a396f63872305b9cdb25698a3f26d18d5 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:19 -0400 Subject: [PATCH 049/114] spelling: physical Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/migrations/0101_auto_20210929_1847.py | 2 +- bookwyrm/migrations/0102_remove_connector_local.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/migrations/0101_auto_20210929_1847.py b/bookwyrm/migrations/0101_auto_20210929_1847.py index 3fca28eac..967b59819 100644 --- a/bookwyrm/migrations/0101_auto_20210929_1847.py +++ b/bookwyrm/migrations/0101_auto_20210929_1847.py @@ -6,7 +6,7 @@ from bookwyrm.connectors.abstract_connector import infer_physical_format def infer_format(app_registry, schema_editor): - """set the new phsyical format field based on existing format data""" + """set the new physical format field based on existing format data""" db_alias = schema_editor.connection.alias editions = ( diff --git a/bookwyrm/migrations/0102_remove_connector_local.py b/bookwyrm/migrations/0102_remove_connector_local.py index 857f0f589..9bfd8b1d0 100644 --- a/bookwyrm/migrations/0102_remove_connector_local.py +++ b/bookwyrm/migrations/0102_remove_connector_local.py @@ -5,7 +5,7 @@ from bookwyrm.settings import DOMAIN def remove_self_connector(app_registry, schema_editor): - """set the new phsyical format field based on existing format data""" + """set the new physical format field based on existing format data""" db_alias = schema_editor.connection.alias app_registry.get_model("bookwyrm", "Connector").objects.using(db_alias).filter( connector_file="self_connector" From 27f025bc39d19360f2283f38434f5fa69f5a81fe Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:19 -0400 Subject: [PATCH 050/114] spelling: presence Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/activitypub/test_author.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/activitypub/test_author.py b/bookwyrm/tests/activitypub/test_author.py index 61d525fc0..51beac49a 100644 --- a/bookwyrm/tests/activitypub/test_author.py +++ b/bookwyrm/tests/activitypub/test_author.py @@ -19,7 +19,7 @@ class Author(TestCase): ) def test_serialize_model(self): - """check presense of author fields""" + """check presence of author fields""" activity = self.author.to_activity() self.assertEqual(activity["id"], self.author.remote_id) self.assertIsInstance(activity["aliases"], list) From 764bc0c204b23cf3f8f50942ef6e52380b58e17f Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 12:22:19 -0400 Subject: [PATCH 051/114] spelling: produce Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/templatetags/shelf_tags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templatetags/shelf_tags.py b/bookwyrm/templatetags/shelf_tags.py index 6166cd6f1..5e6850363 100644 --- a/bookwyrm/templatetags/shelf_tags.py +++ b/bookwyrm/templatetags/shelf_tags.py @@ -37,7 +37,7 @@ def get_next_shelf(current_shelf): @register.filter(name="translate_shelf_name") def get_translated_shelf_name(shelf): - """produced translated shelf identifiername""" + """produce translated shelf identifiername""" if not shelf: return "" # support obj or dict From 3526d9fd19268acd9fc0887a2718961aafbaf680 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:20 -0400 Subject: [PATCH 052/114] spelling: progress Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/readthrough.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/readthrough.py b/bookwyrm/models/readthrough.py index 239ec56be..4911c715b 100644 --- a/bookwyrm/models/readthrough.py +++ b/bookwyrm/models/readthrough.py @@ -8,7 +8,7 @@ from .base_model import BookWyrmModel class ProgressMode(models.TextChoices): - """types of prgress available""" + """types of progress available""" PAGE = "PG", "page" PERCENT = "PCT", "percent" From 55b6d6377491c999c22821fe3a5f087d9758620d Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:20 -0400 Subject: [PATCH 053/114] spelling: quotation Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/activitypub/test_quotation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/activitypub/test_quotation.py b/bookwyrm/tests/activitypub/test_quotation.py index 74728274b..678ee7aa3 100644 --- a/bookwyrm/tests/activitypub/test_quotation.py +++ b/bookwyrm/tests/activitypub/test_quotation.py @@ -30,7 +30,7 @@ class Quotation(TestCase): self.status_data = json.loads(datafile.read_bytes()) def test_quotation_activity(self): - """create a Quoteation ap object from json""" + """create a Quotation ap object from json""" quotation = activitypub.Quotation(**self.status_data) self.assertEqual(quotation.type, "Quotation") From 0b14d3fddf48ce28c03fd1121a6e237631199e0a Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:21 -0400 Subject: [PATCH 054/114] spelling: receive Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/relationship.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/relationship.py b/bookwyrm/models/relationship.py index 422967855..4754bea36 100644 --- a/bookwyrm/models/relationship.py +++ b/bookwyrm/models/relationship.py @@ -34,7 +34,7 @@ class UserRelationship(BookWyrmModel): @property def recipients(self): - """the remote user needs to recieve direct broadcasts""" + """the remote user needs to receive direct broadcasts""" return [u for u in [self.user_subject, self.user_object] if not u.local] def save(self, *args, **kwargs): From e7d8692836c5d0b6ef2a1c56b357f5b7cd51d4e0 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:22 -0400 Subject: [PATCH 055/114] spelling: receiving Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/models/test_fields.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py index d58cf97af..c6e395753 100644 --- a/bookwyrm/tests/models/test_fields.py +++ b/bookwyrm/tests/models/test_fields.py @@ -292,7 +292,7 @@ class ModelFields(TestCase): self.assertEqual(value.name, "MOUSE?? MOUSE!!") def test_foreign_key_from_activity_dict(self, *_): - """test recieving activity json""" + """test receiving activity json""" instance = fields.ForeignKey(User, on_delete=models.CASCADE) datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json") userdata = json.loads(datafile.read_bytes()) From 182a722a55c0ca666524019da50cf71194a17ace Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:21 -0400 Subject: [PATCH 056/114] spelling: recurring Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/static/js/bookwyrm.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js index 6a6c0217f..ceed12eba 100644 --- a/bookwyrm/static/js/bookwyrm.js +++ b/bookwyrm/static/js/bookwyrm.js @@ -5,7 +5,7 @@ let BookWyrm = new (class { constructor() { this.MAX_FILE_SIZE_BYTES = 10 * 1000000; this.initOnDOMLoaded(); - this.initReccuringTasks(); + this.initRecurringTasks(); this.initEventListeners(); } @@ -77,7 +77,7 @@ let BookWyrm = new (class { /** * Execute recurring tasks. */ - initReccuringTasks() { + initRecurringTasks() { // Polling document.querySelectorAll("[data-poll]").forEach((liveArea) => this.polling(liveArea)); } From e5663f97c56fa3da35cae359efda23a788e23117 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:22 -0400 Subject: [PATCH 057/114] spelling: remove Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/static/js/forms.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/static/js/forms.js b/bookwyrm/static/js/forms.js index a48675b35..08066f137 100644 --- a/bookwyrm/static/js/forms.js +++ b/bookwyrm/static/js/forms.js @@ -2,7 +2,7 @@ "use strict"; /** - * Remoev input field + * Remove input field * * @param {event} the button click event */ From 4c9408d77267acb5a279c95d3a50921bd4d7df28 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:23 -0400 Subject: [PATCH 058/114] spelling: revoke Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/management/commands/revoke_preview_image_tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/management/commands/revoke_preview_image_tasks.py b/bookwyrm/management/commands/revoke_preview_image_tasks.py index 6d6e59e8f..7b0947b12 100644 --- a/bookwyrm/management/commands/revoke_preview_image_tasks.py +++ b/bookwyrm/management/commands/revoke_preview_image_tasks.py @@ -9,7 +9,7 @@ class Command(BaseCommand): # pylint: disable=unused-argument def handle(self, *args, **options): - """reveoke nonessential low priority tasks""" + """revoke nonessential low priority tasks""" types = [ "bookwyrm.preview_images.generate_edition_preview_image_task", "bookwyrm.preview_images.generate_user_preview_image_task", From 2fb771f0de2cb81eb7a219dd5934b512ca1305eb Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:23 -0400 Subject: [PATCH 059/114] spelling: sanitize Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/views/reading.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/reading.py b/bookwyrm/views/reading.py index 958917eaa..65870b8dc 100644 --- a/bookwyrm/views/reading.py +++ b/bookwyrm/views/reading.py @@ -186,7 +186,7 @@ def update_readthrough_on_shelve( active_readthrough = models.ReadThrough.objects.create( user=user, book=annotated_book ) - # santiize and set dates + # sanitize and set dates active_readthrough.start_date = load_date_in_user_tz_as_utc(start_date, user) # if the stop or finish date is set, the readthrough will be set as inactive active_readthrough.finish_date = load_date_in_user_tz_as_utc(finish_date, user) From 02bf01827112fc5c37a5008734c55af69d9df46e Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 18:47:15 -0400 Subject: [PATCH 060/114] spelling: search Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/test_postgres.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/tests/test_postgres.py b/bookwyrm/tests/test_postgres.py index 95ed06b0c..8fc3c9d59 100644 --- a/bookwyrm/tests/test_postgres.py +++ b/bookwyrm/tests/test_postgres.py @@ -40,7 +40,7 @@ class PostgresTriggers(TestCase): "'cool':5B 'goodby':3A 'long':2A 'name':9 'rays':7C 'seri':8 'the':6C 'wow':4B", ) - def test_seach_vector_on_author_update(self, _): + def test_search_vector_on_author_update(self, _): """update search when an author name changes""" author = models.Author.objects.create(name="The Rays") book = models.Edition.objects.create( @@ -53,7 +53,7 @@ class PostgresTriggers(TestCase): self.assertEqual(book.search_vector, "'goodby':3A 'jeremy':4C 'long':2A") - def test_seach_vector_on_author_delete(self, _): + def test_search_vector_on_author_delete(self, _): """update search when an author name changes""" author = models.Author.objects.create(name="Jeremy") book = models.Edition.objects.create( From 7a6e249614afcfc260d6921cacb08924788e0667 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:24 -0400 Subject: [PATCH 061/114] spelling: sensitivity Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/views/test_wellknown.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/views/test_wellknown.py b/bookwyrm/tests/views/test_wellknown.py index 465f39b40..80f5a56ae 100644 --- a/bookwyrm/tests/views/test_wellknown.py +++ b/bookwyrm/tests/views/test_wellknown.py @@ -53,7 +53,7 @@ class WellknownViews(TestCase): data = json.loads(result.getvalue()) self.assertEqual(data["subject"], "acct:mouse@local.com") - def test_webfinger_case_sensitivty(self): + def test_webfinger_case_sensitivity(self): """ensure that webfinger queries are not case sensitive""" request = self.factory.get("", {"resource": "acct:MoUsE@local.com"}) request.user = self.anonymous_user From 35f1d043f40f57d99dfea461454c413e16ca1528 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:24 -0400 Subject: [PATCH 062/114] spelling: separate Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/templates/preferences/edit_user.html | 2 +- locale/en_US/LC_MESSAGES/django.po | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/templates/preferences/edit_user.html b/bookwyrm/templates/preferences/edit_user.html index 493b18d2f..f2b14babf 100644 --- a/bookwyrm/templates/preferences/edit_user.html +++ b/bookwyrm/templates/preferences/edit_user.html @@ -133,7 +133,7 @@
{% url 'user-shelves' request.user.localname as path %}

- {% blocktrans %}Looking for shelf privacy? You can set a sepearate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click "Edit shelf."{% endblocktrans %} + {% blocktrans %}Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click "Edit shelf."{% endblocktrans %}

diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index e55690723..b45a6c218 100644 --- a/locale/en_US/LC_MESSAGES/django.po +++ b/locale/en_US/LC_MESSAGES/django.po @@ -4045,7 +4045,7 @@ msgstr "" #: bookwyrm/templates/preferences/edit_user.html:136 #, python-format -msgid "Looking for shelf privacy? You can set a sepearate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" msgstr "" #: bookwyrm/templates/preferences/export.html:4 From 18fcea35daff1f76a1a8169cb7d0b60ee896afce Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:25 -0400 Subject: [PATCH 063/114] spelling: should Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/templatetags/book_display_tags.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templatetags/book_display_tags.py b/bookwyrm/templatetags/book_display_tags.py index 56eb096ec..0a0f228d8 100644 --- a/bookwyrm/templatetags/book_display_tags.py +++ b/bookwyrm/templatetags/book_display_tags.py @@ -18,7 +18,7 @@ def get_book_description(book): if book.description: return book.description if book.parent_work: - # this shoud always be true + # this should always be true return book.parent_work.description return None From 4607d30cad813ec90ee027a84213fcbd09a1b74e Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:25 -0400 Subject: [PATCH 064/114] spelling: signatures Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/test_signing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/test_signing.py b/bookwyrm/tests/test_signing.py index cde193f08..d15d6eecf 100644 --- a/bookwyrm/tests/test_signing.py +++ b/bookwyrm/tests/test_signing.py @@ -107,7 +107,7 @@ class Signature(TestCase): @responses.activate def test_remote_signer(self): - """signtures for remote users""" + """signatures for remote users""" datafile = pathlib.Path(__file__).parent.joinpath("data/ap_user.json") data = json.loads(datafile.read_bytes()) data["id"] = self.fake_remote.remote_id From e4677eb6fae9fc9fc8263c94eb4a47c6c3441e12 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:26 -0400 Subject: [PATCH 065/114] spelling: someone Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/notification.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py index 29f7b0c2d..522038f9a 100644 --- a/bookwyrm/models/notification.py +++ b/bookwyrm/models/notification.py @@ -284,7 +284,7 @@ def notify_user_on_list_item_add(sender, instance, created, *args, **kwargs): return list_owner = instance.book_list.user - # create a notification if somoene ELSE added to a local user's list + # create a notification if someone ELSE added to a local user's list if list_owner.local and list_owner != instance.user: # keep the related_user singular, group the items Notification.notify_list_item(list_owner, instance) From 9dc3cdca5df265e48492a7315eb03bf5fcf9e3fe Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:26 -0400 Subject: [PATCH 066/114] spelling: statuses Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/activitystreams/test_tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/activitystreams/test_tasks.py b/bookwyrm/tests/activitystreams/test_tasks.py index 2e89f6ccc..cddcf0dcc 100644 --- a/bookwyrm/tests/activitystreams/test_tasks.py +++ b/bookwyrm/tests/activitystreams/test_tasks.py @@ -50,7 +50,7 @@ class Activitystreams(TestCase): self.assertEqual(args[1], self.book) def test_remove_book_statuses_task(self): - """remove stauses related to a book""" + """remove statuses related to a book""" with patch("bookwyrm.activitystreams.BooksStream.remove_book_statuses") as mock: activitystreams.remove_book_statuses_task(self.local_user.id, self.book.id) self.assertTrue(mock.called) From ffd035f25afaf399dad1d20b1cb3c76e8d76a59e Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:27 -0400 Subject: [PATCH 067/114] spelling: stores Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/redis_store.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/redis_store.py b/bookwyrm/redis_store.py index f25829f5c..f7c852456 100644 --- a/bookwyrm/redis_store.py +++ b/bookwyrm/redis_store.py @@ -34,7 +34,7 @@ class RedisStore(ABC): def remove_object_from_related_stores(self, obj, stores=None): """remove an object from all stores""" - # if the stoers are provided, the object can just be an id + # if the stores are provided, the object can just be an id if stores and isinstance(obj, int): obj_id = obj else: From 63dbb6a29176d46dc7455113e201516ce7d47e83 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:27 -0400 Subject: [PATCH 068/114] spelling: successfully Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/activitypub/test_base_activity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/activitypub/test_base_activity.py b/bookwyrm/tests/activitypub/test_base_activity.py index df243d0db..c9022d35c 100644 --- a/bookwyrm/tests/activitypub/test_base_activity.py +++ b/bookwyrm/tests/activitypub/test_base_activity.py @@ -59,7 +59,7 @@ class BaseActivity(TestCase): self.assertIsInstance(representative, models.User) def test_init(self, *_): - """simple successfuly init""" + """simple successfully init""" instance = ActivityObject(id="a", type="b") self.assertTrue(hasattr(instance, "id")) self.assertTrue(hasattr(instance, "type")) From 2d4a42ceba009418ed594a2614ab5a020af1aaac Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:28 -0400 Subject: [PATCH 069/114] spelling: suggestions Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/views/list/curate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/list/curate.py b/bookwyrm/views/list/curate.py index 7155ffc43..cf41636ba 100644 --- a/bookwyrm/views/list/curate.py +++ b/bookwyrm/views/list/curate.py @@ -14,7 +14,7 @@ from bookwyrm.views.list.list import normalize_book_list_ordering # pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class Curate(View): - """approve or discard list suggestsions""" + """approve or discard list suggestions""" def get(self, request, list_id): """display a pending list""" From 42e78b14e93cd9a21d7ec2e93b85c5493c231da2 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:28 -0400 Subject: [PATCH 070/114] spelling: translation Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- locale/en_US/LC_MESSAGES/django.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index b45a6c218..65000c1d4 100644 --- a/locale/en_US/LC_MESSAGES/django.po +++ b/locale/en_US/LC_MESSAGES/django.po @@ -1,4 +1,4 @@ -# Stub English-language trnaslation file +# Stub English-language translation file # Copyright (C) 2021 Mouse Reeve # This file is distributed under the same license as the BookWyrm package. # Mouse Reeve , 2021 From 7170e8972d599d633cc051c9b9fa41be9681069e Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:29 -0400 Subject: [PATCH 071/114] spelling: uneventfully Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/models/test_activitypub_mixin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py index fdd1883a8..a465c2c12 100644 --- a/bookwyrm/tests/models/test_activitypub_mixin.py +++ b/bookwyrm/tests/models/test_activitypub_mixin.py @@ -245,7 +245,7 @@ class ActivitypubMixins(TestCase): # ObjectMixin def test_object_save_create(self, *_): - """should save uneventufully when broadcast is disabled""" + """should save uneventfully when broadcast is disabled""" class Success(Exception): """this means we got to the right method""" @@ -276,7 +276,7 @@ class ActivitypubMixins(TestCase): ObjectModel(user=None).save() def test_object_save_update(self, *_): - """should save uneventufully when broadcast is disabled""" + """should save uneventfully when broadcast is disabled""" class Success(Exception): """this means we got to the right method""" From 459b74294d8ae9cd020d8cfacf99bb46140373d0 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:29 -0400 Subject: [PATCH 072/114] spelling: uniqueness Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/annual_goal.py | 2 +- bookwyrm/models/shelf.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/models/annual_goal.py b/bookwyrm/models/annual_goal.py index 0eefacb32..d36b822df 100644 --- a/bookwyrm/models/annual_goal.py +++ b/bookwyrm/models/annual_goal.py @@ -24,7 +24,7 @@ class AnnualGoal(BookWyrmModel): ) class Meta: - """unqiueness constraint""" + """uniqueness constraint""" unique_together = ("user", "year") diff --git a/bookwyrm/models/shelf.py b/bookwyrm/models/shelf.py index 8e754bc47..c52cb6ab8 100644 --- a/bookwyrm/models/shelf.py +++ b/bookwyrm/models/shelf.py @@ -80,7 +80,7 @@ class Shelf(OrderedCollectionMixin, BookWyrmModel): raise PermissionDenied() class Meta: - """user/shelf unqiueness""" + """user/shelf uniqueness""" unique_together = ("user", "identifier") From dfae27ca324252769a04054f9eb1c5a4bc76360d Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 18:56:09 -0400 Subject: [PATCH 073/114] spelling: updated Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/models/activitypub_mixin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 44f2919dd..3350a4f6b 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -405,7 +405,7 @@ class CollectionItemMixin(ActivitypubMixin): # first off, we want to save normally no matter what super().save(*args, **kwargs) - # list items can be updateda, normally you would only broadcast on created + # list items can be updated, normally you would only broadcast on created if not broadcast or not self.user.local: return From 2a914f98b779e726a5c2b71fb784e4b407cf1ad4 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:30 -0400 Subject: [PATCH 074/114] spelling: versions Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/models/test_status_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py index 177bedb24..1bbca1896 100644 --- a/bookwyrm/tests/models/test_status_model.py +++ b/bookwyrm/tests/models/test_status_model.py @@ -397,7 +397,7 @@ class Status(TestCase): # pylint: disable=unused-argument def test_create_broadcast(self, one, two, broadcast_mock, *_): - """should send out two verions of a status on create""" + """should send out two versions of a status on create""" models.Comment.objects.create( content="hi", user=self.local_user, book=self.book ) From ba7f0fce71183145a2245523442f4ad23494f3d5 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:30 -0400 Subject: [PATCH 075/114] spelling: whenever Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/views/inbox.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/inbox.py b/bookwyrm/views/inbox.py index 89e644db8..2fb36507f 100644 --- a/bookwyrm/views/inbox.py +++ b/bookwyrm/views/inbox.py @@ -104,7 +104,7 @@ def raise_is_blocked_activity(activity_json): def sometimes_async_activity_task(activity_json, queue=MEDIUM): """Sometimes we can effectively respond to a request without queuing a new task, - and whever that is possible, we should do it.""" + and whenever that is possible, we should do it.""" activity = activitypub.parse(activity_json) # try resolving this activity without making any http requests From 359228127dee5c5c3eea06b5a38a69e719738e51 Mon Sep 17 00:00:00 2001 From: Josh Soref <2119212+jsoref@users.noreply.github.com> Date: Tue, 4 Apr 2023 11:13:31 -0400 Subject: [PATCH 076/114] spelling: wyrm Signed-off-by: Josh Soref <2119212+jsoref@users.noreply.github.com> --- bookwyrm/tests/models/test_base_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py index 8a8be2148..b94592571 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -51,7 +51,7 @@ class BaseModel(TestCase): def test_set_remote_id(self): """this function sets remote ids after creation""" - # using Work because it BookWrymModel is abstract and this requires save + # using Work because it BookWyrmModel is abstract and this requires save # Work is a relatively not-fancy model. instance = models.Work.objects.create(title="work title") instance.remote_id = None From 011844b7acdeca0921188ac8218f569afc2700c4 Mon Sep 17 00:00:00 2001 From: Jacob Torrey Date: Wed, 5 Apr 2023 15:45:22 +0000 Subject: [PATCH 077/114] Small quality of life improvements to list handling Signed-off-by: Jacob Torrey --- bookwyrm/templates/lists/created_text.html | 2 +- bookwyrm/views/list/list.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bookwyrm/templates/lists/created_text.html b/bookwyrm/templates/lists/created_text.html index f5405b64a..b9e188686 100644 --- a/bookwyrm/templates/lists/created_text.html +++ b/bookwyrm/templates/lists/created_text.html @@ -3,7 +3,7 @@ {% if list.curation == 'group' %} {% blocktrans with username=list.user.display_name userpath=list.user.local_path groupname=list.group.name grouppath=list.group.local_path %}Created by {{ username }} and managed by {{ groupname }}{% endblocktrans %} -{% elif list.curation != 'open' %} +{% elif list.curation == 'curated' %} {% blocktrans with username=list.user.display_name path=list.user.local_path %}Created and curated by {{ username }}{% endblocktrans %} {% else %} {% blocktrans with username=list.user.display_name path=list.user.local_path %}Created by {{ username }}{% endblocktrans %} diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 24d44d183..30d6f970a 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -8,7 +8,7 @@ from django.db import transaction from django.db.models import Avg, DecimalField, Q, Max from django.db.models.functions import Coalesce from django.http import HttpResponseBadRequest, HttpResponse -from django.shortcuts import get_object_or_404 +from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.urls import reverse from django.utils.decorators import method_decorator @@ -183,7 +183,7 @@ def delete_list(request, list_id): book_list.raise_not_deletable(request.user) book_list.delete() - return redirect_to_referer(request, "lists") + return redirect("/list") @require_POST From 9c54030b61e0bcde862fcf6180da5c1ec10182a7 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Wed, 5 Apr 2023 20:18:45 -0400 Subject: [PATCH 078/114] Add add_object_to_stores function This should enable some useful refactoring to allow us to cache some results of expensive queries better. --- bookwyrm/redis_store.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/bookwyrm/redis_store.py b/bookwyrm/redis_store.py index f25829f5c..cd75fc5de 100644 --- a/bookwyrm/redis_store.py +++ b/bookwyrm/redis_store.py @@ -16,12 +16,12 @@ class RedisStore(ABC): """the object and rank""" return {obj.id: self.get_rank(obj)} - def add_object_to_related_stores(self, obj, execute=True): - """add an object to all suitable stores""" + def add_object_to_stores(self, obj, stores, execute=True): + """add an object to a given set of stores""" value = self.get_value(obj) # we want to do this as a bulk operation, hence "pipeline" pipeline = r.pipeline() - for store in self.get_stores_for_object(obj): + for store in stores: # add the status to the feed pipeline.zadd(store, value) # trim the store @@ -32,6 +32,10 @@ class RedisStore(ABC): # and go! return pipeline.execute() + def add_object_to_related_stores(self, obj, execute=True): + """add an object to all suitable stores""" + return self.add_object_to_stores(obj, self.get_stores_for_object(obj), execute) + def remove_object_from_related_stores(self, obj, stores=None): """remove an object from all stores""" # if the stoers are provided, the object can just be an id From 93bd66ad3ea944283c6ae2f89ced056b4602e2b7 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Wed, 5 Apr 2023 20:37:17 -0400 Subject: [PATCH 079/114] Refactor to delete add_object_to_related_stores This is working towards some optimizations. --- bookwyrm/activitystreams.py | 4 +++- bookwyrm/lists_stream.py | 3 +-- bookwyrm/redis_store.py | 4 ---- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 74471883e..76872609d 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -39,7 +39,9 @@ class ActivityStream(RedisStore): def add_status(self, status, increment_unread=False): """add a status to users' feeds""" # the pipeline contains all the add-to-stream activities - pipeline = self.add_object_to_related_stores(status, execute=False) + pipeline = self.add_object_to_stores( + status, self.get_stores_for_object(status), execute=False + ) if increment_unread: for user_id in self.get_audience(status): diff --git a/bookwyrm/lists_stream.py b/bookwyrm/lists_stream.py index 7426488ce..20f045afd 100644 --- a/bookwyrm/lists_stream.py +++ b/bookwyrm/lists_stream.py @@ -24,8 +24,7 @@ class ListsStream(RedisStore): def add_list(self, book_list): """add a list to users' feeds""" - # the pipeline contains all the add-to-stream activities - self.add_object_to_related_stores(book_list) + self.add_object_to_stores(book_list, self.get_stores_for_object(book_list)) def add_user_lists(self, viewer, user): """add a user's lists to another user's feed""" diff --git a/bookwyrm/redis_store.py b/bookwyrm/redis_store.py index cd75fc5de..3e88c09ac 100644 --- a/bookwyrm/redis_store.py +++ b/bookwyrm/redis_store.py @@ -32,10 +32,6 @@ class RedisStore(ABC): # and go! return pipeline.execute() - def add_object_to_related_stores(self, obj, execute=True): - """add an object to all suitable stores""" - return self.add_object_to_stores(obj, self.get_stores_for_object(obj), execute) - def remove_object_from_related_stores(self, obj, stores=None): """remove an object from all stores""" # if the stoers are provided, the object can just be an id From 8053f49acc80acc0386e50c55ab1c0273f0ef02f Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Wed, 5 Apr 2023 20:50:02 -0400 Subject: [PATCH 080/114] Always pass stores to remove_object_from_related_stores --- bookwyrm/activitystreams.py | 4 +++- bookwyrm/suggested_users.py | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 76872609d..78f6d9ee0 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -516,7 +516,9 @@ def remove_status_task(status_ids): for stream in streams.values(): for status in statuses: - stream.remove_object_from_related_stores(status) + stream.remove_object_from_related_stores( + status, stores=stream.get_stores_for_object(status) + ) @app.task(queue=HIGH, ignore_result=True) diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index ea6b1c55d..4cef0c5f3 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -254,7 +254,9 @@ def rerank_user_task(user_id, update_only=False): def remove_user_task(user_id): """do the hard work in celery""" user = models.User.objects.get(id=user_id) - suggested_users.remove_object_from_related_stores(user) + suggested_users.remove_object_from_related_stores( + user, stores=suggested_users.get_stores_for_object(user) + ) @app.task(queue=MEDIUM, ignore_result=True) @@ -268,7 +270,9 @@ def remove_suggestion_task(user_id, suggested_user_id): def bulk_remove_instance_task(instance_id): """remove a bunch of users from recs""" for user in models.User.objects.filter(federated_server__id=instance_id): - suggested_users.remove_object_from_related_stores(user) + suggested_users.remove_object_from_related_stores( + user, stores=suggested_users.get_stores_for_object(user) + ) @app.task(queue=LOW, ignore_result=True) From 68c6a9e748772ecdcee8a6507bb20ff7dbc40620 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Wed, 5 Apr 2023 20:54:58 -0400 Subject: [PATCH 081/114] Rename remove_object_from_related_stores This makes the stores argument required, making it simpler to change the code. --- bookwyrm/activitystreams.py | 8 ++--- bookwyrm/lists_stream.py | 2 +- bookwyrm/redis_store.py | 4 +-- bookwyrm/suggested_users.py | 8 ++--- bookwyrm/tests/activitystreams/test_tasks.py | 36 ++++++++++---------- bookwyrm/tests/lists_stream/test_tasks.py | 2 +- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 78f6d9ee0..cda634b4c 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -516,8 +516,8 @@ def remove_status_task(status_ids): for stream in streams.values(): for status in statuses: - stream.remove_object_from_related_stores( - status, stores=stream.get_stores_for_object(status) + stream.remove_object_from_stores( + status, stream.get_stores_for_object(status) ) @@ -568,9 +568,9 @@ def handle_boost_task(boost_id): for stream in streams.values(): # people who should see the boost (not people who see the original status) audience = stream.get_stores_for_object(instance) - stream.remove_object_from_related_stores(boosted, stores=audience) + stream.remove_object_from_stores(boosted, audience) for status in old_versions: - stream.remove_object_from_related_stores(status, stores=audience) + stream.remove_object_from_stores(status, audience) def get_status_type(status): diff --git a/bookwyrm/lists_stream.py b/bookwyrm/lists_stream.py index 20f045afd..e19e16566 100644 --- a/bookwyrm/lists_stream.py +++ b/bookwyrm/lists_stream.py @@ -232,7 +232,7 @@ def remove_list_task(list_id, re_add=False): # delete for every store stores = [ListsStream().stream_id(idx) for idx in stores] - ListsStream().remove_object_from_related_stores(list_id, stores=stores) + ListsStream().remove_object_from_stores(list_id, stores) if re_add: add_list_task.delay(list_id) diff --git a/bookwyrm/redis_store.py b/bookwyrm/redis_store.py index 3e88c09ac..8904d123a 100644 --- a/bookwyrm/redis_store.py +++ b/bookwyrm/redis_store.py @@ -32,14 +32,14 @@ class RedisStore(ABC): # and go! return pipeline.execute() - def remove_object_from_related_stores(self, obj, stores=None): + # pylint: disable=no-self-use + def remove_object_from_stores(self, obj, stores): """remove an object from all stores""" # if the stoers are provided, the object can just be an id if stores and isinstance(obj, int): obj_id = obj else: obj_id = obj.id - stores = self.get_stores_for_object(obj) if stores is None else stores pipeline = r.pipeline() for store in stores: pipeline.zrem(store, -1, obj_id) diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index 4cef0c5f3..990bec11d 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -254,8 +254,8 @@ def rerank_user_task(user_id, update_only=False): def remove_user_task(user_id): """do the hard work in celery""" user = models.User.objects.get(id=user_id) - suggested_users.remove_object_from_related_stores( - user, stores=suggested_users.get_stores_for_object(user) + suggested_users.remove_object_from_stores( + user, suggested_users.get_stores_for_object(user) ) @@ -270,8 +270,8 @@ def remove_suggestion_task(user_id, suggested_user_id): def bulk_remove_instance_task(instance_id): """remove a bunch of users from recs""" for user in models.User.objects.filter(federated_server__id=instance_id): - suggested_users.remove_object_from_related_stores( - user, stores=suggested_users.get_stores_for_object(user) + suggested_users.remove_object_from_stores( + user, suggested_users.get_stores_for_object(user) ) diff --git a/bookwyrm/tests/activitystreams/test_tasks.py b/bookwyrm/tests/activitystreams/test_tasks.py index 2e89f6ccc..c37a80363 100644 --- a/bookwyrm/tests/activitystreams/test_tasks.py +++ b/bookwyrm/tests/activitystreams/test_tasks.py @@ -75,7 +75,7 @@ class Activitystreams(TestCase): def test_remove_status_task(self): """remove a status from all streams""" with patch( - "bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores" + "bookwyrm.activitystreams.ActivityStream.remove_object_from_stores" ) as mock: activitystreams.remove_status_task(self.status.id) self.assertEqual(mock.call_count, 3) @@ -132,8 +132,8 @@ class Activitystreams(TestCase): self.assertEqual(args[0], self.local_user) self.assertEqual(args[1], self.another_user) - @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores") - @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores") + @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_stores") + @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_stores") @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_boost_to_another_timeline(self, *_): """boost from a non-follower doesn't remove original status from feed""" @@ -144,7 +144,7 @@ class Activitystreams(TestCase): user=self.another_user, ) with patch( - "bookwyrm.activitystreams.HomeStream.remove_object_from_related_stores" + "bookwyrm.activitystreams.HomeStream.remove_object_from_stores" ) as mock: activitystreams.handle_boost_task(boost.id) @@ -152,10 +152,10 @@ class Activitystreams(TestCase): self.assertEqual(mock.call_count, 1) call_args = mock.call_args self.assertEqual(call_args[0][0], status) - self.assertEqual(call_args[1]["stores"], [f"{self.another_user.id}-home"]) + self.assertEqual(call_args[0][1], [f"{self.another_user.id}-home"]) - @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores") - @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores") + @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_stores") + @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_stores") @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_boost_to_another_timeline_remote(self, *_): """boost from a remote non-follower doesn't remove original status from feed""" @@ -166,7 +166,7 @@ class Activitystreams(TestCase): user=self.remote_user, ) with patch( - "bookwyrm.activitystreams.HomeStream.remove_object_from_related_stores" + "bookwyrm.activitystreams.HomeStream.remove_object_from_stores" ) as mock: activitystreams.handle_boost_task(boost.id) @@ -174,10 +174,10 @@ class Activitystreams(TestCase): self.assertEqual(mock.call_count, 1) call_args = mock.call_args self.assertEqual(call_args[0][0], status) - self.assertEqual(call_args[1]["stores"], []) + self.assertEqual(call_args[0][1], []) - @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores") - @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores") + @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_stores") + @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_stores") @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_boost_to_following_timeline(self, *_): """add a boost and deduplicate the boosted status on the timeline""" @@ -189,17 +189,17 @@ class Activitystreams(TestCase): user=self.another_user, ) with patch( - "bookwyrm.activitystreams.HomeStream.remove_object_from_related_stores" + "bookwyrm.activitystreams.HomeStream.remove_object_from_stores" ) as mock: activitystreams.handle_boost_task(boost.id) self.assertTrue(mock.called) call_args = mock.call_args self.assertEqual(call_args[0][0], status) - self.assertTrue(f"{self.another_user.id}-home" in call_args[1]["stores"]) - self.assertTrue(f"{self.local_user.id}-home" in call_args[1]["stores"]) + self.assertTrue(f"{self.another_user.id}-home" in call_args[0][1]) + self.assertTrue(f"{self.local_user.id}-home" in call_args[0][1]) - @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_related_stores") - @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_related_stores") + @patch("bookwyrm.activitystreams.LocalStream.remove_object_from_stores") + @patch("bookwyrm.activitystreams.BooksStream.remove_object_from_stores") @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") def test_boost_to_same_timeline(self, *_): """add a boost and deduplicate the boosted status on the timeline""" @@ -210,10 +210,10 @@ class Activitystreams(TestCase): user=self.local_user, ) with patch( - "bookwyrm.activitystreams.HomeStream.remove_object_from_related_stores" + "bookwyrm.activitystreams.HomeStream.remove_object_from_stores" ) as mock: activitystreams.handle_boost_task(boost.id) self.assertTrue(mock.called) call_args = mock.call_args self.assertEqual(call_args[0][0], status) - self.assertEqual(call_args[1]["stores"], [f"{self.local_user.id}-home"]) + self.assertEqual(call_args[0][1], [f"{self.local_user.id}-home"]) diff --git a/bookwyrm/tests/lists_stream/test_tasks.py b/bookwyrm/tests/lists_stream/test_tasks.py index 55c5d98c8..2e01cecad 100644 --- a/bookwyrm/tests/lists_stream/test_tasks.py +++ b/bookwyrm/tests/lists_stream/test_tasks.py @@ -59,7 +59,7 @@ class Activitystreams(TestCase): def test_remove_list_task(self, *_): """remove a list from all streams""" with patch( - "bookwyrm.lists_stream.ListsStream.remove_object_from_related_stores" + "bookwyrm.lists_stream.ListsStream.remove_object_from_stores" ) as mock: lists_stream.remove_list_task(self.list.id) self.assertEqual(mock.call_count, 1) From 78607a0c3edb6b0726540b9148684fe79c41f1c7 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Wed, 5 Apr 2023 20:57:39 -0400 Subject: [PATCH 082/114] Remove get_stores_for_object abstract method The implementations still have and use this, we've just removed this concept from the RedisStore abstraction, which simplifies things somewhat. --- bookwyrm/activitystreams.py | 1 + bookwyrm/lists_stream.py | 1 + bookwyrm/redis_store.py | 4 ---- bookwyrm/suggested_users.py | 1 + 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index cda634b4c..9586edcbc 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -150,6 +150,7 @@ class ActivityStream(RedisStore): return [user.id for user in self._get_audience(status)] def get_stores_for_object(self, obj): + """the stores that an object belongs in""" return [self.stream_id(user_id) for user_id in self.get_audience(obj)] def get_statuses_for_user(self, user): # pylint: disable=no-self-use diff --git a/bookwyrm/lists_stream.py b/bookwyrm/lists_stream.py index e19e16566..e0618dc1b 100644 --- a/bookwyrm/lists_stream.py +++ b/bookwyrm/lists_stream.py @@ -97,6 +97,7 @@ class ListsStream(RedisStore): return audience.distinct() def get_stores_for_object(self, obj): + """the stores that an object belongs in""" return [self.stream_id(u) for u in self.get_audience(obj)] def get_lists_for_user(self, user): # pylint: disable=no-self-use diff --git a/bookwyrm/redis_store.py b/bookwyrm/redis_store.py index 8904d123a..80bce4df3 100644 --- a/bookwyrm/redis_store.py +++ b/bookwyrm/redis_store.py @@ -82,10 +82,6 @@ class RedisStore(ABC): def get_objects_for_store(self, store): """a queryset of what should go in a store, used for populating it""" - @abstractmethod - def get_stores_for_object(self, obj): - """the stores that an object belongs in""" - @abstractmethod def get_rank(self, obj): """how to rank an object""" diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index 990bec11d..49edc83e9 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -49,6 +49,7 @@ class SuggestedUsers(RedisStore): ) def get_stores_for_object(self, obj): + """the stores that an object belongs in""" return [self.store_id(u) for u in self.get_users_for_object(obj)] def get_users_for_object(self, obj): # pylint: disable=no-self-use From 7a93b5c315c3f82e9a78a3ee5e474804d3661e0b Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Wed, 5 Apr 2023 21:03:07 -0400 Subject: [PATCH 083/114] Only call get_audience once in add_status This is by far the most expensive part of this task, so this should double the speed in the increment_unread case. Related: #2720 --- bookwyrm/activitystreams.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 9586edcbc..847dd379e 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -38,13 +38,14 @@ class ActivityStream(RedisStore): def add_status(self, status, increment_unread=False): """add a status to users' feeds""" + audience = self.get_audience(status) # the pipeline contains all the add-to-stream activities pipeline = self.add_object_to_stores( - status, self.get_stores_for_object(status), execute=False + status, self.get_stores_for_users(audience), execute=False ) if increment_unread: - for user_id in self.get_audience(status): + for user_id in audience: # add to the unread status count pipeline.incr(self.unread_id(user_id)) # add to the unread status count for status type @@ -149,6 +150,10 @@ class ActivityStream(RedisStore): trace.get_current_span().set_attribute("stream_id", self.key) return [user.id for user in self._get_audience(status)] + def get_stores_for_users(self, user_ids): + """convert a list of user ids into redis store ids""" + return [self.stream_id(user_id) for user_id in user_ids] + def get_stores_for_object(self, obj): """the stores that an object belongs in""" return [self.stream_id(user_id) for user_id in self.get_audience(obj)] From 776c5526c8f4367f2a6ea1dfd052c7dfd64c0a17 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Wed, 5 Apr 2023 23:18:36 -0400 Subject: [PATCH 084/114] Remove ActivityStream.get_stores_for_object I think this makes the code somewhat more understandable. --- bookwyrm/activitystreams.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 847dd379e..891aacc09 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -154,10 +154,6 @@ class ActivityStream(RedisStore): """convert a list of user ids into redis store ids""" return [self.stream_id(user_id) for user_id in user_ids] - def get_stores_for_object(self, obj): - """the stores that an object belongs in""" - return [self.stream_id(user_id) for user_id in self.get_audience(obj)] - def get_statuses_for_user(self, user): # pylint: disable=no-self-use """given a user, what statuses should they see on this stream""" return models.Status.privacy_filter( @@ -523,7 +519,7 @@ def remove_status_task(status_ids): for stream in streams.values(): for status in statuses: stream.remove_object_from_stores( - status, stream.get_stores_for_object(status) + status, stream.get_stores_for_users(stream.get_audience(status)) ) @@ -573,7 +569,7 @@ def handle_boost_task(boost_id): for stream in streams.values(): # people who should see the boost (not people who see the original status) - audience = stream.get_stores_for_object(instance) + audience = stream.get_stores_for_users(stream.get_audience(instance)) stream.remove_object_from_stores(boosted, audience) for status in old_versions: stream.remove_object_from_stores(status, audience) From f91fcd518a942801dc8fedbaa60b93287e4d8c50 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Thu, 6 Apr 2023 01:18:35 -0400 Subject: [PATCH 085/114] Increase network timeout in Celery tasks Since Celery tasks don't affect interactive latency, we should have a more generous timeout. This also allows admins to set the timeout for Celery and the web frontend separately, without breaking backwards compatibility with the previous environment variable. --- bookwyrm/settings.py | 2 +- celerywyrm/settings.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 419b76195..8dcf90fcb 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -226,7 +226,7 @@ STREAMS = [ # total time in seconds that the instance will spend searching connectors SEARCH_TIMEOUT = env.int("SEARCH_TIMEOUT", 8) # timeout for a query to an individual connector -QUERY_TIMEOUT = env.int("QUERY_TIMEOUT", 5) +QUERY_TIMEOUT = env.int("INTERACTIVE_QUERY_TIMEOUT", env.int("QUERY_TIMEOUT", 5)) # Redis cache backend if env.bool("USE_DUMMY_CACHE", False): diff --git a/celerywyrm/settings.py b/celerywyrm/settings.py index c1e533ac3..aa08a2417 100644 --- a/celerywyrm/settings.py +++ b/celerywyrm/settings.py @@ -3,6 +3,8 @@ # pylint: disable=unused-wildcard-import from bookwyrm.settings import * +QUERY_TIMEOUT = env.int("CELERY_QUERY_TIMEOUT", env.int("QUERY_TIMEOUT", 30)) + # pylint: disable=line-too-long REDIS_BROKER_PASSWORD = requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")) REDIS_BROKER_HOST = env("REDIS_BROKER_HOST", "redis_broker") From 29ac34cb922727616f1765a5a57be6c6a3698707 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Thu, 6 Apr 2023 05:57:21 -0400 Subject: [PATCH 086/114] Fix help text for `bw-dev down` --- bw-dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bw-dev b/bw-dev index b2a23d852..3e804943b 100755 --- a/bw-dev +++ b/bw-dev @@ -287,7 +287,7 @@ case "$CMD" in echo "Unrecognised command. Try:" echo " setup" echo " up [container]" - echo " down [container]" + echo " down" echo " service_ports_web" echo " initdb" echo " resetdb" From 36c14655ecfd5b414c5b41be161a3d1e05437a1e Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Thu, 6 Apr 2023 11:37:19 +0200 Subject: [PATCH 087/114] =?UTF-8?q?Use=20the=20translated=20shelf=20name?= =?UTF-8?q?=20in=20a=20book=E2=80=99s=20shelf=20list?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously in the list of shelves on the page for a book it was always using the English name of the shelf for the shelf of the reading status. --- bookwyrm/templates/book/book.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index e9eff99ab..1ebb3159e 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -4,6 +4,7 @@ {% load humanize %} {% load utilities %} {% load static %} +{% load shelf_tags %} {% block title %}{{ book|book_title }}{% endblock %} @@ -239,7 +240,7 @@
    {% for shelf in user_shelfbooks %}
  • - {{ shelf.shelf.name }} + {{ shelf.shelf|translate_shelf_name }}
    {% include 'snippets/shelf_selector.html' with shelf=shelf.shelf class="is-small" readthrough=readthrough %}
    From b0f90d05f24c997d326ce625c69337e383eeb8c8 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Thu, 6 Apr 2023 15:55:11 +0200 Subject: [PATCH 088/114] Move the shelf names to a dict instead of a chain of if statements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The main reason to do this is that if we try to add another name then pylint will complain that there are too many return statements. It might be slightly faster too. If I understand correctly it doesn’t matter that the _ function is being called at module load time because it is mapped to gettext_lazy so the actual translation will be done when the string is used. --- bookwyrm/templatetags/shelf_tags.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/bookwyrm/templatetags/shelf_tags.py b/bookwyrm/templatetags/shelf_tags.py index 1fb799883..ea093b8a5 100644 --- a/bookwyrm/templatetags/shelf_tags.py +++ b/bookwyrm/templatetags/shelf_tags.py @@ -9,6 +9,14 @@ from bookwyrm.utils import cache register = template.Library() +SHELF_NAMES = { + "all": _("All books"), + "to-read": _("To Read"), + "reading": _("Currently Reading"), + "read": _("Read"), +} + + @register.filter(name="is_book_on_shelf") def get_is_book_on_shelf(book, shelf): """is a book on a shelf""" @@ -42,15 +50,11 @@ def get_translated_shelf_name(shelf): return "" # support obj or dict identifier = shelf["identifier"] if isinstance(shelf, dict) else shelf.identifier - if identifier == "all": - return _("All books") - if identifier == "to-read": - return _("To Read") - if identifier == "reading": - return _("Currently Reading") - if identifier == "read": - return _("Read") - return shelf["name"] if isinstance(shelf, dict) else shelf.name + + try: + return SHELF_NAMES[identifier] + except KeyError: + return shelf["name"] if isinstance(shelf, dict) else shelf.name @register.simple_tag(takes_context=True) From 9092c9c80c06154f3bd2394b68ca6599ea4ee4e6 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Thu, 6 Apr 2023 11:53:17 +0200 Subject: [PATCH 089/114] Add a translatable name for the "stopped-reading" status shelf --- bookwyrm/templatetags/shelf_tags.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/templatetags/shelf_tags.py b/bookwyrm/templatetags/shelf_tags.py index ea093b8a5..6243fcae2 100644 --- a/bookwyrm/templatetags/shelf_tags.py +++ b/bookwyrm/templatetags/shelf_tags.py @@ -14,6 +14,7 @@ SHELF_NAMES = { "to-read": _("To Read"), "reading": _("Currently Reading"), "read": _("Read"), + "stopped-reading": _("Stopped Reading"), } From 4e09391b2e246fab893b4171ee54b59b4adccd2c Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Thu, 6 Apr 2023 12:20:23 -0400 Subject: [PATCH 090/114] Add telemetry for SuggestedUsers rerank_user_task Related: #2727 --- bookwyrm/suggested_users.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index ea6b1c55d..8ec967cf5 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -4,13 +4,16 @@ import logging from django.dispatch import receiver from django.db import transaction from django.db.models import signals, Count, Q, Case, When, IntegerField +from opentelemetry import trace from bookwyrm import models from bookwyrm.redis_store import RedisStore, r from bookwyrm.tasks import app, LOW, MEDIUM +from bookwyrm.telemetry import open_telemetry logger = logging.getLogger(__name__) +tracer = open_telemetry.tracer() class SuggestedUsers(RedisStore): @@ -57,22 +60,25 @@ class SuggestedUsers(RedisStore): Q(id=obj.id) | Q(followers=obj) | Q(id__in=obj.blocks.all()) | Q(blocks=obj) ) + @tracer.start_as_current_span("SuggestedUsers.rerank_obj") def rerank_obj(self, obj, update_only=True): """update all the instances of this user with new ranks""" + trace.get_current_span().set_attribute("update_only", update_only) pipeline = r.pipeline() for store_user in self.get_users_for_object(obj): - annotated_user = get_annotated_users( - store_user, - id=obj.id, - ).first() - if not annotated_user: - continue + with tracer.start_as_current_span("SuggestedUsers.rerank_obj/user") as _: + annotated_user = get_annotated_users( + store_user, + id=obj.id, + ).first() + if not annotated_user: + continue - pipeline.zadd( - self.store_id(store_user), - self.get_value(annotated_user), - xx=update_only, - ) + pipeline.zadd( + self.store_id(store_user), + self.get_value(annotated_user), + xx=update_only, + ) pipeline.execute() def rerank_user_suggestions(self, user): From b574a12fff7e9c242fb5a29498c9d6070794bbcc Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Thu, 6 Apr 2023 23:30:40 -0400 Subject: [PATCH 091/114] Pass allow_external_connections through ignore_activity Previously, ignore_activity could unexpectedly make a outgoing HTTP connection, leading to unwanted latency, particularly when called via ActivityObject.to_model, which had the allow_external_connections parameter already. Related: #2717 --- bookwyrm/activitypub/base_activity.py | 2 +- bookwyrm/models/favorite.py | 3 ++- bookwyrm/models/status.py | 10 ++++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/bookwyrm/activitypub/base_activity.py b/bookwyrm/activitypub/base_activity.py index 840dab6a4..44361f0d0 100644 --- a/bookwyrm/activitypub/base_activity.py +++ b/bookwyrm/activitypub/base_activity.py @@ -127,7 +127,7 @@ class ActivityObject: if ( allow_create and hasattr(model, "ignore_activity") - and model.ignore_activity(self) + and model.ignore_activity(self, allow_external_connections) ): return None diff --git a/bookwyrm/models/favorite.py b/bookwyrm/models/favorite.py index 4c3675219..98fbce550 100644 --- a/bookwyrm/models/favorite.py +++ b/bookwyrm/models/favorite.py @@ -20,8 +20,9 @@ class Favorite(ActivityMixin, BookWyrmModel): activity_serializer = activitypub.Like + # pylint: disable=unused-argument @classmethod - def ignore_activity(cls, activity): + def ignore_activity(cls, activity, allow_external_connections=True): """don't bother with incoming favs of unknown statuses""" return not Status.objects.filter(remote_id=activity.object).exists() diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py index 1fcc9ee75..047d0aba6 100644 --- a/bookwyrm/models/status.py +++ b/bookwyrm/models/status.py @@ -116,10 +116,16 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): return list(set(mentions)) @classmethod - def ignore_activity(cls, activity): # pylint: disable=too-many-return-statements + def ignore_activity( + cls, activity, allow_external_connections=True + ): # pylint: disable=too-many-return-statements """keep notes if they are replies to existing statuses""" if activity.type == "Announce": - boosted = activitypub.resolve_remote_id(activity.object, get_activity=True) + boosted = activitypub.resolve_remote_id( + activity.object, + get_activity=True, + allow_external_connections=allow_external_connections, + ) if not boosted: # if we can't load the status, definitely ignore it return True From 61453d48e6ab4983b57d1e4eccae43aee2099f97 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Fri, 7 Apr 2023 01:58:49 -0400 Subject: [PATCH 092/114] Add automatic instrumentation to Postgres queries This enables automatic instrumentation of Postgres queries when OpenTelemetry instrumentation is enabled, which will help with debugging performance problems. --- bookwyrm/apps.py | 1 + bookwyrm/telemetry/open_telemetry.py | 6 ++++++ celerywyrm/apps.py | 1 + requirements.txt | 1 + 4 files changed, 9 insertions(+) diff --git a/bookwyrm/apps.py b/bookwyrm/apps.py index 7f684722d..b0c3e3fa4 100644 --- a/bookwyrm/apps.py +++ b/bookwyrm/apps.py @@ -40,6 +40,7 @@ class BookwyrmConfig(AppConfig): from bookwyrm.telemetry import open_telemetry open_telemetry.instrumentDjango() + open_telemetry.instrumentPostgres() if settings.ENABLE_PREVIEW_IMAGES and settings.FONTS: # Download any fonts that we don't have yet diff --git a/bookwyrm/telemetry/open_telemetry.py b/bookwyrm/telemetry/open_telemetry.py index 2798582d0..00b24d4b0 100644 --- a/bookwyrm/telemetry/open_telemetry.py +++ b/bookwyrm/telemetry/open_telemetry.py @@ -22,6 +22,12 @@ def instrumentDjango(): DjangoInstrumentor().instrument() +def instrumentPostgres(): + from opentelemetry.instrumentation.psycopg2 import Psycopg2Instrumentor + + Psycopg2Instrumentor().instrument() + + def instrumentCelery(): from opentelemetry.instrumentation.celery import CeleryInstrumentor from celery.signals import worker_process_init diff --git a/celerywyrm/apps.py b/celerywyrm/apps.py index bb2d27edd..bf443afdb 100644 --- a/celerywyrm/apps.py +++ b/celerywyrm/apps.py @@ -11,3 +11,4 @@ class CelerywyrmConfig(AppConfig): from bookwyrm.telemetry import open_telemetry open_telemetry.instrumentCelery() + open_telemetry.instrumentPostgres() diff --git a/requirements.txt b/requirements.txt index f8f1ab937..3da1d5082 100644 --- a/requirements.txt +++ b/requirements.txt @@ -29,6 +29,7 @@ opentelemetry-api==1.16.0 opentelemetry-exporter-otlp-proto-grpc==1.16.0 opentelemetry-instrumentation-celery==0.37b0 opentelemetry-instrumentation-django==0.37b0 +opentelemetry-instrumentation-psycopg2==0.37b0 opentelemetry-sdk==1.16.0 protobuf==3.20.* pyotp==2.8.0 From 6986fc90251c3cf2f991760568546cafc1cab335 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Thu, 6 Apr 2023 05:48:24 -0400 Subject: [PATCH 093/114] Add form to remove tasks from Celery --- bookwyrm/templates/settings/celery.html | 29 ++++++++++++++ bookwyrm/views/admin/celery_status.py | 50 +++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/bookwyrm/templates/settings/celery.html b/bookwyrm/templates/settings/celery.html index 65315da01..5f79dfd9d 100644 --- a/bookwyrm/templates/settings/celery.html +++ b/bookwyrm/templates/settings/celery.html @@ -116,6 +116,35 @@
{% endif %} +
+

{% trans "Clear Queues" %}

+ +
+ + {% trans "Clearing queues can cause serious problems including data loss! Only play with this if you really know what you're doing. You must shut down the Celery worker before you do this." %} +
+ +
+ {% csrf_token %} + +
+
+

{{ form.queues.label_tag }}

+ {{ form.queues }} +
+ +
+

{{ form.tasks.label_tag }}

+ {{ form.tasks }} +
+
+ +
+ +
+
+
+ {% if errors %}

{% trans "Errors" %}

diff --git a/bookwyrm/views/admin/celery_status.py b/bookwyrm/views/admin/celery_status.py index e0b1fe18c..392d7c471 100644 --- a/bookwyrm/views/admin/celery_status.py +++ b/bookwyrm/views/admin/celery_status.py @@ -1,10 +1,13 @@ """ celery status """ +import json + from django.contrib.auth.decorators import login_required, permission_required from django.http import HttpResponse 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_GET +from django import forms import redis from celerywyrm import settings @@ -46,14 +49,61 @@ class CeleryStatus(View): queues = None errors.append(err) + form = ClearCeleryForm() + data = { "stats": stats, "active_tasks": active_tasks, "queues": queues, + "form": form, "errors": errors, } return TemplateResponse(request, "settings/celery.html", data) + def post(self, request): + """Submit form to clear queues""" + form = ClearCeleryForm(request.POST) + if form.is_valid(): + if len(celery.control.ping()) != 0: + return HttpResponse( + "Refusing to delete tasks while Celery worker is active" + ) + pipeline = r.pipeline() + for queue in form.cleaned_data["queues"]: + for task in r.lrange(queue, 0, -1): + task_json = json.loads(task) + if task_json["headers"]["task"] in form.cleaned_data["tasks"]: + pipeline.lrem(queue, 0, task) + results = pipeline.execute() + + return HttpResponse(f"Deleted {sum(results)} tasks") + + +class ClearCeleryForm(forms.Form): + """Form to clear queues""" + + queues = forms.MultipleChoiceField( + label="Queues", + choices=[ + (LOW, "Low prioirty"), + (MEDIUM, "Medium priority"), + (HIGH, "High priority"), + (IMPORTS, "Imports"), + (BROADCAST, "Broadcasts"), + ], + widget=forms.CheckboxSelectMultiple, + ) + tasks = forms.MultipleChoiceField( + label="Tasks", choices=[], widget=forms.CheckboxSelectMultiple + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + celery.loader.import_default_modules() + self.fields["tasks"].choices = sorted( + [(k, k) for k in celery.tasks.keys() if not k.startswith("celery.")] + ) + @require_GET # pylint: disable=unused-argument From 3709f5c7a965f18fbf6788e28c041ca613ffad78 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Fri, 7 Apr 2023 03:18:43 -0400 Subject: [PATCH 094/114] Increase Celery ping timeout for monitoring page This should prevent some transient alerts. --- bookwyrm/views/admin/celery_status.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/admin/celery_status.py b/bookwyrm/views/admin/celery_status.py index e0b1fe18c..8175ae405 100644 --- a/bookwyrm/views/admin/celery_status.py +++ b/bookwyrm/views/admin/celery_status.py @@ -60,7 +60,7 @@ class CeleryStatus(View): def celery_ping(request): """Just tells you if Celery is on or not""" try: - ping = celery.control.inspect().ping() + ping = celery.control.inspect().ping(timeout=5) if ping: return HttpResponse() # pylint: disable=broad-except From c89da1bd66d465db00c584a8fa5437408c0d57c0 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Fri, 7 Apr 2023 04:17:51 -0400 Subject: [PATCH 095/114] Don't include deleted users in suggested users query Related: #2727 --- bookwyrm/suggested_users.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index ea6b1c55d..9ebf7ccb1 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -53,7 +53,7 @@ class SuggestedUsers(RedisStore): def get_users_for_object(self, obj): # pylint: disable=no-self-use """given a user, who might want to follow them""" - return models.User.objects.filter(local=True,).exclude( + return models.User.objects.filter(local=True, is_active=True).exclude( Q(id=obj.id) | Q(followers=obj) | Q(id__in=obj.blocks.all()) | Q(blocks=obj) ) From 912d0a0149d0f3a16fe5c0d2e179ade1c51ef527 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Fri, 7 Apr 2023 05:51:00 -0400 Subject: [PATCH 096/114] Fix Accept header for requesting ActivityPub objects This is the header described in the ActivityPub spec, which should fix some federation problems with GoToSocial and potentially other picky services. Related: #2794, superseriousbusiness/gotosocial#1676 --- bookwyrm/activitypub/base_activity.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bookwyrm/activitypub/base_activity.py b/bookwyrm/activitypub/base_activity.py index 840dab6a4..ef7ecd0b2 100644 --- a/bookwyrm/activitypub/base_activity.py +++ b/bookwyrm/activitypub/base_activity.py @@ -384,7 +384,8 @@ def get_activitypub_data(url): resp = requests.get( url, headers={ - "Accept": "application/json; charset=utf-8", + # pylint: disable=line-too-long + "Accept": 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', "Date": now, "Signature": make_signature("get", sender, url, now), }, From a8235fc3a2d06e3330682c2fe70e0e6c4e76dfb3 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 7 Apr 2023 06:04:47 -0700 Subject: [PATCH 097/114] Moves the stray "e" back to "mobile" --- bookwyrm/templates/settings/dashboard/dashboard.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/settings/dashboard/dashboard.html b/bookwyrm/templates/settings/dashboard/dashboard.html index ead0d275e..4c109c7e1 100644 --- a/bookwyrm/templates/settings/dashboard/dashboard.html +++ b/bookwyrm/templates/settings/dashboard/dashboard.html @@ -16,7 +16,7 @@

{{ users|intcomma }}

-
+

{% trans "Active this month" %}

{{ active_users|intcomma }}

From 77264493eb23bbc85d0fc923e37bca43f0ea4e86 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Wed, 5 Apr 2023 23:54:42 -0400 Subject: [PATCH 098/114] Override get_audience instead of _get_audience in LocalStream I suspect this will make some future work simpler. --- bookwyrm/activitystreams.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 1a863f48b..3da9abc4e 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -208,11 +208,11 @@ class LocalStream(ActivityStream): key = "local" - def _get_audience(self, status): + def get_audience(self, status): # this stream wants no part in non-public statuses if status.privacy != "public" or not status.user.local: return [] - return super()._get_audience(status) + return super().get_audience(status) def get_statuses_for_user(self, user): # all public statuses by a local user From 07b50a1453ea831a75f0eb92768559b184a9b47f Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Thu, 6 Apr 2023 00:35:15 -0400 Subject: [PATCH 099/114] Optimize get_audience This avoids filtering for the user that made the post in the same query as we use for other things, which should allow for better use of indices in all cases. Previously, #2723 did some work on this that only worked for some cases in HomeStream, but this code should work for all cases. Related: #2720 --- bookwyrm/activitystreams.py | 44 +++++++++++++++++++++---------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 3da9abc4e..92076e6b8 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -107,7 +107,7 @@ class ActivityStream(RedisStore): @tracer.start_as_current_span("ActivityStream._get_audience") def _get_audience(self, status): # pylint: disable=no-self-use - """given a status, what users should see it""" + """given a status, what users should see it, excluding the author""" trace.get_current_span().set_attribute("status_type", status.status_type) trace.get_current_span().set_attribute("status_privacy", status.privacy) trace.get_current_span().set_attribute( @@ -129,15 +129,13 @@ class ActivityStream(RedisStore): # only visible to the poster and mentioned users if status.privacy == "direct": audience = audience.filter( - Q(id=status.user.id) # if the user is the post's author - | Q(id__in=status.mention_users.all()) # if the user is mentioned + Q(id__in=status.mention_users.all()) # if the user is mentioned ) # don't show replies to statuses the user can't see elif status.reply_parent and status.reply_parent.privacy == "followers": audience = audience.filter( - Q(id=status.user.id) # if the user is the post's author - | Q(id=status.reply_parent.user.id) # if the user is the OG author + Q(id=status.reply_parent.user.id) # if the user is the OG author | ( Q(following=status.user) & Q(following=status.reply_parent.user) ) # if the user is following both authors @@ -146,8 +144,7 @@ class ActivityStream(RedisStore): # only visible to the poster's followers and tagged users elif status.privacy == "followers": audience = audience.filter( - Q(id=status.user.id) # if the user is the post's author - | Q(following=status.user) # if the user is following the author + Q(following=status.user) # if the user is following the author ) return audience.distinct() @@ -155,7 +152,11 @@ class ActivityStream(RedisStore): def get_audience(self, status): """given a status, what users should see it""" trace.get_current_span().set_attribute("stream_id", self.key) - return [user.id for user in self._get_audience(status)] + audience = self._get_audience(status) + status_author = models.User.objects.filter( + is_active=True, local=True, id=status.user.id + ) + return list({user.id for user in list(audience) + list(status_author)}) def get_stores_for_users(self, user_ids): """convert a list of user ids into redis store ids""" @@ -184,11 +185,13 @@ class HomeStream(ActivityStream): audience = super()._get_audience(status) if not audience: return [] - # if the user is the post's author - ids_self = [user.id for user in audience.filter(Q(id=status.user.id))] # if the user is following the author - ids_following = [user.id for user in audience.filter(Q(following=status.user))] - return ids_self + ids_following + audience = audience.filter(following=status.user) + # if the user is the post's author + status_author = models.User.objects.filter( + is_active=True, local=True, id=status.user.id + ) + return list({user.id for user in list(audience) + list(status_author)}) def get_statuses_for_user(self, user): return models.Status.privacy_filter( @@ -229,13 +232,6 @@ class BooksStream(ActivityStream): def _get_audience(self, status): """anyone with the mentioned book on their shelves""" - # only show public statuses on the books feed, - # and only statuses that mention books - if status.privacy != "public" or not ( - status.mention_books.exists() or hasattr(status, "book") - ): - return [] - work = ( status.book.parent_work if hasattr(status, "book") @@ -247,6 +243,16 @@ class BooksStream(ActivityStream): return [] return audience.filter(shelfbook__book__parent_work=work).distinct() + def get_audience(self, status): + # only show public statuses on the books feed, + # and only statuses that mention books + if status.privacy != "public" or not ( + status.mention_books.exists() or hasattr(status, "book") + ): + return [] + + return super().get_audience(status) + def get_statuses_for_user(self, user): """any public status that mentions the user's books""" books = user.shelfbook_set.values_list( From 1048638e3033cbed474dbdba8c5d2da86a9a0a6f Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Fri, 7 Apr 2023 21:51:44 -0400 Subject: [PATCH 100/114] Stop ignoring task results This is essentially a revert of 9cbff312a. The commit was at the advice of the Celery docs for optimization, but I've since decided that the downsides in terms of making things harder to debug (it makes Flower nearly useless, for instance) are bigger than the upsides in performance gain (which seem extremely small in practice, given how long our tasks take, and the number of tasks we have). --- bookwyrm/activitypub/base_activity.py | 2 +- bookwyrm/activitystreams.py | 16 ++++++++-------- bookwyrm/connectors/connector_manager.py | 4 ++-- bookwyrm/emailing.py | 2 +- bookwyrm/lists_stream.py | 10 +++++----- bookwyrm/models/activitypub_mixin.py | 2 +- bookwyrm/models/antispam.py | 2 +- bookwyrm/models/import_job.py | 4 ++-- bookwyrm/models/user.py | 4 ++-- bookwyrm/preview_images.py | 8 ++++---- bookwyrm/suggested_users.py | 12 ++++++------ bookwyrm/views/inbox.py | 2 +- 12 files changed, 34 insertions(+), 34 deletions(-) diff --git a/bookwyrm/activitypub/base_activity.py b/bookwyrm/activitypub/base_activity.py index 44361f0d0..908475e73 100644 --- a/bookwyrm/activitypub/base_activity.py +++ b/bookwyrm/activitypub/base_activity.py @@ -241,7 +241,7 @@ class ActivityObject: return data -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) @transaction.atomic def set_related_field( model_name, origin_model_name, related_field_name, related_remote_id, data diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 92076e6b8..0dcb5262e 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -497,7 +497,7 @@ def remove_statuses_on_unshelve(sender, instance, *args, **kwargs): # ---- TASKS -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def add_book_statuses_task(user_id, book_id): """add statuses related to a book on shelve""" user = models.User.objects.get(id=user_id) @@ -505,7 +505,7 @@ def add_book_statuses_task(user_id, book_id): BooksStream().add_book_statuses(user, book) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def remove_book_statuses_task(user_id, book_id): """remove statuses about a book from a user's books feed""" user = models.User.objects.get(id=user_id) @@ -513,7 +513,7 @@ def remove_book_statuses_task(user_id, book_id): BooksStream().remove_book_statuses(user, book) -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def populate_stream_task(stream, user_id): """background task for populating an empty activitystream""" user = models.User.objects.get(id=user_id) @@ -521,7 +521,7 @@ def populate_stream_task(stream, user_id): stream.populate_streams(user) -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def remove_status_task(status_ids): """remove a status from any stream it might be in""" # this can take an id or a list of ids @@ -536,7 +536,7 @@ def remove_status_task(status_ids): ) -@app.task(queue=HIGH, ignore_result=True) +@app.task(queue=HIGH) def add_status_task(status_id, increment_unread=False): """add a status to any stream it should be in""" status = models.Status.objects.select_subclasses().get(id=status_id) @@ -548,7 +548,7 @@ def add_status_task(status_id, increment_unread=False): stream.add_status(status, increment_unread=increment_unread) -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def remove_user_statuses_task(viewer_id, user_id, stream_list=None): """remove all statuses by a user from a viewer's stream""" stream_list = [streams[s] for s in stream_list] if stream_list else streams.values() @@ -558,7 +558,7 @@ def remove_user_statuses_task(viewer_id, user_id, stream_list=None): stream.remove_user_statuses(viewer, user) -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def add_user_statuses_task(viewer_id, user_id, stream_list=None): """add all statuses by a user to a viewer's stream""" stream_list = [streams[s] for s in stream_list] if stream_list else streams.values() @@ -568,7 +568,7 @@ def add_user_statuses_task(viewer_id, user_id, stream_list=None): stream.add_user_statuses(viewer, user) -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def handle_boost_task(boost_id): """remove the original post and other, earlier boosts""" instance = models.Status.objects.get(id=boost_id) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index d7e2aad4b..56a222ba1 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -143,7 +143,7 @@ def get_or_create_connector(remote_id): return load_connector(connector_info) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def load_more_data(connector_id, book_id): """background the work of getting all 10,000 editions of LoTR""" connector_info = models.Connector.objects.get(id=connector_id) @@ -152,7 +152,7 @@ def load_more_data(connector_id, book_id): connector.expand_book_data(book) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def create_edition_task(connector_id, work_id, data): """separate task for each of the 10,000 editions of LoTR""" connector_info = models.Connector.objects.get(id=connector_id) diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py index 1640c0b73..2271077b1 100644 --- a/bookwyrm/emailing.py +++ b/bookwyrm/emailing.py @@ -75,7 +75,7 @@ def format_email(email_name, data): return (subject, html_content, text_content) -@app.task(queue=HIGH, ignore_result=True) +@app.task(queue=HIGH) def send_email(recipient, subject, html_content, text_content): """use a task to send the email""" email = EmailMultiAlternatives( diff --git a/bookwyrm/lists_stream.py b/bookwyrm/lists_stream.py index 2a92103e5..2b08010b1 100644 --- a/bookwyrm/lists_stream.py +++ b/bookwyrm/lists_stream.py @@ -217,14 +217,14 @@ def add_list_on_account_create_command(user_id): # ---- TASKS -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def populate_lists_task(user_id): """background task for populating an empty list stream""" user = models.User.objects.get(id=user_id) ListsStream().populate_lists(user) -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def remove_list_task(list_id, re_add=False): """remove a list from any stream it might be in""" stores = models.User.objects.filter(local=True, is_active=True).values_list( @@ -239,14 +239,14 @@ def remove_list_task(list_id, re_add=False): add_list_task.delay(list_id) -@app.task(queue=HIGH, ignore_result=True) +@app.task(queue=HIGH) def add_list_task(list_id): """add a list to any stream it should be in""" book_list = models.List.objects.get(id=list_id) ListsStream().add_list(book_list) -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def remove_user_lists_task(viewer_id, user_id, exclude_privacy=None): """remove all lists by a user from a viewer's stream""" viewer = models.User.objects.get(id=viewer_id) @@ -254,7 +254,7 @@ def remove_user_lists_task(viewer_id, user_id, exclude_privacy=None): ListsStream().remove_user_lists(viewer, user, exclude_privacy=exclude_privacy) -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def add_user_lists_task(viewer_id, user_id): """add all lists by a user to a viewer's stream""" viewer = models.User.objects.get(id=viewer_id) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 3350a4f6b..e76433189 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -506,7 +506,7 @@ def unfurl_related_field(related_field, sort_field=None): return related_field.remote_id -@app.task(queue=BROADCAST, ignore_result=True) +@app.task(queue=BROADCAST) def broadcast_task(sender_id: int, activity: str, recipients: List[str]): """the celery task for broadcast""" user_model = apps.get_model("bookwyrm.User", require_ready=True) diff --git a/bookwyrm/models/antispam.py b/bookwyrm/models/antispam.py index c3afadf28..1e20df340 100644 --- a/bookwyrm/models/antispam.py +++ b/bookwyrm/models/antispam.py @@ -65,7 +65,7 @@ class AutoMod(AdminModel): created_by = models.ForeignKey("User", on_delete=models.PROTECT) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def automod_task(): """Create reports""" if not AutoMod.objects.exists(): diff --git a/bookwyrm/models/import_job.py b/bookwyrm/models/import_job.py index 5f564d390..bdd88c687 100644 --- a/bookwyrm/models/import_job.py +++ b/bookwyrm/models/import_job.py @@ -327,7 +327,7 @@ class ImportItem(models.Model): ) -@app.task(queue=IMPORTS, ignore_result=True) +@app.task(queue=IMPORTS) def start_import_task(job_id): """trigger the child tasks for each row""" job = ImportJob.objects.get(id=job_id) @@ -346,7 +346,7 @@ def start_import_task(job_id): job.save() -@app.task(queue=IMPORTS, ignore_result=True) +@app.task(queue=IMPORTS) def import_item_task(item_id): """resolve a row into a book""" item = ImportItem.objects.get(id=item_id) diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index 6d26b7b17..85e1f0edb 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -469,7 +469,7 @@ class KeyPair(ActivitypubMixin, BookWyrmModel): return super().save(*args, **kwargs) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def set_remote_server(user_id): """figure out the user's remote server in the background""" user = User.objects.get(id=user_id) @@ -513,7 +513,7 @@ def get_or_create_remote_server(domain, refresh=False): return server -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def get_remote_reviews(outbox): """ingest reviews by a new remote bookwyrm user""" outbox_page = outbox + "?page=true&type=Review" diff --git a/bookwyrm/preview_images.py b/bookwyrm/preview_images.py index c218d87df..549e12472 100644 --- a/bookwyrm/preview_images.py +++ b/bookwyrm/preview_images.py @@ -420,7 +420,7 @@ def save_and_cleanup(image, instance=None): # pylint: disable=invalid-name -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def generate_site_preview_image_task(): """generate preview_image for the website""" if not settings.ENABLE_PREVIEW_IMAGES: @@ -445,7 +445,7 @@ def generate_site_preview_image_task(): # pylint: disable=invalid-name -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def generate_edition_preview_image_task(book_id): """generate preview_image for a book""" if not settings.ENABLE_PREVIEW_IMAGES: @@ -470,7 +470,7 @@ def generate_edition_preview_image_task(book_id): save_and_cleanup(image, instance=book) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def generate_user_preview_image_task(user_id): """generate preview_image for a user""" if not settings.ENABLE_PREVIEW_IMAGES: @@ -496,7 +496,7 @@ def generate_user_preview_image_task(user_id): save_and_cleanup(image, instance=user) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def remove_user_preview_image_task(user_id): """remove preview_image for a user""" if not settings.ENABLE_PREVIEW_IMAGES: diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index 0ae2a1b15..05e05891c 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -244,20 +244,20 @@ def domain_level_update(sender, instance, created, update_fields=None, **kwargs) # ------------------- TASKS -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def rerank_suggestions_task(user_id): """do the hard work in celery""" suggested_users.rerank_user_suggestions(user_id) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def rerank_user_task(user_id, update_only=False): """do the hard work in celery""" user = models.User.objects.get(id=user_id) suggested_users.rerank_obj(user, update_only=update_only) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def remove_user_task(user_id): """do the hard work in celery""" user = models.User.objects.get(id=user_id) @@ -266,14 +266,14 @@ def remove_user_task(user_id): ) -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def remove_suggestion_task(user_id, suggested_user_id): """remove a specific user from a specific user's suggestions""" suggested_user = models.User.objects.get(id=suggested_user_id) suggested_users.remove_suggestion(user_id, suggested_user) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def bulk_remove_instance_task(instance_id): """remove a bunch of users from recs""" for user in models.User.objects.filter(federated_server__id=instance_id): @@ -282,7 +282,7 @@ def bulk_remove_instance_task(instance_id): ) -@app.task(queue=LOW, ignore_result=True) +@app.task(queue=LOW) def bulk_add_instance_task(instance_id): """remove a bunch of users from recs""" for user in models.User.objects.filter(federated_server__id=instance_id): diff --git a/bookwyrm/views/inbox.py b/bookwyrm/views/inbox.py index 2fb36507f..42a8dc78e 100644 --- a/bookwyrm/views/inbox.py +++ b/bookwyrm/views/inbox.py @@ -115,7 +115,7 @@ def sometimes_async_activity_task(activity_json, queue=MEDIUM): activity_task.apply_async(args=(activity_json,), queue=queue) -@app.task(queue=MEDIUM, ignore_result=True) +@app.task(queue=MEDIUM) def activity_task(activity_json): """do something with this json we think is legit""" # lets see if the activitypub module can make sense of this json From 41633090baaa16a5255170caab6792e5975af771 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Sat, 8 Apr 2023 17:02:04 +0200 Subject: [PATCH 101/114] Don't show the series as a link if the book has no author The series link needs an author so if it doesn't have one, instead of showing a server error let's just show the series details as plain text without a link. Fixes: #2797 --- bookwyrm/templates/book/book.html | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index e9eff99ab..1024255e6 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -46,7 +46,13 @@ - ({{ book.series }}{% if book.series_number %} #{{ book.series_number }}{% endif %}) + {% if book.authors.exists %} + + {% endif %} + {{ book.series }}{% if book.series_number %} #{{ book.series_number }}{% endif %} + {% if book.authors.exists %} + + {% endif %} {% endif %}

{% endif %} From 43b34610a6082857f87a0c8126be44552d89e4f0 Mon Sep 17 00:00:00 2001 From: Wesley Aptekar-Cassels Date: Tue, 11 Apr 2023 21:51:31 -0400 Subject: [PATCH 102/114] Choose installed docker compose command in bw-dev Docker is removing support for docker-compose, and it doesn't appear to be possible to install it anymore. Instead, it has been replaced with compose V2 which is a docker plugin called with 'docker compose' (no hyphen). See https://docs.docker.com/compose/compose-v2/ Thanks to @Neriderc for noticing this in #2781. --- bw-dev | 54 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/bw-dev b/bw-dev index 3e804943b..df88b06c6 100755 --- a/bw-dev +++ b/bw-dev @@ -23,21 +23,27 @@ trap showerr EXIT source .env trap - EXIT +if docker compose &> /dev/null ; then + DOCKER_COMPOSE="docker compose" +else + DOCKER_COMPOSE="docker-compose" +fi + function clean { - docker-compose stop - docker-compose rm -f + $DOCKER_COMPOSE stop + $DOCKER_COMPOSE rm -f } function runweb { - docker-compose run --rm web "$@" + $DOCKER_COMPOSE run --rm web "$@" } function execdb { - docker-compose exec db $@ + $DOCKER_COMPOSE exec db $@ } function execweb { - docker-compose exec web "$@" + $DOCKER_COMPOSE exec web "$@" } function initdb { @@ -75,23 +81,23 @@ set -x case "$CMD" in up) - docker-compose up --build "$@" + $DOCKER_COMPOSE up --build "$@" ;; down) - docker-compose down + $DOCKER_COMPOSE down ;; service_ports_web) prod_error - docker-compose run --rm --service-ports web + $DOCKER_COMPOSE run --rm --service-ports web ;; initdb) initdb "@" ;; resetdb) prod_error - docker-compose rm -svf + $DOCKER_COMPOSE rm -svf docker volume rm -f bookwyrm_media_volume bookwyrm_pgdata bookwyrm_redis_activity_data bookwyrm_redis_broker_data bookwyrm_static_volume - docker-compose build + $DOCKER_COMPOSE build migrate migrate django_celery_beat initdb @@ -116,7 +122,7 @@ case "$CMD" in execdb psql -U ${POSTGRES_USER} ${POSTGRES_DB} ;; restart_celery) - docker-compose restart celery_worker + $DOCKER_COMPOSE restart celery_worker ;; pytest) prod_error @@ -164,7 +170,7 @@ case "$CMD" in runweb django-admin compilemessages --ignore venv ;; build) - docker-compose build + $DOCKER_COMPOSE build ;; clean) prod_error @@ -172,7 +178,7 @@ case "$CMD" in ;; black) prod_error - docker-compose run --rm dev-tools black celerywyrm bookwyrm + $DOCKER_COMPOSE run --rm dev-tools black celerywyrm bookwyrm ;; pylint) prod_error @@ -181,25 +187,25 @@ case "$CMD" in ;; prettier) prod_error - docker-compose run --rm dev-tools npx prettier --write bookwyrm/static/js/*.js + $DOCKER_COMPOSE run --rm dev-tools npx prettier --write bookwyrm/static/js/*.js ;; eslint) prod_error - docker-compose run --rm dev-tools npx eslint bookwyrm/static --ext .js + $DOCKER_COMPOSE run --rm dev-tools npx eslint bookwyrm/static --ext .js ;; stylelint) prod_error - docker-compose run --rm dev-tools npx stylelint \ + $DOCKER_COMPOSE run --rm dev-tools npx stylelint \ bookwyrm/static/css/bookwyrm.scss bookwyrm/static/css/bookwyrm/**/*.scss --fix \ --config dev-tools/.stylelintrc.js ;; formatters) prod_error runweb pylint bookwyrm/ - docker-compose run --rm dev-tools black celerywyrm bookwyrm - docker-compose run --rm dev-tools npx prettier --write bookwyrm/static/js/*.js - docker-compose run --rm dev-tools npx eslint bookwyrm/static --ext .js - docker-compose run --rm dev-tools npx stylelint \ + $DOCKER_COMPOSE run --rm dev-tools black celerywyrm bookwyrm + $DOCKER_COMPOSE run --rm dev-tools npx prettier --write bookwyrm/static/js/*.js + $DOCKER_COMPOSE run --rm dev-tools npx eslint bookwyrm/static --ext .js + $DOCKER_COMPOSE run --rm dev-tools npx stylelint \ bookwyrm/static/css/bookwyrm.scss bookwyrm/static/css/bookwyrm/**/*.scss --fix \ --config dev-tools/.stylelintrc.js ;; @@ -209,14 +215,14 @@ case "$CMD" in ;; update) git pull - docker-compose build + $DOCKER_COMPOSE build # ./update.sh runweb python manage.py migrate runweb python manage.py compile_themes runweb python manage.py collectstatic --no-input - docker-compose up -d - docker-compose restart web - docker-compose restart celery_worker + $DOCKER_COMPOSE up -d + $DOCKER_COMPOSE restart web + $DOCKER_COMPOSE restart celery_worker ;; populate_streams) runweb python manage.py populate_streams "$@" From f520d1b7f8c2ebca690ac3e246c39b3a5e70045a Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Fri, 14 Apr 2023 16:40:50 +0200 Subject: [PATCH 103/114] Make the text on the search button translatable --- bookwyrm/templates/search/layout.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/search/layout.html b/bookwyrm/templates/search/layout.html index a2f64ad07..340911cb0 100644 --- a/bookwyrm/templates/search/layout.html +++ b/bookwyrm/templates/search/layout.html @@ -29,7 +29,7 @@
From 3619d8960bf951bbc69f8aa23ce7d0f27d3d117d Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Fri, 14 Apr 2023 16:49:00 +0200 Subject: [PATCH 104/114] Mark two strings as translatable in the getting started questionnaire --- bookwyrm/templates/get_started/books.html | 2 +- bookwyrm/templates/get_started/users.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/templates/get_started/books.html b/bookwyrm/templates/get_started/books.html index 9613508b9..93196dbcf 100644 --- a/bookwyrm/templates/get_started/books.html +++ b/bookwyrm/templates/get_started/books.html @@ -30,7 +30,7 @@
{% if book_results %}
-

Search results

+

{% trans "Search results" %}

{% for book in book_results %} diff --git a/bookwyrm/templates/get_started/users.html b/bookwyrm/templates/get_started/users.html index 7ec7ed9d3..4f95882f5 100644 --- a/bookwyrm/templates/get_started/users.html +++ b/bookwyrm/templates/get_started/users.html @@ -5,7 +5,7 @@

{% trans "Who to follow" %}

-

You can follow users on other BookWyrm instances and federated services like Mastodon.

+

{% trans "You can follow users on other BookWyrm instances and federated services like Mastodon." %}

From 2bbc9a16adfb2a79109f6e3ae06b6ca016c8e746 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Sat, 15 Apr 2023 11:36:18 +0200 Subject: [PATCH 105/114] Fix deduplicating books that are on a shelf or in a list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously when the deduplicate_book_data script tried to merge an edition that was on a shelf or in a list then it would fail because when the canonical book was added to the shelf or the list then it wouldn’t set the extra fields of the linking table for the “through” model of the field. These would end up defaulting to NULL, but that is not valid for some of the fields in ShelfItem and ListItem so postgres wouldn’t accept it. To fix that, this patch makes it skip updating fields that have a non-autogenerated linking table. The linking table would appear as a separate model anyway so the book will be moved via that instead. Fixes: #2817 --- .../management/commands/deduplicate_book_data.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/bookwyrm/management/commands/deduplicate_book_data.py b/bookwyrm/management/commands/deduplicate_book_data.py index 5ca8496b0..4519d2cff 100644 --- a/bookwyrm/management/commands/deduplicate_book_data.py +++ b/bookwyrm/management/commands/deduplicate_book_data.py @@ -1,7 +1,7 @@ """ PROCEED WITH CAUTION: uses deduplication fields to permanently merge book data objects """ from django.core.management.base import BaseCommand -from django.db.models import Count +from django.db.models import Count, ManyToManyField from bookwyrm import models @@ -12,6 +12,16 @@ def update_related(canonical, obj): (r.remote_field.name, r.related_model) for r in canonical._meta.related_objects ] for (related_field, related_model) in related_models: + # Skip the ManyToMany fields that aren’t auto-created. These + # should have a corresponding OneToMany field in the model for + # the linking table anyway. If we update it through that model + # instead then we won’t lose the extra fields in the linking + # table. + related_field_obj = related_model._meta.get_field(related_field) + if isinstance(related_field_obj, ManyToManyField): + through = related_field_obj.remote_field.through + if not through._meta.auto_created: + continue related_objs = related_model.objects.filter(**{related_field: obj}) for related_obj in related_objs: print("replacing in", related_model.__name__, related_field, related_obj.id) From 71e2486d017a35f217bfdae7b281465d039f5ce0 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Fri, 14 Apr 2023 22:35:07 +0200 Subject: [PATCH 106/114] Move the merging code from deduplicate code to common module That way it can be used in a new command to merge individual items. --- .../commands/deduplicate_book_data.py | 50 ++----------------- bookwyrm/management/merge.py | 50 +++++++++++++++++++ 2 files changed, 53 insertions(+), 47 deletions(-) create mode 100644 bookwyrm/management/merge.py diff --git a/bookwyrm/management/commands/deduplicate_book_data.py b/bookwyrm/management/commands/deduplicate_book_data.py index 4519d2cff..dde7d133c 100644 --- a/bookwyrm/management/commands/deduplicate_book_data.py +++ b/bookwyrm/management/commands/deduplicate_book_data.py @@ -1,50 +1,9 @@ """ PROCEED WITH CAUTION: uses deduplication fields to permanently merge book data objects """ from django.core.management.base import BaseCommand -from django.db.models import Count, ManyToManyField +from django.db.models import Count from bookwyrm import models - - -def update_related(canonical, obj): - """update all the models with fk to the object being removed""" - # move related models to canonical - related_models = [ - (r.remote_field.name, r.related_model) for r in canonical._meta.related_objects - ] - for (related_field, related_model) in related_models: - # Skip the ManyToMany fields that aren’t auto-created. These - # should have a corresponding OneToMany field in the model for - # the linking table anyway. If we update it through that model - # instead then we won’t lose the extra fields in the linking - # table. - related_field_obj = related_model._meta.get_field(related_field) - if isinstance(related_field_obj, ManyToManyField): - through = related_field_obj.remote_field.through - if not through._meta.auto_created: - continue - related_objs = related_model.objects.filter(**{related_field: obj}) - for related_obj in related_objs: - print("replacing in", related_model.__name__, related_field, related_obj.id) - try: - setattr(related_obj, related_field, canonical) - related_obj.save() - except TypeError: - getattr(related_obj, related_field).add(canonical) - getattr(related_obj, related_field).remove(obj) - - -def copy_data(canonical, obj): - """try to get the most data possible""" - for data_field in obj._meta.get_fields(): - if not hasattr(data_field, "activitypub_field"): - continue - data_value = getattr(obj, data_field.name) - if not data_value: - continue - if not getattr(canonical, data_field.name): - print("setting data field", data_field.name, data_value) - setattr(canonical, data_field.name, data_value) - canonical.save() +from bookwyrm.management.merge import merge_objects def dedupe_model(model): @@ -71,10 +30,7 @@ def dedupe_model(model): print("keeping", canonical.remote_id) for obj in objs[1:]: print(obj.remote_id) - copy_data(canonical, obj) - update_related(canonical, obj) - # remove the outdated entry - obj.delete() + merge_objects(canonical, obj) class Command(BaseCommand): diff --git a/bookwyrm/management/merge.py b/bookwyrm/management/merge.py new file mode 100644 index 000000000..f55229f18 --- /dev/null +++ b/bookwyrm/management/merge.py @@ -0,0 +1,50 @@ +from django.db.models import ManyToManyField + + +def update_related(canonical, obj): + """update all the models with fk to the object being removed""" + # move related models to canonical + related_models = [ + (r.remote_field.name, r.related_model) for r in canonical._meta.related_objects + ] + for (related_field, related_model) in related_models: + # Skip the ManyToMany fields that aren’t auto-created. These + # should have a corresponding OneToMany field in the model for + # the linking table anyway. If we update it through that model + # instead then we won’t lose the extra fields in the linking + # table. + related_field_obj = related_model._meta.get_field(related_field) + if isinstance(related_field_obj, ManyToManyField): + through = related_field_obj.remote_field.through + if not through._meta.auto_created: + continue + related_objs = related_model.objects.filter(**{related_field: obj}) + for related_obj in related_objs: + print("replacing in", related_model.__name__, related_field, related_obj.id) + try: + setattr(related_obj, related_field, canonical) + related_obj.save() + except TypeError: + getattr(related_obj, related_field).add(canonical) + getattr(related_obj, related_field).remove(obj) + + +def copy_data(canonical, obj): + """try to get the most data possible""" + for data_field in obj._meta.get_fields(): + if not hasattr(data_field, "activitypub_field"): + continue + data_value = getattr(obj, data_field.name) + if not data_value: + continue + if not getattr(canonical, data_field.name): + print("setting data field", data_field.name, data_value) + setattr(canonical, data_field.name, data_value) + canonical.save() + + +def merge_objects(canonical, obj): + copy_data(canonical, obj) + update_related(canonical, obj) + # remove the outdated entry + obj.delete() From bd893e29de710e12c8de92154e8c8c4d81db0771 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Fri, 14 Apr 2023 23:05:30 +0200 Subject: [PATCH 107/114] Add management commands to merge editions and authors --- bookwyrm/management/commands/merge_authors.py | 12 ++++++++ .../management/commands/merge_editions.py | 12 ++++++++ bookwyrm/management/merge_command.py | 30 +++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 bookwyrm/management/commands/merge_authors.py create mode 100644 bookwyrm/management/commands/merge_editions.py create mode 100644 bookwyrm/management/merge_command.py diff --git a/bookwyrm/management/commands/merge_authors.py b/bookwyrm/management/commands/merge_authors.py new file mode 100644 index 000000000..7465df147 --- /dev/null +++ b/bookwyrm/management/commands/merge_authors.py @@ -0,0 +1,12 @@ +""" PROCEED WITH CAUTION: uses deduplication fields to permanently +merge author data objects """ +from bookwyrm import models +from bookwyrm.management.merge_command import MergeCommand + + +class Command(MergeCommand): + """merges two authors by ID""" + + help = "merges specified authors into one" + + MODEL = models.Author diff --git a/bookwyrm/management/commands/merge_editions.py b/bookwyrm/management/commands/merge_editions.py new file mode 100644 index 000000000..9ed696201 --- /dev/null +++ b/bookwyrm/management/commands/merge_editions.py @@ -0,0 +1,12 @@ +""" PROCEED WITH CAUTION: uses deduplication fields to permanently +merge edition data objects """ +from bookwyrm import models +from bookwyrm.management.merge_command import MergeCommand + + +class Command(MergeCommand): + """merges two editions by ID""" + + help = "merges specified editions into one" + + MODEL = models.Edition diff --git a/bookwyrm/management/merge_command.py b/bookwyrm/management/merge_command.py new file mode 100644 index 000000000..c8f44fc80 --- /dev/null +++ b/bookwyrm/management/merge_command.py @@ -0,0 +1,30 @@ +from bookwyrm.management.merge import merge_objects +from django.core.management.base import BaseCommand + + +class MergeCommand(BaseCommand): + """base class for merge commands""" + + def add_arguments(self, parser): + """add the arguments for this command""" + parser.add_argument("--canonical", type=int, required=True) + parser.add_argument("--other", type=int, required=True) + + # pylint: disable=no-self-use,unused-argument + def handle(self, *args, **options): + """merge the two objects""" + model = self.MODEL + + try: + canonical = model.objects.get(id=options["canonical"]) + except model.DoesNotExist: + print("canonical book doesn’t exist!") + return + try: + other = model.objects.get(id=options["other"]) + except model.DoesNotExist: + print("other book doesn’t exist!") + return + + merge_objects(canonical, other) + From e28562949b4c5cbac34310b59d7530038fc48e54 Mon Sep 17 00:00:00 2001 From: Jascha Urbach Date: Sat, 15 Apr 2023 16:31:15 +0200 Subject: [PATCH 108/114] ./bw.-dev black get rid of the black error. --- bookwyrm/management/merge_command.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bookwyrm/management/merge_command.py b/bookwyrm/management/merge_command.py index c8f44fc80..805dc73fa 100644 --- a/bookwyrm/management/merge_command.py +++ b/bookwyrm/management/merge_command.py @@ -27,4 +27,3 @@ class MergeCommand(BaseCommand): return merge_objects(canonical, other) - From f3b1b1d8e4e0bb48caf9a15bc4bef2298b7214df Mon Sep 17 00:00:00 2001 From: Jascha Urbach Date: Sun, 16 Apr 2023 17:28:05 +0200 Subject: [PATCH 109/114] Fix language constant to show correct lang in API api/v1/instance had "en" hardcoded as language. This fix takes LANGUAGE_CODE from settings.py/.env and takes the first two letters as response. --- bookwyrm/views/wellknown.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bookwyrm/views/wellknown.py b/bookwyrm/views/wellknown.py index 03e619dfd..d16c318c1 100644 --- a/bookwyrm/views/wellknown.py +++ b/bookwyrm/views/wellknown.py @@ -9,8 +9,7 @@ from django.utils import timezone from django.views.decorators.http import require_GET from bookwyrm import models -from bookwyrm.settings import DOMAIN, VERSION - +from bookwyrm.settings import DOMAIN, VERSION, LANGUAGE_CODE @require_GET def webfinger(request): @@ -110,7 +109,7 @@ def instance_info(_): "status_count": status_count, }, "thumbnail": logo, - "languages": ["en"], + "languages": [LANGUAGE_CODE[:2]], "registrations": site.allow_registration, "approval_required": not site.allow_registration and site.allow_invite_requests, From 0cae89b2b6d96e59c1ec4c3f6bae7a72400e8c04 Mon Sep 17 00:00:00 2001 From: Jascha Urbach Date: Sun, 16 Apr 2023 17:30:27 +0200 Subject: [PATCH 110/114] Update wellknown.py ./bw-dev black --- bookwyrm/views/wellknown.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/views/wellknown.py b/bookwyrm/views/wellknown.py index d16c318c1..ec5acf98f 100644 --- a/bookwyrm/views/wellknown.py +++ b/bookwyrm/views/wellknown.py @@ -11,6 +11,7 @@ from django.views.decorators.http import require_GET from bookwyrm import models from bookwyrm.settings import DOMAIN, VERSION, LANGUAGE_CODE + @require_GET def webfinger(request): """allow other servers to ask about a user""" From 84834eb5d31ccc8187b28e8ed7257732980aec74 Mon Sep 17 00:00:00 2001 From: Jacob Torrey Date: Mon, 17 Apr 2023 15:06:41 +0000 Subject: [PATCH 111/114] Run bw-dev black to fix formatting Signed-off-by: Jacob Torrey --- bookwyrm/connectors/abstract_connector.py | 1 - bookwyrm/connectors/connector_manager.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index b023caff9..1219e18b2 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -93,7 +93,6 @@ class AbstractMinimalConnector(ABC): except aiohttp.ClientError as err: logger.info(err) - @abstractmethod def get_or_create_book(self, remote_id): """pull up a book record by whatever means possible""" diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 304baf91e..b01e583b9 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -21,6 +21,7 @@ logger = logging.getLogger(__name__) class ConnectorException(HTTPError): """when the connector can't do what was asked""" + async def async_connector_search(query, items, min_confidence): """Try a number of requests simultaneously""" timeout = aiohttp.ClientTimeout(total=SEARCH_TIMEOUT) From 718939834acc1673d958916114c5d916ca85aa39 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 18 Apr 2023 10:01:48 -0700 Subject: [PATCH 112/114] Fixes check on isbn list length in LT importer --- bookwyrm/importers/librarything_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/importers/librarything_import.py b/bookwyrm/importers/librarything_import.py index c6833547d..ea31b46eb 100644 --- a/bookwyrm/importers/librarything_import.py +++ b/bookwyrm/importers/librarything_import.py @@ -19,7 +19,7 @@ class LibrarythingImporter(Importer): normalized = {k: remove_brackets(entry.get(v)) for k, v in mappings.items()} isbn_13 = normalized.get("isbn_13") isbn_13 = isbn_13.split(", ") if isbn_13 else [] - normalized["isbn_13"] = isbn_13[1] if len(isbn_13) > 0 else None + normalized["isbn_13"] = isbn_13[1] if len(isbn_13) > 1 else None return normalized def get_shelf(self, normalized_row): From 4e025b51057232ad82c8c056d581ea75438618f0 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 25 Apr 2023 17:21:54 -0700 Subject: [PATCH 113/114] Updates locales --- locale/ca_ES/LC_MESSAGES/django.mo | Bin 142231 -> 142231 bytes locale/ca_ES/LC_MESSAGES/django.po | 59 +++--- locale/de_DE/LC_MESSAGES/django.mo | Bin 143995 -> 144056 bytes locale/de_DE/LC_MESSAGES/django.po | 61 ++++--- locale/en_US/LC_MESSAGES/django.po | 97 ++++++---- locale/eo_UY/LC_MESSAGES/django.mo | Bin 138669 -> 139128 bytes locale/eo_UY/LC_MESSAGES/django.po | 63 ++++--- locale/es_ES/LC_MESSAGES/django.mo | Bin 139871 -> 139871 bytes locale/es_ES/LC_MESSAGES/django.po | 59 +++--- locale/eu_ES/LC_MESSAGES/django.mo | Bin 142801 -> 144176 bytes locale/eu_ES/LC_MESSAGES/django.po | 129 +++++++------ locale/fi_FI/LC_MESSAGES/django.mo | Bin 141141 -> 141141 bytes locale/fi_FI/LC_MESSAGES/django.po | 59 +++--- locale/fr_FR/LC_MESSAGES/django.mo | Bin 147376 -> 147908 bytes locale/fr_FR/LC_MESSAGES/django.po | 59 +++--- locale/gl_ES/LC_MESSAGES/django.mo | Bin 139991 -> 140484 bytes locale/gl_ES/LC_MESSAGES/django.po | 63 ++++--- locale/it_IT/LC_MESSAGES/django.mo | Bin 141261 -> 141772 bytes locale/it_IT/LC_MESSAGES/django.po | 59 +++--- locale/lt_LT/LC_MESSAGES/django.mo | Bin 137314 -> 138323 bytes locale/lt_LT/LC_MESSAGES/django.po | 91 ++++----- locale/no_NO/LC_MESSAGES/django.mo | Bin 75667 -> 87416 bytes locale/no_NO/LC_MESSAGES/django.po | 263 ++++++++++++++------------- locale/pl_PL/LC_MESSAGES/django.mo | Bin 125112 -> 125180 bytes locale/pl_PL/LC_MESSAGES/django.po | 59 +++--- locale/pt_BR/LC_MESSAGES/django.mo | Bin 85322 -> 85322 bytes locale/pt_BR/LC_MESSAGES/django.po | 59 +++--- locale/pt_PT/LC_MESSAGES/django.mo | Bin 80340 -> 80340 bytes locale/pt_PT/LC_MESSAGES/django.po | 59 +++--- locale/ro_RO/LC_MESSAGES/django.mo | Bin 124622 -> 124622 bytes locale/ro_RO/LC_MESSAGES/django.po | 59 +++--- locale/sv_SE/LC_MESSAGES/django.mo | Bin 135628 -> 135628 bytes locale/sv_SE/LC_MESSAGES/django.po | 59 +++--- locale/zh_Hans/LC_MESSAGES/django.mo | Bin 95024 -> 95024 bytes locale/zh_Hans/LC_MESSAGES/django.po | 59 +++--- locale/zh_Hant/LC_MESSAGES/django.mo | Bin 32619 -> 32619 bytes locale/zh_Hant/LC_MESSAGES/django.po | 81 +++++---- 37 files changed, 839 insertions(+), 658 deletions(-) diff --git a/locale/ca_ES/LC_MESSAGES/django.mo b/locale/ca_ES/LC_MESSAGES/django.mo index 81661dec9e1a72c0390b40556ecf3471025891e5..8c5b434879738d91e930301130d51c2515068642 100644 GIT binary patch delta 28 kcmbP!on!iSj)pCa=5|~rx(4P7h9*`\n" "Language-Team: Catalan\n" "Language: ca\n" @@ -316,19 +316,19 @@ msgstr "Citacions" msgid "Everything else" msgstr "Tota la resta" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Línia de temps Inici" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Inici" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Cronologia dels llibres" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Cronologia dels llibres" msgid "Books" msgstr "Llibres" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Anglès)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (Alemany)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (espanyol)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "Euskera (Basc)" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (gallec)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (italià)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (finès)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (francès)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituà)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (noruec)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (polonès)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (portuguès del Brasil)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portuguès europeu)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (romanès)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (suec)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (xinès simplificat)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (xinès tradicional)" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4038,6 +4042,11 @@ msgstr "Oculta els seguidors i els que segueixo al perfil" msgid "Default post privacy:" msgstr "Privacitat de publicació per defecte:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/de_DE/LC_MESSAGES/django.mo b/locale/de_DE/LC_MESSAGES/django.mo index 4bca66c2834d530fcbce1bffe78f5ecfeb28b1aa..f32f521370dcb8bb16976d7ec952497a9a9a47c7 100644 GIT binary patch delta 29692 zcmZwQ1#}fxqxSJR36kJ$ArL%Bf@`3-y9I(n@ZjzTcTe#aFA&_lIK|!FDekWK|D3(~ zzOK9Otatj`?lb2k(7s>q`)qySrGVJwQVdpS-pR=`l~jZGcL?VKdAkA&dfj`IXx zV{E+M$8r4d5$3^YeI2I^7DRPC0F&WTOpm)TFW$itn6#hc)WA^8g-bClUd96W3FFhh zle53$BqyOb24FqZi2Gm_++_2;1~^U;7ps9uNUuB4akgT6RQ(Kt%nF2H9pYh_8CTo% z3#fW;Q3Lj&?{wTwcK(qDt71~@fGKgPjsJo1h_A8;`;i z#J8d!oV zR>zBhVkq$w6kdlJDZBzNT8EBxoaMxW$FcsC2wWM*EU?{p$C-!cFbca*F#1n)oMprh zAxTabD(%4^xE*&-Hujt1INONlpXxYs@g;J6oQaWa1IGN_Y}saO=V>hA7BT{-bK>zf zY9$8FFuG>44a7%a8}ymwI3=+Q_QLfz7_-iH92U)4Zp|^rq_4(Sr01k@ChttMrv1~b zWR#mgM>6s-+-f)3Bpa75bq&RrsIB3AP0enCFXF=M4gEf7=VS?*o-bZ!GgpGu@9wjGxozT zr~&k3ze?aKOoj>AU>4WOf_-r*cExlYgz6ZHSykj7fy^YtUFkT{F`u;v>V;DRV_+Th z!G;(YTVhP?X5;-(A!FcBtM zWd@W5V-XL*I9LudT#q~m&La%KaqG-GeI@ECxQA-D#Cr3}t%_RF7N`k!K@GUKUa1=4 zND?A&ET+Q`mY@e~j(T%;!6vv7o9g*byxS~Echr)NM9pXh>X7`28o*+kztQF&wE4$S zTXPn5IImjoVF2-Gs0qd0V-BAms$3>?D6yu?L>Q zm4c1-GLP-yYON&Z7?ZUDTm{vEOYv{!T&=3Gok@4vV1*R zR72s`-dKeAIMmGl!3cbh+QQ}s%|N=L>P<6}?*oQZ1ZFI2nhP+R$r$#**!323DEP<#3sQ=so* zGqCii70Qq5xID(ha8$hrY=wPMD{~9g@e@?JkLZIxQCs74#GH+k==uJimVln)oal>f zt=&)~AAmYsqfsMYj;V1wHo!}$j`AEe9Th>9FO3>tD^$JisB*(>`Z!F$`EzCw&|z9` zGajHSyhY8}`j;Wn_dWG6EBS#Xm!*|x5wzX=s3^6DnyZ> z$7CC71}Ci7QG50jHN$VHLl*0V*@A?qvl5J|S044@6N=jNj@DjQH)^7zZG7qp)?Z6G zhXj9IgxPT~Y7d{Io{sn@&FM{#DTx4wPYtyGdqWx$#vAqJ+yv7?R~t{#>A*CO@VqdX0Y+n zsCL}d2&jX4sD_%NM&2DYAUA3y#-kcqjhgv3)Z@Ab1Mo6xBA-zW`TKhK zP!k(%(|!Cs<;i+;1NuOXHZLdA2p-LsE*#C1|032nOO?djDm3z7RCg41U2KU zs0lqn^%M8J8JIuD((|8#Krbwa`EWI=;yu)!zs5xP5jBHY7mUeJ<-7#6h|doT;}qo@jRP#yh1tw@|pCY}&A^R%deWMXoP%`EzL^Qum04MOd8Mbse-v*~S70~wB5fg^4LI&^38H@u2kfs{AQ(q_PahzFxO zdXK8;x@nd=7OEqEOo~A^y)>%hP#bTBiHY|?4SYOmBJQ~aG_y^p3j1w=vo?Mo)$m)? zium3#rb5-rjv8=bYiU$FRZ&aa2sOZP)LH0`n(%1Mpk16yK!

hN4gorRaEnZ8FI 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 delta 29634 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

9W&8E(Oncod6c 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 diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index 18b6aa596..7cb8c2dc0 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: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-26 15:31\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-07 14:21\n" "Last-Translator: Mouse Reeve \n" "Language-Team: German\n" "Language: de\n" @@ -316,19 +316,19 @@ msgstr "Zitate" msgid "Everything else" msgstr "Alles andere" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Start-Zeitleiste" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Startseite" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Bücher-Timeline" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Bücher-Timeline" msgid "Books" msgstr "Bücher" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Englisch)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (Katalanisch)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "Esperanto (Esperanto)" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (Spanisch)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "Euskara (Baskisch)" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Galizisch)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (Italienisch)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (Finnisch)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (Französisch)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litauisch)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (Norwegisch)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (Polnisch)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (brasilianisches Portugiesisch)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugiesisch)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (Rumänisch)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Schwedisch)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (vereinfachtes Chinesisch)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinesisch, traditionell)" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -3033,7 +3037,7 @@ msgstr "Einladung beantragen" #: bookwyrm/templates/landing/layout.html:50 #, python-format msgid "%(name)s registration is closed" -msgstr "%(name)s erlaubt keine Selbtregistrierung" +msgstr "%(name)s erlaubt keine Selbstregistrierung" #: bookwyrm/templates/landing/layout.html:61 msgid "Thank you! Your request has been received." @@ -4038,6 +4042,11 @@ msgstr "Folgende und Gefolgte im Profil ausblenden" msgid "Default post privacy:" msgstr "Voreinstellung für Beitragssichtbarkeit:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index 65000c1d4..1deefea4b 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: 2023-03-29 14:55+0000\n" +"POT-Creation-Date: 2023-04-26 00:20+0000\n" "PO-Revision-Date: 2021-02-28 17:19-0800\n" "Last-Translator: Mouse Reeve \n" "Language-Team: English \n" @@ -276,11 +276,11 @@ msgstr "" msgid "Import stopped" msgstr "" -#: bookwyrm/models/import_job.py:360 bookwyrm/models/import_job.py:385 +#: bookwyrm/models/import_job.py:363 bookwyrm/models/import_job.py:388 msgid "Error loading book" msgstr "" -#: bookwyrm/models/import_job.py:369 +#: bookwyrm/models/import_job.py:372 msgid "Could not find a match for book" msgstr "" @@ -301,7 +301,7 @@ msgstr "" msgid "Approved" msgstr "" -#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:298 +#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:305 msgid "Reviews" msgstr "" @@ -625,7 +625,7 @@ msgstr "" #: bookwyrm/templates/annual_summary/layout.html:157 #: bookwyrm/templates/annual_summary/layout.html:178 #: bookwyrm/templates/annual_summary/layout.html:247 -#: bookwyrm/templates/book/book.html:56 +#: bookwyrm/templates/book/book.html:63 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -713,24 +713,24 @@ msgid "View ISNI record" msgstr "" #: bookwyrm/templates/author/author.html:95 -#: bookwyrm/templates/book/book.html:166 +#: bookwyrm/templates/book/book.html:173 msgid "View on ISFDB" msgstr "" #: bookwyrm/templates/author/author.html:100 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:133 +#: bookwyrm/templates/book/book.html:140 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" #: bookwyrm/templates/author/author.html:104 -#: bookwyrm/templates/book/book.html:137 +#: bookwyrm/templates/book/book.html:144 msgid "View on OpenLibrary" msgstr "" #: bookwyrm/templates/author/author.html:119 -#: bookwyrm/templates/book/book.html:151 +#: bookwyrm/templates/book/book.html:158 msgid "View on Inventaire" msgstr "" @@ -839,7 +839,7 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:126 -#: bookwyrm/templates/book/book.html:211 +#: bookwyrm/templates/book/book.html:218 #: bookwyrm/templates/book/edit/edit_book.html:150 #: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/edit_links.html:86 @@ -863,7 +863,7 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:127 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:212 +#: bookwyrm/templates/book/book.html:219 #: bookwyrm/templates/book/cover_add_modal.html:33 #: bookwyrm/templates/book/edit/edit_book.html:152 #: bookwyrm/templates/book/edit/edit_book.html:155 @@ -900,93 +900,93 @@ msgstr "" msgid "Confirm" msgstr "" -#: bookwyrm/templates/book/book.html:19 +#: bookwyrm/templates/book/book.html:20 msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:64 bookwyrm/templates/book/book.html:65 +#: bookwyrm/templates/book/book.html:71 bookwyrm/templates/book/book.html:72 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:90 bookwyrm/templates/book/book.html:93 +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:100 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:99 +#: bookwyrm/templates/book/book.html:106 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:117 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:188 +#: bookwyrm/templates/book/book.html:195 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:200 +#: bookwyrm/templates/book/book.html:207 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:207 +#: bookwyrm/templates/book/book.html:214 #: bookwyrm/templates/book/edit/edit_book_form.html:42 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:223 +#: bookwyrm/templates/book/book.html:230 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:237 +#: bookwyrm/templates/book/book.html:244 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:259 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:263 +#: bookwyrm/templates/book/book.html:270 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:269 +#: bookwyrm/templates/book/book.html:276 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:277 +#: bookwyrm/templates/book/book.html:284 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:303 +#: bookwyrm/templates/book/book.html:310 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:309 +#: bookwyrm/templates/book/book.html:316 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:315 +#: bookwyrm/templates/book/book.html:322 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:351 +#: bookwyrm/templates/book/book.html:358 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:363 +#: bookwyrm/templates/book/book.html:370 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:374 +#: bookwyrm/templates/book/book.html:381 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1000,11 +1000,11 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:386 +#: bookwyrm/templates/book/book.html:393 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:403 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1928,13 +1928,13 @@ msgstr "" #: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37 -#: bookwyrm/templatetags/shelf_tags.py:48 +#: bookwyrm/templatetags/shelf_tags.py:14 msgid "To Read" msgstr "" #: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38 -#: bookwyrm/templatetags/shelf_tags.py:50 +#: bookwyrm/templatetags/shelf_tags.py:15 msgid "Currently Reading" msgstr "" @@ -1943,12 +1943,13 @@ msgstr "" #: bookwyrm/templates/snippets/shelf_selector.html:46 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 -#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52 +#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:16 msgid "Read" msgstr "" #: bookwyrm/templates/get_started/book_preview.html:13 #: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40 +#: bookwyrm/templatetags/shelf_tags.py:17 msgid "Stopped Reading" msgstr "" @@ -1980,6 +1981,7 @@ msgstr "" #: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217 #: bookwyrm/templates/search/layout.html:5 #: bookwyrm/templates/search/layout.html:10 +#: bookwyrm/templates/search/layout.html:32 msgid "Search" msgstr "" @@ -1987,6 +1989,10 @@ msgstr "" msgid "Suggested Books" msgstr "" +#: bookwyrm/templates/get_started/books.html:33 +msgid "Search results" +msgstr "" + #: bookwyrm/templates/get_started/books.html:46 #, python-format msgid "Popular on %(site_name)s" @@ -2065,6 +2071,10 @@ msgstr "" msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." msgstr "" +#: bookwyrm/templates/get_started/users.html:8 +msgid "You can follow users on other BookWyrm instances and federated services like Mastodon." +msgstr "" + #: bookwyrm/templates/get_started/users.html:11 msgid "Search for a user" msgstr "" @@ -4536,7 +4546,16 @@ msgstr "" msgid "Could not connect to Celery" msgstr "" -#: bookwyrm/templates/settings/celery.html:121 +#: bookwyrm/templates/settings/celery.html:120 +#: bookwyrm/templates/settings/celery.html:143 +msgid "Clear Queues" +msgstr "" + +#: bookwyrm/templates/settings/celery.html:124 +msgid "Clearing queues can cause serious problems including data loss! Only play with this if you really know what you're doing. You must shut down the Celery worker before you do this." +msgstr "" + +#: bookwyrm/templates/settings/celery.html:150 msgid "Errors" msgstr "" @@ -4901,7 +4920,7 @@ msgid "This is only intended to be used when things have gone very wrong with im msgstr "" #: bookwyrm/templates/settings/imports/imports.html:31 -msgid "While imports are disabled, users will not be allowed to start new imports, but existing imports will not be effected." +msgid "While imports are disabled, users will not be allowed to start new imports, but existing imports will not be affected." msgstr "" #: bookwyrm/templates/settings/imports/imports.html:36 @@ -5757,7 +5776,7 @@ msgid "User profile" msgstr "" #: bookwyrm/templates/shelf/shelf.html:39 -#: bookwyrm/templatetags/shelf_tags.py:46 bookwyrm/views/shelf/shelf.py:53 +#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:53 msgid "All books" msgstr "" diff --git a/locale/eo_UY/LC_MESSAGES/django.mo b/locale/eo_UY/LC_MESSAGES/django.mo index b8c3bb5563c51b468ab90de93f1d2d339e9f50b0..5dec12e25aa8dc2fcacac8f65dd535c7a17cc07d 100644 GIT binary patch delta 30155 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 YjaRpM+LlNV)iXRMY-6S8o}LB%7kK5AG5`Po delta 29736 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 qNx8GnV9%sXJJT%noJh5E?S4<={IObg{kbQ_dUV\n" "Language-Team: Esperanto\n" "Language: eo\n" @@ -316,19 +316,19 @@ msgstr "Citaĵoj" msgid "Everything else" msgstr "Ĉio alia" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Hejma novaĵfluo" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Hejmo" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Libra novaĵfluo" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Libra novaĵfluo" msgid "Books" msgstr "Libroj" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Angla)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (Kataluna)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (Germana)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "Esperanto (Esperanto)" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (Hispana)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "Euskara (Eŭska)" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Galega)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (Itala)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (Finna)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (Franca)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litova)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvega)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (Pola)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Brazila portugala)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Eŭropa portugala)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (Rumana)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Sveda)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Simpligita ĉina)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tradicia ĉina)" @@ -461,7 +465,7 @@ msgstr "%(title)s havas la plej diversajn #: bookwyrm/templates/about/about.html:94 msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, reach out and make yourself heard." -msgstr "Notu kion vi legas, parolu pri libroj, verku recenzojn kaj malkovru vian sekvan legaĵon. BookWyrm estas programo konstruita por homoj. Ĝi estas ĉiam sen reklamoj, kontraŭkapitalisma kaj celas resti malgranda kaj persona. Se vi havas petojn pri novaj trajtoj, raportojn pri cimoj, aŭ grandajn revojn kontaktu nin kaj estu aŭskultata." +msgstr "Notu kion vi legas, parolu pri libroj, verku recenzojn kaj malkovru vian sekvan legaĵon. BookWyrm estas programo konstruita por homoj. Ĝi estas ĉiam sen reklamoj, kontraŭkomerca kaj celas resti malgranda kaj persona. Se vi havas petojn pri novaj trajtoj, raportojn pri cimoj, aŭ grandajn revojn kontaktu nin kaj estu aŭskultata." #: bookwyrm/templates/about/about.html:105 msgid "Meet your admins" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -1307,7 +1311,7 @@ msgstr "Ĉu vi ne trovas la ĝustan eldonon?" #: bookwyrm/templates/book/editions/editions.html:75 msgid "Add another edition" -msgstr "Aldoni alian aldonon" +msgstr "Aldoni plian eldonon" #: bookwyrm/templates/book/editions/format_filter.html:9 #: bookwyrm/templates/book/editions/language_filter.html:9 @@ -4038,6 +4042,11 @@ msgstr "Kaŝi la sekvantojn kaj la sekvatojn ĉe via profilo" msgid "Default post privacy:" msgstr "Defaŭlta privateco de afiŝoj:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "Ĉu vi volas privatajn bretojn? Vi povas agordi apartan nivelon de videbleco por ĉiu breto. Iru al Viaj libroj, elektu breton per la langetoj, kaj alklaku «Modifi breton»." + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/es_ES/LC_MESSAGES/django.mo b/locale/es_ES/LC_MESSAGES/django.mo index 75700af33c77f88642609139d7bbf511e56d3d3c..9bee049c9e8a4e16d8f41442b5988516b66118d3 100644 GIT binary patch delta 28 kcmcbAgya4Zj)pCab1b<`bPdcE3{9+z47V?{WZd}z0HK}=jQ{`u delta 28 kcmcbAgya4Zj)pCab1b=xbq$Rb49%>JEw(SSWZd}z0HL)ClK=n! diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po index deea2d35e..d111ffd50 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: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-13 16:38\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-07 14:21\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Spanish\n" "Language: es\n" @@ -316,19 +316,19 @@ msgstr "Citas" msgid "Everything else" msgstr "Todo lo demás" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Línea de tiempo principal" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Inicio" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Línea temporal de libros" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Línea temporal de libros" msgid "Books" msgstr "Libros" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Inglés)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (Catalán)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (Alemán)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "Euskera" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (gallego)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (finés)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (Francés)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituano)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (noruego)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (Polaco)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (portugués brasileño)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugués europeo)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (rumano)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Sueco)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Chino simplificado)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chino tradicional)" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4038,6 +4042,11 @@ msgstr "Ocultar a quién sigo y quién me sigue en el perfil." msgid "Default post privacy:" msgstr "Privacidad de publicación por defecto:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/eu_ES/LC_MESSAGES/django.mo b/locale/eu_ES/LC_MESSAGES/django.mo index 92a4337fa817b14ba46e729711a6a14d0009092f..be31de3b6486f8301a91172fb1975626bc7a95eb 100644 GIT binary patch delta 31717 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 delta 30503 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 diff --git a/locale/eu_ES/LC_MESSAGES/django.po b/locale/eu_ES/LC_MESSAGES/django.po index a9d24235e..42d943913 100644 --- a/locale/eu_ES/LC_MESSAGES/django.po +++ b/locale/eu_ES/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-23 09:56\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-25 12:51\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Basque\n" "Language: eu\n" @@ -316,19 +316,19 @@ msgstr "Aipuak" msgid "Everything else" msgstr "Gainerako guztia" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Hasierako denbora-lerroa" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Hasiera" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Liburuen denbora-lerroa" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Liburuen denbora-lerroa" msgid "Books" msgstr "Liburuak" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Ingelesa)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (katalana)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (alemana)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "Esperantoa" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (espainiera)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "Euskara" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Galiziera)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (Italiera)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (finlandiera)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (frantses)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lituano (lituaniera)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvegiera)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (poloniera)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Brasilgo Portugesa)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europako Portugesa)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (errumaniera)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (suediera)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Txinera soildua)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Txinera tradizionala)" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -1077,7 +1081,7 @@ msgstr "Gehitu liburua" #: bookwyrm/templates/book/edit/edit_book.html:43 msgid "Failed to save book, see errors below for more information." -msgstr "" +msgstr "Liburua gordetzeak huts egin du, ikus behean agertzen diren erroreak informazio gehiagorako." #: bookwyrm/templates/book/edit/edit_book.html:70 msgid "Confirm Book Info" @@ -1476,16 +1480,16 @@ msgstr "baloratu du" #: bookwyrm/templates/book/series.html:11 msgid "Series by" -msgstr "" +msgstr "Seriearen sortzailea: " #: bookwyrm/templates/book/series.html:27 #, python-format msgid "Book %(series_number)s" -msgstr "" +msgstr "%(series_number)s. liburua" #: bookwyrm/templates/book/series.html:27 msgid "Unsorted Book" -msgstr "" +msgstr "Sailkatu gabeko liburua" #: bookwyrm/templates/book/sync_modal.html:15 #, python-format @@ -2176,7 +2180,7 @@ msgstr[1] "%(shared_books)s liburu zure apaletan" #: bookwyrm/templates/groups/suggested_users.html:43 #, python-format msgid "No potential members found for \"%(user_query)s\"" -msgstr "Ez da kide potentzialik aurkitu \"%(user_query)s\"-(r)ekin" +msgstr "Ez da kide potentzialik aurkitu \"%(user_query)s\"(r)ekin" #: bookwyrm/templates/groups/user_groups.html:15 msgid "Manager" @@ -2699,11 +2703,11 @@ msgstr "Aurkitu liburu bat" #: bookwyrm/templates/hashtag.html:12 #, python-format msgid "See tagged statuses in the local %(site_name)s community" -msgstr "" +msgstr "Ikusi etiketatutako egoeran %(site_name)s komunitate lokalean" #: bookwyrm/templates/hashtag.html:25 msgid "No activities for this hashtag yet!" -msgstr "" +msgstr "Ez dago aktibitaterik oraindik traola honentzat!" #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 @@ -3033,7 +3037,7 @@ msgstr "Eskatu gonbidapen bat" #: bookwyrm/templates/landing/layout.html:50 #, python-format msgid "%(name)s registration is closed" -msgstr "%(name)s -(r)en izen-ematea itxita dago" +msgstr "%(name)s(e)n izena ematea itxita dago" #: bookwyrm/templates/landing/layout.html:61 msgid "Thank you! Your request has been received." @@ -3456,62 +3460,62 @@ msgstr[1] "%(related_user)s(e)k iradoki du #: bookwyrm/templates/notifications/items/boost.html:21 #, python-format msgid "%(related_user)s boosted your review of %(book_title)s" -msgstr "%(related_user)s(e)k zure %(book_title)s(r)en kritika zabaldu du" +msgstr "%(related_user)s(e)k zure %(book_title)s(r)en kritika bultzatu du" #: bookwyrm/templates/notifications/items/boost.html:27 #, python-format msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s" -msgstr "%(related_user)s eta %(second_user)s(e)k %(book_title)s liburuari buruzko zure kritika sustatu zuten" +msgstr "%(related_user)s eta %(second_user)s(e)k %(book_title)s liburuari buruzko zure kritika bultzatu dute" #: bookwyrm/templates/notifications/items/boost.html:36 #, python-format msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s" -msgstr "%(related_user)s eta beste %(other_user_display_count)s erabiltzailek %(book_title)s liburuari buruzko zure kritika sustatu zuten" +msgstr "%(related_user)s eta beste %(other_user_display_count)s erabiltzailek %(book_title)s liburuari buruzko zure kritika bultzatu dute" #: bookwyrm/templates/notifications/items/boost.html:44 #, python-format msgid "%(related_user)s boosted your comment on %(book_title)s" -msgstr "%(related_user)s(e)k zure %(book_title)s(r)i buruzko iruzkina zabaldu du" +msgstr "%(related_user)s(e)k zure %(book_title)s(r)i buruzko iruzkina bultzatu du" #: bookwyrm/templates/notifications/items/boost.html:50 #, python-format msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s" -msgstr "%(related_user)s eta %(second_user)s (e)k %(book_title)s liburuari buruzko zure iruzkina sustatu zuten" +msgstr "%(related_user)s eta %(second_user)s (e)k %(book_title)s liburuari buruzko zure iruzkina bultzatu dute" #: bookwyrm/templates/notifications/items/boost.html:59 #, python-format msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s" -msgstr "%(related_user)s eta %(other_user_display_count)s erabiltzailek %(book_title)s liburuari buruzko zure iruzkina sustatu zuten" +msgstr "%(related_user)s eta %(other_user_display_count)s erabiltzailek %(book_title)s liburuari buruzko zure iruzkina bultzatu dute" #: bookwyrm/templates/notifications/items/boost.html:67 #, python-format msgid "%(related_user)s boosted your quote from %(book_title)s" -msgstr "%(related_user)s(e)k zure %(book_title)s(e)ko aipua zabaldu du" +msgstr "%(related_user)s(e)k zure %(book_title)s(e)ko aipua bultzatu du" #: bookwyrm/templates/notifications/items/boost.html:73 #, python-format msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s" -msgstr "%(related_user)s eta %(second_user)s(e)k %(book_title)s liburuari buruzko zure aipamena sustatu zuten" +msgstr "%(related_user)s eta %(second_user)s(e)k %(book_title)s liburuari buruzko zure aipamena bultzatu dute" #: bookwyrm/templates/notifications/items/boost.html:82 #, python-format msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s" -msgstr "%(related_user)s eta beste %(other_user_display_count)s erabiltzailek %(book_title)s liburuari buruzko zure aipamena sustatu zuten" +msgstr "%(related_user)s eta beste %(other_user_display_count)s erabiltzailek %(book_title)s liburuari buruzko zure aipamena bultzatu dute" #: bookwyrm/templates/notifications/items/boost.html:90 #, python-format msgid "%(related_user)s boosted your status" -msgstr "%(related_user)s(e)k zure egoera zabaldu du" +msgstr "%(related_user)s(e)k zure egoera bultzatu du" #: bookwyrm/templates/notifications/items/boost.html:96 #, python-format msgid "%(related_user)s and %(second_user)s boosted your status" -msgstr "%(related_user)s eta %(second_user)s(e)k zure egoera sustatu zuten" +msgstr "%(related_user)s eta %(second_user)s(e)k zure egoera bultzatu dute" #: bookwyrm/templates/notifications/items/boost.html:105 #, python-format msgid "%(related_user)s and %(other_user_display_count)s others boosted your status" -msgstr "%(related_user)s eta %(other_user_display_count)s erabiltzailek zure egoera sustatu zuten" +msgstr "%(related_user)s eta %(other_user_display_count)s erabiltzailek zure egoera bultzatu dute" #: bookwyrm/templates/notifications/items/fav.html:21 #, python-format @@ -3521,7 +3525,7 @@ msgstr "%(related_user)s(e)k atsegin du zu #: bookwyrm/templates/notifications/items/fav.html:27 #, python-format msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s" -msgstr "%(related_user)s eta %(second_user)s(e)k %(book_title)s liburuari buruzko zure kritika maitatu zuten" +msgstr "%(related_user)s eta %(second_user)s(e)k %(book_title)s liburuari buruzko zure kritika atsegin dute" #: bookwyrm/templates/notifications/items/fav.html:36 #, python-format @@ -3536,7 +3540,7 @@ msgstr "%(related_user)s(e)k atsegin du zu #: bookwyrm/templates/notifications/items/fav.html:50 #, python-format msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s" -msgstr "%(related_user)s eta %(second_user)s(e)k %(book_title)s liburuari buruzko zure iruzkina maitatu zuten" +msgstr "%(related_user)s eta %(second_user)s(e)k %(book_title)s liburuari buruzko zure iruzkina atsegin dute" #: bookwyrm/templates/notifications/items/fav.html:59 #, python-format @@ -3551,7 +3555,7 @@ msgstr "%(related_user)s(e)k atsegin du zu #: bookwyrm/templates/notifications/items/fav.html:73 #, python-format msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s" -msgstr "%(related_user)s eta %(second_user)s(e)k %(book_title)s liburuari buruzko zure aipamena maitatu zuten" +msgstr "%(related_user)s eta %(second_user)s(e)k %(book_title)s liburuari buruzko zure aipamena atsegin dute" #: bookwyrm/templates/notifications/items/fav.html:82 #, python-format @@ -3566,7 +3570,7 @@ msgstr "%(related_user)s(e)k zure %(related_user)s and %(second_user)s liked your status" -msgstr "%(related_user)s eta %(second_user)s (e)k zure egoera maitatu zuen" +msgstr "%(related_user)s eta %(second_user)s (e)k zure egoera atsegin dute" #: bookwyrm/templates/notifications/items/fav.html:105 #, python-format @@ -3616,7 +3620,7 @@ msgstr "%(related_user)s(e)k zure \"%(related_user)s and %(second_user)s have left your group \"%(group_name)s\"" -msgstr "%(related_user)s eta %(second_user)s zure \"%(group_name)s\" taldetik atera ziren" +msgstr "%(related_user)s eta %(second_user)s zure \"%(group_name)s\" taldetik atera dira" #: bookwyrm/templates/notifications/items/leave.html:36 #, python-format @@ -4038,6 +4042,11 @@ msgstr "Ezkutatu jarraitzaile eta jarraituak profilean" msgid "Default post privacy:" msgstr "Lehenetsitako pribatutasuna bidalketentzat:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "Apalen pribatutasunaren bila zabiltza? Zure apal bakoitzarentzat berariazko ikusgarritasun maila ezarri dezakezu. Zoaz Zure liburuak atalera, hautatu apal bat fitxa-barran eta klikatu \"Editatu apala\"." + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" @@ -4483,7 +4492,7 @@ msgstr "Lehentasun handia" #: bookwyrm/templates/settings/celery.html:50 msgid "Broadcasts" -msgstr "" +msgstr "Emanaldiak" #: bookwyrm/templates/settings/celery.html:60 msgid "Could not connect to Redis broker" @@ -5838,7 +5847,7 @@ msgstr "Bultzatu" #: bookwyrm/templates/snippets/boost_button.html:33 #: bookwyrm/templates/snippets/boost_button.html:34 msgid "Un-boost" -msgstr "Desegin zabaltzea" +msgstr "Desegin bultzatzea" #: bookwyrm/templates/snippets/create_status.html:36 msgid "Quote" @@ -6173,7 +6182,7 @@ msgstr "Izena eman" #: bookwyrm/templates/snippets/report_modal.html:8 #, python-format msgid "Report @%(username)s's status" -msgstr "Salatu @%(username)s-(r)en egoera" +msgstr "Salatu @%(username)s(r)en egoera" #: bookwyrm/templates/snippets/report_modal.html:10 #, python-format @@ -6249,17 +6258,17 @@ msgstr "" #: bookwyrm/templates/snippets/status/content_status.html:102 #, python-format msgid "%(endpage)s" -msgstr "" +msgstr "%(endpage)s" #: bookwyrm/templates/snippets/status/content_status.html:104 #, python-format msgid "(%(percent)s%%" -msgstr "" +msgstr "(%%%(percent)s" #: bookwyrm/templates/snippets/status/content_status.html:104 #, python-format msgid " - %(endpercent)s%%" -msgstr "" +msgstr " - %%%(endpercent)s" #: bookwyrm/templates/snippets/status/content_status.html:127 msgid "Open image in new window" @@ -6362,7 +6371,7 @@ msgstr "Ezabatu egoera" #: bookwyrm/templates/snippets/status/layout.html:57 #: bookwyrm/templates/snippets/status/layout.html:58 msgid "Boost status" -msgstr "Zabaldu egoera" +msgstr "Bultzatu egoera" #: bookwyrm/templates/snippets/status/layout.html:61 #: bookwyrm/templates/snippets/status/layout.html:62 @@ -6421,7 +6430,7 @@ msgstr "Zure kontua babestu dezakezu zure erabiltzaile-hobespenetan bi faktoreta #: bookwyrm/templates/user/books_header.html:9 #, python-format msgid "%(username)s's books" -msgstr "%(username)s-(r)en liburuak" +msgstr "%(username)s(r)en liburuak" #: bookwyrm/templates/user/goal.html:8 #, python-format @@ -6445,7 +6454,7 @@ msgstr "Zure %(year)s urteko liburuak" #: bookwyrm/templates/user/goal.html:42 #, python-format msgid "%(username)s's %(year)s Books" -msgstr "%(username)s-(r)en %(year)s-(e)ko Liburuak" +msgstr "%(username)s(r)en %(year)s(e)ko liburuak" #: bookwyrm/templates/user/groups.html:9 msgid "Your Groups" @@ -6592,7 +6601,7 @@ msgstr "Liburu zerrenda: %(name)s" #, python-format msgid "%(num)d book - by %(user)s" msgid_plural "%(num)d books - by %(user)s" -msgstr[0] "" +msgstr[0] "liburu %(num)d - %(user)s" msgstr[1] "%(num)d liburu - %(user)s" #: bookwyrm/templatetags/utilities.py:39 diff --git a/locale/fi_FI/LC_MESSAGES/django.mo b/locale/fi_FI/LC_MESSAGES/django.mo index a75ba2009f41b471463b431c5d01c9c4aafb16c3..cfe4da67b4daf21fcab7ea9122e0c435cec2e6d3 100644 GIT binary patch delta 28 kcmcb5j^pY%j)pCaHI7^+x(4P7h9*`\n" "Language-Team: Finnish\n" "Language: fi\n" @@ -316,19 +316,19 @@ msgstr "Lainaukset" msgid "Everything else" msgstr "Muut" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Oma aikajana" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Etusivu" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Kirjavirta" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Kirjavirta" msgid "Books" msgstr "Kirjat" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (englanti)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (katalaani)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (saksa)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (espanja)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "Euskara (baski)" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (galego)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (italia)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "suomi" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (ranska)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (liettua)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (norja)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (puola)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (brasilianportugali)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (portugali)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (romania)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (ruotsi)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (yksinkertaistettu kiina)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (perinteinen kiina)" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4038,6 +4042,11 @@ msgstr "Älä näytä seuraajia ja seurattavia profiilisivulla" msgid "Default post privacy:" msgstr "Julkaisujen julkisuuden oletusvalinta:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/fr_FR/LC_MESSAGES/django.mo b/locale/fr_FR/LC_MESSAGES/django.mo index e153f2262eb07690a2b35b1fba059bf3d2230e4e..234866759bd51ead4841685bcdbd6ee66bd447f9 100644 GIT binary patch delta 30208 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 delta 29697 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 Gb^Sl{5zx2* diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po index 348de736f..a4e79df83 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: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-25 17:09\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-07 16:18\n" "Last-Translator: Mouse Reeve \n" "Language-Team: French\n" "Language: fr\n" @@ -316,19 +316,19 @@ msgstr "Citations" msgid "Everything else" msgstr "Tout le reste" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Mon fil d’actualité" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Accueil" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Actualité de mes livres" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Actualité de mes livres" msgid "Books" msgstr "Livres" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (Catalan)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "Esperanto (Espéranto)" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "Euskara (Basque)" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Galicien)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (Italien)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (Finnois)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituanien)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvégien)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (Polonais)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Portugais brésilien)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugais européen)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (Roumain)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Suédois)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简化字" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (chinois traditionnel)" @@ -842,7 +846,7 @@ msgstr "ISNI :" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4038,6 +4042,11 @@ msgstr "Cacher les comptes abonnés et suivis sur le profil" msgid "Default post privacy:" msgstr "Niveau de confidentialité des messages par défaut :" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "Vous souhaitez protéger vos étagères ? Vous pouvez définir un niveau de visibilité différent pour chacune d’elles. Allez dans Vos Livres, choisissez une étagère parmi les onglets, puis cliquez sur « Modifier l’étagère »." + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/gl_ES/LC_MESSAGES/django.mo b/locale/gl_ES/LC_MESSAGES/django.mo index 2bf62a8a521398c689406c42160bb23552c49218..d99a045d3caa244f2b72a1716db1388fc8ca031b 100644 GIT binary patch delta 30584 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 D|5$;E delta 30219 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�OIKpnb> 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 M*~VYax2*Yp0Bv^qga7~l diff --git a/locale/gl_ES/LC_MESSAGES/django.po b/locale/gl_ES/LC_MESSAGES/django.po index 0cb15f8f7..e53136d94 100644 --- a/locale/gl_ES/LC_MESSAGES/django.po +++ b/locale/gl_ES/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-14 06:27\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-25 07:49\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Galician\n" "Language: gl\n" @@ -185,11 +185,11 @@ msgstr "Novela gráfica" #: bookwyrm/models/book.py:275 msgid "Hardcover" -msgstr "Portada dura" +msgstr "Tapa dura" #: bookwyrm/models/book.py:276 msgid "Paperback" -msgstr "En rústica" +msgstr "Libro de bolso" #: bookwyrm/models/federated_server.py:11 #: bookwyrm/templates/settings/federation/edit_instance.html:55 @@ -316,19 +316,19 @@ msgstr "Citas" msgid "Everything else" msgstr "As outras cousas" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Cronoloxía de Inicio" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Inicio" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Cronoloxía de libros" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Cronoloxía de libros" msgid "Books" msgstr "Libros" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Inglés)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (Catalan)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (Alemán)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "Esperanto (Esperanto)" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (Español)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "Euskara (Éuscaro)" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Galego)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (Italiano)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (Finés)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (Francés)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituano)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (Noruegués)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (Polaco)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Portugués brasileiro)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugués europeo)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (Rumanés)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Sueco)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Chinés simplificado)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinés tradicional)" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4038,6 +4042,11 @@ msgstr "Agochar relacións de seguimento no perfil" msgid "Default post privacy:" msgstr "Privacidade por defecto:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "Queres privacidade para os estantes? Podes establecer individualmente o nivel de privacidade dos estantes. Vai a Os teus libros, elixe un estante das seccións, e preme en \"Editar estante\"" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/it_IT/LC_MESSAGES/django.mo b/locale/it_IT/LC_MESSAGES/django.mo index 502f4b498bc244dacc4d361c03038f147565078a..b412b4ba6badc61dabc8e2b8268973dde3275c72 100644 GIT binary patch delta 29946 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�C2-EGPT?q>aal8}ysV4Q|2aSf)$qnHMt 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\n" "Language-Team: Italian\n" "Language: it\n" @@ -316,19 +316,19 @@ msgstr "Citazioni" msgid "Everything else" msgstr "Tutto il resto" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "La tua timeline" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Home" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Timeline dei libri" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Timeline dei libri" msgid "Books" msgstr "Libri" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Inglese)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (catalano)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (Tedesco)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "Esperanto (Esperanto)" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (Spagnolo)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "Euskara (Basque)" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Galiziano)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (Italiano)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (Finlandese)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (Francese)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituano)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvegese)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (Polacco)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Portoghese Brasiliano)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portoghese europeo)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Rumeno (Romanian)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Svedese)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Cinese Semplificato)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Cinese Tradizionale)" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4038,6 +4042,11 @@ msgstr "Nascondi i seguaci e i seguiti sul profilo" msgid "Default post privacy:" msgstr "Privacy predefinita dei post:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "Stai cercando la privacy degli scaffali? Puoi impostare un livello di visibilità separato per ciascuno dei tuoi scaffali. Vai a I tuoi libri, scegli uno scaffale dalla barra delle schede e fai clic su \"Modifica scaffale\"." + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/lt_LT/LC_MESSAGES/django.mo b/locale/lt_LT/LC_MESSAGES/django.mo index d0861d55f3b3b1c6e66b469ec4fd5a2f38216355..eb4a25aeb7b56b890d2de4d493f21d36acefb1e6 100644 GIT binary patch delta 29617 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 a%@EISg-2b8?RCe;D?A`-y`R@M*Z%>62i2$m delta 28775 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 diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index 1e2c8132d..03a6466bd 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-13 16:38\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-23 11:56\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -316,19 +316,19 @@ msgstr "Citatos" msgid "Everything else" msgstr "Visa kita" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Pagrindinė siena" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Pagrindinis" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Knygų siena" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Knygų siena" msgid "Books" msgstr "Knygos" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Anglų)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (kataloniečių)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (Vokiečių)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "Esperanto (Esperanto)" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (Ispanų)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (galisų)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italų (Italian)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (suomių)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (Prancūzų)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norvegų (Norwegian)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (lenkų)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português brasileiro (Brazilijos portugalų)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europos portugalų)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (rumunų)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Švedų)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Supaprastinta kinų)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tradicinė kinų)" @@ -709,7 +713,7 @@ msgstr "Wikipedia" #: bookwyrm/templates/author/author.html:79 msgid "Website" -msgstr "" +msgstr "Tinklapis" #: bookwyrm/templates/author/author.html:87 msgid "View ISNI record" @@ -801,7 +805,7 @@ msgstr "Nuoroda į wikipediją:" #: bookwyrm/templates/author/edit_author.html:60 msgid "Website:" -msgstr "" +msgstr "Tinklalapis:" #: bookwyrm/templates/author/edit_author.html:65 msgid "Birth date:" @@ -850,7 +854,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -1089,7 +1093,7 @@ msgstr "Pridėti knygą" #: bookwyrm/templates/book/edit/edit_book.html:43 msgid "Failed to save book, see errors below for more information." -msgstr "" +msgstr "Knygos išsaugoti nepavyko, žiūrėkite klaidas žemiau." #: bookwyrm/templates/book/edit/edit_book.html:70 msgid "Confirm Book Info" @@ -2804,7 +2808,7 @@ msgstr "Importuoti" #: bookwyrm/templates/import/import.html:103 msgid "You've reached the import limit." -msgstr "" +msgstr "Pasiekėte importavimo limitą." #: bookwyrm/templates/import/import.html:112 msgid "Imports are temporarily disabled; thank you for your patience." @@ -3873,11 +3877,11 @@ msgstr "Dabar sekate %(display_name)s!" #: bookwyrm/templates/preferences/2fa.html:7 #: bookwyrm/templates/preferences/layout.html:24 msgid "Two Factor Authentication" -msgstr "" +msgstr "Dviejų lygių autentifikavimas" #: bookwyrm/templates/preferences/2fa.html:16 msgid "Successfully updated 2FA settings" -msgstr "" +msgstr "Sėkmingai atnaujinote 2FA nustatymus" #: bookwyrm/templates/preferences/2fa.html:24 msgid "Write down or copy and paste these codes somewhere safe." @@ -3895,7 +3899,7 @@ msgstr "" #: bookwyrm/templates/preferences/disable-2fa.html:4 #: bookwyrm/templates/preferences/disable-2fa.html:7 msgid "Disable 2FA" -msgstr "" +msgstr "Išjungti 2FA" #: bookwyrm/templates/preferences/2fa.html:39 msgid "You can generate backup codes to use in case you do not have access to your authentication app. If you generate new codes, any backup codes previously generated will no longer work." @@ -3985,7 +3989,7 @@ msgstr "" #: bookwyrm/templates/preferences/delete_user.html:20 msgid "Deactivate Account" -msgstr "" +msgstr "Išjungti vartotojo vardą" #: bookwyrm/templates/preferences/delete_user.html:26 msgid "Permanently delete account" @@ -4070,6 +4074,11 @@ msgstr "Slėpti paskyros sekėjus" msgid "Default post privacy:" msgstr "Numatytasis įrašo privatumas:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" @@ -4112,7 +4121,7 @@ msgstr "Pradėti „%(book_title)s“" #: bookwyrm/templates/reading_progress/stop.html:5 #, python-format msgid "Stop Reading \"%(book_title)s\"" -msgstr "" +msgstr "Baigti skaityti „%(book_title)s“" #: bookwyrm/templates/reading_progress/want.html:5 #, python-format @@ -4163,7 +4172,7 @@ msgstr "baigta" #: bookwyrm/templates/readthrough/readthrough_list.html:16 msgid "stopped" -msgstr "" +msgstr "nustota" #: bookwyrm/templates/readthrough/readthrough_list.html:27 msgid "Show all updates" @@ -4504,11 +4513,11 @@ msgstr "" #: bookwyrm/templates/settings/celery.html:22 msgid "Queues" -msgstr "" +msgstr "Eilės" #: bookwyrm/templates/settings/celery.html:26 msgid "Low priority" -msgstr "" +msgstr "Žemas prioritetas" #: bookwyrm/templates/settings/celery.html:32 msgid "Medium priority" @@ -4516,11 +4525,11 @@ msgstr "" #: bookwyrm/templates/settings/celery.html:38 msgid "High priority" -msgstr "" +msgstr "Aukštas prioritetas" #: bookwyrm/templates/settings/celery.html:50 msgid "Broadcasts" -msgstr "" +msgstr "Transliacijos" #: bookwyrm/templates/settings/celery.html:60 msgid "Could not connect to Redis broker" @@ -6164,7 +6173,7 @@ msgstr "%(page)s psl." #: bookwyrm/templates/snippets/pagination.html:13 msgid "Newer" -msgstr "" +msgstr "Naujesni" #: bookwyrm/templates/snippets/pagination.html:15 msgid "Previous" @@ -6172,7 +6181,7 @@ msgstr "Ankstesnis" #: bookwyrm/templates/snippets/pagination.html:28 msgid "Older" -msgstr "" +msgstr "Ankstesni" #: bookwyrm/templates/snippets/privacy-icons.html:12 msgid "Followers-only" diff --git a/locale/no_NO/LC_MESSAGES/django.mo b/locale/no_NO/LC_MESSAGES/django.mo index 185ee107c25643c94bf3312b5e567340a6d11970..ae0d87817cacc29cdff8afebea14e588fc34529e 100644 GIT binary patch delta 33132 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 delta 21931 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 diff --git a/locale/no_NO/LC_MESSAGES/django.po b/locale/no_NO/LC_MESSAGES/django.po index 20a0861b0..6dedc9fa8 100644 --- a/locale/no_NO/LC_MESSAGES/django.po +++ b/locale/no_NO/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-13 16:39\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-13 10:56\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Norwegian\n" "Language: no\n" @@ -64,11 +64,11 @@ msgstr "Stoppdato for lesing kan ikke være før startdato." #: bookwyrm/forms/forms.py:67 msgid "Reading stopped date cannot be in the future." -msgstr "" +msgstr "Stoppdato for lesing kan ikke være i fremtiden." #: bookwyrm/forms/forms.py:74 msgid "Reading finished date cannot be in the future." -msgstr "" +msgstr "Sluttdato for lesing kan ikke være i fremtiden." #: bookwyrm/forms/landing.py:38 msgid "Username or password are incorrect" @@ -157,7 +157,7 @@ msgstr "Selvsletting" #: bookwyrm/models/base_model.py:20 msgid "Self deactivation" -msgstr "" +msgstr "Selvdeaktivering" #: bookwyrm/models/base_model.py:21 msgid "Moderator suspension" @@ -265,15 +265,15 @@ msgstr "Aktiv" #: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:166 msgid "Complete" -msgstr "" +msgstr "Ferdig" #: bookwyrm/models/import_job.py:50 msgid "Stopped" -msgstr "" +msgstr "Stoppet" #: bookwyrm/models/import_job.py:83 bookwyrm/models/import_job.py:91 msgid "Import stopped" -msgstr "" +msgstr "Importering stoppet" #: bookwyrm/models/import_job.py:360 bookwyrm/models/import_job.py:385 msgid "Error loading book" @@ -316,19 +316,19 @@ msgstr "Sitater" msgid "Everything else" msgstr "Andre ting" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Lokal tidslinje" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Hjem" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Boktidslinja" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Boktidslinja" msgid "Books" msgstr "Bøker" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Engelsk)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (katalansk)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (Tysk)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "Esperanto (Esperanto)" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (Spansk)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" -msgstr "" +msgstr "Euskara (Baskisk)" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Gallisk)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (Italiensk)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (finsk)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (Fransk)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litauisk)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (Norsk)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (Polsk)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português - Brasil (Brasiliansk portugisisk)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europeisk Portugisisk)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (romansk)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Svensk)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Forenklet kinesisk)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tradisjonelt kinesisk)" @@ -442,7 +446,7 @@ msgstr "Velkommen til %(site_name)s!" #: bookwyrm/templates/about/about.html:25 #, python-format msgid "%(site_name)s is part of BookWyrm, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the BookWyrm network, this community is unique." -msgstr "" +msgstr "%(site_name)s er en del av BookWyrm, et nettverk av selvstendige, selvstyrte samfunn for lesere. Du kan kommunisere sømløst med brukere hvor som helst i BookWyrm-nettverket, men hvert samfunn er unikt." #: bookwyrm/templates/about/about.html:45 #, python-format @@ -499,7 +503,7 @@ msgstr "Adferdsregler" #: bookwyrm/templates/about/layout.html:54 #: bookwyrm/templates/snippets/footer.html:34 msgid "Impressum" -msgstr "" +msgstr "Impressum" #: bookwyrm/templates/about/layout.html:11 msgid "Active users:" @@ -701,7 +705,7 @@ msgstr "Wikipedia" #: bookwyrm/templates/author/author.html:79 msgid "Website" -msgstr "" +msgstr "Nettside" #: bookwyrm/templates/author/author.html:87 msgid "View ISNI record" @@ -710,7 +714,7 @@ msgstr "Vis ISNI -oppføring" #: bookwyrm/templates/author/author.html:95 #: bookwyrm/templates/book/book.html:166 msgid "View on ISFDB" -msgstr "" +msgstr "Vis på ISFDB" #: bookwyrm/templates/author/author.html:100 #: bookwyrm/templates/author/sync_modal.html:5 @@ -739,7 +743,7 @@ msgstr "Vis på Goodreads" #: bookwyrm/templates/author/author.html:151 msgid "View ISFDB entry" -msgstr "" +msgstr "Vis ISFDB-oppføring" #: bookwyrm/templates/author/author.html:166 #, python-format @@ -793,7 +797,7 @@ msgstr "Lenke til wikipedia:" #: bookwyrm/templates/author/edit_author.html:60 msgid "Website:" -msgstr "" +msgstr "Nettsted:" #: bookwyrm/templates/author/edit_author.html:65 msgid "Birth date:" @@ -827,7 +831,7 @@ msgstr "Goodreads nøkkel:" #: bookwyrm/templates/author/edit_author.html:109 msgid "ISFDB:" -msgstr "" +msgstr "ISFDB:" #: bookwyrm/templates/author/edit_author.html:116 msgid "ISNI:" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -1025,16 +1029,16 @@ msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:29 #: bookwyrm/templates/book/edit/edit_book_form.html:359 msgid "Audible ASIN:" -msgstr "" +msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:36 #: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISFDB ID:" -msgstr "" +msgstr "ISFDB ID:" #: bookwyrm/templates/book/book_identifiers.html:43 msgid "Goodreads:" -msgstr "" +msgstr "Goodreads:" #: bookwyrm/templates/book/cover_add_modal.html:5 msgid "Add cover" @@ -1077,7 +1081,7 @@ msgstr "Legg til bok" #: bookwyrm/templates/book/edit/edit_book.html:43 msgid "Failed to save book, see errors below for more information." -msgstr "" +msgstr "Boken kunne ikke lagres, se feilene nedenfor for mer informasjon." #: bookwyrm/templates/book/edit/edit_book.html:70 msgid "Confirm Book Info" @@ -1091,12 +1095,12 @@ msgstr "Er \"%(name)s\" en av disse forfatterne?" #: bookwyrm/templates/book/edit/edit_book.html:89 #, python-format msgid "Author of %(book_title)s" -msgstr "" +msgstr "Forfatter av %(book_title)s" #: bookwyrm/templates/book/edit/edit_book.html:93 #, python-format msgid "Author of %(alt_title)s" -msgstr "" +msgstr "Forfatter av %(alt_title)s" #: bookwyrm/templates/book/edit/edit_book.html:95 msgid "Find more information at isni.org" @@ -1476,16 +1480,16 @@ msgstr "vurderte den" #: bookwyrm/templates/book/series.html:11 msgid "Series by" -msgstr "" +msgstr "En serie av" #: bookwyrm/templates/book/series.html:27 #, python-format msgid "Book %(series_number)s" -msgstr "" +msgstr "Bok %(series_number)s" #: bookwyrm/templates/book/series.html:27 msgid "Unsorted Book" -msgstr "" +msgstr "Usortert bok" #: bookwyrm/templates/book/sync_modal.html:15 #, python-format @@ -1807,11 +1811,11 @@ msgstr "Tilbakestill passordet ditt på %(site_name)s" #: bookwyrm/templates/email/test/html_content.html:6 #: bookwyrm/templates/email/test/text_content.html:4 msgid "This is a test email." -msgstr "" +msgstr "Dette er en test-e-post." #: bookwyrm/templates/email/test/subject.html:2 msgid "Test email" -msgstr "" +msgstr "Test-e-post" #: bookwyrm/templates/embed-layout.html:20 bookwyrm/templates/layout.html:31 #: bookwyrm/templates/setup/layout.html:15 @@ -2264,31 +2268,31 @@ msgstr "Du kan også manuelt legge til lesedato her. I motsetning til å endre l #: bookwyrm/templates/guided_tour/book.html:55 msgid "Got a favourite you re-read every year? We've got you covered - you can add multiple read dates for the same book 😀" -msgstr "" +msgstr "Har du en favoritt du leser om igjen hvert år? Ikke noe problem – du kan legge til flere lesedatoer for samme bok 😀" #: bookwyrm/templates/guided_tour/book.html:79 msgid "There can be multiple editions of a book, in various formats or languages. You can choose which edition you want to use." -msgstr "" +msgstr "Det kan være flere utgaver av en bok, i ulike formater og språk. Du kan velge hvilken utgave du vil bruke." #: bookwyrm/templates/guided_tour/book.html:80 msgid "Other editions" -msgstr "" +msgstr "Andre utgaver" #: bookwyrm/templates/guided_tour/book.html:102 msgid "You can post a review, comment, or quote here." -msgstr "" +msgstr "Du kan legge til en anmeldelse, kommentar eller sitat her." #: bookwyrm/templates/guided_tour/book.html:103 msgid "Share your thoughts" -msgstr "" +msgstr "Del dine tanker" #: bookwyrm/templates/guided_tour/book.html:127 msgid "If you have read this book you can post a review including an optional star rating" -msgstr "" +msgstr "Om du har lest denne boken kan du publisere en anmeldelse inkludert en valgfri stjernemerking" #: bookwyrm/templates/guided_tour/book.html:128 msgid "Post a review" -msgstr "" +msgstr "Publiser anmeldelse" #: bookwyrm/templates/guided_tour/book.html:151 msgid "You can share your thoughts on this book generally with a simple comment" @@ -2296,23 +2300,23 @@ msgstr "" #: bookwyrm/templates/guided_tour/book.html:152 msgid "Post a comment" -msgstr "" +msgstr "Skriv en kommentar" #: bookwyrm/templates/guided_tour/book.html:175 msgid "Just read some perfect prose? Let the world know by sharing a quote!" -msgstr "" +msgstr "Bare les noen perfekte prosa? Del med verden ved å dele et sitat!" #: bookwyrm/templates/guided_tour/book.html:176 msgid "Share a quote" -msgstr "" +msgstr "Del sitat" #: bookwyrm/templates/guided_tour/book.html:199 msgid "If your review or comment might ruin the book for someone who hasn't read it yet, you can hide your post behind a spoiler alert" -msgstr "" +msgstr "Om din omtale eller kommentar kan ødelegge boken for noen som ikke har lest den ennå, du kan skjule innlegget ditt bak en plottblott-advarsel" #: bookwyrm/templates/guided_tour/book.html:200 msgid "Spoiler alerts" -msgstr "" +msgstr "Plottblott-advarsel" #: bookwyrm/templates/guided_tour/book.html:224 msgid "Choose who can see your post here. Post privacy can be Public (everyone can see), Unlisted (everyone can see, but it doesn't appear in public feeds or discovery pages), Followers (only your followers can see), or Private (only you can see)" @@ -2326,15 +2330,15 @@ msgstr "Delingsinstilling for post" #: bookwyrm/templates/guided_tour/book.html:248 msgid "Some ebooks can be downloaded for free from external sources. They will be shown here." -msgstr "" +msgstr "Noen e-bøker kan lastes ned gratis fra eksterne kilder. De vil vises her." #: bookwyrm/templates/guided_tour/book.html:249 msgid "Download links" -msgstr "" +msgstr "Nedlastingslenker" #: bookwyrm/templates/guided_tour/book.html:273 msgid "Continue the tour by selecting Your books from the drop down menu." -msgstr "" +msgstr "Fortsett gjennomgangen ved å velge Dine bøker fra nedtrekksmenyen." #: bookwyrm/templates/guided_tour/book.html:296 #: bookwyrm/templates/guided_tour/home.html:50 @@ -2344,15 +2348,15 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_groups.html:116 #: bookwyrm/templates/guided_tour/user_profile.html:141 msgid "Ok" -msgstr "" +msgstr "Ok" #: bookwyrm/templates/guided_tour/group.html:10 msgid "Welcome to the page for your group! This is where you can add and remove users, create user-curated lists, and edit the group details." -msgstr "" +msgstr "Velkommen til siden for gruppen din! Her kan du legge til og fjerne brukere, opprette brukerstyrte lister, og redigere gruppedetaljene." #: bookwyrm/templates/guided_tour/group.html:11 msgid "Your group" -msgstr "" +msgstr "Din gruppe" #: bookwyrm/templates/guided_tour/group.html:31 msgid "Use this search box to find users to join your group. Currently users must be members of the same Bookwyrm instance and be invited by the group owner." @@ -2360,15 +2364,15 @@ msgstr "" #: bookwyrm/templates/guided_tour/group.html:32 msgid "Find users" -msgstr "" +msgstr "Finn brukere" #: bookwyrm/templates/guided_tour/group.html:54 msgid "Your group members will appear here. The group owner is marked with a star symbol." -msgstr "" +msgstr "Gruppemedlemmene vises her. Eieren av gruppa er markert med et stjernesymbol." #: bookwyrm/templates/guided_tour/group.html:55 msgid "Group members" -msgstr "" +msgstr "Gruppemedlemmer" #: bookwyrm/templates/guided_tour/group.html:77 msgid "As well as creating lists from the Lists page, you can create a group-curated list here on the group's homepage. Any member of the group can create a list curated by group members." @@ -2376,46 +2380,46 @@ msgstr "" #: bookwyrm/templates/guided_tour/group.html:78 msgid "Group lists" -msgstr "" +msgstr "Gruppelister" #: bookwyrm/templates/guided_tour/group.html:100 msgid "Congratulations, you've finished the tour! Now you know the basics, but there is lots more to explore on your own. Happy reading!" -msgstr "" +msgstr "Gratulerer, du har fullført omvisningen! Nå kan du det grunnleggende, men det er mye mer å utforske på egen hånd. God lesing!" #: bookwyrm/templates/guided_tour/group.html:115 msgid "End tour" -msgstr "" +msgstr "Avslutt omvisning" #: bookwyrm/templates/guided_tour/home.html:16 msgid "Welcome to Bookwyrm!

Would you like to take the guided tour to help you get started?" -msgstr "" +msgstr "Velkommen til Bookwyrm!

Vil du ha en veiledet omvisning for å hjelpe deg å komme i gang?" #: bookwyrm/templates/guided_tour/home.html:17 #: bookwyrm/templates/guided_tour/home.html:39 #: bookwyrm/templates/snippets/footer.html:20 msgid "Guided Tour" -msgstr "" +msgstr "Veiledet omvisning" #: bookwyrm/templates/guided_tour/home.html:25 #: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:36 msgid "No thanks" -msgstr "" +msgstr "Nei takk" #: bookwyrm/templates/guided_tour/home.html:33 msgid "Yes please!" -msgstr "" +msgstr "Ja takk!" #: bookwyrm/templates/guided_tour/home.html:38 msgid "If you ever change your mind, just click on the Guided Tour link to start your tour" -msgstr "" +msgstr "Hvis du noen gang ombestemmer deg kan du klikke på Veiledet omvisnings-lenken for å starte omvisningen din" #: bookwyrm/templates/guided_tour/home.html:62 msgid "Search for books, users, or lists using this search box." -msgstr "" +msgstr "Søk etter bøker, brukere eller lister med dette søkefeltet." #: bookwyrm/templates/guided_tour/home.html:63 msgid "Search box" -msgstr "" +msgstr "Søkefelt" #: bookwyrm/templates/guided_tour/home.html:79 msgid "Search book records by scanning an ISBN barcode using your device's camera - great when you're in the bookstore or library!" @@ -2423,15 +2427,15 @@ msgstr "" #: bookwyrm/templates/guided_tour/home.html:80 msgid "Barcode reader" -msgstr "" +msgstr "Strekkodeleser" #: bookwyrm/templates/guided_tour/home.html:102 msgid "Use the Feed, Lists and Discover links to discover the latest news from your feed, lists of books by topic, and the latest happenings on this Bookwyrm server!" -msgstr "" +msgstr "Bruk lenkene Strøm, Lister og Oppdag for å få de seneste nyhetene fra strømmen din, lister over bøker etter emne, og siste nytt på denne BookWyrm-serveren!" #: bookwyrm/templates/guided_tour/home.html:103 msgid "Navigation Bar" -msgstr "" +msgstr "Navigeringsfelt" #: bookwyrm/templates/guided_tour/home.html:126 msgid "Books on your reading status shelves will be shown here." @@ -2443,11 +2447,11 @@ msgstr "" #: bookwyrm/templates/guided_tour/home.html:152 msgid "Timelines" -msgstr "" +msgstr "Tidslinjer" #: bookwyrm/templates/guided_tour/home.html:176 msgid "The bell will light up when you have a new notification. When it does, click on it to find out what exciting thing has happened!" -msgstr "" +msgstr "Klokka lyser opp når du får ny varsel. Når det skjer, klikk på den for å finne ut hva spennende som har skjedd!" #: bookwyrm/templates/guided_tour/home.html:177 #: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106 @@ -2459,15 +2463,15 @@ msgstr "Varsler" #: bookwyrm/templates/guided_tour/home.html:200 msgid "Your profile, books, direct messages, and settings can be accessed by clicking on your name in the menu here." -msgstr "" +msgstr "Din profil, bøker, direktemeldinger og innstillinger kan nås ved å klikke på navnet ditt i denne menyen." #: bookwyrm/templates/guided_tour/home.html:200 msgid "Try selecting Profile from the drop down menu to continue the tour." -msgstr "" +msgstr "Prøv å velge Profil fra nedtrekksmenyen for å fortsette omvisningen." #: bookwyrm/templates/guided_tour/home.html:201 msgid "Profile and settings menu" -msgstr "" +msgstr "Profil og innstillingsmeny" #: bookwyrm/templates/guided_tour/lists.html:13 msgid "This is the lists page where you can discover book lists created by any user. A List is a collection of books, similar to a shelf." @@ -2475,101 +2479,101 @@ msgstr "" #: bookwyrm/templates/guided_tour/lists.html:13 msgid "Shelves are for organising books for yourself, whereas Lists are generally for sharing with others." -msgstr "" +msgstr "Hyller brukes til å organisere bøker for deg selv, mens lister deles vanligvis med andre." #: bookwyrm/templates/guided_tour/lists.html:34 msgid "Let's see how to create a new list." -msgstr "" +msgstr "La oss se på hvordan du lager en ny liste." #: bookwyrm/templates/guided_tour/lists.html:34 msgid "Click the Create List button, then Next to continue the tour" -msgstr "" +msgstr "Klikk på Opprett liste, deretter Neste for å fortsette omvisningen" #: bookwyrm/templates/guided_tour/lists.html:35 #: bookwyrm/templates/guided_tour/lists.html:59 msgid "Creating a new list" -msgstr "" +msgstr "Oppretting av en ny liste" #: bookwyrm/templates/guided_tour/lists.html:58 msgid "You must give your list a name and can optionally give it a description to help other people understand what your list is about." -msgstr "" +msgstr "Du må gi listen din et navn og kan eventuelt gi den en beskrivelse for å hjelpe andre med å forstå hva listen din dreier seg om." #: bookwyrm/templates/guided_tour/lists.html:81 msgid "Choose who can see your list here. List privacy options work just like we saw when posting book reviews. This is a common pattern throughout Bookwyrm." -msgstr "" +msgstr "Velg hvem som kan se listen her. Listens personvernalternativer fungerer på samme måte som den vi så når vi publiserer bokomtaler. Dette mønsteret ser vi overalt i BookWyrm." #: bookwyrm/templates/guided_tour/lists.html:82 msgid "List privacy" -msgstr "" +msgstr "Personvernalternativet for liste" #: bookwyrm/templates/guided_tour/lists.html:105 msgid "You can also decide how your list is to be curated - only by you, by anyone, or by a group." -msgstr "" +msgstr "Du kan også velge hvordan listen din skal kureres – kun av deg, av hvem som helst, eller av en gruppe." #: bookwyrm/templates/guided_tour/lists.html:106 msgid "List curation" -msgstr "" +msgstr "Listekurering" #: bookwyrm/templates/guided_tour/lists.html:128 msgid "Next in our tour we will explore Groups!" -msgstr "" +msgstr "På neste stopp i omvisningen vil vi utforske grupper!" #: bookwyrm/templates/guided_tour/lists.html:129 msgid "Next: Groups" -msgstr "" +msgstr "Neste: Grupper" #: bookwyrm/templates/guided_tour/lists.html:143 msgid "Take me there" -msgstr "" +msgstr "Ta meg dit" #: bookwyrm/templates/guided_tour/search.html:16 msgid "If the book you are looking for is available on a remote catalogue such as Open Library, click on Import book." -msgstr "" +msgstr "Om boken du leter etter er tilgjengelig på en ekstern katalog, for eksempel Open Library, klikk på Importer bok." #: bookwyrm/templates/guided_tour/search.html:17 #: bookwyrm/templates/guided_tour/search.html:44 msgid "Searching" -msgstr "" +msgstr "Søker" #: bookwyrm/templates/guided_tour/search.html:43 msgid "If the book you are looking for is already on this Bookwyrm instance, you can click on the title to go to the book's page." -msgstr "" +msgstr "Om boken du leter etter allerede finnes på denne BookWyrm-instansen, kan du klikke på tittelen for å gå til siden til boka." #: bookwyrm/templates/guided_tour/search.html:71 msgid "If the book you are looking for is not listed, try loading more records from other sources like Open Library or Inventaire." -msgstr "" +msgstr "Om boken du leter etter er ikke oppført, prøv å laste flere oppføringer fra andre kilder som Open Library eller Inventaire." #: bookwyrm/templates/guided_tour/search.html:72 msgid "Load more records" -msgstr "" +msgstr "Last inn flere oppføringer" #: bookwyrm/templates/guided_tour/search.html:98 msgid "If your book is not in the results, try adjusting your search terms." -msgstr "" +msgstr "Om boken ikke er i resultatet, prøv å endre søkeordene dine." #: bookwyrm/templates/guided_tour/search.html:99 msgid "Search again" -msgstr "" +msgstr "Søk på nytt" #: bookwyrm/templates/guided_tour/search.html:121 msgid "If you still can't find your book, you can add a record manually." -msgstr "" +msgstr "Om du fortsatt ikke finner boken din, kan du legge til en oppføring manuelt." #: bookwyrm/templates/guided_tour/search.html:122 msgid "Add a record manually" -msgstr "" +msgstr "Legg til oppføring manuelt" #: bookwyrm/templates/guided_tour/search.html:147 msgid "Import, manually add, or view an existing book to continue the tour." -msgstr "" +msgstr "Importer, legg til manuelt, eller se en eksisterende bok for å fortsette omvisningen." #: bookwyrm/templates/guided_tour/search.html:148 msgid "Continue the tour" -msgstr "" +msgstr "Fortsett omvisningen" #: bookwyrm/templates/guided_tour/user_books.html:10 msgid "This is the page where your books are listed, organised into shelves." -msgstr "" +msgstr "Dette er siden hvor bøker listes opp, organisert i hyller." #: bookwyrm/templates/guided_tour/user_books.html:11 #: bookwyrm/templates/user/books_header.html:4 @@ -2640,7 +2644,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_groups.html:79 msgid "Group visibility" -msgstr "" +msgstr "Gruppens synlighet" #: bookwyrm/templates/guided_tour/user_groups.html:102 msgid "Once you're happy with how everything is set up, click the Save button to create your new group." @@ -2652,7 +2656,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_groups.html:103 msgid "Save your group" -msgstr "" +msgstr "Lagre gruppen din" #: bookwyrm/templates/guided_tour/user_profile.html:10 msgid "This is your user profile. All your latest activities will be listed here. Other Bookwyrm users can see parts of this page too - what they can see depends on your privacy settings." @@ -2694,7 +2698,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_profile.html:124 msgid "Find a book" -msgstr "" +msgstr "Finn en bok" #: bookwyrm/templates/hashtag.html:12 #, python-format @@ -2703,7 +2707,7 @@ msgstr "" #: bookwyrm/templates/hashtag.html:25 msgid "No activities for this hashtag yet!" -msgstr "" +msgstr "Ingen aktiviteter for denne emneknaggen ennå!" #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 @@ -2713,7 +2717,7 @@ msgstr "Importer bøker" #: bookwyrm/templates/import/import.html:13 msgid "Not a valid CSV file" -msgstr "" +msgstr "Ikke en gyldig CSV-fil" #: bookwyrm/templates/import/import.html:20 #, python-format @@ -2741,23 +2745,23 @@ msgstr "Datakilde:" #: bookwyrm/templates/import/import.html:53 msgid "Goodreads (CSV)" -msgstr "" +msgstr "Goodreads (CSV)" #: bookwyrm/templates/import/import.html:56 msgid "Storygraph (CSV)" -msgstr "" +msgstr "Storygraph (CSV)" #: bookwyrm/templates/import/import.html:59 msgid "LibraryThing (TSV)" -msgstr "" +msgstr "LibraryThing (TSV)" #: bookwyrm/templates/import/import.html:62 msgid "OpenLibrary (CSV)" -msgstr "" +msgstr "OpenLibrary (CSV)" #: bookwyrm/templates/import/import.html:65 msgid "Calibre (CSV)" -msgstr "" +msgstr "Calibre (CSV)" #: bookwyrm/templates/import/import.html:71 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." @@ -3299,7 +3303,7 @@ msgstr "En valgfri merknad som vil vises sammen med boken." #: bookwyrm/templates/lists/list.html:37 msgid "That book is already on this list." -msgstr "" +msgstr "Den boka er allerede på denne listen." #: bookwyrm/templates/lists/list.html:45 msgid "You successfully suggested a book for this list!" @@ -3311,7 +3315,7 @@ msgstr "Du har nå lagt til ei bok i denne lista!" #: bookwyrm/templates/lists/list.html:54 msgid "This list is currently empty." -msgstr "" +msgstr "Denne listen er for øyeblikket tom." #: bookwyrm/templates/lists/list.html:104 msgid "Edit notes" @@ -4038,6 +4042,11 @@ msgstr "" msgid "Default post privacy:" msgstr "Standard tilgangsnivå på innlegg:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" @@ -5880,7 +5889,7 @@ msgstr "Innhold" #: bookwyrm/templates/snippets/create_status/content_warning_field.html:9 msgid "Include spoiler alert" -msgstr "Inkluder spoiler-varsel" +msgstr "Inkluder plottblott-advarsel" #: bookwyrm/templates/snippets/create_status/content_warning_field.html:18 msgid "Spoilers/content warnings:" @@ -5888,7 +5897,7 @@ msgstr "" #: bookwyrm/templates/snippets/create_status/content_warning_field.html:27 msgid "Spoilers ahead!" -msgstr "Spoilers forut!" +msgstr "Plottblott forut!" #: bookwyrm/templates/snippets/create_status/layout.html:45 #: bookwyrm/templates/snippets/reading_modals/form.html:7 diff --git a/locale/pl_PL/LC_MESSAGES/django.mo b/locale/pl_PL/LC_MESSAGES/django.mo index be15d14dee937772e59a9d91e6befcc373c69d1d..58f304208a04302f82c1d5db314e25424c776d02 100644 GIT binary patch delta 26179 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 B%3}Zk delta 26122 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\n" "Language-Team: Polish\n" "Language: pl\n" @@ -316,19 +316,19 @@ msgstr "Cytaty" msgid "Everything else" msgstr "Wszystko inne" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Strona główna" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Start" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Oś czasu książek" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Oś czasu książek" msgid "Books" msgstr "Książki" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Angielski)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (Kataloński)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (Niemiecki)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "Esperanto (Esperanto)" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (Hiszpański)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Galicyjski)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (Włoski)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (Fiński)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (Francuski)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litewski)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (Norweski)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Brazylijski Portugalski)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugalski)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (Rumuński)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Szwedzki)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Uproszczony chiński)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tradycyjny chiński)" @@ -850,7 +854,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4070,6 +4074,11 @@ msgstr "Ukryj obserwujących i obserwowanych na profilu" msgid "Default post privacy:" msgstr "Domyślna prywatność wpisu:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo index a7d3514327cea5b209235597e29059e08c7e88be..9acc649431538f955442a90b50bd8dd618076512 100644 GIT binary patch delta 25 hcmX>#i}lnj)(vY;ahd2Em@62XSQ!~^-gatA699&x3N`=$ delta 25 hcmX>#i}lnj)(vY;aT)6x8Y>u@Ss7by-gatA699&|3OxV- diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po index 614646716..e2a3a6bea 100644 --- a/locale/pt_BR/LC_MESSAGES/django.po +++ b/locale/pt_BR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-13 16:39\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-07 14:21\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt\n" @@ -316,19 +316,19 @@ msgstr "Citações" msgid "Everything else" msgstr "Todo o resto" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Linha do tempo" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Página inicial" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Linha do tempo dos livros" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Linha do tempo dos livros" msgid "Books" msgstr "Livros" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (Inglês)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (Alemão)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (Espanhol)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Galego)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (Italiano)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (Finlandês)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (Francês)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituano)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (Norueguês)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Português do Brasil)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Português Europeu)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (Romeno)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Sueco)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Chinês simplificado)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinês tradicional)" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4038,6 +4042,11 @@ msgstr "Esconder quem sigo e seguidores no perfil" msgid "Default post privacy:" msgstr "Privacidade padrão das publicações:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/pt_PT/LC_MESSAGES/django.mo b/locale/pt_PT/LC_MESSAGES/django.mo index 75385af56b0d98d92eff3a18a1bb10cea1c6ad00..bfd64697bdb7d9dfe42259127e9598b205410f17 100644 GIT binary patch delta 25 hcmccendQo7mJP4>ahd2Em@62XSQ!~^{<`me6#$(13!?x4 delta 25 hcmccendQo7mJP4>aT)6x8Y>u@Ss7by{<`me6#$(O3#tGB diff --git a/locale/pt_PT/LC_MESSAGES/django.po b/locale/pt_PT/LC_MESSAGES/django.po index 6a3989cc8..1f2e7887c 100644 --- a/locale/pt_PT/LC_MESSAGES/django.po +++ b/locale/pt_PT/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-13 16:39\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-07 14:21\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Portuguese\n" "Language: pt\n" @@ -316,19 +316,19 @@ msgstr "Citações" msgid "Everything else" msgstr "Tudo o resto" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Cronograma Inicial" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Início" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Cronograma de Livros" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Cronograma de Livros" msgid "Books" msgstr "Livros" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "Inglês" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (Alemão)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (Espanhol)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Galician)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (Italiano)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (finlandês)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (Francês)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (lituano)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (Norueguês)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Português brasileiro)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português (Português Europeu)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (Romeno)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (sueco)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Chinês simplificado)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinês tradicional)" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4038,6 +4042,11 @@ msgstr "Ocultar os seguidores e os que sigo no perfil" msgid "Default post privacy:" msgstr "Privacidade de publicação predefinida:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/ro_RO/LC_MESSAGES/django.mo b/locale/ro_RO/LC_MESSAGES/django.mo index c9a5ada88a22216d8243c74e388093af7ec9f44c..5de371bf8fed5b3f1531d0b432ea37a8ec8f1e18 100644 GIT binary patch delta 28 kcmX?imi^pW_J%Et3SwL)x(4P7h9*`\n" "Language-Team: Romanian\n" "Language: ro\n" @@ -316,19 +316,19 @@ msgstr "Citate" msgid "Everything else" msgstr "Orice altceva" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Friză cronologică principală" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Acasă" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Friză cronologică de cărți" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Friză cronologică de cărți" msgid "Books" msgstr "Cărți" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English (engleză)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (catalană)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch (germană)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español (spaniolă)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (galiciană)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano (italiană)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (finlandeză)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français (franceză)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (lituaniană)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk (norvegiană)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (portugheză braziliană)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (portugheză europeană)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (română)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (suedeză)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (chineză simplificată)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (chineză tradițională)" @@ -846,7 +850,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4054,6 +4058,11 @@ msgstr "Ascundeți urmăritorii pe profil" msgid "Default post privacy:" msgstr "Confidențialitatea implicită a postărilor:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/sv_SE/LC_MESSAGES/django.mo b/locale/sv_SE/LC_MESSAGES/django.mo index b6dcee8e0c2bbf634d12af751be58355566cb648..68c4027dfc12b8a4e68a9bfa111234370561d821 100644 GIT binary patch delta 28 kcmX@JnB&Z1j)pCa_f5G>bPdcE3{9+z47a~DWqf=a0G(3`zyJUM delta 28 kcmX@JnB&Z1j)pCa_f5Hsbq$Rb49%>JEw{fkWqf=a0G)9P#{d8T diff --git a/locale/sv_SE/LC_MESSAGES/django.po b/locale/sv_SE/LC_MESSAGES/django.po index bd6e7c71d..6b132d311 100644 --- a/locale/sv_SE/LC_MESSAGES/django.po +++ b/locale/sv_SE/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-13 16:39\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-07 14:21\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Swedish\n" "Language: sv\n" @@ -316,19 +316,19 @@ msgstr "Citat" msgid "Everything else" msgstr "Allt annat" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "Tidslinje för Hem" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "Hem" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "Tidslinjer för böcker" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "Tidslinjer för böcker" msgid "Books" msgstr "Böcker" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "Engelska" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (katalanska)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Tyska (Tysk)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Spanska (Spansk)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "Euskara (Baskiska)" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego (Gallisk)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italienska (Italiensk)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Finland (Finska)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Franska (Fransk)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Litauiska (Litauisk)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norska (Norska)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (polska)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português d Brasil (Brasiliansk Portugisiska)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europeisk Portugisiska)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Rumänien (Rumänska)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska (Svenska)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Förenklad Kinesiska)" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Traditionell Kinesiska)" @@ -842,7 +846,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4038,6 +4042,11 @@ msgstr "Göm följare och följningar på profilen" msgid "Default post privacy:" msgstr "Standardsekretess för inlägg:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo index 5f7bf079326aa9940e7a29c60038959eb056b268..d958264a34ba00ad71fcefa81427d1a9cddc1a0c 100644 GIT binary patch delta 25 fcmdn+jCBJLJ$%PyqHAETU}$1xWVreDJJ%KfmH7() delta 25 fcmdn+jCBJLJ$%PytZQhjU}$D#Y`OXMJJ%KfmJkaD diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po index fd76f3597..f88d7358c 100644 --- a/locale/zh_Hans/LC_MESSAGES/django.po +++ b/locale/zh_Hans/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-13 16:39\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-07 14:21\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Chinese Simplified\n" "Language: zh\n" @@ -316,19 +316,19 @@ msgstr "引用" msgid "Everything else" msgstr "所有其它内容" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "主页时间线" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "主页" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "书目时间线" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "书目时间线" msgid "Books" msgstr "书目" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English(英语)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "Català (加泰罗尼亚语)" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch(德语)" -#: bookwyrm/settings.py:294 +#: bookwyrm/settings.py:297 +msgid "Esperanto (Esperanto)" +msgstr "" + +#: bookwyrm/settings.py:298 msgid "Español (Spanish)" msgstr "Español(西班牙语)" -#: bookwyrm/settings.py:295 +#: bookwyrm/settings.py:299 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:296 +#: bookwyrm/settings.py:300 msgid "Galego (Galician)" msgstr "Galego(加利西亚语)" -#: bookwyrm/settings.py:297 +#: bookwyrm/settings.py:301 msgid "Italiano (Italian)" msgstr "Italiano(意大利语)" -#: bookwyrm/settings.py:298 +#: bookwyrm/settings.py:302 msgid "Suomi (Finnish)" msgstr "Suomi (Finnish/芬兰语)" -#: bookwyrm/settings.py:299 +#: bookwyrm/settings.py:303 msgid "Français (French)" msgstr "Français(法语)" -#: bookwyrm/settings.py:300 +#: bookwyrm/settings.py:304 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių(立陶宛语)" -#: bookwyrm/settings.py:301 +#: bookwyrm/settings.py:305 msgid "Norsk (Norwegian)" msgstr "Norsk(挪威语)" -#: bookwyrm/settings.py:302 +#: bookwyrm/settings.py:306 msgid "Polski (Polish)" msgstr "Polski (波兰语)" -#: bookwyrm/settings.py:303 +#: bookwyrm/settings.py:307 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil(巴西葡萄牙语)" -#: bookwyrm/settings.py:304 +#: bookwyrm/settings.py:308 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu(欧洲葡萄牙语)" -#: bookwyrm/settings.py:305 +#: bookwyrm/settings.py:309 msgid "Română (Romanian)" msgstr "Română (罗马尼亚语)" -#: bookwyrm/settings.py:306 +#: bookwyrm/settings.py:310 msgid "Svenska (Swedish)" msgstr "Svenska(瑞典语)" -#: bookwyrm/settings.py:307 +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文(繁体中文)" @@ -838,7 +842,7 @@ msgstr "ISNI:" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4022,6 +4026,11 @@ msgstr "隐藏关注者并在个人资料中关注" msgid "Default post privacy:" msgstr "默认发文隐私:" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" diff --git a/locale/zh_Hant/LC_MESSAGES/django.mo b/locale/zh_Hant/LC_MESSAGES/django.mo index c388dd30e5958075aac37a5d1ae8465c44f92309..276bf23665fd6ea86f8ca0fd2fc910c5a8896abb 100644 GIT binary patch delta 25 hcmaF;kMZ?C#to-JxlD8o%oPkxtc(mdUkRPA2>_P03N!!! delta 25 hcmaF;kMZ?C#to-Jxr}uUjTH>dtc)!;UkRPA2>_PN3OfJ* diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po index ec4437fc8..ff51f1495 100644 --- a/locale/zh_Hant/LC_MESSAGES/django.po +++ b/locale/zh_Hant/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-13 14:54+0000\n" -"PO-Revision-Date: 2023-03-13 16:39\n" +"POT-Creation-Date: 2023-03-29 14:55+0000\n" +"PO-Revision-Date: 2023-04-07 14:21\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Chinese Traditional\n" "Language: zh\n" @@ -316,19 +316,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home Timeline" msgstr "主頁時間線" -#: bookwyrm/settings.py:218 +#: bookwyrm/settings.py:221 msgid "Home" msgstr "主頁" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:219 +#: bookwyrm/settings.py:222 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:43 @@ -336,75 +336,79 @@ msgstr "" msgid "Books" msgstr "書目" -#: bookwyrm/settings.py:291 +#: bookwyrm/settings.py:294 msgid "English" msgstr "English(英語)" -#: bookwyrm/settings.py:292 +#: bookwyrm/settings.py:295 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:293 +#: bookwyrm/settings.py:296 msgid "Deutsch (German)" msgstr "Deutsch(德語)" -#: bookwyrm/settings.py:294 -msgid "Español (Spanish)" -msgstr "Español(西班牙語)" - -#: bookwyrm/settings.py:295 -msgid "Euskara (Basque)" -msgstr "" - -#: bookwyrm/settings.py:296 -msgid "Galego (Galician)" -msgstr "" - #: bookwyrm/settings.py:297 -msgid "Italiano (Italian)" +msgid "Esperanto (Esperanto)" msgstr "" #: bookwyrm/settings.py:298 -msgid "Suomi (Finnish)" -msgstr "" +msgid "Español (Spanish)" +msgstr "Español(西班牙語)" #: bookwyrm/settings.py:299 -msgid "Français (French)" -msgstr "Français(法語)" +msgid "Euskara (Basque)" +msgstr "" #: bookwyrm/settings.py:300 -msgid "Lietuvių (Lithuanian)" +msgid "Galego (Galician)" msgstr "" #: bookwyrm/settings.py:301 -msgid "Norsk (Norwegian)" +msgid "Italiano (Italian)" msgstr "" #: bookwyrm/settings.py:302 -msgid "Polski (Polish)" +msgid "Suomi (Finnish)" msgstr "" #: bookwyrm/settings.py:303 -msgid "Português do Brasil (Brazilian Portuguese)" -msgstr "" +msgid "Français (French)" +msgstr "Français(法語)" #: bookwyrm/settings.py:304 -msgid "Português Europeu (European Portuguese)" +msgid "Lietuvių (Lithuanian)" msgstr "" #: bookwyrm/settings.py:305 -msgid "Română (Romanian)" +msgid "Norsk (Norwegian)" msgstr "" #: bookwyrm/settings.py:306 -msgid "Svenska (Swedish)" +msgid "Polski (Polish)" msgstr "" #: bookwyrm/settings.py:307 +msgid "Português do Brasil (Brazilian Portuguese)" +msgstr "" + +#: bookwyrm/settings.py:308 +msgid "Português Europeu (European Portuguese)" +msgstr "" + +#: bookwyrm/settings.py:309 +msgid "Română (Romanian)" +msgstr "" + +#: bookwyrm/settings.py:310 +msgid "Svenska (Swedish)" +msgstr "" + +#: bookwyrm/settings.py:311 msgid "简体中文 (Simplified Chinese)" msgstr "簡體中文" -#: bookwyrm/settings.py:308 +#: bookwyrm/settings.py:312 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文" @@ -838,7 +842,7 @@ msgstr "" #: 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/preferences/edit_user.html:140 #: bookwyrm/templates/readthrough/readthrough_modal.html:81 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/federation/edit_instance.html:98 @@ -4022,6 +4026,11 @@ msgstr "" msgid "Default post privacy:" msgstr "" +#: bookwyrm/templates/preferences/edit_user.html:136 +#, python-format +msgid "Looking for shelf privacy? You can set a separate visibility level for each of your shelves. Go to Your Books, pick a shelf from the tab bar, and click \"Edit shelf.\"" +msgstr "" + #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 msgid "CSV Export" From b77ae9e7833f005e13e0a0d9c329c8ab6718cca0 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 25 Apr 2023 17:42:32 -0700 Subject: [PATCH 114/114] Ticks version number --- bookwyrm/settings.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 8dcf90fcb..ab73115a1 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -12,7 +12,7 @@ from django.core.exceptions import ImproperlyConfigured env = Env() env.read_env() DOMAIN = env("DOMAIN") -VERSION = "0.6.1" +VERSION = "0.6.2" RELEASE_API = env( "RELEASE_API", @@ -22,7 +22,7 @@ RELEASE_API = env( PAGE_LENGTH = env.int("PAGE_LENGTH", 15) DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English") -JS_CACHE = "a7d4e720" +JS_CACHE = "ea91d7df" # email EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")