From d1c582493d8a319f24a1cabcc943e35da0eb7d4a Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 18 Apr 2021 09:26:27 -0700 Subject: [PATCH 01/18] Update to django 3.2 --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6b7d82d3..0bcc8599 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ celery==4.4.2 -Django==3.1.8 +Django==3.2.0 django-model-utils==4.0.0 environs==7.2.0 flower==0.9.4 From 0cb80aeb55f531f40f493457cb78b33363091522 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 07:24:03 -0700 Subject: [PATCH 02/18] Preserve search results after adding a book --- bookwyrm/templates/lists/list.html | 2 +- bookwyrm/views/list.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/bookwyrm/templates/lists/list.html b/bookwyrm/templates/lists/list.html index a9f8e5c0..80e2ba20 100644 --- a/bookwyrm/templates/lists/list.html +++ b/bookwyrm/templates/lists/list.html @@ -116,7 +116,7 @@

{% include 'snippets/book_titleby.html' with book=book %}

-
+ {% csrf_token %} diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py index a2cf7afe..fe7bba54 100644 --- a/bookwyrm/views/list.py +++ b/bookwyrm/views/list.py @@ -1,5 +1,6 @@ """ book list views""" from typing import Optional +from urllib.parse import urlencode from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator @@ -9,6 +10,7 @@ from django.db.models.functions import Coalesce from django.http import HttpResponseNotFound, HttpResponseBadRequest, HttpResponse 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 from django.views import View from django.views.decorators.http import require_POST @@ -263,7 +265,8 @@ def add_book(request): # if the book is already on the list, don't flip out pass - return redirect("list", book_list.id) + path = reverse('list', args=[book_list.id]) + return redirect("{:s}?{:s}".format(path, urlencode(request.GET))) @require_POST From 0f6b5cc6be4ea11014322aa206bdc217f751405e Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 08:02:30 -0700 Subject: [PATCH 03/18] Filter list search results to hide already added books --- bookwyrm/connectors/connector_manager.py | 6 ++++-- bookwyrm/connectors/self_connector.py | 17 +++++++++-------- bookwyrm/views/list.py | 8 ++++++-- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 53198c0a..e9998906 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -67,10 +67,12 @@ def search(query, min_confidence=0.1): return results -def local_search(query, min_confidence=0.1, raw=False): +def local_search(query, min_confidence=0.1, raw=False, filters=None): """ only look at local search results """ connector = load_connector(models.Connector.objects.get(local=True)) - return connector.search(query, min_confidence=min_confidence, raw=raw) + return connector.search( + query, min_confidence=min_confidence, raw=raw, filters=filters + ) def isbn_local_search(query, raw=False): diff --git a/bookwyrm/connectors/self_connector.py b/bookwyrm/connectors/self_connector.py index 500ffd74..66560f21 100644 --- a/bookwyrm/connectors/self_connector.py +++ b/bookwyrm/connectors/self_connector.py @@ -13,15 +13,16 @@ class Connector(AbstractConnector): """ instantiate a connector """ # pylint: disable=arguments-differ - def search(self, query, min_confidence=0.1, raw=False): + def search(self, query, min_confidence=0.1, raw=False, filters=None): """ search your local database """ + filters = filters or [] if not query: return [] # first, try searching unqiue identifiers - results = search_identifiers(query) + results = search_identifiers(query, *filters) if not results: # then try searching title/author - results = search_title_author(query, min_confidence) + results = search_title_author(query, min_confidence, *filters) search_results = [] for result in results: if raw: @@ -98,15 +99,15 @@ class Connector(AbstractConnector): pass -def search_identifiers(query): +def search_identifiers(query, *filters): """ tries remote_id, isbn; defined as dedupe fields on the model """ - filters = [ + or_filters = [ {f.name: query} for f in models.Edition._meta.get_fields() if hasattr(f, "deduplication_field") and f.deduplication_field ] results = models.Edition.objects.filter( - reduce(operator.or_, (Q(**f) for f in filters)) + *filters, reduce(operator.or_, (Q(**f) for f in or_filters)) ).distinct() # when there are multiple editions of the same work, pick the default. @@ -114,7 +115,7 @@ def search_identifiers(query): return results.filter(parent_work__default_edition__id=F("id")) or results -def search_title_author(query, min_confidence): +def search_title_author(query, min_confidence, *filters): """ searches for title and author """ vector = ( SearchVector("title", weight="A") @@ -126,7 +127,7 @@ def search_title_author(query, min_confidence): results = ( models.Edition.objects.annotate(search=vector) .annotate(rank=SearchRank(vector, query)) - .filter(rank__gt=min_confidence) + .filter(*filters, rank__gt=min_confidence) .order_by("-rank") ) diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py index fe7bba54..748f2b8b 100644 --- a/bookwyrm/views/list.py +++ b/bookwyrm/views/list.py @@ -137,7 +137,11 @@ class List(View): if query and request.user.is_authenticated: # search for books - suggestions = connector_manager.local_search(query, raw=True) + suggestions = connector_manager.local_search( + query, + raw=True, + filters=[~Q(parent_work__editions__in=book_list.books.all())], + ) elif request.user.is_authenticated: # just suggest whatever books are nearby suggestions = request.user.shelfbook_set.filter( @@ -265,7 +269,7 @@ def add_book(request): # if the book is already on the list, don't flip out pass - path = reverse('list', args=[book_list.id]) + path = reverse("list", args=[book_list.id]) return redirect("{:s}?{:s}".format(path, urlencode(request.GET))) From 3ade2d3bb1934daa6d54838dfb73fcda81c7bf35 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 09:15:42 -0700 Subject: [PATCH 04/18] New version of black, new whitespace --- bookwyrm/activitypub/__init__.py | 2 +- bookwyrm/activitypub/base_activity.py | 24 +++---- bookwyrm/activitypub/book.py | 8 +-- bookwyrm/activitypub/image.py | 4 +- bookwyrm/activitypub/note.py | 18 ++--- bookwyrm/activitypub/ordered_collection.py | 16 ++--- bookwyrm/activitypub/person.py | 4 +- bookwyrm/activitypub/verbs.py | 50 ++++++------- bookwyrm/activitystreams.py | 44 ++++++------ bookwyrm/connectors/abstract_connector.py | 48 ++++++------- bookwyrm/connectors/bookwyrm_connector.py | 2 +- bookwyrm/connectors/connector_manager.py | 20 +++--- bookwyrm/connectors/openlibrary.py | 20 +++--- bookwyrm/connectors/self_connector.py | 14 ++-- bookwyrm/context_processors.py | 2 +- bookwyrm/emailing.py | 10 +-- bookwyrm/forms.py | 6 +- bookwyrm/importers/goodreads_import.py | 2 +- bookwyrm/importers/importer.py | 16 ++--- bookwyrm/importers/librarything_import.py | 4 +- .../commands/deduplicate_book_data.py | 10 +-- bookwyrm/management/commands/erase_streams.py | 6 +- bookwyrm/management/commands/initdb.py | 2 +- .../management/commands/populate_streams.py | 6 +- .../management/commands/remove_editions.py | 6 +- bookwyrm/migrations/0046_reviewrating.py | 4 +- bookwyrm/models/activitypub_mixin.py | 70 +++++++++---------- bookwyrm/models/attachment.py | 6 +- bookwyrm/models/author.py | 4 +- bookwyrm/models/base_model.py | 12 ++-- bookwyrm/models/book.py | 44 ++++++------ bookwyrm/models/connector.py | 4 +- bookwyrm/models/favorite.py | 10 +-- bookwyrm/models/federated_server.py | 8 +-- bookwyrm/models/fields.py | 60 ++++++++-------- bookwyrm/models/import_job.py | 36 +++++----- bookwyrm/models/list.py | 12 ++-- bookwyrm/models/notification.py | 6 +- bookwyrm/models/readthrough.py | 12 ++-- bookwyrm/models/relationship.py | 32 ++++----- bookwyrm/models/report.py | 10 +-- bookwyrm/models/shelf.py | 14 ++-- bookwyrm/models/site.py | 24 +++---- bookwyrm/models/status.py | 50 ++++++------- bookwyrm/models/user.py | 48 ++++++------- bookwyrm/redis_store.py | 22 +++--- bookwyrm/sanitize_html.py | 10 +-- bookwyrm/signatures.py | 16 ++--- bookwyrm/status.py | 2 +- bookwyrm/templatetags/bookwyrm_tags.py | 48 ++++++------- .../tests/activitypub/test_base_activity.py | 26 +++---- bookwyrm/tests/activitypub/test_quotation.py | 8 +-- .../connectors/test_abstract_connector.py | 18 ++--- .../test_abstract_minimal_connector.py | 22 +++--- .../connectors/test_bookwyrm_connector.py | 10 +-- .../connectors/test_connector_manager.py | 18 ++--- .../connectors/test_openlibrary_connector.py | 40 +++++------ .../tests/connectors/test_self_connector.py | 10 +-- .../tests/importers/test_goodreads_import.py | 22 +++--- .../importers/test_librarything_import.py | 20 +++--- .../tests/management/test_populate_streams.py | 6 +- .../tests/models/test_activitypub_mixin.py | 54 +++++++------- bookwyrm/tests/models/test_base_model.py | 16 ++--- bookwyrm/tests/models/test_book_model.py | 16 ++--- .../tests/models/test_federated_server.py | 6 +- bookwyrm/tests/models/test_fields.py | 56 +++++++-------- bookwyrm/tests/models/test_import_model.py | 20 +++--- bookwyrm/tests/models/test_list.py | 12 ++-- .../tests/models/test_readthrough_model.py | 6 +- .../tests/models/test_relationship_models.py | 16 ++--- bookwyrm/tests/models/test_shelf_model.py | 12 ++-- bookwyrm/tests/models/test_status_model.py | 58 +++++++-------- bookwyrm/tests/models/test_user_model.py | 4 +- bookwyrm/tests/test_activitystreams.py | 36 +++++----- bookwyrm/tests/test_emailing.py | 8 +-- bookwyrm/tests/test_sanitize_html.py | 12 ++-- bookwyrm/tests/test_signing.py | 20 +++--- bookwyrm/tests/test_templatetags.py | 40 +++++------ bookwyrm/tests/views/inbox/test_inbox.py | 22 +++--- bookwyrm/tests/views/inbox/test_inbox_add.py | 8 +-- .../tests/views/inbox/test_inbox_announce.py | 14 ++-- .../tests/views/inbox/test_inbox_block.py | 8 +-- .../tests/views/inbox/test_inbox_create.py | 16 ++--- .../tests/views/inbox/test_inbox_delete.py | 12 ++-- .../tests/views/inbox/test_inbox_follow.py | 18 ++--- bookwyrm/tests/views/inbox/test_inbox_like.py | 10 +-- .../tests/views/inbox/test_inbox_remove.py | 8 +-- .../tests/views/inbox/test_inbox_update.py | 12 ++-- bookwyrm/tests/views/test_authentication.py | 18 ++--- bookwyrm/tests/views/test_author.py | 14 ++-- bookwyrm/tests/views/test_block.py | 10 +-- bookwyrm/tests/views/test_book.py | 30 ++++---- bookwyrm/tests/views/test_directory.py | 6 +- bookwyrm/tests/views/test_federation.py | 18 ++--- bookwyrm/tests/views/test_feed.py | 18 ++--- bookwyrm/tests/views/test_follow.py | 16 ++--- bookwyrm/tests/views/test_get_started.py | 18 ++--- bookwyrm/tests/views/test_goal.py | 16 ++--- bookwyrm/tests/views/test_helpers.py | 32 ++++----- bookwyrm/tests/views/test_import.py | 10 +-- bookwyrm/tests/views/test_interaction.py | 20 +++--- bookwyrm/tests/views/test_invite.py | 18 ++--- bookwyrm/tests/views/test_isbn.py | 6 +- bookwyrm/tests/views/test_landing.py | 10 +-- bookwyrm/tests/views/test_list.py | 30 ++++---- bookwyrm/tests/views/test_notifications.py | 8 +-- bookwyrm/tests/views/test_outbox.py | 18 ++--- bookwyrm/tests/views/test_password.py | 22 +++--- bookwyrm/tests/views/test_reading.py | 16 ++--- bookwyrm/tests/views/test_readthrough.py | 6 +- bookwyrm/tests/views/test_reports.py | 18 ++--- bookwyrm/tests/views/test_rss_feed.py | 6 +- bookwyrm/tests/views/test_search.py | 12 ++-- bookwyrm/tests/views/test_shelf.py | 22 +++--- bookwyrm/tests/views/test_status.py | 32 ++++----- bookwyrm/tests/views/test_updates.py | 8 +-- bookwyrm/tests/views/test_user.py | 24 +++---- bookwyrm/tests/views/test_user_admin.py | 10 +-- bookwyrm/tests/views/test_wellknown.py | 12 ++-- bookwyrm/views/authentication.py | 14 ++-- bookwyrm/views/author.py | 10 +-- bookwyrm/views/block.py | 8 +-- bookwyrm/views/books.py | 28 ++++---- bookwyrm/views/directory.py | 6 +- bookwyrm/views/federation.py | 26 +++---- bookwyrm/views/feed.py | 20 +++--- bookwyrm/views/follow.py | 8 +-- bookwyrm/views/get_started.py | 16 ++--- bookwyrm/views/goal.py | 8 +-- bookwyrm/views/helpers.py | 22 +++--- bookwyrm/views/import_data.py | 12 ++-- bookwyrm/views/inbox.py | 12 ++-- bookwyrm/views/interaction.py | 16 ++--- bookwyrm/views/invite.py | 22 +++--- bookwyrm/views/isbn.py | 4 +- bookwyrm/views/landing.py | 12 ++-- bookwyrm/views/list.py | 32 ++++----- bookwyrm/views/notifications.py | 6 +- bookwyrm/views/outbox.py | 4 +- bookwyrm/views/password.py | 18 ++--- bookwyrm/views/reading.py | 16 ++--- bookwyrm/views/reports.py | 16 ++--- bookwyrm/views/rss_feed.py | 12 ++-- bookwyrm/views/search.py | 4 +- bookwyrm/views/shelf.py | 16 ++--- bookwyrm/views/site.py | 8 +-- bookwyrm/views/status.py | 20 +++--- bookwyrm/views/updates.py | 4 +- bookwyrm/views/user.py | 22 +++--- bookwyrm/views/user_admin.py | 10 +-- bookwyrm/views/wellknown.py | 12 ++-- requirements.txt | 2 +- 152 files changed, 1289 insertions(+), 1289 deletions(-) diff --git a/bookwyrm/activitypub/__init__.py b/bookwyrm/activitypub/__init__.py index d363fbd5..bfb22fa3 100644 --- a/bookwyrm/activitypub/__init__.py +++ b/bookwyrm/activitypub/__init__.py @@ -27,5 +27,5 @@ activity_objects = {c[0]: c[1] for c in cls_members if hasattr(c[1], "to_model") def parse(activity_json): - """ figure out what activity this is and parse it """ + """figure out what activity this is and parse it""" return naive_parse(activity_objects, activity_json) diff --git a/bookwyrm/activitypub/base_activity.py b/bookwyrm/activitypub/base_activity.py index dd2795bb..5349e1dd 100644 --- a/bookwyrm/activitypub/base_activity.py +++ b/bookwyrm/activitypub/base_activity.py @@ -10,11 +10,11 @@ from bookwyrm.tasks import app class ActivitySerializerError(ValueError): - """ routine problems serializing activitypub json """ + """routine problems serializing activitypub json""" class ActivityEncoder(JSONEncoder): - """ used to convert an Activity object into json """ + """used to convert an Activity object into json""" def default(self, o): return o.__dict__ @@ -22,7 +22,7 @@ class ActivityEncoder(JSONEncoder): @dataclass class Link: - """ for tagging a book in a status """ + """for tagging a book in a status""" href: str name: str @@ -31,14 +31,14 @@ class Link: @dataclass class Mention(Link): - """ a subtype of Link for mentioning an actor """ + """a subtype of Link for mentioning an actor""" type: str = "Mention" @dataclass class Signature: - """ public key block """ + """public key block""" creator: str created: str @@ -47,7 +47,7 @@ class Signature: def naive_parse(activity_objects, activity_json, serializer=None): - """ this navigates circular import issues """ + """this navigates circular import issues""" if not serializer: if activity_json.get("publicKeyPem"): # ugh @@ -67,7 +67,7 @@ def naive_parse(activity_objects, activity_json, serializer=None): @dataclass(init=False) class ActivityObject: - """ actor activitypub json """ + """actor activitypub json""" id: str type: str @@ -106,7 +106,7 @@ class ActivityObject: setattr(self, field.name, value) def to_model(self, model=None, instance=None, allow_create=True, save=True): - """ convert from an activity to a model instance """ + """convert from an activity to a model instance""" model = model or get_model_from_type(self.type) # only reject statuses if we're potentially creating them @@ -181,7 +181,7 @@ class ActivityObject: return instance def serialize(self): - """ convert to dictionary with context attr """ + """convert to dictionary with context attr""" data = self.__dict__.copy() # recursively serialize for (k, v) in data.items(): @@ -200,7 +200,7 @@ class ActivityObject: def set_related_field( model_name, origin_model_name, related_field_name, related_remote_id, data ): - """ load reverse related fields (editions, attachments) without blocking """ + """load reverse related fields (editions, attachments) without blocking""" model = apps.get_model("bookwyrm.%s" % model_name, require_ready=True) origin_model = apps.get_model("bookwyrm.%s" % origin_model_name, require_ready=True) @@ -236,7 +236,7 @@ def set_related_field( def get_model_from_type(activity_type): - """ given the activity, what type of model """ + """given the activity, what type of model""" models = apps.get_models() model = [ m @@ -255,7 +255,7 @@ def get_model_from_type(activity_type): def resolve_remote_id( remote_id, model=None, refresh=False, save=True, get_activity=False ): - """ take a remote_id and return an instance, creating if necessary """ + """take a remote_id and return an instance, creating if necessary""" if model: # a bonus check we can do if we already know the model result = model.find_existing_by_remote_id(remote_id) if result and not refresh: diff --git a/bookwyrm/activitypub/book.py b/bookwyrm/activitypub/book.py index c5b896e3..f6ebf913 100644 --- a/bookwyrm/activitypub/book.py +++ b/bookwyrm/activitypub/book.py @@ -8,7 +8,7 @@ from .image import Document @dataclass(init=False) class Book(ActivityObject): - """ serializes an edition or work, abstract """ + """serializes an edition or work, abstract""" title: str lastEditedBy: str = None @@ -35,7 +35,7 @@ class Book(ActivityObject): @dataclass(init=False) class Edition(Book): - """ Edition instance of a book object """ + """Edition instance of a book object""" work: str isbn10: str = "" @@ -52,7 +52,7 @@ class Edition(Book): @dataclass(init=False) class Work(Book): - """ work instance of a book object """ + """work instance of a book object""" lccn: str = "" defaultEdition: str = "" @@ -62,7 +62,7 @@ class Work(Book): @dataclass(init=False) class Author(ActivityObject): - """ author of a book """ + """author of a book""" name: str lastEditedBy: str = None diff --git a/bookwyrm/activitypub/image.py b/bookwyrm/activitypub/image.py index a7120ce4..7950faaf 100644 --- a/bookwyrm/activitypub/image.py +++ b/bookwyrm/activitypub/image.py @@ -5,7 +5,7 @@ from .base_activity import ActivityObject @dataclass(init=False) class Document(ActivityObject): - """ a document """ + """a document""" url: str name: str = "" @@ -15,6 +15,6 @@ class Document(ActivityObject): @dataclass(init=False) class Image(Document): - """ an image """ + """an image""" type: str = "Image" diff --git a/bookwyrm/activitypub/note.py b/bookwyrm/activitypub/note.py index e1a42958..b501c3d6 100644 --- a/bookwyrm/activitypub/note.py +++ b/bookwyrm/activitypub/note.py @@ -9,19 +9,19 @@ from .image import Document @dataclass(init=False) class Tombstone(ActivityObject): - """ the placeholder for a deleted status """ + """the placeholder for a deleted status""" type: str = "Tombstone" def to_model(self, *args, **kwargs): # pylint: disable=unused-argument - """ this should never really get serialized, just searched for """ + """this should never really get serialized, just searched for""" model = apps.get_model("bookwyrm.Status") return model.find_existing_by_remote_id(self.id) @dataclass(init=False) class Note(ActivityObject): - """ Note activity """ + """Note activity""" published: str attributedTo: str @@ -39,7 +39,7 @@ class Note(ActivityObject): @dataclass(init=False) class Article(Note): - """ what's an article except a note with more fields """ + """what's an article except a note with more fields""" name: str type: str = "Article" @@ -47,14 +47,14 @@ class Article(Note): @dataclass(init=False) class GeneratedNote(Note): - """ just a re-typed note """ + """just a re-typed note""" type: str = "GeneratedNote" @dataclass(init=False) class Comment(Note): - """ like a note but with a book """ + """like a note but with a book""" inReplyToBook: str type: str = "Comment" @@ -62,7 +62,7 @@ class Comment(Note): @dataclass(init=False) class Quotation(Comment): - """ a quote and commentary on a book """ + """a quote and commentary on a book""" quote: str type: str = "Quotation" @@ -70,7 +70,7 @@ class Quotation(Comment): @dataclass(init=False) class Review(Comment): - """ a full book review """ + """a full book review""" name: str = None rating: int = None @@ -79,7 +79,7 @@ class Review(Comment): @dataclass(init=False) class Rating(Comment): - """ just a star rating """ + """just a star rating""" rating: int content: str = None diff --git a/bookwyrm/activitypub/ordered_collection.py b/bookwyrm/activitypub/ordered_collection.py index 650f6a40..e3a83be8 100644 --- a/bookwyrm/activitypub/ordered_collection.py +++ b/bookwyrm/activitypub/ordered_collection.py @@ -7,7 +7,7 @@ from .base_activity import ActivityObject @dataclass(init=False) class OrderedCollection(ActivityObject): - """ structure of an ordered collection activity """ + """structure of an ordered collection activity""" totalItems: int first: str @@ -19,7 +19,7 @@ class OrderedCollection(ActivityObject): @dataclass(init=False) class OrderedCollectionPrivate(OrderedCollection): - """ an ordered collection with privacy settings """ + """an ordered collection with privacy settings""" to: List[str] = field(default_factory=lambda: []) cc: List[str] = field(default_factory=lambda: []) @@ -27,14 +27,14 @@ class OrderedCollectionPrivate(OrderedCollection): @dataclass(init=False) class Shelf(OrderedCollectionPrivate): - """ structure of an ordered collection activity """ + """structure of an ordered collection activity""" type: str = "Shelf" @dataclass(init=False) class BookList(OrderedCollectionPrivate): - """ structure of an ordered collection activity """ + """structure of an ordered collection activity""" summary: str = None curation: str = "closed" @@ -43,7 +43,7 @@ class BookList(OrderedCollectionPrivate): @dataclass(init=False) class OrderedCollectionPage(ActivityObject): - """ structure of an ordered collection activity """ + """structure of an ordered collection activity""" partOf: str orderedItems: List @@ -54,7 +54,7 @@ class OrderedCollectionPage(ActivityObject): @dataclass(init=False) class CollectionItem(ActivityObject): - """ an item in a collection """ + """an item in a collection""" actor: str type: str = "CollectionItem" @@ -62,7 +62,7 @@ class CollectionItem(ActivityObject): @dataclass(init=False) class ListItem(CollectionItem): - """ a book on a list """ + """a book on a list""" book: str notes: str = None @@ -73,7 +73,7 @@ class ListItem(CollectionItem): @dataclass(init=False) class ShelfItem(CollectionItem): - """ a book on a list """ + """a book on a list""" book: str type: str = "ShelfItem" diff --git a/bookwyrm/activitypub/person.py b/bookwyrm/activitypub/person.py index 9231bd95..d5f37946 100644 --- a/bookwyrm/activitypub/person.py +++ b/bookwyrm/activitypub/person.py @@ -8,7 +8,7 @@ from .image import Image @dataclass(init=False) class PublicKey(ActivityObject): - """ public key block """ + """public key block""" owner: str publicKeyPem: str @@ -17,7 +17,7 @@ class PublicKey(ActivityObject): @dataclass(init=False) class Person(ActivityObject): - """ actor activitypub json """ + """actor activitypub json""" preferredUsername: str inbox: str diff --git a/bookwyrm/activitypub/verbs.py b/bookwyrm/activitypub/verbs.py index 090beea5..f26936d7 100644 --- a/bookwyrm/activitypub/verbs.py +++ b/bookwyrm/activitypub/verbs.py @@ -9,13 +9,13 @@ from .ordered_collection import CollectionItem @dataclass(init=False) class Verb(ActivityObject): - """generic fields for activities """ + """generic fields for activities""" actor: str object: ActivityObject def action(self): - """ usually we just want to update and save """ + """usually we just want to update and save""" # self.object may return None if the object is invalid in an expected way # ie, Question type if self.object: @@ -24,7 +24,7 @@ class Verb(ActivityObject): @dataclass(init=False) class Create(Verb): - """ Create activity """ + """Create activity""" to: List[str] cc: List[str] = field(default_factory=lambda: []) @@ -34,14 +34,14 @@ class Create(Verb): @dataclass(init=False) class Delete(Verb): - """ Create activity """ + """Create activity""" to: List[str] cc: List[str] = field(default_factory=lambda: []) type: str = "Delete" def action(self): - """ find and delete the activity object """ + """find and delete the activity object""" if not self.object: return @@ -59,25 +59,25 @@ class Delete(Verb): @dataclass(init=False) class Update(Verb): - """ Update activity """ + """Update activity""" to: List[str] type: str = "Update" def action(self): - """ update a model instance from the dataclass """ + """update a model instance from the dataclass""" if self.object: self.object.to_model(allow_create=False) @dataclass(init=False) class Undo(Verb): - """ Undo an activity """ + """Undo an activity""" type: str = "Undo" def action(self): - """ find and remove the activity object """ + """find and remove the activity object""" if isinstance(self.object, str): # it may be that sometihng should be done with these, but idk what # this seems just to be coming from pleroma @@ -103,64 +103,64 @@ class Undo(Verb): @dataclass(init=False) class Follow(Verb): - """ Follow activity """ + """Follow activity""" object: str type: str = "Follow" def action(self): - """ relationship save """ + """relationship save""" self.to_model() @dataclass(init=False) class Block(Verb): - """ Block activity """ + """Block activity""" object: str type: str = "Block" def action(self): - """ relationship save """ + """relationship save""" self.to_model() @dataclass(init=False) class Accept(Verb): - """ Accept activity """ + """Accept activity""" object: Follow type: str = "Accept" def action(self): - """ find and remove the activity object """ + """find and remove the activity object""" obj = self.object.to_model(save=False, allow_create=False) obj.accept() @dataclass(init=False) class Reject(Verb): - """ Reject activity """ + """Reject activity""" object: Follow type: str = "Reject" def action(self): - """ find and remove the activity object """ + """find and remove the activity object""" obj = self.object.to_model(save=False, allow_create=False) obj.reject() @dataclass(init=False) class Add(Verb): - """Add activity """ + """Add activity""" target: ActivityObject object: CollectionItem type: str = "Add" def action(self): - """ figure out the target to assign the item to a collection """ + """figure out the target to assign the item to a collection""" target = resolve_remote_id(self.target) item = self.object.to_model(save=False) setattr(item, item.collection_field, target) @@ -169,12 +169,12 @@ class Add(Verb): @dataclass(init=False) class Remove(Add): - """Remove activity """ + """Remove activity""" type: str = "Remove" def action(self): - """ find and remove the activity object """ + """find and remove the activity object""" obj = self.object.to_model(save=False, allow_create=False) if obj: obj.delete() @@ -182,19 +182,19 @@ class Remove(Add): @dataclass(init=False) class Like(Verb): - """ a user faving an object """ + """a user faving an object""" object: str type: str = "Like" def action(self): - """ like """ + """like""" self.to_model() @dataclass(init=False) class Announce(Verb): - """ boosting a status """ + """boosting a status""" published: str to: List[str] = field(default_factory=lambda: []) @@ -203,5 +203,5 @@ class Announce(Verb): type: str = "Announce" def action(self): - """ boost """ + """boost""" self.to_model() diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 949ae9da..86321cd8 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -8,22 +8,22 @@ from bookwyrm.views.helpers import privacy_filter class ActivityStream(RedisStore): - """ a category of activity stream (like home, local, federated) """ + """a category of activity stream (like home, local, federated)""" def stream_id(self, user): - """ the redis key for this user's instance of this stream """ + """the redis key for this user's instance of this stream""" return "{}-{}".format(user.id, self.key) def unread_id(self, user): - """ the redis key for this user's unread count for this stream """ + """the redis key for this user's unread count for this stream""" return "{}-unread".format(self.stream_id(user)) def get_rank(self, obj): # pylint: disable=no-self-use - """ statuses are sorted by date published """ + """statuses are sorted by date published""" return obj.published_date.timestamp() def add_status(self, status): - """ add a status to users' feeds """ + """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) @@ -35,19 +35,19 @@ class ActivityStream(RedisStore): pipeline.execute() def add_user_statuses(self, viewer, user): - """ add a user's statuses to another user's feed """ + """add a user's statuses to another user's feed""" # only add the statuses that the viewer should be able to see (ie, not dms) statuses = privacy_filter(viewer, user.status_set.all()) self.bulk_add_objects_to_store(statuses, self.stream_id(viewer)) def remove_user_statuses(self, viewer, user): - """ remove a user's status from another user's feed """ + """remove a user's status from another user's feed""" # remove all so that followers only statuses are removed statuses = user.status_set.all() self.bulk_remove_objects_from_store(statuses, self.stream_id(viewer)) def get_activity_stream(self, user): - """ load the statuses to be displayed """ + """load the statuses to be displayed""" # clear unreads for this feed r.set(self.unread_id(user), 0) @@ -59,15 +59,15 @@ class ActivityStream(RedisStore): ) def get_unread_count(self, user): - """ get the unread status count for this user's feed """ + """get the unread status count for this user's feed""" return int(r.get(self.unread_id(user)) or 0) def populate_streams(self, user): - """ go from zero to a timeline """ + """go from zero to a timeline""" self.populate_store(self.stream_id(user)) 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""" # direct messages don't appeard in feeds, direct comments/reviews/etc do if status.privacy == "direct" and status.status_type == "Note": return [] @@ -98,7 +98,7 @@ class ActivityStream(RedisStore): return [self.stream_id(u) for u 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 """ + """given a user, what statuses should they see on this stream""" return privacy_filter( user, models.Status.objects.select_subclasses(), @@ -111,7 +111,7 @@ class ActivityStream(RedisStore): class HomeStream(ActivityStream): - """ users you follow """ + """users you follow""" key = "home" @@ -134,7 +134,7 @@ class HomeStream(ActivityStream): class LocalStream(ActivityStream): - """ users you follow """ + """users you follow""" key = "local" @@ -154,7 +154,7 @@ class LocalStream(ActivityStream): class FederatedStream(ActivityStream): - """ users you follow """ + """users you follow""" key = "federated" @@ -182,7 +182,7 @@ streams = { @receiver(signals.post_save) # pylint: disable=unused-argument def add_status_on_create(sender, instance, created, *args, **kwargs): - """ add newly created statuses to activity feeds """ + """add newly created statuses to activity feeds""" # we're only interested in new statuses if not issubclass(sender, models.Status): return @@ -203,7 +203,7 @@ def add_status_on_create(sender, instance, created, *args, **kwargs): @receiver(signals.post_delete, sender=models.Boost) # pylint: disable=unused-argument def remove_boost_on_delete(sender, instance, *args, **kwargs): - """ boosts are deleted """ + """boosts are deleted""" # we're only interested in new statuses for stream in streams.values(): stream.remove_object_from_related_stores(instance) @@ -212,7 +212,7 @@ def remove_boost_on_delete(sender, instance, *args, **kwargs): @receiver(signals.post_save, sender=models.UserFollows) # pylint: disable=unused-argument def add_statuses_on_follow(sender, instance, created, *args, **kwargs): - """ add a newly followed user's statuses to feeds """ + """add a newly followed user's statuses to feeds""" if not created or not instance.user_subject.local: return HomeStream().add_user_statuses(instance.user_subject, instance.user_object) @@ -221,7 +221,7 @@ def add_statuses_on_follow(sender, instance, created, *args, **kwargs): @receiver(signals.post_delete, sender=models.UserFollows) # pylint: disable=unused-argument def remove_statuses_on_unfollow(sender, instance, *args, **kwargs): - """ remove statuses from a feed on unfollow """ + """remove statuses from a feed on unfollow""" if not instance.user_subject.local: return HomeStream().remove_user_statuses(instance.user_subject, instance.user_object) @@ -230,7 +230,7 @@ def remove_statuses_on_unfollow(sender, instance, *args, **kwargs): @receiver(signals.post_save, sender=models.UserBlocks) # pylint: disable=unused-argument def remove_statuses_on_block(sender, instance, *args, **kwargs): - """ remove statuses from all feeds on block """ + """remove statuses from all feeds on block""" # blocks apply ot all feeds if instance.user_subject.local: for stream in streams.values(): @@ -245,7 +245,7 @@ def remove_statuses_on_block(sender, instance, *args, **kwargs): @receiver(signals.post_delete, sender=models.UserBlocks) # pylint: disable=unused-argument def add_statuses_on_unblock(sender, instance, *args, **kwargs): - """ remove statuses from all feeds on block """ + """remove statuses from all feeds on block""" public_streams = [LocalStream(), FederatedStream()] # add statuses back to streams with statuses from anyone if instance.user_subject.local: @@ -261,7 +261,7 @@ def add_statuses_on_unblock(sender, instance, *args, **kwargs): @receiver(signals.post_save, sender=models.User) # pylint: disable=unused-argument def populate_streams_on_account_create(sender, instance, created, *args, **kwargs): - """ build a user's feeds when they join """ + """build a user's feeds when they join""" if not created or not instance.local: return diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 2fe5d825..264b5a38 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -16,7 +16,7 @@ logger = logging.getLogger(__name__) class AbstractMinimalConnector(ABC): - """ just the bare bones, for other bookwyrm instances """ + """just the bare bones, for other bookwyrm instances""" def __init__(self, identifier): # load connector settings @@ -39,7 +39,7 @@ class AbstractMinimalConnector(ABC): setattr(self, field, getattr(info, field)) def search(self, query, min_confidence=None): - """ free text search """ + """free text search""" params = {} if min_confidence: params["min_confidence"] = min_confidence @@ -55,7 +55,7 @@ class AbstractMinimalConnector(ABC): return results def isbn_search(self, query): - """ isbn search """ + """isbn search""" params = {} data = get_data( "%s%s" % (self.isbn_search_url, query), @@ -70,27 +70,27 @@ class AbstractMinimalConnector(ABC): @abstractmethod def get_or_create_book(self, remote_id): - """ pull up a book record by whatever means possible """ + """pull up a book record by whatever means possible""" @abstractmethod def parse_search_data(self, data): - """ turn the result json from a search into a list """ + """turn the result json from a search into a list""" @abstractmethod def format_search_result(self, search_result): - """ create a SearchResult obj from json """ + """create a SearchResult obj from json""" @abstractmethod def parse_isbn_search_data(self, data): - """ turn the result json from a search into a list """ + """turn the result json from a search into a list""" @abstractmethod def format_isbn_search_result(self, search_result): - """ create a SearchResult obj from json """ + """create a SearchResult obj from json""" class AbstractConnector(AbstractMinimalConnector): - """ generic book data connector """ + """generic book data connector""" def __init__(self, identifier): super().__init__(identifier) @@ -99,14 +99,14 @@ class AbstractConnector(AbstractMinimalConnector): self.book_mappings = [] def is_available(self): - """ check if you're allowed to use this connector """ + """check if you're allowed to use this connector""" if self.max_query_count is not None: if self.connector.query_count >= self.max_query_count: return False return True def get_or_create_book(self, remote_id): - """ translate arbitrary json into an Activitypub dataclass """ + """translate arbitrary json into an Activitypub dataclass""" # first, check if we have the origin_id saved existing = models.Edition.find_existing_by_remote_id( remote_id @@ -151,7 +151,7 @@ class AbstractConnector(AbstractMinimalConnector): return edition def create_edition_from_data(self, work, edition_data): - """ if we already have the work, we're ready """ + """if we already have the work, we're ready""" mapped_data = dict_from_mappings(edition_data, self.book_mappings) mapped_data["work"] = work.remote_id edition_activity = activitypub.Edition(**mapped_data) @@ -171,7 +171,7 @@ class AbstractConnector(AbstractMinimalConnector): return edition def get_or_create_author(self, remote_id): - """ load that author """ + """load that author""" existing = models.Author.find_existing_by_remote_id(remote_id) if existing: return existing @@ -189,23 +189,23 @@ class AbstractConnector(AbstractMinimalConnector): @abstractmethod def is_work_data(self, data): - """ differentiate works and editions """ + """differentiate works and editions""" @abstractmethod def get_edition_from_work_data(self, data): - """ every work needs at least one edition """ + """every work needs at least one edition""" @abstractmethod def get_work_from_edition_data(self, data): - """ every edition needs a work """ + """every edition needs a work""" @abstractmethod def get_authors_from_data(self, data): - """ load author data """ + """load author data""" @abstractmethod def expand_book_data(self, book): - """ get more info on a book """ + """get more info on a book""" def dict_from_mappings(data, mappings): @@ -218,7 +218,7 @@ def dict_from_mappings(data, mappings): def get_data(url, params=None): - """ wrapper for request.get """ + """wrapper for request.get""" # check if the url is blocked if models.FederatedServer.is_blocked(url): raise ConnectorException( @@ -250,7 +250,7 @@ def get_data(url, params=None): def get_image(url): - """ wrapper for requesting an image """ + """wrapper for requesting an image""" try: resp = requests.get( url, @@ -268,7 +268,7 @@ def get_image(url): @dataclass class SearchResult: - """ standardized search result object """ + """standardized search result object""" title: str key: str @@ -284,14 +284,14 @@ class SearchResult: ) def json(self): - """ serialize a connector for json response """ + """serialize a connector for json response""" serialized = asdict(self) del serialized["connector"] return serialized class Mapping: - """ associate a local database field with a field in an external dataset """ + """associate a local database field with a field in an external dataset""" def __init__(self, local_field, remote_field=None, formatter=None): noop = lambda x: x @@ -301,7 +301,7 @@ class Mapping: self.formatter = formatter or noop def get_value(self, data): - """ pull a field from incoming json and return the formatted version """ + """pull a field from incoming json and return the formatted version""" value = data.get(self.remote_field) if not value: return None diff --git a/bookwyrm/connectors/bookwyrm_connector.py b/bookwyrm/connectors/bookwyrm_connector.py index f7869d55..640a0bca 100644 --- a/bookwyrm/connectors/bookwyrm_connector.py +++ b/bookwyrm/connectors/bookwyrm_connector.py @@ -4,7 +4,7 @@ from .abstract_connector import AbstractMinimalConnector, SearchResult class Connector(AbstractMinimalConnector): - """ this is basically just for search """ + """this is basically just for search""" def get_or_create_book(self, remote_id): edition = activitypub.resolve_remote_id(remote_id, model=models.Edition) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 53198c0a..20d273e0 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -16,11 +16,11 @@ logger = logging.getLogger(__name__) class ConnectorException(HTTPError): - """ when the connector can't do what was asked """ + """when the connector can't do what was asked""" def search(query, min_confidence=0.1): - """ find books based on arbitary keywords """ + """find books based on arbitary keywords""" if not query: return [] results = [] @@ -68,19 +68,19 @@ def search(query, min_confidence=0.1): def local_search(query, min_confidence=0.1, raw=False): - """ only look at local search results """ + """only look at local search results""" connector = load_connector(models.Connector.objects.get(local=True)) return connector.search(query, min_confidence=min_confidence, raw=raw) def isbn_local_search(query, raw=False): - """ only look at local search results """ + """only look at local search results""" connector = load_connector(models.Connector.objects.get(local=True)) return connector.isbn_search(query, raw=raw) def first_search_result(query, min_confidence=0.1): - """ search until you find a result that fits """ + """search until you find a result that fits""" for connector in get_connectors(): result = connector.search(query, min_confidence=min_confidence) if result: @@ -89,13 +89,13 @@ def first_search_result(query, min_confidence=0.1): def get_connectors(): - """ load all connectors """ + """load all connectors""" for info in models.Connector.objects.order_by("priority").all(): yield load_connector(info) def get_or_create_connector(remote_id): - """ get the connector related to the object's server """ + """get the connector related to the object's server""" url = urlparse(remote_id) identifier = url.netloc if not identifier: @@ -119,7 +119,7 @@ def get_or_create_connector(remote_id): @app.task def load_more_data(connector_id, book_id): - """ background the work of getting all 10,000 editions of LoTR """ + """background the work of getting all 10,000 editions of LoTR""" connector_info = models.Connector.objects.get(id=connector_id) connector = load_connector(connector_info) book = models.Book.objects.select_subclasses().get(id=book_id) @@ -127,7 +127,7 @@ def load_more_data(connector_id, book_id): def load_connector(connector_info): - """ instantiate the connector class """ + """instantiate the connector class""" connector = importlib.import_module( "bookwyrm.connectors.%s" % connector_info.connector_file ) @@ -137,6 +137,6 @@ def load_connector(connector_info): @receiver(signals.post_save, sender="bookwyrm.FederatedServer") # pylint: disable=unused-argument def create_connector(sender, instance, created, *args, **kwargs): - """ create a connector to an external bookwyrm server """ + """create a connector to an external bookwyrm server""" if instance.application_type == "bookwyrm": get_or_create_connector("https://{:s}".format(instance.server_name)) diff --git a/bookwyrm/connectors/openlibrary.py b/bookwyrm/connectors/openlibrary.py index 8ee738eb..a7c30b66 100644 --- a/bookwyrm/connectors/openlibrary.py +++ b/bookwyrm/connectors/openlibrary.py @@ -9,7 +9,7 @@ from .openlibrary_languages import languages class Connector(AbstractConnector): - """ instantiate a connector for OL """ + """instantiate a connector for OL""" def __init__(self, identifier): super().__init__(identifier) @@ -59,7 +59,7 @@ class Connector(AbstractConnector): ] def get_remote_id_from_data(self, data): - """ format a url from an openlibrary id field """ + """format a url from an openlibrary id field""" try: key = data["key"] except KeyError: @@ -87,7 +87,7 @@ class Connector(AbstractConnector): return get_data(url) def get_authors_from_data(self, data): - """ parse author json and load or create authors """ + """parse author json and load or create authors""" for author_blob in data.get("authors", []): author_blob = author_blob.get("author", author_blob) # this id is "/authors/OL1234567A" @@ -99,7 +99,7 @@ class Connector(AbstractConnector): yield author def get_cover_url(self, cover_blob, size="L"): - """ ask openlibrary for the cover """ + """ask openlibrary for the cover""" if not cover_blob: return None cover_id = cover_blob[0] @@ -141,7 +141,7 @@ class Connector(AbstractConnector): ) def load_edition_data(self, olkey): - """ query openlibrary for editions of a work """ + """query openlibrary for editions of a work""" url = "%s/works/%s/editions" % (self.books_url, olkey) return get_data(url) @@ -166,7 +166,7 @@ class Connector(AbstractConnector): def ignore_edition(edition_data): - """ don't load a million editions that have no metadata """ + """don't load a million editions that have no metadata""" # an isbn, we love to see it if edition_data.get("isbn_13") or edition_data.get("isbn_10"): return False @@ -185,19 +185,19 @@ def ignore_edition(edition_data): def get_description(description_blob): - """ descriptions can be a string or a dict """ + """descriptions can be a string or a dict""" if isinstance(description_blob, dict): return description_blob.get("value") return description_blob def get_openlibrary_key(key): - """ convert /books/OL27320736M into OL27320736M """ + """convert /books/OL27320736M into OL27320736M""" return key.split("/")[-1] def get_languages(language_blob): - """ /language/eng -> English """ + """/language/eng -> English""" langs = [] for lang in language_blob: langs.append(languages.get(lang.get("key", ""), None)) @@ -205,7 +205,7 @@ def get_languages(language_blob): def pick_default_edition(options): - """ favor physical copies with covers in english """ + """favor physical copies with covers in english""" if not options: return None if len(options) == 1: diff --git a/bookwyrm/connectors/self_connector.py b/bookwyrm/connectors/self_connector.py index 500ffd74..22835941 100644 --- a/bookwyrm/connectors/self_connector.py +++ b/bookwyrm/connectors/self_connector.py @@ -10,11 +10,11 @@ from .abstract_connector import AbstractConnector, SearchResult class Connector(AbstractConnector): - """ instantiate a connector """ + """instantiate a connector""" # pylint: disable=arguments-differ def search(self, query, min_confidence=0.1, raw=False): - """ search your local database """ + """search your local database""" if not query: return [] # first, try searching unqiue identifiers @@ -35,7 +35,7 @@ class Connector(AbstractConnector): return search_results def isbn_search(self, query, raw=False): - """ search your local database """ + """search your local database""" if not query: return [] @@ -87,11 +87,11 @@ class Connector(AbstractConnector): return None def parse_isbn_search_data(self, data): - """ it's already in the right format, don't even worry about it """ + """it's already in the right format, don't even worry about it""" return data def parse_search_data(self, data): - """ it's already in the right format, don't even worry about it """ + """it's already in the right format, don't even worry about it""" return data def expand_book_data(self, book): @@ -99,7 +99,7 @@ class Connector(AbstractConnector): def search_identifiers(query): - """ tries remote_id, isbn; defined as dedupe fields on the model """ + """tries remote_id, isbn; defined as dedupe fields on the model""" filters = [ {f.name: query} for f in models.Edition._meta.get_fields() @@ -115,7 +115,7 @@ def search_identifiers(query): def search_title_author(query, min_confidence): - """ searches for title and author """ + """searches for title and author""" vector = ( SearchVector("title", weight="A") + SearchVector("subtitle", weight="B") diff --git a/bookwyrm/context_processors.py b/bookwyrm/context_processors.py index 8f79a652..f5f25186 100644 --- a/bookwyrm/context_processors.py +++ b/bookwyrm/context_processors.py @@ -3,5 +3,5 @@ from bookwyrm import models def site_settings(request): # pylint: disable=unused-argument - """ include the custom info about the site """ + """include the custom info about the site""" return {"site": models.SiteSettings.objects.get()} diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py index 1804254b..657310b0 100644 --- a/bookwyrm/emailing.py +++ b/bookwyrm/emailing.py @@ -8,7 +8,7 @@ from bookwyrm.settings import DOMAIN def email_data(): - """ fields every email needs """ + """fields every email needs""" site = models.SiteSettings.objects.get() if site.logo_small: logo_path = "/images/{}".format(site.logo_small.url) @@ -24,14 +24,14 @@ def email_data(): def invite_email(invite_request): - """ send out an invite code """ + """send out an invite code""" data = email_data() data["invite_link"] = invite_request.invite.link send_email.delay(invite_request.email, *format_email("invite", data)) def password_reset_email(reset_code): - """ generate a password reset email """ + """generate a password reset email""" data = email_data() data["reset_link"] = reset_code.link data["user"] = reset_code.user.display_name @@ -39,7 +39,7 @@ def password_reset_email(reset_code): def format_email(email_name, data): - """ render the email templates """ + """render the email templates""" subject = ( get_template("email/{}/subject.html".format(email_name)).render(data).strip() ) @@ -58,7 +58,7 @@ def format_email(email_name, data): @app.task def send_email(recipient, subject, html_content, text_content): - """ use a task to send the email """ + """use a task to send the email""" email = EmailMultiAlternatives( subject, text_content, settings.DEFAULT_FROM_EMAIL, [recipient] ) diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py index df68334e..b6197f33 100644 --- a/bookwyrm/forms.py +++ b/bookwyrm/forms.py @@ -12,7 +12,7 @@ from bookwyrm import models class CustomForm(ModelForm): - """ add css classes to the forms """ + """add css classes to the forms""" def __init__(self, *args, **kwargs): css_classes = defaultdict(lambda: "") @@ -198,7 +198,7 @@ class ImportForm(forms.Form): class ExpiryWidget(widgets.Select): def value_from_datadict(self, data, files, name): - """ human-readable exiration time buckets """ + """human-readable exiration time buckets""" selected_string = super().value_from_datadict(data, files, name) if selected_string == "day": @@ -217,7 +217,7 @@ class ExpiryWidget(widgets.Select): class InviteRequestForm(CustomForm): def clean(self): - """ make sure the email isn't in use by a registered user """ + """make sure the email isn't in use by a registered user""" cleaned_data = super().clean() email = cleaned_data.get("email") if email and models.User.objects.filter(email=email).exists(): diff --git a/bookwyrm/importers/goodreads_import.py b/bookwyrm/importers/goodreads_import.py index 0b126c14..7b577ea8 100644 --- a/bookwyrm/importers/goodreads_import.py +++ b/bookwyrm/importers/goodreads_import.py @@ -9,7 +9,7 @@ class GoodreadsImporter(Importer): service = "GoodReads" def parse_fields(self, entry): - """ handle the specific fields in goodreads csvs """ + """handle the specific fields in goodreads csvs""" entry.update({"import_source": self.service}) # add missing 'Date Started' field entry.update({"Date Started": None}) diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index ddbfa304..c1e41897 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -10,7 +10,7 @@ logger = logging.getLogger(__name__) class Importer: - """ Generic class for csv data import from an outside service """ + """Generic class for csv data import from an outside service""" service = "Unknown" delimiter = "," @@ -18,7 +18,7 @@ class Importer: mandatory_fields = ["Title", "Author"] def create_job(self, user, csv_file, include_reviews, privacy): - """ check over a csv and creates a database entry for the job""" + """check over a csv and creates a database entry for the job""" job = ImportJob.objects.create( user=user, include_reviews=include_reviews, privacy=privacy ) @@ -32,16 +32,16 @@ class Importer: return job def save_item(self, job, index, data): # pylint: disable=no-self-use - """ creates and saves an import item """ + """creates and saves an import item""" ImportItem(job=job, index=index, data=data).save() def parse_fields(self, entry): - """ updates csv data with additional info """ + """updates csv data with additional info""" entry.update({"import_source": self.service}) return entry def create_retry_job(self, user, original_job, items): - """ retry items that didn't import """ + """retry items that didn't import""" job = ImportJob.objects.create( user=user, include_reviews=original_job.include_reviews, @@ -53,7 +53,7 @@ class Importer: return job def start_import(self, job): - """ initalizes a csv import job """ + """initalizes a csv import job""" result = import_data.delay(self.service, job.id) job.task_id = result.id job.save() @@ -61,7 +61,7 @@ class Importer: @app.task def import_data(source, job_id): - """ does the actual lookup work in a celery task """ + """does the actual lookup work in a celery task""" job = ImportJob.objects.get(id=job_id) try: for item in job.items.all(): @@ -89,7 +89,7 @@ def import_data(source, job_id): def handle_imported_book(source, user, item, include_reviews, privacy): - """ process a csv and then post about it """ + """process a csv and then post about it""" if isinstance(item.book, models.Work): item.book = item.book.default_edition if not item.book: diff --git a/bookwyrm/importers/librarything_import.py b/bookwyrm/importers/librarything_import.py index 3755cb1a..b3175a82 100644 --- a/bookwyrm/importers/librarything_import.py +++ b/bookwyrm/importers/librarything_import.py @@ -6,7 +6,7 @@ from . import Importer class LibrarythingImporter(Importer): - """ csv downloads from librarything """ + """csv downloads from librarything""" service = "LibraryThing" delimiter = "\t" @@ -15,7 +15,7 @@ class LibrarythingImporter(Importer): mandatory_fields = ["Title", "Primary Author"] def parse_fields(self, entry): - """ custom parsing for librarything """ + """custom parsing for librarything""" data = {} data["import_source"] = self.service data["Book Id"] = entry["Book Id"] diff --git a/bookwyrm/management/commands/deduplicate_book_data.py b/bookwyrm/management/commands/deduplicate_book_data.py index edd91a71..ed01a784 100644 --- a/bookwyrm/management/commands/deduplicate_book_data.py +++ b/bookwyrm/management/commands/deduplicate_book_data.py @@ -6,7 +6,7 @@ from bookwyrm import models def update_related(canonical, obj): - """ update all the models with fk to the object being removed """ + """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 @@ -24,7 +24,7 @@ def update_related(canonical, obj): def copy_data(canonical, obj): - """ try to get the most data possible """ + """try to get the most data possible""" for data_field in obj._meta.get_fields(): if not hasattr(data_field, "activitypub_field"): continue @@ -38,7 +38,7 @@ def copy_data(canonical, obj): def dedupe_model(model): - """ combine duplicate editions and update related models """ + """combine duplicate editions and update related models""" fields = model._meta.get_fields() dedupe_fields = [ f for f in fields if hasattr(f, "deduplication_field") and f.deduplication_field @@ -68,12 +68,12 @@ def dedupe_model(model): class Command(BaseCommand): - """ dedplucate allllll the book data models """ + """dedplucate allllll the book data models""" help = "merges duplicate book data" # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): - """ run deudplications """ + """run deudplications""" dedupe_model(models.Edition) dedupe_model(models.Work) dedupe_model(models.Author) diff --git a/bookwyrm/management/commands/erase_streams.py b/bookwyrm/management/commands/erase_streams.py index 042e857f..1d34b1bb 100644 --- a/bookwyrm/management/commands/erase_streams.py +++ b/bookwyrm/management/commands/erase_streams.py @@ -10,15 +10,15 @@ r = redis.Redis( def erase_streams(): - """ throw the whole redis away """ + """throw the whole redis away""" r.flushall() class Command(BaseCommand): - """ delete activity streams for all users """ + """delete activity streams for all users""" help = "Delete all the user streams" # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): - """ flush all, baby """ + """flush all, baby""" erase_streams() diff --git a/bookwyrm/management/commands/initdb.py b/bookwyrm/management/commands/initdb.py index a86a1652..0c0cc61f 100644 --- a/bookwyrm/management/commands/initdb.py +++ b/bookwyrm/management/commands/initdb.py @@ -108,7 +108,7 @@ def init_connectors(): def init_federated_servers(): - """ big no to nazis """ + """big no to nazis""" built_in_blocks = ["gab.ai", "gab.com"] for server in built_in_blocks: FederatedServer.objects.create( diff --git a/bookwyrm/management/commands/populate_streams.py b/bookwyrm/management/commands/populate_streams.py index 4cd2036a..04f6bf6e 100644 --- a/bookwyrm/management/commands/populate_streams.py +++ b/bookwyrm/management/commands/populate_streams.py @@ -10,7 +10,7 @@ r = redis.Redis( def populate_streams(): - """ build all the streams for all the users """ + """build all the streams for all the users""" users = models.User.objects.filter( local=True, is_active=True, @@ -21,10 +21,10 @@ def populate_streams(): class Command(BaseCommand): - """ start all over with user streams """ + """start all over with user streams""" help = "Populate streams for all users" # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): - """ run feed builder """ + """run feed builder""" populate_streams() diff --git a/bookwyrm/management/commands/remove_editions.py b/bookwyrm/management/commands/remove_editions.py index 6829c6d1..9eb9b7da 100644 --- a/bookwyrm/management/commands/remove_editions.py +++ b/bookwyrm/management/commands/remove_editions.py @@ -5,7 +5,7 @@ from bookwyrm import models def remove_editions(): - """ combine duplicate editions and update related models """ + """combine duplicate editions and update related models""" # not in use filters = { "%s__isnull" % r.name: True for r in models.Edition._meta.related_objects @@ -33,10 +33,10 @@ def remove_editions(): class Command(BaseCommand): - """ dedplucate allllll the book data models """ + """dedplucate allllll the book data models""" help = "merges duplicate book data" # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): - """ run deudplications """ + """run deudplications""" remove_editions() diff --git a/bookwyrm/migrations/0046_reviewrating.py b/bookwyrm/migrations/0046_reviewrating.py index 8d149004..26f6f36a 100644 --- a/bookwyrm/migrations/0046_reviewrating.py +++ b/bookwyrm/migrations/0046_reviewrating.py @@ -8,7 +8,7 @@ from psycopg2.extras import execute_values def convert_review_rating(app_registry, schema_editor): - """ take rating type Reviews and convert them to ReviewRatings """ + """take rating type Reviews and convert them to ReviewRatings""" db_alias = schema_editor.connection.alias reviews = ( @@ -29,7 +29,7 @@ VALUES %s""", def unconvert_review_rating(app_registry, schema_editor): - """ undo the conversion from ratings back to reviews""" + """undo the conversion from ratings back to reviews""" # All we need to do to revert this is drop the table, which Django will do # on its own, as long as we have a valid reverse function. So, this is a # no-op function so Django will do its thing diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 02cfafc0..83b4c0ab 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -31,18 +31,18 @@ PropertyField = namedtuple("PropertyField", ("set_activity_from_field")) def set_activity_from_property_field(activity, obj, field): - """ assign a model property value to the activity json """ + """assign a model property value to the activity json""" activity[field[1]] = getattr(obj, field[0]) class ActivitypubMixin: - """ add this mixin for models that are AP serializable """ + """add this mixin for models that are AP serializable""" activity_serializer = lambda: {} reverse_unfurl = False def __init__(self, *args, **kwargs): - """ collect some info on model fields """ + """collect some info on model fields""" self.image_fields = [] self.many_to_many_fields = [] self.simple_fields = [] # "simple" @@ -85,7 +85,7 @@ class ActivitypubMixin: @classmethod def find_existing_by_remote_id(cls, remote_id): - """ look up a remote id in the db """ + """look up a remote id in the db""" return cls.find_existing({"id": remote_id}) @classmethod @@ -126,7 +126,7 @@ class ActivitypubMixin: return match.first() def broadcast(self, activity, sender, software=None): - """ send out an activity """ + """send out an activity""" broadcast_task.delay( sender.id, json.dumps(activity, cls=activitypub.ActivityEncoder), @@ -134,7 +134,7 @@ class ActivitypubMixin: ) def get_recipients(self, software=None): - """ figure out which inbox urls to post to """ + """figure out which inbox urls to post to""" # first we have to figure out who should receive this activity privacy = self.privacy if hasattr(self, "privacy") else "public" # is this activity owned by a user (statuses, lists, shelves), or is it @@ -182,20 +182,20 @@ class ActivitypubMixin: return list(set(recipients)) def to_activity_dataclass(self): - """ convert from a model to an activity """ + """convert from a model to an activity""" activity = generate_activity(self) return self.activity_serializer(**activity) def to_activity(self, **kwargs): # pylint: disable=unused-argument - """ convert from a model to a json activity """ + """convert from a model to a json activity""" return self.to_activity_dataclass().serialize() class ObjectMixin(ActivitypubMixin): - """ add this mixin for object models that are AP serializable """ + """add this mixin for object models that are AP serializable""" def save(self, *args, created=None, **kwargs): - """ broadcast created/updated/deleted objects as appropriate """ + """broadcast created/updated/deleted objects as appropriate""" broadcast = kwargs.get("broadcast", True) # this bonus kwarg would cause an error in the base save method if "broadcast" in kwargs: @@ -254,7 +254,7 @@ class ObjectMixin(ActivitypubMixin): self.broadcast(activity, user) def to_create_activity(self, user, **kwargs): - """ returns the object wrapped in a Create activity """ + """returns the object wrapped in a Create activity""" activity_object = self.to_activity_dataclass(**kwargs) signature = None @@ -280,7 +280,7 @@ class ObjectMixin(ActivitypubMixin): ).serialize() def to_delete_activity(self, user): - """ notice of deletion """ + """notice of deletion""" return activitypub.Delete( id=self.remote_id + "/activity", actor=user.remote_id, @@ -290,7 +290,7 @@ class ObjectMixin(ActivitypubMixin): ).serialize() def to_update_activity(self, user): - """ wrapper for Updates to an activity """ + """wrapper for Updates to an activity""" activity_id = "%s#update/%s" % (self.remote_id, uuid4()) return activitypub.Update( id=activity_id, @@ -306,13 +306,13 @@ 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 overriden if there's a special remote id, ie outbox""" return self.remote_id def to_ordered_collection( self, queryset, remote_id=None, page=False, collection_only=False, **kwargs ): - """ an ordered collection of whatevers """ + """an ordered collection of whatevers""" if not queryset.ordered: raise RuntimeError("queryset must be ordered") @@ -341,11 +341,11 @@ class OrderedCollectionPageMixin(ObjectMixin): class OrderedCollectionMixin(OrderedCollectionPageMixin): - """ extends activitypub models to work as ordered collections """ + """extends activitypub models to work as ordered collections""" @property def collection_queryset(self): - """ usually an ordered collection model aggregates a different model """ + """usually an ordered collection model aggregates a different model""" raise NotImplementedError("Model must define collection_queryset") activity_serializer = activitypub.OrderedCollection @@ -354,24 +354,24 @@ class OrderedCollectionMixin(OrderedCollectionPageMixin): return self.to_ordered_collection(self.collection_queryset, **kwargs) def to_activity(self, **kwargs): - """ an ordered collection of the specified model queryset """ + """an ordered collection of the specified model queryset""" return self.to_ordered_collection( self.collection_queryset, **kwargs ).serialize() class CollectionItemMixin(ActivitypubMixin): - """ for items that are part of an (Ordered)Collection """ + """for items that are part of an (Ordered)Collection""" activity_serializer = activitypub.CollectionItem def broadcast(self, activity, sender, software="bookwyrm"): - """ only send book collection updates to other bookwyrm instances """ + """only send book collection updates to other bookwyrm instances""" super().broadcast(activity, sender, software=software) @property def privacy(self): - """ inherit the privacy of the list, or direct if pending """ + """inherit the privacy of the list, or direct if pending""" collection_field = getattr(self, self.collection_field) if self.approved: return collection_field.privacy @@ -379,7 +379,7 @@ class CollectionItemMixin(ActivitypubMixin): @property def recipients(self): - """ the owner of the list is a direct recipient """ + """the owner of the list is a direct recipient""" collection_field = getattr(self, self.collection_field) if collection_field.user.local: # don't broadcast to yourself @@ -387,7 +387,7 @@ class CollectionItemMixin(ActivitypubMixin): return [collection_field.user] def save(self, *args, broadcast=True, **kwargs): - """ broadcast updated """ + """broadcast updated""" # first off, we want to save normally no matter what super().save(*args, **kwargs) @@ -400,14 +400,14 @@ class CollectionItemMixin(ActivitypubMixin): self.broadcast(activity, self.user) def delete(self, *args, broadcast=True, **kwargs): - """ broadcast a remove activity """ + """broadcast a remove activity""" activity = self.to_remove_activity(self.user) super().delete(*args, **kwargs) if self.user.local and broadcast: self.broadcast(activity, self.user) def to_add_activity(self, user): - """ AP for shelving a book""" + """AP for shelving a book""" collection_field = getattr(self, self.collection_field) return activitypub.Add( id="{:s}#add".format(collection_field.remote_id), @@ -417,7 +417,7 @@ class CollectionItemMixin(ActivitypubMixin): ).serialize() def to_remove_activity(self, user): - """ AP for un-shelving a book""" + """AP for un-shelving a book""" collection_field = getattr(self, self.collection_field) return activitypub.Remove( id="{:s}#remove".format(collection_field.remote_id), @@ -428,24 +428,24 @@ class CollectionItemMixin(ActivitypubMixin): class ActivityMixin(ActivitypubMixin): - """ add this mixin for models that are AP serializable """ + """add this mixin for models that are AP serializable""" def save(self, *args, broadcast=True, **kwargs): - """ broadcast activity """ + """broadcast activity""" super().save(*args, **kwargs) user = self.user if hasattr(self, "user") else self.user_subject if broadcast and user.local: self.broadcast(self.to_activity(), user) def delete(self, *args, broadcast=True, **kwargs): - """ nevermind, undo that activity """ + """nevermind, undo that activity""" user = self.user if hasattr(self, "user") else self.user_subject if broadcast and user.local: self.broadcast(self.to_undo_activity(), user) super().delete(*args, **kwargs) def to_undo_activity(self): - """ undo an action """ + """undo an action""" user = self.user if hasattr(self, "user") else self.user_subject return activitypub.Undo( id="%s#undo" % self.remote_id, @@ -455,7 +455,7 @@ class ActivityMixin(ActivitypubMixin): def generate_activity(obj): - """ go through the fields on an object """ + """go through the fields on an object""" activity = {} for field in obj.activity_fields: field.set_activity_from_field(activity, obj) @@ -478,7 +478,7 @@ def generate_activity(obj): def unfurl_related_field(related_field, sort_field=None): - """ load reverse lookups (like public key owner or Status attachment """ + """load reverse lookups (like public key owner or Status attachment""" if sort_field and hasattr(related_field, "all"): return [ unfurl_related_field(i) for i in related_field.order_by(sort_field).all() @@ -494,7 +494,7 @@ def unfurl_related_field(related_field, sort_field=None): @app.task def broadcast_task(sender_id, activity, recipients): - """ the celery task for broadcast """ + """the celery task for broadcast""" user_model = apps.get_model("bookwyrm.User", require_ready=True) sender = user_model.objects.get(id=sender_id) for recipient in recipients: @@ -505,7 +505,7 @@ def broadcast_task(sender_id, activity, recipients): def sign_and_send(sender, data, destination): - """ crpyto whatever and http junk """ + """crpyto whatever and http junk""" now = http_date() if not sender.key_pair.private_key: @@ -534,7 +534,7 @@ def sign_and_send(sender, data, destination): def to_ordered_collection_page( queryset, remote_id, id_only=False, page=1, pure=False, **kwargs ): - """ serialize and pagiante a queryset """ + """serialize and pagiante a queryset""" paginated = Paginator(queryset, PAGE_LENGTH) activity_page = paginated.get_page(page) diff --git a/bookwyrm/models/attachment.py b/bookwyrm/models/attachment.py index eaeca11e..c8b2e51c 100644 --- a/bookwyrm/models/attachment.py +++ b/bookwyrm/models/attachment.py @@ -8,7 +8,7 @@ from . import fields class Attachment(ActivitypubMixin, BookWyrmModel): - """ an image (or, in the future, video etc) associated with a status """ + """an image (or, in the future, video etc) associated with a status""" status = models.ForeignKey( "Status", on_delete=models.CASCADE, related_name="attachments", null=True @@ -16,13 +16,13 @@ class Attachment(ActivitypubMixin, BookWyrmModel): reverse_unfurl = True class Meta: - """ one day we'll have other types of attachments besides images """ + """one day we'll have other types of attachments besides images""" abstract = True class Image(Attachment): - """ an image attachment """ + """an image attachment""" image = fields.ImageField( upload_to="status/", diff --git a/bookwyrm/models/author.py b/bookwyrm/models/author.py index 4c5fe6c8..b9a4b146 100644 --- a/bookwyrm/models/author.py +++ b/bookwyrm/models/author.py @@ -9,7 +9,7 @@ from . import fields class Author(BookDataModel): - """ basic biographic info """ + """basic biographic info""" wikipedia_link = fields.CharField( max_length=255, blank=True, null=True, deduplication_field=True @@ -24,7 +24,7 @@ class Author(BookDataModel): bio = fields.HtmlField(null=True, blank=True) def get_remote_id(self): - """ editions and works both use "book" instead of model_name """ + """editions and works both use "book" instead of model_name""" return "https://%s/author/%s" % (DOMAIN, self.id) activity_serializer = activitypub.Author diff --git a/bookwyrm/models/base_model.py b/bookwyrm/models/base_model.py index 261c9686..e85ff733 100644 --- a/bookwyrm/models/base_model.py +++ b/bookwyrm/models/base_model.py @@ -7,14 +7,14 @@ from .fields import RemoteIdField class BookWyrmModel(models.Model): - """ shared fields """ + """shared fields""" created_date = models.DateTimeField(auto_now_add=True) updated_date = models.DateTimeField(auto_now=True) remote_id = RemoteIdField(null=True, activitypub_field="id") def get_remote_id(self): - """ generate a url that resolves to the local object """ + """generate a url that resolves to the local object""" base_path = "https://%s" % DOMAIN if hasattr(self, "user"): base_path = "%s%s" % (base_path, self.user.local_path) @@ -22,17 +22,17 @@ class BookWyrmModel(models.Model): return "%s/%s/%d" % (base_path, model_name, self.id) class Meta: - """ this is just here to provide default fields for other models """ + """this is just here to provide default fields for other models""" abstract = True @property def local_path(self): - """ how to link to this object in the local app """ + """how to link to this object in the local app""" return self.get_remote_id().replace("https://%s" % DOMAIN, "") def visible_to_user(self, viewer): - """ is a user authorized to view an object? """ + """is a user authorized to view an object?""" # make sure this is an object with privacy owned by a user if not hasattr(self, "user") or not hasattr(self, "privacy"): return None @@ -65,7 +65,7 @@ class BookWyrmModel(models.Model): @receiver(models.signals.post_save) # pylint: disable=unused-argument def set_remote_id(sender, instance, created, *args, **kwargs): - """ set the remote_id after save (when the id is available) """ + """set the remote_id after save (when the id is available)""" if not created or not hasattr(instance, "get_remote_id"): return if not instance.remote_id: diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index 5280c7aa..dd098e56 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -13,7 +13,7 @@ from . import fields class BookDataModel(ObjectMixin, BookWyrmModel): - """ fields shared between editable book data (books, works, authors) """ + """fields shared between editable book data (books, works, authors)""" origin_id = models.CharField(max_length=255, null=True, blank=True) openlibrary_key = fields.CharField( @@ -33,12 +33,12 @@ class BookDataModel(ObjectMixin, BookWyrmModel): ) class Meta: - """ can't initialize this model, that wouldn't make sense """ + """can't initialize this model, that wouldn't make sense""" abstract = True def save(self, *args, **kwargs): - """ ensure that the remote_id is within this instance """ + """ensure that the remote_id is within this instance""" if self.id: self.remote_id = self.get_remote_id() else: @@ -47,12 +47,12 @@ class BookDataModel(ObjectMixin, BookWyrmModel): return super().save(*args, **kwargs) def broadcast(self, activity, sender, software="bookwyrm"): - """ only send book data updates to other bookwyrm instances """ + """only send book data updates to other bookwyrm instances""" super().broadcast(activity, sender, software=software) class Book(BookDataModel): - """ a generic book, which can mean either an edition or a work """ + """a generic book, which can mean either an edition or a work""" connector = models.ForeignKey("Connector", on_delete=models.PROTECT, null=True) @@ -83,17 +83,17 @@ class Book(BookDataModel): @property def author_text(self): - """ format a list of authors """ + """format a list of authors""" return ", ".join(a.name for a in self.authors.all()) @property def latest_readthrough(self): - """ most recent readthrough activity """ + """most recent readthrough activity""" return self.readthrough_set.order_by("-updated_date").first() @property def edition_info(self): - """ properties of this edition, as a string """ + """properties of this edition, as a string""" items = [ self.physical_format if hasattr(self, "physical_format") else None, self.languages[0] + " language" @@ -106,20 +106,20 @@ class Book(BookDataModel): @property def alt_text(self): - """ image alt test """ + """image alt test""" text = "%s" % self.title if self.edition_info: text += " (%s)" % self.edition_info return text def save(self, *args, **kwargs): - """ can't be abstract for query reasons, but you shouldn't USE it """ + """can't be abstract for query reasons, but you shouldn't USE it""" if not isinstance(self, Edition) and not isinstance(self, Work): raise ValueError("Books should be added as Editions or Works") return super().save(*args, **kwargs) def get_remote_id(self): - """ editions and works both use "book" instead of model_name """ + """editions and works both use "book" instead of model_name""" return "https://%s/book/%d" % (DOMAIN, self.id) def __repr__(self): @@ -131,7 +131,7 @@ class Book(BookDataModel): class Work(OrderedCollectionPageMixin, Book): - """ a work (an abstract concept of a book that manifests in an edition) """ + """a work (an abstract concept of a book that manifests in an edition)""" # library of congress catalog control number lccn = fields.CharField( @@ -143,19 +143,19 @@ class Work(OrderedCollectionPageMixin, Book): ) def save(self, *args, **kwargs): - """ set some fields on the edition object """ + """set some fields on the edition object""" # set rank for edition in self.editions.all(): edition.save() return super().save(*args, **kwargs) def get_default_edition(self): - """ in case the default edition is not set """ + """in case the default edition is not set""" return self.default_edition or self.editions.order_by("-edition_rank").first() @transaction.atomic() def reset_default_edition(self): - """ sets a new default edition based on computed rank """ + """sets a new default edition based on computed rank""" self.default_edition = None # editions are re-ranked implicitly self.save() @@ -163,11 +163,11 @@ class Work(OrderedCollectionPageMixin, Book): self.save() def to_edition_list(self, **kwargs): - """ an ordered collection of editions """ + """an ordered collection of editions""" return self.to_ordered_collection( self.editions.order_by("-edition_rank").all(), remote_id="%s/editions" % self.remote_id, - **kwargs + **kwargs, ) activity_serializer = activitypub.Work @@ -176,7 +176,7 @@ class Work(OrderedCollectionPageMixin, Book): class Edition(Book): - """ an edition of a book """ + """an edition of a book""" # these identifiers only apply to editions, not works isbn_10 = fields.CharField( @@ -215,7 +215,7 @@ class Edition(Book): name_field = "title" def get_rank(self, ignore_default=False): - """ calculate how complete the data is on this edition """ + """calculate how complete the data is on this edition""" if ( not ignore_default and self.parent_work @@ -235,7 +235,7 @@ class Edition(Book): return rank def save(self, *args, **kwargs): - """ set some fields on the edition object """ + """set some fields on the edition object""" # calculate isbn 10/13 if self.isbn_13 and self.isbn_13[:3] == "978" and not self.isbn_10: self.isbn_10 = isbn_13_to_10(self.isbn_13) @@ -249,7 +249,7 @@ class Edition(Book): def isbn_10_to_13(isbn_10): - """ convert an isbn 10 into an isbn 13 """ + """convert an isbn 10 into an isbn 13""" isbn_10 = re.sub(r"[^0-9X]", "", isbn_10) # drop the last character of the isbn 10 number (the original checkdigit) converted = isbn_10[:9] @@ -271,7 +271,7 @@ def isbn_10_to_13(isbn_10): def isbn_13_to_10(isbn_13): - """ convert isbn 13 to 10, if possible """ + """convert isbn 13 to 10, if possible""" if isbn_13[:3] != "978": return None diff --git a/bookwyrm/models/connector.py b/bookwyrm/models/connector.py index 11bdbee2..6043fc02 100644 --- a/bookwyrm/models/connector.py +++ b/bookwyrm/models/connector.py @@ -9,7 +9,7 @@ ConnectorFiles = models.TextChoices("ConnectorFiles", CONNECTORS) class Connector(BookWyrmModel): - """ book data source connectors """ + """book data source connectors""" identifier = models.CharField(max_length=255, unique=True) priority = models.IntegerField(default=2) @@ -32,7 +32,7 @@ class Connector(BookWyrmModel): query_count_expiry = models.DateTimeField(auto_now_add=True, blank=True) class Meta: - """ check that there's code to actually use this connector """ + """check that there's code to actually use this connector""" constraints = [ models.CheckConstraint( diff --git a/bookwyrm/models/favorite.py b/bookwyrm/models/favorite.py index 7b72d175..c4518119 100644 --- a/bookwyrm/models/favorite.py +++ b/bookwyrm/models/favorite.py @@ -11,7 +11,7 @@ from .status import Status class Favorite(ActivityMixin, BookWyrmModel): - """ fav'ing a post """ + """fav'ing a post""" user = fields.ForeignKey( "User", on_delete=models.PROTECT, activitypub_field="actor" @@ -24,11 +24,11 @@ class Favorite(ActivityMixin, BookWyrmModel): @classmethod def ignore_activity(cls, activity): - """ don't bother with incoming favs of unknown statuses """ + """don't bother with incoming favs of unknown statuses""" return not Status.objects.filter(remote_id=activity.object).exists() def save(self, *args, **kwargs): - """ update user active time """ + """update user active time""" self.user.last_active_date = timezone.now() self.user.save(broadcast=False) super().save(*args, **kwargs) @@ -45,7 +45,7 @@ class Favorite(ActivityMixin, BookWyrmModel): ) def delete(self, *args, **kwargs): - """ delete and delete notifications """ + """delete and delete notifications""" # check for notification if self.status.user.local: notification_model = apps.get_model( @@ -62,6 +62,6 @@ class Favorite(ActivityMixin, BookWyrmModel): super().delete(*args, **kwargs) class Meta: - """ can't fav things twice """ + """can't fav things twice""" unique_together = ("user", "status") diff --git a/bookwyrm/models/federated_server.py b/bookwyrm/models/federated_server.py index aa2b2f6a..7d446ca0 100644 --- a/bookwyrm/models/federated_server.py +++ b/bookwyrm/models/federated_server.py @@ -13,7 +13,7 @@ FederationStatus = models.TextChoices( class FederatedServer(BookWyrmModel): - """ store which servers we federate with """ + """store which servers we federate with""" server_name = models.CharField(max_length=255, unique=True) status = models.CharField( @@ -25,7 +25,7 @@ class FederatedServer(BookWyrmModel): notes = models.TextField(null=True, blank=True) def block(self): - """ block a server """ + """block a server""" self.status = "blocked" self.save() @@ -35,7 +35,7 @@ class FederatedServer(BookWyrmModel): ) def unblock(self): - """ unblock a server """ + """unblock a server""" self.status = "federated" self.save() @@ -45,7 +45,7 @@ class FederatedServer(BookWyrmModel): @classmethod def is_blocked(cls, url): - """ look up if a domain is blocked """ + """look up if a domain is blocked""" url = urlparse(url) domain = url.netloc return cls.objects.filter(server_name=domain, status="blocked").exists() diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index a1b2035b..123b3efa 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -18,7 +18,7 @@ from bookwyrm.settings import DOMAIN def validate_remote_id(value): - """ make sure the remote_id looks like a url """ + """make sure the remote_id looks like a url""" if not value or not re.match(r"^http.?:\/\/[^\s]+$", value): raise ValidationError( _("%(value)s is not a valid remote_id"), @@ -27,7 +27,7 @@ def validate_remote_id(value): def validate_localname(value): - """ make sure localnames look okay """ + """make sure localnames look okay""" if not re.match(r"^[A-Za-z\-_\.0-9]+$", value): raise ValidationError( _("%(value)s is not a valid username"), @@ -36,7 +36,7 @@ def validate_localname(value): def validate_username(value): - """ make sure usernames look okay """ + """make sure usernames look okay""" if not re.match(r"^[A-Za-z\-_\.0-9]+@[A-Za-z\-_\.0-9]+\.[a-z]{2,}$", value): raise ValidationError( _("%(value)s is not a valid username"), @@ -45,7 +45,7 @@ def validate_username(value): class ActivitypubFieldMixin: - """ make a database field serializable """ + """make a database field serializable""" def __init__( self, @@ -64,7 +64,7 @@ class ActivitypubFieldMixin: super().__init__(*args, **kwargs) def set_field_from_activity(self, instance, data): - """ helper function for assinging a value to the field """ + """helper function for assinging a value to the field""" try: value = getattr(data, self.get_activitypub_field()) except AttributeError: @@ -78,7 +78,7 @@ class ActivitypubFieldMixin: setattr(instance, self.name, formatted) def set_activity_from_field(self, activity, instance): - """ update the json object """ + """update the json object""" value = getattr(instance, self.name) formatted = self.field_to_activity(value) if formatted is None: @@ -94,19 +94,19 @@ class ActivitypubFieldMixin: activity[key] = formatted def field_to_activity(self, value): - """ formatter to convert a model value into activitypub """ + """formatter to convert a model value into activitypub""" if hasattr(self, "activitypub_wrapper"): return {self.activitypub_wrapper: value} return value def field_from_activity(self, value): - """ formatter to convert activitypub into a model value """ + """formatter to convert activitypub into a model value""" if value and hasattr(self, "activitypub_wrapper"): value = value.get(self.activitypub_wrapper) return value def get_activitypub_field(self): - """ model_field_name to activitypubFieldName """ + """model_field_name to activitypubFieldName""" if self.activitypub_field: return self.activitypub_field name = self.name.split(".")[-1] @@ -115,7 +115,7 @@ class ActivitypubFieldMixin: class ActivitypubRelatedFieldMixin(ActivitypubFieldMixin): - """ default (de)serialization for foreign key and one to one """ + """default (de)serialization for foreign key and one to one""" def __init__(self, *args, load_remote=True, **kwargs): self.load_remote = load_remote @@ -146,7 +146,7 @@ class ActivitypubRelatedFieldMixin(ActivitypubFieldMixin): class RemoteIdField(ActivitypubFieldMixin, models.CharField): - """ a url that serves as a unique identifier """ + """a url that serves as a unique identifier""" def __init__(self, *args, max_length=255, validators=None, **kwargs): validators = validators or [validate_remote_id] @@ -156,7 +156,7 @@ class RemoteIdField(ActivitypubFieldMixin, models.CharField): class UsernameField(ActivitypubFieldMixin, models.CharField): - """ activitypub-aware username field """ + """activitypub-aware username field""" def __init__(self, activitypub_field="preferredUsername", **kwargs): self.activitypub_field = activitypub_field @@ -172,7 +172,7 @@ class UsernameField(ActivitypubFieldMixin, models.CharField): ) def deconstruct(self): - """ implementation of models.Field deconstruct """ + """implementation of models.Field deconstruct""" name, path, args, kwargs = super().deconstruct() del kwargs["verbose_name"] del kwargs["max_length"] @@ -191,7 +191,7 @@ PrivacyLevels = models.TextChoices( class PrivacyField(ActivitypubFieldMixin, models.CharField): - """ this maps to two differente activitypub fields """ + """this maps to two differente activitypub fields""" public = "https://www.w3.org/ns/activitystreams#Public" @@ -236,7 +236,7 @@ class PrivacyField(ActivitypubFieldMixin, models.CharField): class ForeignKey(ActivitypubRelatedFieldMixin, models.ForeignKey): - """ activitypub-aware foreign key field """ + """activitypub-aware foreign key field""" def field_to_activity(self, value): if not value: @@ -245,7 +245,7 @@ class ForeignKey(ActivitypubRelatedFieldMixin, models.ForeignKey): class OneToOneField(ActivitypubRelatedFieldMixin, models.OneToOneField): - """ activitypub-aware foreign key field """ + """activitypub-aware foreign key field""" def field_to_activity(self, value): if not value: @@ -254,14 +254,14 @@ class OneToOneField(ActivitypubRelatedFieldMixin, models.OneToOneField): class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField): - """ activitypub-aware many to many field """ + """activitypub-aware many to many field""" def __init__(self, *args, link_only=False, **kwargs): self.link_only = link_only super().__init__(*args, **kwargs) def set_field_from_activity(self, instance, data): - """ helper function for assinging a value to the field """ + """helper function for assinging a value to the field""" value = getattr(data, self.get_activitypub_field()) formatted = self.field_from_activity(value) if formatted is None or formatted is MISSING: @@ -293,7 +293,7 @@ class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField): class TagField(ManyToManyField): - """ special case of many to many that uses Tags """ + """special case of many to many that uses Tags""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -333,7 +333,7 @@ class TagField(ManyToManyField): def image_serializer(value, alt): - """ helper for serializing images """ + """helper for serializing images""" if value and hasattr(value, "url"): url = value.url else: @@ -343,7 +343,7 @@ def image_serializer(value, alt): class ImageField(ActivitypubFieldMixin, models.ImageField): - """ activitypub-aware image field """ + """activitypub-aware image field""" def __init__(self, *args, alt_field=None, **kwargs): self.alt_field = alt_field @@ -351,7 +351,7 @@ class ImageField(ActivitypubFieldMixin, models.ImageField): # pylint: disable=arguments-differ def set_field_from_activity(self, instance, data, save=True): - """ helper function for assinging a value to the field """ + """helper function for assinging a value to the field""" value = getattr(data, self.get_activitypub_field()) formatted = self.field_from_activity(value) if formatted is None or formatted is MISSING: @@ -397,7 +397,7 @@ class ImageField(ActivitypubFieldMixin, models.ImageField): class DateTimeField(ActivitypubFieldMixin, models.DateTimeField): - """ activitypub-aware datetime field """ + """activitypub-aware datetime field""" def field_to_activity(self, value): if not value: @@ -416,7 +416,7 @@ class DateTimeField(ActivitypubFieldMixin, models.DateTimeField): class HtmlField(ActivitypubFieldMixin, models.TextField): - """ a text field for storing html """ + """a text field for storing html""" def field_from_activity(self, value): if not value or value == MISSING: @@ -427,30 +427,30 @@ class HtmlField(ActivitypubFieldMixin, models.TextField): class ArrayField(ActivitypubFieldMixin, DjangoArrayField): - """ activitypub-aware array field """ + """activitypub-aware array field""" def field_to_activity(self, value): return [str(i) for i in value] class CharField(ActivitypubFieldMixin, models.CharField): - """ activitypub-aware char field """ + """activitypub-aware char field""" class TextField(ActivitypubFieldMixin, models.TextField): - """ activitypub-aware text field """ + """activitypub-aware text field""" class BooleanField(ActivitypubFieldMixin, models.BooleanField): - """ activitypub-aware boolean field """ + """activitypub-aware boolean field""" class IntegerField(ActivitypubFieldMixin, models.IntegerField): - """ activitypub-aware boolean field """ + """activitypub-aware boolean field""" class DecimalField(ActivitypubFieldMixin, models.DecimalField): - """ activitypub-aware boolean field """ + """activitypub-aware boolean field""" def field_to_activity(self, value): if not value: diff --git a/bookwyrm/models/import_job.py b/bookwyrm/models/import_job.py index 026cf7cd..1b1152ab 100644 --- a/bookwyrm/models/import_job.py +++ b/bookwyrm/models/import_job.py @@ -20,7 +20,7 @@ GOODREADS_SHELVES = { def unquote_string(text): - """ resolve csv quote weirdness """ + """resolve csv quote weirdness""" match = re.match(r'="([^"]*)"', text) if match: return match.group(1) @@ -28,7 +28,7 @@ def unquote_string(text): def construct_search_term(title, author): - """ formulate a query for the data connector """ + """formulate a query for the data connector""" # Strip brackets (usually series title from search term) title = re.sub(r"\s*\([^)]*\)\s*", "", title) # Open library doesn't like including author initials in search term. @@ -38,7 +38,7 @@ def construct_search_term(title, author): class ImportJob(models.Model): - """ entry for a specific request for book data import """ + """entry for a specific request for book data import""" user = models.ForeignKey(User, on_delete=models.CASCADE) created_date = models.DateTimeField(default=timezone.now) @@ -51,7 +51,7 @@ class ImportJob(models.Model): retry = models.BooleanField(default=False) def save(self, *args, **kwargs): - """ save and notify """ + """save and notify""" super().save(*args, **kwargs) if self.complete: notification_model = apps.get_model( @@ -65,7 +65,7 @@ class ImportJob(models.Model): class ImportItem(models.Model): - """ a single line of a csv being imported """ + """a single line of a csv being imported""" job = models.ForeignKey(ImportJob, on_delete=models.CASCADE, related_name="items") index = models.IntegerField() @@ -74,11 +74,11 @@ class ImportItem(models.Model): fail_reason = models.TextField(null=True) def resolve(self): - """ try various ways to lookup a book """ + """try various ways to lookup a book""" self.book = self.get_book_from_isbn() or self.get_book_from_title_author() def get_book_from_isbn(self): - """ search by isbn """ + """search by isbn""" search_result = connector_manager.first_search_result( self.isbn, min_confidence=0.999 ) @@ -88,7 +88,7 @@ class ImportItem(models.Model): return None def get_book_from_title_author(self): - """ search by title and author """ + """search by title and author""" search_term = construct_search_term(self.title, self.author) search_result = connector_manager.first_search_result( search_term, min_confidence=0.999 @@ -100,60 +100,60 @@ class ImportItem(models.Model): @property def title(self): - """ get the book title """ + """get the book title""" return self.data["Title"] @property def author(self): - """ get the book title """ + """get the book title""" return self.data["Author"] @property def isbn(self): - """ pulls out the isbn13 field from the csv line data """ + """pulls out the isbn13 field from the csv line data""" return unquote_string(self.data["ISBN13"]) @property def shelf(self): - """ the goodreads shelf field """ + """the goodreads shelf field""" if self.data["Exclusive Shelf"]: return GOODREADS_SHELVES.get(self.data["Exclusive Shelf"]) return None @property def review(self): - """ a user-written review, to be imported with the book data """ + """a user-written review, to be imported with the book data""" return self.data["My Review"] @property def rating(self): - """ x/5 star rating for a book """ + """x/5 star rating for a book""" return int(self.data["My Rating"]) @property def date_added(self): - """ when the book was added to this dataset """ + """when the book was added to this dataset""" if self.data["Date Added"]: return timezone.make_aware(dateutil.parser.parse(self.data["Date Added"])) return None @property def date_started(self): - """ when the book was started """ + """when the book was started""" if "Date Started" in self.data and self.data["Date Started"]: return timezone.make_aware(dateutil.parser.parse(self.data["Date Started"])) return None @property def date_read(self): - """ the date a book was completed """ + """the date a book was completed""" if self.data["Date Read"]: return timezone.make_aware(dateutil.parser.parse(self.data["Date Read"])) return None @property def reads(self): - """ formats a read through dataset for the book in this line """ + """formats a read through dataset for the book in this line""" start_date = self.date_started # Goodreads special case (no 'date started' field) diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py index 639f8402..2a5c3382 100644 --- a/bookwyrm/models/list.py +++ b/bookwyrm/models/list.py @@ -21,7 +21,7 @@ CurationType = models.TextChoices( class List(OrderedCollectionMixin, BookWyrmModel): - """ a list of books """ + """a list of books""" name = fields.CharField(max_length=100) user = fields.ForeignKey( @@ -41,22 +41,22 @@ class List(OrderedCollectionMixin, BookWyrmModel): activity_serializer = activitypub.BookList def get_remote_id(self): - """ don't want the user to be in there in this case """ + """don't want the user to be in there in this case""" return "https://%s/list/%d" % (DOMAIN, self.id) @property def collection_queryset(self): - """ list of books for this shelf, overrides OrderedCollectionMixin """ + """list of books for this shelf, overrides OrderedCollectionMixin""" return self.books.filter(listitem__approved=True).order_by("listitem") class Meta: - """ default sorting """ + """default sorting""" ordering = ("-updated_date",) class ListItem(CollectionItemMixin, BookWyrmModel): - """ ok """ + """ok""" book = fields.ForeignKey( "Edition", on_delete=models.PROTECT, activitypub_field="book" @@ -74,7 +74,7 @@ class ListItem(CollectionItemMixin, BookWyrmModel): collection_field = "book_list" def save(self, *args, **kwargs): - """ create a notification too """ + """create a notification too""" created = not bool(self.id) super().save(*args, **kwargs) # tick the updated date on the parent list diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py index 233d635b..ff0b4e5a 100644 --- a/bookwyrm/models/notification.py +++ b/bookwyrm/models/notification.py @@ -10,7 +10,7 @@ NotificationType = models.TextChoices( class Notification(BookWyrmModel): - """ you've been tagged, liked, followed, etc """ + """you've been tagged, liked, followed, etc""" user = models.ForeignKey("User", on_delete=models.CASCADE) related_book = models.ForeignKey("Edition", on_delete=models.CASCADE, null=True) @@ -29,7 +29,7 @@ class Notification(BookWyrmModel): ) def save(self, *args, **kwargs): - """ save, but don't make dupes """ + """save, but don't make dupes""" # there's probably a better way to do this if self.__class__.objects.filter( user=self.user, @@ -45,7 +45,7 @@ class Notification(BookWyrmModel): super().save(*args, **kwargs) class Meta: - """ checks if notifcation is in enum list for valid types """ + """checks if notifcation is in enum list for valid types""" constraints = [ models.CheckConstraint( diff --git a/bookwyrm/models/readthrough.py b/bookwyrm/models/readthrough.py index 1a5fcb0d..664daa13 100644 --- a/bookwyrm/models/readthrough.py +++ b/bookwyrm/models/readthrough.py @@ -7,14 +7,14 @@ from .base_model import BookWyrmModel class ProgressMode(models.TextChoices): - """ types of prgress available """ + """types of prgress available""" PAGE = "PG", "page" PERCENT = "PCT", "percent" class ReadThrough(BookWyrmModel): - """ Store a read through a book in the database. """ + """Store a read through a book in the database.""" user = models.ForeignKey("User", on_delete=models.PROTECT) book = models.ForeignKey("Edition", on_delete=models.PROTECT) @@ -28,13 +28,13 @@ class ReadThrough(BookWyrmModel): finish_date = models.DateTimeField(blank=True, null=True) def save(self, *args, **kwargs): - """ update user active time """ + """update user active time""" self.user.last_active_date = timezone.now() self.user.save(broadcast=False) super().save(*args, **kwargs) def create_update(self): - """ add update to the readthrough """ + """add update to the readthrough""" if self.progress: return self.progressupdate_set.create( user=self.user, progress=self.progress, mode=self.progress_mode @@ -43,7 +43,7 @@ class ReadThrough(BookWyrmModel): class ProgressUpdate(BookWyrmModel): - """ Store progress through a book in the database. """ + """Store progress through a book in the database.""" user = models.ForeignKey("User", on_delete=models.PROTECT) readthrough = models.ForeignKey("ReadThrough", on_delete=models.CASCADE) @@ -53,7 +53,7 @@ class ProgressUpdate(BookWyrmModel): ) def save(self, *args, **kwargs): - """ update user active time """ + """update user active time""" self.user.last_active_date = timezone.now() self.user.save(broadcast=False) super().save(*args, **kwargs) diff --git a/bookwyrm/models/relationship.py b/bookwyrm/models/relationship.py index 3f849597..12f4c51a 100644 --- a/bookwyrm/models/relationship.py +++ b/bookwyrm/models/relationship.py @@ -11,7 +11,7 @@ from . import fields class UserRelationship(BookWyrmModel): - """ many-to-many through table for followers """ + """many-to-many through table for followers""" user_subject = fields.ForeignKey( "User", @@ -28,16 +28,16 @@ class UserRelationship(BookWyrmModel): @property def privacy(self): - """ all relationships are handled directly with the participants """ + """all relationships are handled directly with the participants""" return "direct" @property def recipients(self): - """ the remote user needs to recieve direct broadcasts """ + """the remote user needs to recieve direct broadcasts""" return [u for u in [self.user_subject, self.user_object] if not u.local] class Meta: - """ relationships should be unique """ + """relationships should be unique""" abstract = True constraints = [ @@ -51,22 +51,22 @@ class UserRelationship(BookWyrmModel): ] def get_remote_id(self): - """ use shelf identifier in remote_id """ + """use shelf identifier in remote_id""" base_path = self.user_subject.remote_id return "%s#follows/%d" % (base_path, self.id) class UserFollows(ActivityMixin, UserRelationship): - """ Following a user """ + """Following a user""" status = "follows" def to_activity(self): # pylint: disable=arguments-differ - """ overrides default to manually set serializer """ + """overrides default to manually set serializer""" return activitypub.Follow(**generate_activity(self)) def save(self, *args, **kwargs): - """ really really don't let a user follow someone who blocked them """ + """really really don't let a user follow someone who blocked them""" # blocking in either direction is a no-go if UserBlocks.objects.filter( Q( @@ -85,7 +85,7 @@ class UserFollows(ActivityMixin, UserRelationship): @classmethod def from_request(cls, follow_request): - """ converts a follow request into a follow relationship """ + """converts a follow request into a follow relationship""" return cls.objects.create( user_subject=follow_request.user_subject, user_object=follow_request.user_object, @@ -94,13 +94,13 @@ class UserFollows(ActivityMixin, UserRelationship): class UserFollowRequest(ActivitypubMixin, UserRelationship): - """ following a user requires manual or automatic confirmation """ + """following a user requires manual or automatic confirmation""" status = "follow_request" activity_serializer = activitypub.Follow def save(self, *args, broadcast=True, **kwargs): - """ make sure the follow or block relationship doesn't already exist """ + """make sure the follow or block relationship doesn't already exist""" # if there's a request for a follow that already exists, accept it # without changing the local database state if UserFollows.objects.filter( @@ -141,13 +141,13 @@ class UserFollowRequest(ActivitypubMixin, UserRelationship): ) def get_accept_reject_id(self, status): - """ get id for sending an accept or reject of a local user """ + """get id for sending an accept or reject of a local user""" base_path = self.user_object.remote_id return "%s#%s/%d" % (base_path, status, self.id or 0) def accept(self, broadcast_only=False): - """ turn this request into the real deal""" + """turn this request into the real deal""" user = self.user_object if not self.user_subject.local: activity = activitypub.Accept( @@ -164,7 +164,7 @@ class UserFollowRequest(ActivitypubMixin, UserRelationship): self.delete() def reject(self): - """ generate a Reject for this follow request """ + """generate a Reject for this follow request""" if self.user_object.local: activity = activitypub.Reject( id=self.get_accept_reject_id(status="rejects"), @@ -177,13 +177,13 @@ class UserFollowRequest(ActivitypubMixin, UserRelationship): class UserBlocks(ActivityMixin, UserRelationship): - """ prevent another user from following you and seeing your posts """ + """prevent another user from following you and seeing your posts""" status = "blocks" activity_serializer = activitypub.Block def save(self, *args, **kwargs): - """ remove follow or follow request rels after a block is created """ + """remove follow or follow request rels after a block is created""" super().save(*args, **kwargs) UserFollows.objects.filter( diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py index f9e8905b..7ff4c909 100644 --- a/bookwyrm/models/report.py +++ b/bookwyrm/models/report.py @@ -6,7 +6,7 @@ from .base_model import BookWyrmModel class Report(BookWyrmModel): - """ reported status or user """ + """reported status or user""" reporter = models.ForeignKey( "User", related_name="reporter", on_delete=models.PROTECT @@ -17,7 +17,7 @@ class Report(BookWyrmModel): resolved = models.BooleanField(default=False) def save(self, *args, **kwargs): - """ notify admins when a report is created """ + """notify admins when a report is created""" super().save(*args, **kwargs) user_model = apps.get_model("bookwyrm.User", require_ready=True) # moderators and superusers should be notified @@ -34,7 +34,7 @@ class Report(BookWyrmModel): ) class Meta: - """ don't let users report themselves """ + """don't let users report themselves""" constraints = [ models.CheckConstraint(check=~Q(reporter=F("user")), name="self_report") @@ -43,13 +43,13 @@ class Report(BookWyrmModel): class ReportComment(BookWyrmModel): - """ updates on a report """ + """updates on a report""" user = models.ForeignKey("User", on_delete=models.PROTECT) note = models.TextField() report = models.ForeignKey(Report, on_delete=models.PROTECT) class Meta: - """ sort comments """ + """sort comments""" ordering = ("-created_date",) diff --git a/bookwyrm/models/shelf.py b/bookwyrm/models/shelf.py index d37668dd..4110ae8d 100644 --- a/bookwyrm/models/shelf.py +++ b/bookwyrm/models/shelf.py @@ -9,7 +9,7 @@ from . import fields class Shelf(OrderedCollectionMixin, BookWyrmModel): - """ a list of books owned by a user """ + """a list of books owned by a user""" TO_READ = "to-read" READING = "reading" @@ -34,36 +34,36 @@ class Shelf(OrderedCollectionMixin, BookWyrmModel): activity_serializer = activitypub.Shelf def save(self, *args, **kwargs): - """ set the identifier """ + """set the identifier""" super().save(*args, **kwargs) if not self.identifier: self.identifier = self.get_identifier() super().save(*args, **kwargs, broadcast=False) def get_identifier(self): - """ custom-shelf-123 for the url """ + """custom-shelf-123 for the url""" slug = re.sub(r"[^\w]", "", self.name).lower() return "{:s}-{:d}".format(slug, self.id) @property def collection_queryset(self): - """ list of books for this shelf, overrides OrderedCollectionMixin """ + """list of books for this shelf, overrides OrderedCollectionMixin""" return self.books.order_by("shelfbook") def get_remote_id(self): - """ shelf identifier instead of id """ + """shelf identifier instead of id""" base_path = self.user.remote_id identifier = self.identifier or self.get_identifier() return "%s/books/%s" % (base_path, identifier) class Meta: - """ user/shelf unqiueness """ + """user/shelf unqiueness""" unique_together = ("user", "identifier") class ShelfBook(CollectionItemMixin, BookWyrmModel): - """ many to many join table for books and shelves """ + """many to many join table for books and shelves""" book = fields.ForeignKey( "Edition", on_delete=models.PROTECT, activitypub_field="book" diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py index 1eb31869..193cffb7 100644 --- a/bookwyrm/models/site.py +++ b/bookwyrm/models/site.py @@ -12,7 +12,7 @@ from .user import User class SiteSettings(models.Model): - """ customized settings for this instance """ + """customized settings for this instance""" name = models.CharField(default="BookWyrm", max_length=100) instance_tagline = models.CharField( @@ -35,7 +35,7 @@ class SiteSettings(models.Model): @classmethod def get(cls): - """ gets the site settings db entry or defaults """ + """gets the site settings db entry or defaults""" try: return cls.objects.get(id=1) except cls.DoesNotExist: @@ -45,12 +45,12 @@ class SiteSettings(models.Model): def new_access_code(): - """ the identifier for a user invite """ + """the identifier for a user invite""" return base64.b32encode(Random.get_random_bytes(5)).decode("ascii") class SiteInvite(models.Model): - """ gives someone access to create an account on the instance """ + """gives someone access to create an account on the instance""" created_date = models.DateTimeField(auto_now_add=True) code = models.CharField(max_length=32, default=new_access_code) @@ -61,19 +61,19 @@ class SiteInvite(models.Model): invitees = models.ManyToManyField(User, related_name="invitees") def valid(self): - """ make sure it hasn't expired or been used """ + """make sure it hasn't expired or been used""" return (self.expiry is None or self.expiry > timezone.now()) and ( self.use_limit is None or self.times_used < self.use_limit ) @property def link(self): - """ formats the invite link """ + """formats the invite link""" return "https://{}/invite/{}".format(DOMAIN, self.code) class InviteRequest(BookWyrmModel): - """ prospective users can request an invite """ + """prospective users can request an invite""" email = models.EmailField(max_length=255, unique=True) invite = models.ForeignKey( @@ -83,30 +83,30 @@ class InviteRequest(BookWyrmModel): ignored = models.BooleanField(default=False) def save(self, *args, **kwargs): - """ don't create a request for a registered email """ + """don't create a request for a registered email""" if not self.id and User.objects.filter(email=self.email).exists(): raise IntegrityError() super().save(*args, **kwargs) def get_passowrd_reset_expiry(): - """ give people a limited time to use the link """ + """give people a limited time to use the link""" now = timezone.now() return now + datetime.timedelta(days=1) class PasswordReset(models.Model): - """ gives someone access to create an account on the instance """ + """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) user = models.OneToOneField(User, on_delete=models.CASCADE) def valid(self): - """ make sure it hasn't expired or been used """ + """make sure it hasn't expired or been used""" return self.expiry > timezone.now() @property def link(self): - """ formats the invite link """ + """formats the invite link""" return "https://{}/password-reset/{}".format(DOMAIN, self.code) diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py index 0dee0b75..bd21ec56 100644 --- a/bookwyrm/models/status.py +++ b/bookwyrm/models/status.py @@ -19,7 +19,7 @@ from . import fields class Status(OrderedCollectionPageMixin, BookWyrmModel): - """ any post, like a reply to a review, etc """ + """any post, like a reply to a review, etc""" user = fields.ForeignKey( "User", on_delete=models.PROTECT, activitypub_field="attributedTo" @@ -59,12 +59,12 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): deserialize_reverse_fields = [("attachments", "attachment")] class Meta: - """ default sorting """ + """default sorting""" ordering = ("-published_date",) def save(self, *args, **kwargs): - """ save and notify """ + """save and notify""" super().save(*args, **kwargs) notification_model = apps.get_model("bookwyrm.Notification", require_ready=True) @@ -98,7 +98,7 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): ) def delete(self, *args, **kwargs): # pylint: disable=unused-argument - """ "delete" a status """ + """ "delete" a status""" if hasattr(self, "boosted_status"): # okay but if it's a boost really delete it super().delete(*args, **kwargs) @@ -109,7 +109,7 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): @property def recipients(self): - """ tagged users who definitely need to get this status in broadcast """ + """tagged users who definitely need to get this status in broadcast""" mentions = [u for u in self.mention_users.all() if not u.local] if ( hasattr(self, "reply_parent") @@ -121,7 +121,7 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): @classmethod def ignore_activity(cls, activity): # pylint: disable=too-many-return-statements - """ keep notes if they are replies to existing statuses """ + """keep notes if they are replies to existing statuses""" if activity.type == "Announce": try: boosted = activitypub.resolve_remote_id( @@ -163,16 +163,16 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): @property def status_type(self): - """ expose the type of status for the ui using activity type """ + """expose the type of status for the ui using activity type""" return self.activity_serializer.__name__ @property def boostable(self): - """ you can't boost dms """ + """you can't boost dms""" return self.privacy in ["unlisted", "public"] def to_replies(self, **kwargs): - """ helper function for loading AP serialized replies to a status """ + """helper function for loading AP serialized replies to a status""" return self.to_ordered_collection( self.replies(self), remote_id="%s/replies" % self.remote_id, @@ -181,7 +181,7 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): ).serialize() def to_activity_dataclass(self, pure=False): # pylint: disable=arguments-differ - """ return tombstone if the status is deleted """ + """return tombstone if the status is deleted""" if self.deleted: return activitypub.Tombstone( id=self.remote_id, @@ -210,16 +210,16 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): return activity def to_activity(self, pure=False): # pylint: disable=arguments-differ - """ json serialized activitypub class """ + """json serialized activitypub class""" return self.to_activity_dataclass(pure=pure).serialize() class GeneratedNote(Status): - """ these are app-generated messages about user activity """ + """these are app-generated messages about user activity""" @property def pure_content(self): - """ indicate the book in question for mastodon (or w/e) users """ + """indicate the book in question for mastodon (or w/e) users""" message = self.content books = ", ".join( '"%s"' % (book.remote_id, book.title) @@ -232,7 +232,7 @@ class GeneratedNote(Status): class Comment(Status): - """ like a review but without a rating and transient """ + """like a review but without a rating and transient""" book = fields.ForeignKey( "Edition", on_delete=models.PROTECT, activitypub_field="inReplyToBook" @@ -253,7 +253,7 @@ class Comment(Status): @property def pure_content(self): - """ indicate the book in question for mastodon (or w/e) users """ + """indicate the book in question for mastodon (or w/e) users""" return '%s

(comment on "%s")

' % ( self.content, self.book.remote_id, @@ -265,7 +265,7 @@ class Comment(Status): class Quotation(Status): - """ like a review but without a rating and transient """ + """like a review but without a rating and transient""" quote = fields.HtmlField() book = fields.ForeignKey( @@ -274,7 +274,7 @@ class Quotation(Status): @property def pure_content(self): - """ indicate the book in question for mastodon (or w/e) users """ + """indicate the book in question for mastodon (or w/e) users""" quote = re.sub(r"^

", '

"', self.quote) quote = re.sub(r"

$", '"

', quote) return '%s

-- "%s"

%s' % ( @@ -289,7 +289,7 @@ class Quotation(Status): class Review(Status): - """ a book review """ + """a book review""" name = fields.CharField(max_length=255, null=True) book = fields.ForeignKey( @@ -306,7 +306,7 @@ class Review(Status): @property def pure_name(self): - """ clarify review names for mastodon serialization """ + """clarify review names for mastodon serialization""" template = get_template("snippets/generated_status/review_pure_name.html") return template.render( {"book": self.book, "rating": self.rating, "name": self.name} @@ -314,7 +314,7 @@ class Review(Status): @property def pure_content(self): - """ indicate the book in question for mastodon (or w/e) users """ + """indicate the book in question for mastodon (or w/e) users""" return self.content activity_serializer = activitypub.Review @@ -322,7 +322,7 @@ class Review(Status): class ReviewRating(Review): - """ a subtype of review that only contains a rating """ + """a subtype of review that only contains a rating""" def save(self, *args, **kwargs): if not self.rating: @@ -339,7 +339,7 @@ class ReviewRating(Review): class Boost(ActivityMixin, Status): - """ boost'ing a post """ + """boost'ing a post""" boosted_status = fields.ForeignKey( "Status", @@ -350,7 +350,7 @@ class Boost(ActivityMixin, Status): activity_serializer = activitypub.Announce def save(self, *args, **kwargs): - """ save and notify """ + """save and notify""" # This constraint can't work as it would cross tables. # class Meta: # unique_together = ('user', 'boosted_status') @@ -374,7 +374,7 @@ class Boost(ActivityMixin, Status): ) def delete(self, *args, **kwargs): - """ delete and un-notify """ + """delete and un-notify""" notification_model = apps.get_model("bookwyrm.Notification", require_ready=True) notification_model.objects.filter( user=self.boosted_status.user, @@ -385,7 +385,7 @@ class Boost(ActivityMixin, Status): super().delete(*args, **kwargs) def __init__(self, *args, **kwargs): - """ the user field is "actor" here instead of "attributedTo" """ + """the user field is "actor" here instead of "attributedTo" """ super().__init__(*args, **kwargs) reserve_fields = ["user", "boosted_status", "published_date", "privacy"] diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index 0f98c82d..3efbd6ac 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -35,7 +35,7 @@ DeactivationReason = models.TextChoices( class User(OrderedCollectionPageMixin, AbstractUser): - """ a user who wants to read books """ + """a user who wants to read books""" username = fields.UsernameField() email = models.EmailField(unique=True, null=True) @@ -130,38 +130,38 @@ class User(OrderedCollectionPageMixin, AbstractUser): @property def following_link(self): - """ just how to find out the following info """ + """just how to find out the following info""" return "{:s}/following".format(self.remote_id) @property def alt_text(self): - """ alt text with username """ + """alt text with username""" return "avatar for %s" % (self.localname or self.username) @property def display_name(self): - """ show the cleanest version of the user's name possible """ + """show the cleanest version of the user's name possible""" if self.name and self.name != "": return self.name return self.localname or self.username @property def deleted(self): - """ for consistent naming """ + """for consistent naming""" return not self.is_active activity_serializer = activitypub.Person @classmethod def viewer_aware_objects(cls, viewer): - """ the user queryset filtered for the context of the logged in user """ + """the user queryset filtered for the context of the logged in user""" queryset = cls.objects.filter(is_active=True) if viewer and viewer.is_authenticated: queryset = queryset.exclude(blocks=viewer) return queryset def to_outbox(self, filter_type=None, **kwargs): - """ an ordered collection of statuses """ + """an ordered collection of statuses""" if filter_type: filter_class = apps.get_model( "bookwyrm.%s" % filter_type, require_ready=True @@ -188,7 +188,7 @@ class User(OrderedCollectionPageMixin, AbstractUser): ).serialize() def to_following_activity(self, **kwargs): - """ activitypub following list """ + """activitypub following list""" remote_id = "%s/following" % self.remote_id return self.to_ordered_collection( self.following.order_by("-updated_date").all(), @@ -198,7 +198,7 @@ class User(OrderedCollectionPageMixin, AbstractUser): ) def to_followers_activity(self, **kwargs): - """ activitypub followers list """ + """activitypub followers list""" remote_id = "%s/followers" % self.remote_id return self.to_ordered_collection( self.followers.order_by("-updated_date").all(), @@ -227,7 +227,7 @@ class User(OrderedCollectionPageMixin, AbstractUser): return activity_object def save(self, *args, **kwargs): - """ populate fields for new local users """ + """populate fields for new local users""" created = not bool(self.id) if not self.local and not re.match(regex.full_username, self.username): # generate a username that uses the domain (webfinger format) @@ -292,19 +292,19 @@ class User(OrderedCollectionPageMixin, AbstractUser): ).save(broadcast=False) def delete(self, *args, **kwargs): - """ deactivate rather than delete a user """ + """deactivate rather than delete a user""" self.is_active = False # skip the logic in this class's save() super().save(*args, **kwargs) @property def local_path(self): - """ this model doesn't inherit bookwyrm model, so here we are """ + """this model doesn't inherit bookwyrm model, so here we are""" return "/user/%s" % (self.localname or self.username) class KeyPair(ActivitypubMixin, BookWyrmModel): - """ public and private keys for a user """ + """public and private keys for a user""" private_key = models.TextField(blank=True, null=True) public_key = fields.TextField( @@ -319,7 +319,7 @@ class KeyPair(ActivitypubMixin, BookWyrmModel): return "%s/#main-key" % self.owner.remote_id def save(self, *args, **kwargs): - """ create a key pair """ + """create a key pair""" # no broadcasting happening here if "broadcast" in kwargs: del kwargs["broadcast"] @@ -337,7 +337,7 @@ class KeyPair(ActivitypubMixin, BookWyrmModel): class AnnualGoal(BookWyrmModel): - """ set a goal for how many books you read in a year """ + """set a goal for how many books you read in a year""" user = models.ForeignKey("User", on_delete=models.PROTECT) goal = models.IntegerField(validators=[MinValueValidator(1)]) @@ -347,17 +347,17 @@ class AnnualGoal(BookWyrmModel): ) class Meta: - """ unqiueness constraint """ + """unqiueness constraint""" unique_together = ("user", "year") def get_remote_id(self): - """ put the year in the path """ + """put the year in the path""" return "%s/goal/%d" % (self.user.remote_id, self.year) @property def books(self): - """ the books you've read this year """ + """the books you've read this year""" return ( self.user.readthrough_set.filter(finish_date__year__gte=self.year) .order_by("-finish_date") @@ -366,7 +366,7 @@ class AnnualGoal(BookWyrmModel): @property def ratings(self): - """ ratings for books read this year """ + """ratings for books read this year""" book_ids = [r.book.id for r in self.books] reviews = Review.objects.filter( user=self.user, @@ -376,12 +376,12 @@ class AnnualGoal(BookWyrmModel): @property def progress_percent(self): - """ how close to your goal, in percent form """ + """how close to your goal, in percent form""" return int(float(self.book_count / self.goal) * 100) @property def book_count(self): - """ how many books you've read this year """ + """how many books you've read this year""" return self.user.readthrough_set.filter( finish_date__year__gte=self.year ).count() @@ -389,7 +389,7 @@ class AnnualGoal(BookWyrmModel): @app.task def set_remote_server(user_id): - """ figure out the user's remote server in the background """ + """figure out the user's remote server in the background""" user = User.objects.get(id=user_id) actor_parts = urlparse(user.remote_id) user.federated_server = get_or_create_remote_server(actor_parts.netloc) @@ -399,7 +399,7 @@ def set_remote_server(user_id): def get_or_create_remote_server(domain): - """ get info on a remote server """ + """get info on a remote server""" try: return FederatedServer.objects.get(server_name=domain) except FederatedServer.DoesNotExist: @@ -428,7 +428,7 @@ def get_or_create_remote_server(domain): @app.task def get_remote_reviews(outbox): - """ ingest reviews by a new remote bookwyrm user """ + """ingest reviews by a new remote bookwyrm user""" outbox_page = outbox + "?page=true&type=Review" data = get_data(outbox_page) diff --git a/bookwyrm/redis_store.py b/bookwyrm/redis_store.py index 4236d6df..259bc4fd 100644 --- a/bookwyrm/redis_store.py +++ b/bookwyrm/redis_store.py @@ -10,16 +10,16 @@ r = redis.Redis( class RedisStore(ABC): - """ sets of ranked, related objects, like statuses for a user's feed """ + """sets of ranked, related objects, like statuses for a user's feed""" max_length = settings.MAX_STREAM_LENGTH def get_value(self, obj): - """ the object and rank """ + """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 """ + """add an object to all suitable stores""" value = self.get_value(obj) # we want to do this as a bulk operation, hence "pipeline" pipeline = r.pipeline() @@ -34,14 +34,14 @@ class RedisStore(ABC): return pipeline.execute() def remove_object_from_related_stores(self, obj): - """ remove an object from all stores """ + """remove an object from all stores""" pipeline = r.pipeline() for store in self.get_stores_for_object(obj): pipeline.zrem(store, -1, obj.id) pipeline.execute() def bulk_add_objects_to_store(self, objs, store): - """ add a list of objects to a given store """ + """add a list of objects to a given store""" pipeline = r.pipeline() for obj in objs[: self.max_length]: pipeline.zadd(store, self.get_value(obj)) @@ -50,18 +50,18 @@ class RedisStore(ABC): pipeline.execute() def bulk_remove_objects_from_store(self, objs, store): - """ remoev a list of objects from a given store """ + """remoev a list of objects from a given store""" pipeline = r.pipeline() for obj in objs[: self.max_length]: pipeline.zrem(store, -1, obj.id) pipeline.execute() def get_store(self, store): # pylint: disable=no-self-use - """ load the values in a store """ + """load the values in a store""" return r.zrevrange(store, 0, -1) def populate_store(self, store): - """ go from zero to a store """ + """go from zero to a store""" pipeline = r.pipeline() queryset = self.get_objects_for_store(store) @@ -75,12 +75,12 @@ class RedisStore(ABC): @abstractmethod def get_objects_for_store(self, store): - """ a queryset of what should go in a store, used for populating it """ + """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 """ + """the stores that an object belongs in""" @abstractmethod def get_rank(self, obj): - """ how to rank an object """ + """how to rank an object""" diff --git a/bookwyrm/sanitize_html.py b/bookwyrm/sanitize_html.py index 2a630f83..0be64c58 100644 --- a/bookwyrm/sanitize_html.py +++ b/bookwyrm/sanitize_html.py @@ -3,7 +3,7 @@ from html.parser import HTMLParser class InputHtmlParser(HTMLParser): # pylint: disable=abstract-method - """ Removes any html that isn't allowed_tagsed from a block """ + """Removes any html that isn't allowed_tagsed from a block""" def __init__(self): HTMLParser.__init__(self) @@ -28,7 +28,7 @@ class InputHtmlParser(HTMLParser): # pylint: disable=abstract-method self.allow_html = True def handle_starttag(self, tag, attrs): - """ check if the tag is valid """ + """check if the tag is valid""" if self.allow_html and tag in self.allowed_tags: self.output.append(("tag", self.get_starttag_text())) self.tag_stack.append(tag) @@ -36,7 +36,7 @@ class InputHtmlParser(HTMLParser): # pylint: disable=abstract-method self.output.append(("data", "")) def handle_endtag(self, tag): - """ keep the close tag """ + """keep the close tag""" if not self.allow_html or tag not in self.allowed_tags: self.output.append(("data", "")) return @@ -51,11 +51,11 @@ class InputHtmlParser(HTMLParser): # pylint: disable=abstract-method self.output.append(("tag", "" % tag)) def handle_data(self, data): - """ extract the answer, if we're in an answer tag """ + """extract the answer, if we're in an answer tag""" self.output.append(("data", data)) def get_output(self): - """ convert the output from a list of tuples to a string """ + """convert the output from a list of tuples to a string""" if self.tag_stack: self.allow_html = False if not self.allow_html: diff --git a/bookwyrm/signatures.py b/bookwyrm/signatures.py index 80cbfdc7..5488cf9b 100644 --- a/bookwyrm/signatures.py +++ b/bookwyrm/signatures.py @@ -13,7 +13,7 @@ MAX_SIGNATURE_AGE = 300 def create_key_pair(): - """ a new public/private key pair, used for creating new users """ + """a new public/private key pair, used for creating new users""" random_generator = Random.new().read key = RSA.generate(1024, random_generator) private_key = key.export_key().decode("utf8") @@ -23,7 +23,7 @@ def create_key_pair(): def make_signature(sender, destination, date, digest): - """ uses a private key to sign an outgoing message """ + """uses a private key to sign an outgoing message""" inbox_parts = urlparse(destination) signature_headers = [ "(request-target): post %s" % inbox_parts.path, @@ -44,14 +44,14 @@ def make_signature(sender, destination, date, digest): def make_digest(data): - """ creates a message digest for signing """ + """creates a message digest for signing""" return "SHA-256=" + b64encode(hashlib.sha256(data.encode("utf-8")).digest()).decode( "utf-8" ) def verify_digest(request): - """ checks if a digest is syntactically valid and matches the message """ + """checks if a digest is syntactically valid and matches the message""" algorithm, digest = request.headers["digest"].split("=", 1) if algorithm == "SHA-256": hash_function = hashlib.sha256 @@ -66,7 +66,7 @@ def verify_digest(request): class Signature: - """ read and validate incoming signatures """ + """read and validate incoming signatures""" def __init__(self, key_id, headers, signature): self.key_id = key_id @@ -75,7 +75,7 @@ class Signature: @classmethod def parse(cls, request): - """ extract and parse a signature from an http request """ + """extract and parse a signature from an http request""" signature_dict = {} for pair in request.headers["Signature"].split(","): k, v = pair.split("=", 1) @@ -92,7 +92,7 @@ class Signature: return cls(key_id, headers, signature) def verify(self, public_key, request): - """ verify rsa signature """ + """verify rsa signature""" if http_date_age(request.headers["date"]) > MAX_SIGNATURE_AGE: raise ValueError("Request too old: %s" % (request.headers["date"],)) public_key = RSA.import_key(public_key) @@ -118,7 +118,7 @@ class Signature: def http_date_age(datestr): - """ age of a signature in seconds """ + """age of a signature in seconds""" parsed = datetime.datetime.strptime(datestr, "%a, %d %b %Y %H:%M:%S GMT") delta = datetime.datetime.utcnow() - parsed return delta.total_seconds() diff --git a/bookwyrm/status.py b/bookwyrm/status.py index 793bd742..09fbdc06 100644 --- a/bookwyrm/status.py +++ b/bookwyrm/status.py @@ -6,7 +6,7 @@ from bookwyrm.sanitize_html import InputHtmlParser def create_generated_note(user, content, mention_books=None, privacy="public"): - """ a note created by the app about user activity """ + """a note created by the app about user activity""" # sanitize input html parser = InputHtmlParser() parser.feed(content) diff --git a/bookwyrm/templatetags/bookwyrm_tags.py b/bookwyrm/templatetags/bookwyrm_tags.py index bd14a410..2ed0cbc2 100644 --- a/bookwyrm/templatetags/bookwyrm_tags.py +++ b/bookwyrm/templatetags/bookwyrm_tags.py @@ -13,13 +13,13 @@ register = template.Library() @register.filter(name="dict_key") def dict_key(d, k): - """ Returns the given key from a dictionary. """ + """Returns the given key from a dictionary.""" return d.get(k) or 0 @register.filter(name="rating") def get_rating(book, user): - """ get the overall rating of a book """ + """get the overall rating of a book""" queryset = views.helpers.privacy_filter( user, models.Review.objects.filter(book=book) ) @@ -28,7 +28,7 @@ def get_rating(book, user): @register.filter(name="user_rating") def get_user_rating(book, user): - """ get a user's rating of a book """ + """get a user's rating of a book""" rating = ( models.Review.objects.filter( user=user, @@ -45,19 +45,19 @@ def get_user_rating(book, user): @register.filter(name="username") def get_user_identifier(user): - """ use localname for local users, username for remote """ + """use localname for local users, username for remote""" return user.localname if user.localname else user.username @register.filter(name="notification_count") def get_notification_count(user): - """ how many UNREAD notifications are there """ + """how many UNREAD notifications are there""" return user.notification_set.filter(read=False).count() @register.filter(name="replies") def get_replies(status): - """ get all direct replies to a status """ + """get all direct replies to a status""" # TODO: this limit could cause problems return models.Status.objects.filter( reply_parent=status, @@ -67,7 +67,7 @@ def get_replies(status): @register.filter(name="parent") def get_parent(status): - """ get the reply parent for a status """ + """get the reply parent for a status""" return ( models.Status.objects.filter(id=status.reply_parent_id) .select_subclasses() @@ -77,7 +77,7 @@ def get_parent(status): @register.filter(name="liked") def get_user_liked(user, status): - """ did the given user fav a status? """ + """did the given user fav a status?""" try: models.Favorite.objects.get(user=user, status=status) return True @@ -87,13 +87,13 @@ def get_user_liked(user, status): @register.filter(name="boosted") def get_user_boosted(user, status): - """ did the given user fav a status? """ + """did the given user fav a status?""" return user.id in status.boosters.all().values_list("user", flat=True) @register.filter(name="follow_request_exists") def follow_request_exists(user, requester): - """ see if there is a pending follow request for a user """ + """see if there is a pending follow request for a user""" try: models.UserFollowRequest.objects.filter( user_subject=requester, @@ -106,7 +106,7 @@ def follow_request_exists(user, requester): @register.filter(name="boosted_status") def get_boosted(boost): - """ load a boosted status. have to do this or it wont get foregin keys """ + """load a boosted status. have to do this or it wont get foregin keys""" return ( models.Status.objects.select_subclasses() .filter(id=boost.boosted_status.id) @@ -116,19 +116,19 @@ def get_boosted(boost): @register.filter(name="book_description") def get_book_description(book): - """ use the work's text if the book doesn't have it """ + """use the work's text if the book doesn't have it""" return book.description or book.parent_work.description @register.filter(name="uuid") def get_uuid(identifier): - """ for avoiding clashing ids when there are many forms """ + """for avoiding clashing ids when there are many forms""" return "%s%s" % (identifier, uuid4()) @register.filter(name="to_markdown") def get_markdown(content): - """ convert markdown to html """ + """convert markdown to html""" if content: return to_markdown(content) return None @@ -136,7 +136,7 @@ def get_markdown(content): @register.filter(name="mentions") def get_mentions(status, user): - """ people to @ in a reply: the parent and all mentions """ + """people to @ in a reply: the parent and all mentions""" mentions = set([status.user] + list(status.mention_users.all())) return ( " ".join("@" + get_user_identifier(m) for m in mentions if not m == user) + " " @@ -145,7 +145,7 @@ def get_mentions(status, user): @register.filter(name="status_preview_name") def get_status_preview_name(obj): - """ text snippet with book context for a status """ + """text snippet with book context for a status""" name = obj.__class__.__name__.lower() if name == "review": return "%s of %s" % (name, obj.book.title) @@ -158,7 +158,7 @@ def get_status_preview_name(obj): @register.filter(name="next_shelf") def get_next_shelf(current_shelf): - """ shelf you'd use to update reading progress """ + """shelf you'd use to update reading progress""" if current_shelf == "to-read": return "reading" if current_shelf == "reading": @@ -170,7 +170,7 @@ def get_next_shelf(current_shelf): @register.filter(name="title") def get_title(book): - """ display the subtitle if the title is short """ + """display the subtitle if the title is short""" if not book: return "" title = book.title @@ -181,7 +181,7 @@ def get_title(book): @register.simple_tag(takes_context=False) def related_status(notification): - """ for notifications """ + """for notifications""" if not notification.related_status: return None if hasattr(notification.related_status, "quotation"): @@ -195,7 +195,7 @@ def related_status(notification): @register.simple_tag(takes_context=True) def active_shelf(context, book): - """ check what shelf a user has a book on, if any """ + """check what shelf a user has a book on, if any""" shelf = models.ShelfBook.objects.filter( shelf__user=context["request"].user, book__in=book.parent_work.editions.all() ).first() @@ -204,7 +204,7 @@ def active_shelf(context, book): @register.simple_tag(takes_context=False) def latest_read_through(book, user): - """ the most recent read activity """ + """the most recent read activity""" return ( models.ReadThrough.objects.filter(user=user, book=book) .order_by("-start_date") @@ -214,7 +214,7 @@ def latest_read_through(book, user): @register.simple_tag(takes_context=False) def active_read_through(book, user): - """ the most recent read activity """ + """the most recent read activity""" return ( models.ReadThrough.objects.filter( user=user, book=book, finish_date__isnull=True @@ -226,12 +226,12 @@ def active_read_through(book, user): @register.simple_tag(takes_context=False) def comparison_bool(str1, str2): - """ idk why I need to write a tag for this, it reutrns a bool """ + """idk why I need to write a tag for this, it reutrns a bool""" return str1 == str2 @register.simple_tag(takes_context=False) def get_lang(): - """ get current language, strip to the first two letters """ + """get current language, strip to the first two letters""" language = utils.translation.get_language() return language[0 : language.find("-")] diff --git a/bookwyrm/tests/activitypub/test_base_activity.py b/bookwyrm/tests/activitypub/test_base_activity.py index 8ec0b703..77844a22 100644 --- a/bookwyrm/tests/activitypub/test_base_activity.py +++ b/bookwyrm/tests/activitypub/test_base_activity.py @@ -21,10 +21,10 @@ from bookwyrm import models @patch("bookwyrm.activitystreams.ActivityStream.add_status") class BaseActivity(TestCase): - """ the super class for model-linked activitypub dataclasses """ + """the super class for model-linked activitypub dataclasses""" def setUp(self): - """ we're probably going to re-use this so why copy/paste """ + """we're probably going to re-use this so why copy/paste""" self.user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" ) @@ -45,28 +45,28 @@ class BaseActivity(TestCase): self.image_data = output.getvalue() def test_init(self, _): - """ simple successfuly init """ + """simple successfuly init""" instance = ActivityObject(id="a", type="b") self.assertTrue(hasattr(instance, "id")) self.assertTrue(hasattr(instance, "type")) def test_init_missing(self, _): - """ init with missing required params """ + """init with missing required params""" with self.assertRaises(ActivitySerializerError): ActivityObject() def test_init_extra_fields(self, _): - """ init ignoring additional fields """ + """init ignoring additional fields""" instance = ActivityObject(id="a", type="b", fish="c") self.assertTrue(hasattr(instance, "id")) self.assertTrue(hasattr(instance, "type")) def test_init_default_field(self, _): - """ replace an existing required field with a default field """ + """replace an existing required field with a default field""" @dataclass(init=False) class TestClass(ActivityObject): - """ test class with default field """ + """test class with default field""" type: str = "TestObject" @@ -75,7 +75,7 @@ class BaseActivity(TestCase): self.assertEqual(instance.type, "TestObject") def test_serialize(self, _): - """ simple function for converting dataclass to dict """ + """simple function for converting dataclass to dict""" instance = ActivityObject(id="a", type="b") serialized = instance.serialize() self.assertIsInstance(serialized, dict) @@ -84,7 +84,7 @@ class BaseActivity(TestCase): @responses.activate def test_resolve_remote_id(self, _): - """ look up or load remote data """ + """look up or load remote data""" # existing item result = resolve_remote_id("http://example.com/a/b", model=models.User) self.assertEqual(result, self.user) @@ -106,14 +106,14 @@ class BaseActivity(TestCase): self.assertEqual(result.name, "MOUSE?? MOUSE!!") def test_to_model_invalid_model(self, _): - """ catch mismatch between activity type and model type """ + """catch mismatch between activity type and model type""" instance = ActivityObject(id="a", type="b") with self.assertRaises(ActivitySerializerError): instance.to_model(model=models.User) @responses.activate def test_to_model_image(self, _): - """ update an image field """ + """update an image field""" activity = activitypub.Person( id=self.user.remote_id, name="New Name", @@ -146,7 +146,7 @@ class BaseActivity(TestCase): self.assertEqual(self.user.key_pair.public_key, "hi") def test_to_model_many_to_many(self, _): - """ annoying that these all need special handling """ + """annoying that these all need special handling""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): status = models.Status.objects.create( content="test status", @@ -216,7 +216,7 @@ class BaseActivity(TestCase): @responses.activate def test_set_related_field(self, _): - """ celery task to add back-references to created objects """ + """celery task to add back-references to created objects""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): status = models.Status.objects.create( content="test status", diff --git a/bookwyrm/tests/activitypub/test_quotation.py b/bookwyrm/tests/activitypub/test_quotation.py index 1f429dd2..c90348bc 100644 --- a/bookwyrm/tests/activitypub/test_quotation.py +++ b/bookwyrm/tests/activitypub/test_quotation.py @@ -8,10 +8,10 @@ from bookwyrm import activitypub, models class Quotation(TestCase): - """ we have hecka ways to create statuses """ + """we have hecka ways to create statuses""" def setUp(self): - """ model objects we'll need """ + """model objects we'll need""" with patch("bookwyrm.models.user.set_remote_server.delay"): self.user = models.User.objects.create_user( "mouse", @@ -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 Quoteation ap object from json""" quotation = activitypub.Quotation(**self.status_data) self.assertEqual(quotation.type, "Quotation") @@ -41,7 +41,7 @@ class Quotation(TestCase): self.assertEqual(quotation.published, "2020-05-10T02:38:31.150343+00:00") def test_activity_to_model(self): - """ create a model instance from an activity object """ + """create a model instance from an activity object""" activity = activitypub.Quotation(**self.status_data) quotation = activity.to_model(model=models.Quotation) diff --git a/bookwyrm/tests/connectors/test_abstract_connector.py b/bookwyrm/tests/connectors/test_abstract_connector.py index 97190c16..4497b4e5 100644 --- a/bookwyrm/tests/connectors/test_abstract_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_connector.py @@ -10,10 +10,10 @@ from bookwyrm.settings import DOMAIN class AbstractConnector(TestCase): - """ generic code for connecting to outside data sources """ + """generic code for connecting to outside data sources""" def setUp(self): - """ we need an example connector """ + """we need an example connector""" self.connector_info = models.Connector.objects.create( identifier="example.com", connector_file="openlibrary", @@ -38,7 +38,7 @@ class AbstractConnector(TestCase): self.edition_data = edition_data class TestConnector(abstract_connector.AbstractConnector): - """ nothing added here """ + """nothing added here""" def format_search_result(self, search_result): return search_result @@ -81,18 +81,18 @@ class AbstractConnector(TestCase): ) def test_abstract_connector_init(self): - """ barebones connector for search with defaults """ + """barebones connector for search with defaults""" self.assertIsInstance(self.connector.book_mappings, list) def test_is_available(self): - """ this isn't used.... """ + """this isn't used....""" self.assertTrue(self.connector.is_available()) self.connector.max_query_count = 1 self.connector.connector.query_count = 2 self.assertFalse(self.connector.is_available()) def test_get_or_create_book_existing(self): - """ find an existing book by remote/origin id """ + """find an existing book by remote/origin id""" self.assertEqual(models.Book.objects.count(), 1) self.assertEqual( self.book.remote_id, "https://%s/book/%d" % (DOMAIN, self.book.id) @@ -113,7 +113,7 @@ class AbstractConnector(TestCase): @responses.activate def test_get_or_create_book_deduped(self): - """ load remote data and deduplicate """ + """load remote data and deduplicate""" responses.add( responses.GET, "https://example.com/book/abcd", json=self.edition_data ) @@ -125,7 +125,7 @@ class AbstractConnector(TestCase): @responses.activate def test_get_or_create_author(self): - """ load an author """ + """load an author""" self.connector.author_mappings = [ Mapping("id"), Mapping("name"), @@ -142,7 +142,7 @@ class AbstractConnector(TestCase): self.assertEqual(result.origin_id, "https://www.example.com/author") def test_get_or_create_author_existing(self): - """ get an existing author """ + """get an existing author""" author = models.Author.objects.create(name="Test Author") result = self.connector.get_or_create_author(author.remote_id) self.assertEqual(author, result) diff --git a/bookwyrm/tests/connectors/test_abstract_minimal_connector.py b/bookwyrm/tests/connectors/test_abstract_minimal_connector.py index fa7c85f4..bc5625c9 100644 --- a/bookwyrm/tests/connectors/test_abstract_minimal_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_minimal_connector.py @@ -8,10 +8,10 @@ from bookwyrm.connectors.abstract_connector import Mapping, SearchResult class AbstractConnector(TestCase): - """ generic code for connecting to outside data sources """ + """generic code for connecting to outside data sources""" def setUp(self): - """ we need an example connector """ + """we need an example connector""" self.connector_info = models.Connector.objects.create( identifier="example.com", connector_file="openlibrary", @@ -23,7 +23,7 @@ class AbstractConnector(TestCase): ) class TestConnector(abstract_connector.AbstractMinimalConnector): - """ nothing added here """ + """nothing added here""" def format_search_result(self, search_result): return search_result @@ -43,7 +43,7 @@ class AbstractConnector(TestCase): self.test_connector = TestConnector("example.com") def test_abstract_minimal_connector_init(self): - """ barebones connector for search with defaults """ + """barebones connector for search with defaults""" connector = self.test_connector self.assertEqual(connector.connector, self.connector_info) self.assertEqual(connector.base_url, "https://example.com") @@ -58,7 +58,7 @@ class AbstractConnector(TestCase): @responses.activate def test_search(self): - """ makes an http request to the outside service """ + """makes an http request to the outside service""" responses.add( responses.GET, "https://example.com/search?q=a%20book%20title", @@ -73,7 +73,7 @@ class AbstractConnector(TestCase): @responses.activate def test_search_min_confidence(self): - """ makes an http request to the outside service """ + """makes an http request to the outside service""" responses.add( responses.GET, "https://example.com/search?q=a%20book%20title&min_confidence=1", @@ -85,7 +85,7 @@ class AbstractConnector(TestCase): @responses.activate def test_isbn_search(self): - """ makes an http request to the outside service """ + """makes an http request to the outside service""" responses.add( responses.GET, "https://example.com/isbn?q=123456", @@ -96,7 +96,7 @@ class AbstractConnector(TestCase): self.assertEqual(len(results), 10) def test_search_result(self): - """ a class that stores info about a search result """ + """a class that stores info about a search result""" result = SearchResult( title="Title", key="https://example.com/book/1", @@ -109,21 +109,21 @@ class AbstractConnector(TestCase): self.assertEqual(result.title, "Title") def test_create_mapping(self): - """ maps remote fields for book data to bookwyrm activitypub fields """ + """maps remote fields for book data to bookwyrm activitypub fields""" mapping = Mapping("isbn") self.assertEqual(mapping.local_field, "isbn") self.assertEqual(mapping.remote_field, "isbn") self.assertEqual(mapping.formatter("bb"), "bb") def test_create_mapping_with_remote(self): - """ the remote field is different than the local field """ + """the remote field is different than the local field""" mapping = Mapping("isbn", remote_field="isbn13") self.assertEqual(mapping.local_field, "isbn") self.assertEqual(mapping.remote_field, "isbn13") self.assertEqual(mapping.formatter("bb"), "bb") def test_create_mapping_with_formatter(self): - """ a function is provided to modify the data """ + """a function is provided to modify the data""" formatter = lambda x: "aa" + x mapping = Mapping("isbn", formatter=formatter) self.assertEqual(mapping.local_field, "isbn") diff --git a/bookwyrm/tests/connectors/test_bookwyrm_connector.py b/bookwyrm/tests/connectors/test_bookwyrm_connector.py index 386c1350..46ea54a9 100644 --- a/bookwyrm/tests/connectors/test_bookwyrm_connector.py +++ b/bookwyrm/tests/connectors/test_bookwyrm_connector.py @@ -9,10 +9,10 @@ from bookwyrm.connectors.abstract_connector import SearchResult class BookWyrmConnector(TestCase): - """ this connector doesn't do much, just search """ + """this connector doesn't do much, just search""" def setUp(self): - """ create the connector """ + """create the connector""" models.Connector.objects.create( identifier="example.com", connector_file="bookwyrm_connector", @@ -24,14 +24,14 @@ class BookWyrmConnector(TestCase): self.connector = Connector("example.com") def test_get_or_create_book_existing(self): - """ load book activity """ + """load book activity""" work = models.Work.objects.create(title="Test Work") book = models.Edition.objects.create(title="Test Edition", parent_work=work) result = self.connector.get_or_create_book(book.remote_id) self.assertEqual(book, result) def test_format_search_result(self): - """ create a SearchResult object from search response json """ + """create a SearchResult object from search response json""" datafile = pathlib.Path(__file__).parent.joinpath("../data/bw_search.json") search_data = json.loads(datafile.read_bytes()) results = self.connector.parse_search_data(search_data) @@ -46,7 +46,7 @@ class BookWyrmConnector(TestCase): self.assertEqual(result.connector, self.connector) def test_format_isbn_search_result(self): - """ just gotta attach the connector """ + """just gotta attach the connector""" datafile = pathlib.Path(__file__).parent.joinpath("../data/bw_search.json") search_data = json.loads(datafile.read_bytes()) results = self.connector.parse_isbn_search_data(search_data) diff --git a/bookwyrm/tests/connectors/test_connector_manager.py b/bookwyrm/tests/connectors/test_connector_manager.py index 52589323..feded616 100644 --- a/bookwyrm/tests/connectors/test_connector_manager.py +++ b/bookwyrm/tests/connectors/test_connector_manager.py @@ -8,10 +8,10 @@ from bookwyrm.connectors.self_connector import Connector as SelfConnector class ConnectorManager(TestCase): - """ interface between the app and various connectors """ + """interface between the app and various connectors""" def setUp(self): - """ we'll need some books and a connector info entry """ + """we'll need some books and a connector info entry""" self.work = models.Work.objects.create(title="Example Work") self.edition = models.Edition.objects.create( @@ -32,7 +32,7 @@ class ConnectorManager(TestCase): ) def test_get_or_create_connector(self): - """ loads a connector if the data source is known or creates one """ + """loads a connector if the data source is known or creates one""" remote_id = "https://example.com/object/1" connector = connector_manager.get_or_create_connector(remote_id) self.assertIsInstance(connector, BookWyrmConnector) @@ -43,7 +43,7 @@ class ConnectorManager(TestCase): self.assertEqual(connector.identifier, same_connector.identifier) def test_get_connectors(self): - """ load all connectors """ + """load all connectors""" remote_id = "https://example.com/object/1" connector_manager.get_or_create_connector(remote_id) connectors = list(connector_manager.get_connectors()) @@ -52,7 +52,7 @@ class ConnectorManager(TestCase): self.assertIsInstance(connectors[1], BookWyrmConnector) def test_search(self): - """ search all connectors """ + """search all connectors""" results = connector_manager.search("Example") self.assertEqual(len(results), 1) self.assertIsInstance(results[0]["connector"], SelfConnector) @@ -60,7 +60,7 @@ class ConnectorManager(TestCase): self.assertEqual(results[0]["results"][0].title, "Example Edition") def test_search_isbn(self): - """ special handling if a query resembles an isbn """ + """special handling if a query resembles an isbn""" results = connector_manager.search("0000000000") self.assertEqual(len(results), 1) self.assertIsInstance(results[0]["connector"], SelfConnector) @@ -68,20 +68,20 @@ class ConnectorManager(TestCase): self.assertEqual(results[0]["results"][0].title, "Example Edition") def test_local_search(self): - """ search only the local database """ + """search only the local database""" results = connector_manager.local_search("Example") self.assertEqual(len(results), 1) self.assertEqual(results[0].title, "Example Edition") def test_first_search_result(self): - """ only get one search result """ + """only get one search result""" result = connector_manager.first_search_result("Example") self.assertEqual(result.title, "Example Edition") no_result = connector_manager.first_search_result("dkjfhg") self.assertIsNone(no_result) def test_load_connector(self): - """ load a connector object from the database entry """ + """load a connector object from the database entry""" connector = connector_manager.load_connector(self.connector) self.assertIsInstance(connector, SelfConnector) self.assertEqual(connector.identifier, "test_connector") diff --git a/bookwyrm/tests/connectors/test_openlibrary_connector.py b/bookwyrm/tests/connectors/test_openlibrary_connector.py index 3cff4fb0..699b26ed 100644 --- a/bookwyrm/tests/connectors/test_openlibrary_connector.py +++ b/bookwyrm/tests/connectors/test_openlibrary_connector.py @@ -16,10 +16,10 @@ from bookwyrm.connectors.connector_manager import ConnectorException class Openlibrary(TestCase): - """ test loading data from openlibrary.org """ + """test loading data from openlibrary.org""" def setUp(self): - """ creates the connector we'll use """ + """creates the connector we'll use""" models.Connector.objects.create( identifier="openlibrary.org", name="OpenLibrary", @@ -42,7 +42,7 @@ class Openlibrary(TestCase): self.edition_list_data = json.loads(edition_list_file.read_bytes()) def test_get_remote_id_from_data(self): - """ format the remote id from the data """ + """format the remote id from the data""" data = {"key": "/work/OL1234W"} result = self.connector.get_remote_id_from_data(data) self.assertEqual(result, "https://openlibrary.org/work/OL1234W") @@ -51,13 +51,13 @@ class Openlibrary(TestCase): self.connector.get_remote_id_from_data({}) def test_is_work_data(self): - """ detect if the loaded json is a work """ + """detect if the loaded json is a work""" self.assertEqual(self.connector.is_work_data(self.work_data), True) self.assertEqual(self.connector.is_work_data(self.edition_data), False) @responses.activate def test_get_edition_from_work_data(self): - """ loads a list of editions """ + """loads a list of editions""" data = {"key": "/work/OL1234W"} responses.add( responses.GET, @@ -74,7 +74,7 @@ class Openlibrary(TestCase): @responses.activate def test_get_work_from_edition_data(self): - """ loads a list of editions """ + """loads a list of editions""" data = {"works": [{"key": "/work/OL1234W"}]} responses.add( responses.GET, @@ -87,7 +87,7 @@ class Openlibrary(TestCase): @responses.activate def test_get_authors_from_data(self): - """ find authors in data """ + """find authors in data""" responses.add( responses.GET, "https://openlibrary.org/authors/OL382982A", @@ -112,13 +112,13 @@ class Openlibrary(TestCase): self.assertEqual(result.openlibrary_key, "OL453734A") def test_get_cover_url(self): - """ formats a url that should contain the cover image """ + """formats a url that should contain the cover image""" blob = ["image"] result = self.connector.get_cover_url(blob) self.assertEqual(result, "https://covers.openlibrary.org/b/id/image-L.jpg") def test_parse_search_result(self): - """ extract the results from the search json response """ + """extract the results from the search json response""" datafile = pathlib.Path(__file__).parent.joinpath("../data/ol_search.json") search_data = json.loads(datafile.read_bytes()) result = self.connector.parse_search_data(search_data) @@ -126,7 +126,7 @@ class Openlibrary(TestCase): self.assertEqual(len(result), 2) def test_format_search_result(self): - """ translate json from openlibrary into SearchResult """ + """translate json from openlibrary into SearchResult""" datafile = pathlib.Path(__file__).parent.joinpath("../data/ol_search.json") search_data = json.loads(datafile.read_bytes()) results = self.connector.parse_search_data(search_data) @@ -141,7 +141,7 @@ class Openlibrary(TestCase): self.assertEqual(result.connector, self.connector) def test_parse_isbn_search_result(self): - """ extract the results from the search json response """ + """extract the results from the search json response""" datafile = pathlib.Path(__file__).parent.joinpath("../data/ol_isbn_search.json") search_data = json.loads(datafile.read_bytes()) result = self.connector.parse_isbn_search_data(search_data) @@ -149,7 +149,7 @@ class Openlibrary(TestCase): self.assertEqual(len(result), 1) def test_format_isbn_search_result(self): - """ translate json from openlibrary into SearchResult """ + """translate json from openlibrary into SearchResult""" datafile = pathlib.Path(__file__).parent.joinpath("../data/ol_isbn_search.json") search_data = json.loads(datafile.read_bytes()) results = self.connector.parse_isbn_search_data(search_data) @@ -165,7 +165,7 @@ class Openlibrary(TestCase): @responses.activate def test_load_edition_data(self): - """ format url from key and make request """ + """format url from key and make request""" key = "OL1234W" responses.add( responses.GET, @@ -177,7 +177,7 @@ class Openlibrary(TestCase): @responses.activate def test_expand_book_data(self): - """ given a book, get more editions """ + """given a book, get more editions""" work = models.Work.objects.create(title="Test Work", openlibrary_key="OL1234W") edition = models.Edition.objects.create(title="Test Edition", parent_work=work) @@ -194,29 +194,29 @@ class Openlibrary(TestCase): self.connector.expand_book_data(work) def test_get_description(self): - """ should do some cleanup on the description data """ + """should do some cleanup on the description data""" description = get_description(self.work_data["description"]) expected = "First in the Old Kingdom/Abhorsen series." self.assertEqual(description, expected) def test_get_openlibrary_key(self): - """ extracts the uuid """ + """extracts the uuid""" key = get_openlibrary_key("/books/OL27320736M") self.assertEqual(key, "OL27320736M") def test_get_languages(self): - """ looks up languages from a list """ + """looks up languages from a list""" languages = get_languages(self.edition_data["languages"]) self.assertEqual(languages, ["English"]) def test_pick_default_edition(self): - """ detect if the loaded json is an edition """ + """detect if the loaded json is an edition""" edition = pick_default_edition(self.edition_list_data["entries"]) self.assertEqual(edition["key"], "/books/OL9788823M") @responses.activate def test_create_edition_from_data(self): - """ okay but can it actually create an edition with proper metadata """ + """okay but can it actually create an edition with proper metadata""" work = models.Work.objects.create(title="Hello") responses.add( responses.GET, @@ -240,7 +240,7 @@ class Openlibrary(TestCase): self.assertEqual(result.physical_format, "Hardcover") def test_ignore_edition(self): - """ skip editions with poor metadata """ + """skip editions with poor metadata""" self.assertFalse(ignore_edition({"isbn_13": "hi"})) self.assertFalse(ignore_edition({"oclc_numbers": "hi"})) self.assertFalse(ignore_edition({"covers": "hi"})) diff --git a/bookwyrm/tests/connectors/test_self_connector.py b/bookwyrm/tests/connectors/test_self_connector.py index 9925f594..eee7d00c 100644 --- a/bookwyrm/tests/connectors/test_self_connector.py +++ b/bookwyrm/tests/connectors/test_self_connector.py @@ -9,10 +9,10 @@ from bookwyrm.settings import DOMAIN class SelfConnector(TestCase): - """ just uses local data """ + """just uses local data""" def setUp(self): - """ creating the connector """ + """creating the connector""" models.Connector.objects.create( identifier=DOMAIN, name="Local", @@ -27,7 +27,7 @@ class SelfConnector(TestCase): self.connector = Connector(DOMAIN) def test_format_search_result(self): - """ create a SearchResult """ + """create a SearchResult""" author = models.Author.objects.create(name="Anonymous") edition = models.Edition.objects.create( title="Edition of Example Work", @@ -42,7 +42,7 @@ class SelfConnector(TestCase): self.assertEqual(result.connector, self.connector) def test_search_rank(self): - """ prioritize certain results """ + """prioritize certain results""" author = models.Author.objects.create(name="Anonymous") edition = models.Edition.objects.create( title="Edition of Example Work", @@ -78,7 +78,7 @@ class SelfConnector(TestCase): self.assertEqual(results[2].title, "Edition of Example Work") def test_search_multiple_editions(self): - """ it should get rid of duplicate editions for the same work """ + """it should get rid of duplicate editions for the same work""" work = models.Work.objects.create(title="Work Title") edition_1 = models.Edition.objects.create( title="Edition 1 Title", parent_work=work diff --git a/bookwyrm/tests/importers/test_goodreads_import.py b/bookwyrm/tests/importers/test_goodreads_import.py index 6e9caaf4..0e39d5ec 100644 --- a/bookwyrm/tests/importers/test_goodreads_import.py +++ b/bookwyrm/tests/importers/test_goodreads_import.py @@ -14,10 +14,10 @@ from bookwyrm.settings import DOMAIN class GoodreadsImport(TestCase): - """ importing from goodreads csv """ + """importing from goodreads csv""" def setUp(self): - """ use a test csv """ + """use a test csv""" self.importer = GoodreadsImporter() datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") self.csv = open(datafile, "r", encoding=self.importer.encoding) @@ -44,7 +44,7 @@ class GoodreadsImport(TestCase): ) def test_create_job(self): - """ creates the import job entry and checks csv """ + """creates the import job entry and checks csv""" import_job = self.importer.create_job(self.user, self.csv, False, "public") self.assertEqual(import_job.user, self.user) self.assertEqual(import_job.include_reviews, False) @@ -60,7 +60,7 @@ class GoodreadsImport(TestCase): self.assertEqual(import_items[2].data["Book Id"], "28694510") def test_create_retry_job(self): - """ trying again with items that didn't import """ + """trying again with items that didn't import""" import_job = self.importer.create_job(self.user, self.csv, False, "unlisted") import_items = models.ImportItem.objects.filter(job=import_job).all()[:2] @@ -78,7 +78,7 @@ class GoodreadsImport(TestCase): self.assertEqual(retry_items[1].data["Book Id"], "52691223") def test_start_import(self): - """ begin loading books """ + """begin loading books""" import_job = self.importer.create_job(self.user, self.csv, False, "unlisted") MockTask = namedtuple("Task", ("id")) mock_task = MockTask(7) @@ -90,7 +90,7 @@ class GoodreadsImport(TestCase): @responses.activate def test_import_data(self): - """ resolve entry """ + """resolve entry""" import_job = self.importer.create_job(self.user, self.csv, False, "unlisted") book = models.Edition.objects.create(title="Test Book") @@ -105,7 +105,7 @@ class GoodreadsImport(TestCase): self.assertEqual(import_item.book.id, book.id) def test_handle_imported_book(self): - """ goodreads import added a book, this adds related connections """ + """goodreads import added a book, this adds related connections""" shelf = self.user.shelf_set.filter(identifier="read").first() self.assertIsNone(shelf.books.first()) @@ -138,7 +138,7 @@ class GoodreadsImport(TestCase): self.assertEqual(readthrough.finish_date.day, 25) def test_handle_imported_book_already_shelved(self): - """ goodreads import added a book, this adds related connections """ + """goodreads import added a book, this adds related connections""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): shelf = self.user.shelf_set.filter(identifier="to-read").first() models.ShelfBook.objects.create(shelf=shelf, user=self.user, book=self.book) @@ -171,7 +171,7 @@ class GoodreadsImport(TestCase): self.assertEqual(readthrough.finish_date.day, 25) def test_handle_import_twice(self): - """ re-importing books """ + """re-importing books""" shelf = self.user.shelf_set.filter(identifier="read").first() import_job = models.ImportJob.objects.create(user=self.user) datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") @@ -206,7 +206,7 @@ class GoodreadsImport(TestCase): @patch("bookwyrm.activitystreams.ActivityStream.add_status") def test_handle_imported_book_review(self, _): - """ goodreads review import """ + """goodreads review import""" import_job = models.ImportJob.objects.create(user=self.user) datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") csv_file = open(datafile, "r") @@ -229,7 +229,7 @@ class GoodreadsImport(TestCase): self.assertEqual(review.privacy, "unlisted") def test_handle_imported_book_reviews_disabled(self): - """ goodreads review import """ + """goodreads review import""" import_job = models.ImportJob.objects.create(user=self.user) datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") csv_file = open(datafile, "r") diff --git a/bookwyrm/tests/importers/test_librarything_import.py b/bookwyrm/tests/importers/test_librarything_import.py index 5e1d778e..5ae0944c 100644 --- a/bookwyrm/tests/importers/test_librarything_import.py +++ b/bookwyrm/tests/importers/test_librarything_import.py @@ -13,10 +13,10 @@ from bookwyrm.settings import DOMAIN class LibrarythingImport(TestCase): - """ importing from librarything tsv """ + """importing from librarything tsv""" def setUp(self): - """ use a test tsv """ + """use a test tsv""" self.importer = LibrarythingImporter() datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv") @@ -45,7 +45,7 @@ class LibrarythingImport(TestCase): ) def test_create_job(self): - """ creates the import job entry and checks csv """ + """creates the import job entry and checks csv""" import_job = self.importer.create_job(self.user, self.csv, False, "public") self.assertEqual(import_job.user, self.user) self.assertEqual(import_job.include_reviews, False) @@ -61,7 +61,7 @@ class LibrarythingImport(TestCase): self.assertEqual(import_items[2].data["Book Id"], "5015399") def test_create_retry_job(self): - """ trying again with items that didn't import """ + """trying again with items that didn't import""" import_job = self.importer.create_job(self.user, self.csv, False, "unlisted") import_items = models.ImportItem.objects.filter(job=import_job).all()[:2] @@ -80,7 +80,7 @@ class LibrarythingImport(TestCase): @responses.activate def test_import_data(self): - """ resolve entry """ + """resolve entry""" import_job = self.importer.create_job(self.user, self.csv, False, "unlisted") book = models.Edition.objects.create(title="Test Book") @@ -95,7 +95,7 @@ class LibrarythingImport(TestCase): self.assertEqual(import_item.book.id, book.id) def test_handle_imported_book(self): - """ librarything import added a book, this adds related connections """ + """librarything import added a book, this adds related connections""" shelf = self.user.shelf_set.filter(identifier="read").first() self.assertIsNone(shelf.books.first()) @@ -130,7 +130,7 @@ class LibrarythingImport(TestCase): self.assertEqual(readthrough.finish_date.day, 8) def test_handle_imported_book_already_shelved(self): - """ librarything import added a book, this adds related connections """ + """librarything import added a book, this adds related connections""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): shelf = self.user.shelf_set.filter(identifier="to-read").first() models.ShelfBook.objects.create(shelf=shelf, user=self.user, book=self.book) @@ -165,7 +165,7 @@ class LibrarythingImport(TestCase): self.assertEqual(readthrough.finish_date.day, 8) def test_handle_import_twice(self): - """ re-importing books """ + """re-importing books""" shelf = self.user.shelf_set.filter(identifier="read").first() import_job = models.ImportJob.objects.create(user=self.user) datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv") @@ -202,7 +202,7 @@ class LibrarythingImport(TestCase): @patch("bookwyrm.activitystreams.ActivityStream.add_status") def test_handle_imported_book_review(self, _): - """ librarything review import """ + """librarything review import""" import_job = models.ImportJob.objects.create(user=self.user) datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv") csv_file = open(datafile, "r", encoding=self.importer.encoding) @@ -225,7 +225,7 @@ class LibrarythingImport(TestCase): self.assertEqual(review.privacy, "unlisted") def test_handle_imported_book_reviews_disabled(self): - """ librarything review import """ + """librarything review import""" import_job = models.ImportJob.objects.create(user=self.user) datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv") csv_file = open(datafile, "r", encoding=self.importer.encoding) diff --git a/bookwyrm/tests/management/test_populate_streams.py b/bookwyrm/tests/management/test_populate_streams.py index 6a9b6b8a..d187c054 100644 --- a/bookwyrm/tests/management/test_populate_streams.py +++ b/bookwyrm/tests/management/test_populate_streams.py @@ -8,10 +8,10 @@ from bookwyrm.management.commands.populate_streams import populate_streams @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") class Activitystreams(TestCase): - """ using redis to build activity streams """ + """using redis to build activity streams""" def setUp(self): - """ we need some stuff """ + """we need some stuff""" self.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "password", local=True, localname="mouse" ) @@ -31,7 +31,7 @@ class Activitystreams(TestCase): self.book = models.Edition.objects.create(title="test book") def test_populate_streams(self, _): - """ make sure the function on the redis manager gets called """ + """make sure the function on the redis manager gets called""" with patch("bookwyrm.activitystreams.ActivityStream.add_status"): models.Comment.objects.create( user=self.local_user, content="hi", book=self.book diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py index e172ede9..1c0975c4 100644 --- a/bookwyrm/tests/models/test_activitypub_mixin.py +++ b/bookwyrm/tests/models/test_activitypub_mixin.py @@ -15,10 +15,10 @@ from bookwyrm.models.activitypub_mixin import ActivityMixin, ObjectMixin @patch("bookwyrm.activitystreams.ActivityStream.add_status") class ActivitypubMixins(TestCase): - """ functionality shared across models """ + """functionality shared across models""" def setUp(self): - """ shared data """ + """shared data""" self.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.com", "mouseword", local=True, localname="mouse" ) @@ -46,16 +46,16 @@ class ActivitypubMixins(TestCase): # ActivitypubMixin def test_to_activity(self, _): - """ model to ActivityPub json """ + """model to ActivityPub json""" @dataclass(init=False) class TestActivity(ActivityObject): - """ real simple mock """ + """real simple mock""" type: str = "Test" class TestModel(ActivitypubMixin, base_model.BookWyrmModel): - """ real simple mock model because BookWyrmModel is abstract """ + """real simple mock model because BookWyrmModel is abstract""" instance = TestModel() instance.remote_id = "https://www.example.com/test" @@ -67,7 +67,7 @@ class ActivitypubMixins(TestCase): self.assertEqual(activity["type"], "Test") def test_find_existing_by_remote_id(self, _): - """ attempt to match a remote id to an object in the db """ + """attempt to match a remote id to an object in the db""" # uses a different remote id scheme # this isn't really part of this test directly but it's helpful to state book = models.Edition.objects.create( @@ -100,7 +100,7 @@ class ActivitypubMixins(TestCase): result = models.Status.find_existing_by_remote_id("https://comment.net") def test_find_existing(self, _): - """ match a blob of data to a model """ + """match a blob of data to a model""" book = models.Edition.objects.create( title="Test edition", openlibrary_key="OL1234", @@ -110,7 +110,7 @@ class ActivitypubMixins(TestCase): self.assertEqual(result, book) def test_get_recipients_public_object(self, _): - """ determines the recipients for an object's broadcast """ + """determines the recipients for an object's broadcast""" MockSelf = namedtuple("Self", ("privacy")) mock_self = MockSelf("public") recipients = ActivitypubMixin.get_recipients(mock_self) @@ -118,7 +118,7 @@ class ActivitypubMixins(TestCase): self.assertEqual(recipients[0], self.remote_user.inbox) def test_get_recipients_public_user_object_no_followers(self, _): - """ determines the recipients for a user's object broadcast """ + """determines the recipients for a user's object broadcast""" MockSelf = namedtuple("Self", ("privacy", "user")) mock_self = MockSelf("public", self.local_user) @@ -126,7 +126,7 @@ class ActivitypubMixins(TestCase): self.assertEqual(len(recipients), 0) def test_get_recipients_public_user_object(self, _): - """ determines the recipients for a user's object broadcast """ + """determines the recipients for a user's object broadcast""" MockSelf = namedtuple("Self", ("privacy", "user")) mock_self = MockSelf("public", self.local_user) self.local_user.followers.add(self.remote_user) @@ -136,7 +136,7 @@ class ActivitypubMixins(TestCase): self.assertEqual(recipients[0], self.remote_user.inbox) def test_get_recipients_public_user_object_with_mention(self, _): - """ determines the recipients for a user's object broadcast """ + """determines the recipients for a user's object broadcast""" MockSelf = namedtuple("Self", ("privacy", "user")) mock_self = MockSelf("public", self.local_user) self.local_user.followers.add(self.remote_user) @@ -159,7 +159,7 @@ class ActivitypubMixins(TestCase): self.assertTrue(self.remote_user.inbox in recipients) def test_get_recipients_direct(self, _): - """ determines the recipients for a user's object broadcast """ + """determines the recipients for a user's object broadcast""" MockSelf = namedtuple("Self", ("privacy", "user")) mock_self = MockSelf("public", self.local_user) self.local_user.followers.add(self.remote_user) @@ -181,7 +181,7 @@ class ActivitypubMixins(TestCase): self.assertEqual(recipients[0], another_remote_user.inbox) def test_get_recipients_combine_inboxes(self, _): - """ should combine users with the same shared_inbox """ + """should combine users with the same shared_inbox""" self.remote_user.shared_inbox = "http://example.com/inbox" self.remote_user.save(broadcast=False) with patch("bookwyrm.models.user.set_remote_server.delay"): @@ -205,7 +205,7 @@ class ActivitypubMixins(TestCase): self.assertEqual(recipients[0], "http://example.com/inbox") def test_get_recipients_software(self, _): - """ should differentiate between bookwyrm and other remote users """ + """should differentiate between bookwyrm and other remote users""" with patch("bookwyrm.models.user.set_remote_server.delay"): another_remote_user = models.User.objects.create_user( "nutria", @@ -235,13 +235,13 @@ class ActivitypubMixins(TestCase): # ObjectMixin def test_object_save_create(self, _): - """ should save uneventufully when broadcast is disabled """ + """should save uneventufully when broadcast is disabled""" class Success(Exception): - """ this means we got to the right method """ + """this means we got to the right method""" class ObjectModel(ObjectMixin, base_model.BookWyrmModel): - """ real simple mock model because BookWyrmModel is abstract """ + """real simple mock model because BookWyrmModel is abstract""" user = models.fields.ForeignKey("User", on_delete=db.models.CASCADE) @@ -252,7 +252,7 @@ class ActivitypubMixins(TestCase): def broadcast( self, activity, sender, **kwargs ): # pylint: disable=arguments-differ - """ do something """ + """do something""" raise Success() def to_create_activity(self, user): # pylint: disable=arguments-differ @@ -266,13 +266,13 @@ class ActivitypubMixins(TestCase): ObjectModel(user=None).save() def test_object_save_update(self, _): - """ should save uneventufully when broadcast is disabled """ + """should save uneventufully when broadcast is disabled""" class Success(Exception): - """ this means we got to the right method """ + """this means we got to the right method""" class UpdateObjectModel(ObjectMixin, base_model.BookWyrmModel): - """ real simple mock model because BookWyrmModel is abstract """ + """real simple mock model because BookWyrmModel is abstract""" user = models.fields.ForeignKey("User", on_delete=db.models.CASCADE) last_edited_by = models.fields.ForeignKey( @@ -292,13 +292,13 @@ class ActivitypubMixins(TestCase): UpdateObjectModel(id=1, last_edited_by=self.local_user).save() def test_object_save_delete(self, _): - """ should create delete activities when objects are deleted by flag """ + """should create delete activities when objects are deleted by flag""" class ActivitySuccess(Exception): - """ this means we got to the right method """ + """this means we got to the right method""" class DeletableObjectModel(ObjectMixin, base_model.BookWyrmModel): - """ real simple mock model because BookWyrmModel is abstract """ + """real simple mock model because BookWyrmModel is abstract""" user = models.fields.ForeignKey("User", on_delete=db.models.CASCADE) deleted = models.fields.BooleanField() @@ -314,7 +314,7 @@ class ActivitypubMixins(TestCase): DeletableObjectModel(id=1, user=self.local_user, deleted=True).save() def test_to_delete_activity(self, _): - """ wrapper for Delete activity """ + """wrapper for Delete activity""" MockSelf = namedtuple("Self", ("remote_id", "to_activity")) mock_self = MockSelf( "https://example.com/status/1", lambda *args: self.object_mock @@ -329,7 +329,7 @@ class ActivitypubMixins(TestCase): ) def test_to_update_activity(self, _): - """ ditto above but for Update """ + """ditto above but for Update""" MockSelf = namedtuple("Self", ("remote_id", "to_activity")) mock_self = MockSelf( "https://example.com/status/1", lambda *args: self.object_mock @@ -347,7 +347,7 @@ class ActivitypubMixins(TestCase): # Activity mixin def test_to_undo_activity(self, _): - """ and again, for Undo """ + """and again, for Undo""" MockSelf = namedtuple("Self", ("remote_id", "to_activity", "user")) mock_self = MockSelf( "https://example.com/status/1", diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py index 442f98ca..5a8350b2 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -8,10 +8,10 @@ from bookwyrm.settings import DOMAIN class BaseModel(TestCase): - """ functionality shared across models """ + """functionality shared across models""" def setUp(self): - """ shared data """ + """shared data""" self.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.com", "mouseword", local=True, localname="mouse" ) @@ -27,14 +27,14 @@ class BaseModel(TestCase): ) def test_remote_id(self): - """ these should be generated """ + """these should be generated""" instance = base_model.BookWyrmModel() instance.id = 1 expected = instance.get_remote_id() self.assertEqual(expected, "https://%s/bookwyrmmodel/1" % DOMAIN) def test_remote_id_with_user(self): - """ format of remote id when there's a user object """ + """format of remote id when there's a user object""" instance = base_model.BookWyrmModel() instance.user = self.local_user instance.id = 1 @@ -42,7 +42,7 @@ class BaseModel(TestCase): self.assertEqual(expected, "https://%s/user/mouse/bookwyrmmodel/1" % DOMAIN) def test_set_remote_id(self): - """ this function sets remote ids after creation """ + """this function sets remote ids after creation""" # using Work because it BookWrymModel is abstract and this requires save # Work is a relatively not-fancy model. instance = models.Work.objects.create(title="work title") @@ -59,7 +59,7 @@ class BaseModel(TestCase): @patch("bookwyrm.activitystreams.ActivityStream.add_status") def test_object_visible_to_user(self, _): - """ does a user have permission to view an object """ + """does a user have permission to view an object""" obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="public" ) @@ -88,7 +88,7 @@ class BaseModel(TestCase): @patch("bookwyrm.activitystreams.ActivityStream.add_status") def test_object_visible_to_user_follower(self, _): - """ what you can see if you follow a user """ + """what you can see if you follow a user""" self.remote_user.followers.add(self.local_user) obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="followers" @@ -108,7 +108,7 @@ class BaseModel(TestCase): @patch("bookwyrm.activitystreams.ActivityStream.add_status") def test_object_visible_to_user_blocked(self, _): - """ you can't see it if they block you """ + """you can't see it if they block you""" self.remote_user.blocks.add(self.local_user) obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="public" diff --git a/bookwyrm/tests/models/test_book_model.py b/bookwyrm/tests/models/test_book_model.py index 14ab0c57..c80cc4a8 100644 --- a/bookwyrm/tests/models/test_book_model.py +++ b/bookwyrm/tests/models/test_book_model.py @@ -8,10 +8,10 @@ from bookwyrm.models.book import isbn_10_to_13, isbn_13_to_10 class Book(TestCase): - """ not too much going on in the books model but here we are """ + """not too much going on in the books model but here we are""" def setUp(self): - """ we'll need some books """ + """we'll need some books""" self.work = models.Work.objects.create( title="Example Work", remote_id="https://example.com/book/1" ) @@ -25,17 +25,17 @@ class Book(TestCase): ) def test_remote_id(self): - """ fanciness with remote/origin ids """ + """fanciness with remote/origin ids""" remote_id = "https://%s/book/%d" % (settings.DOMAIN, self.work.id) self.assertEqual(self.work.get_remote_id(), remote_id) self.assertEqual(self.work.remote_id, remote_id) def test_create_book(self): - """ you shouldn't be able to create Books (only editions and works) """ + """you shouldn't be able to create Books (only editions and works)""" self.assertRaises(ValueError, models.Book.objects.create, title="Invalid Book") def test_isbn_10_to_13(self): - """ checksums and so on """ + """checksums and so on""" isbn_10 = "178816167X" isbn_13 = isbn_10_to_13(isbn_10) self.assertEqual(isbn_13, "9781788161671") @@ -45,7 +45,7 @@ class Book(TestCase): self.assertEqual(isbn_13, "9781788161671") def test_isbn_13_to_10(self): - """ checksums and so on """ + """checksums and so on""" isbn_13 = "9781788161671" isbn_10 = isbn_13_to_10(isbn_13) self.assertEqual(isbn_10, "178816167X") @@ -55,7 +55,7 @@ class Book(TestCase): self.assertEqual(isbn_10, "178816167X") def test_get_edition_info(self): - """ text slug about an edition """ + """text slug about an edition""" book = models.Edition.objects.create(title="Test Edition") self.assertEqual(book.edition_info, "") @@ -77,7 +77,7 @@ class Book(TestCase): self.assertEqual(book.alt_text, "Test Edition (worm, Glorbish language, 2020)") def test_get_rank(self): - """ sets the data quality index for the book """ + """sets the data quality index for the book""" # basic rank self.assertEqual(self.first_edition.edition_rank, 0) diff --git a/bookwyrm/tests/models/test_federated_server.py b/bookwyrm/tests/models/test_federated_server.py index 4e9e8b68..43724568 100644 --- a/bookwyrm/tests/models/test_federated_server.py +++ b/bookwyrm/tests/models/test_federated_server.py @@ -6,10 +6,10 @@ from bookwyrm import models class FederatedServer(TestCase): - """ federate server management """ + """federate server management""" def setUp(self): - """ we'll need a user """ + """we'll need a user""" self.server = models.FederatedServer.objects.create(server_name="test.server") with patch("bookwyrm.models.user.set_remote_server.delay"): self.remote_user = models.User.objects.create_user( @@ -36,7 +36,7 @@ class FederatedServer(TestCase): ) def test_block_unblock(self): - """ block a server and all users on it """ + """block a server and all users on it""" self.assertEqual(self.server.status, "federated") self.assertTrue(self.remote_user.is_active) self.assertFalse(self.inactive_remote_user.is_active) diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py index 18bb028f..ea692b62 100644 --- a/bookwyrm/tests/models/test_fields.py +++ b/bookwyrm/tests/models/test_fields.py @@ -25,10 +25,10 @@ from bookwyrm.models.activitypub_mixin import ActivitypubMixin # pylint: disable=too-many-public-methods class ActivitypubFields(TestCase): - """ overwrites standard model feilds to work with activitypub """ + """overwrites standard model feilds to work with activitypub""" def test_validate_remote_id(self): - """ should look like a url """ + """should look like a url""" self.assertIsNone(fields.validate_remote_id("http://www.example.com")) self.assertIsNone(fields.validate_remote_id("https://www.example.com")) self.assertIsNone(fields.validate_remote_id("http://exle.com/dlg-23/x")) @@ -45,7 +45,7 @@ class ActivitypubFields(TestCase): ) def test_activitypub_field_mixin(self): - """ generic mixin with super basic to and from functionality """ + """generic mixin with super basic to and from functionality""" instance = fields.ActivitypubFieldMixin() self.assertEqual(instance.field_to_activity("fish"), "fish") self.assertEqual(instance.field_from_activity("fish"), "fish") @@ -63,11 +63,11 @@ class ActivitypubFields(TestCase): self.assertEqual(instance.get_activitypub_field(), "snakeCaseName") def test_set_field_from_activity(self): - """ setter from entire json blob """ + """setter from entire json blob""" @dataclass class TestModel: - """ real simple mock """ + """real simple mock""" field_name: str @@ -82,11 +82,11 @@ class ActivitypubFields(TestCase): self.assertEqual(mock_model.field_name, "hi") def test_set_activity_from_field(self): - """ set json field given entire model """ + """set json field given entire model""" @dataclass class TestModel: - """ real simple mock """ + """real simple mock""" field_name: str unrelated: str @@ -100,7 +100,7 @@ class ActivitypubFields(TestCase): self.assertEqual(data["fieldName"], "bip") def test_remote_id_field(self): - """ just sets some defaults on charfield """ + """just sets some defaults on charfield""" instance = fields.RemoteIdField() self.assertEqual(instance.max_length, 255) self.assertTrue(instance.deduplication_field) @@ -109,7 +109,7 @@ class ActivitypubFields(TestCase): instance.run_validators("http://www.example.com/dlfjg 23/x") def test_username_field(self): - """ again, just setting defaults on username field """ + """again, just setting defaults on username field""" instance = fields.UsernameField() self.assertEqual(instance.activitypub_field, "preferredUsername") self.assertEqual(instance.max_length, 150) @@ -130,7 +130,7 @@ class ActivitypubFields(TestCase): self.assertEqual(instance.field_to_activity("test@example.com"), "test") def test_privacy_field_defaults(self): - """ post privacy field's many default values """ + """post privacy field's many default values""" instance = fields.PrivacyField() self.assertEqual(instance.max_length, 255) self.assertEqual( @@ -143,11 +143,11 @@ class ActivitypubFields(TestCase): ) def test_privacy_field_set_field_from_activity(self): - """ translate between to/cc fields and privacy """ + """translate between to/cc fields and privacy""" @dataclass(init=False) class TestActivity(ActivityObject): - """ real simple mock """ + """real simple mock""" to: List[str] cc: List[str] @@ -155,7 +155,7 @@ class ActivitypubFields(TestCase): type: str = "Test" class TestPrivacyModel(ActivitypubMixin, BookWyrmModel): - """ real simple mock model because BookWyrmModel is abstract """ + """real simple mock model because BookWyrmModel is abstract""" privacy_field = fields.PrivacyField() mention_users = fields.TagField(User) @@ -187,7 +187,7 @@ class ActivitypubFields(TestCase): @patch("bookwyrm.models.activitypub_mixin.ObjectMixin.broadcast") @patch("bookwyrm.activitystreams.ActivityStream.add_status") def test_privacy_field_set_activity_from_field(self, *_): - """ translate between to/cc fields and privacy """ + """translate between to/cc fields and privacy""" user = User.objects.create_user( "rat", "rat@rat.rat", "ratword", local=True, localname="rat" ) @@ -231,7 +231,7 @@ class ActivitypubFields(TestCase): self.assertEqual(activity["cc"], []) def test_foreign_key(self): - """ should be able to format a related model """ + """should be able to format a related model""" instance = fields.ForeignKey("User", on_delete=models.CASCADE) Serializable = namedtuple("Serializable", ("to_activity", "remote_id")) item = Serializable(lambda: {"a": "b"}, "https://e.b/c") @@ -240,7 +240,7 @@ class ActivitypubFields(TestCase): @responses.activate def test_foreign_key_from_activity_str(self): - """ create a new object from a foreign key """ + """create a new object from a foreign key""" instance = fields.ForeignKey(User, on_delete=models.CASCADE) datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json") userdata = json.loads(datafile.read_bytes()) @@ -264,7 +264,7 @@ class ActivitypubFields(TestCase): self.assertEqual(value.name, "MOUSE?? MOUSE!!") def test_foreign_key_from_activity_dict(self): - """ test recieving activity json """ + """test recieving 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()) @@ -284,7 +284,7 @@ class ActivitypubFields(TestCase): # et cetera but we're not testing serializing user json def test_foreign_key_from_activity_dict_existing(self): - """ test receiving a dict of an existing object in the db """ + """test receiving a dict of an existing object in the db""" instance = fields.ForeignKey(User, on_delete=models.CASCADE) datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json") userdata = json.loads(datafile.read_bytes()) @@ -302,7 +302,7 @@ class ActivitypubFields(TestCase): self.assertEqual(value, user) def test_foreign_key_from_activity_str_existing(self): - """ test receiving a remote id of an existing object in the db """ + """test receiving a remote id of an existing object in the db""" instance = fields.ForeignKey(User, on_delete=models.CASCADE) user = User.objects.create_user( "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" @@ -315,14 +315,14 @@ class ActivitypubFields(TestCase): self.assertEqual(value, user) def test_one_to_one_field(self): - """ a gussied up foreign key """ + """a gussied up foreign key""" instance = fields.OneToOneField("User", on_delete=models.CASCADE) Serializable = namedtuple("Serializable", ("to_activity", "remote_id")) item = Serializable(lambda: {"a": "b"}, "https://e.b/c") self.assertEqual(instance.field_to_activity(item), {"a": "b"}) def test_many_to_many_field(self): - """ lists! """ + """lists!""" instance = fields.ManyToManyField("User") Serializable = namedtuple("Serializable", ("to_activity", "remote_id")) @@ -340,7 +340,7 @@ class ActivitypubFields(TestCase): @responses.activate def test_many_to_many_field_from_activity(self): - """ resolve related fields for a list, takes a list of remote ids """ + """resolve related fields for a list, takes a list of remote ids""" instance = fields.ManyToManyField(User) datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json") userdata = json.loads(datafile.read_bytes()) @@ -360,7 +360,7 @@ class ActivitypubFields(TestCase): self.assertIsInstance(value[0], User) def test_tag_field(self): - """ a special type of many to many field """ + """a special type of many to many field""" instance = fields.TagField("User") Serializable = namedtuple( @@ -379,13 +379,13 @@ class ActivitypubFields(TestCase): self.assertEqual(result[0].type, "Serializable") def test_tag_field_from_activity(self): - """ loadin' a list of items from Links """ + """loadin' a list of items from Links""" # TODO @responses.activate @patch("bookwyrm.models.activitypub_mixin.ObjectMixin.broadcast") def test_image_field(self, _): - """ storing images """ + """storing images""" user = User.objects.create_user( "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" ) @@ -423,7 +423,7 @@ class ActivitypubFields(TestCase): self.assertIsInstance(loaded_image[1], ContentFile) def test_datetime_field(self): - """ this one is pretty simple, it just has to use isoformat """ + """this one is pretty simple, it just has to use isoformat""" instance = fields.DateTimeField() now = timezone.now() self.assertEqual(instance.field_to_activity(now), now.isoformat()) @@ -431,12 +431,12 @@ class ActivitypubFields(TestCase): self.assertEqual(instance.field_from_activity("bip"), None) def test_array_field(self): - """ idk why it makes them strings but probably for a good reason """ + """idk why it makes them strings but probably for a good reason""" instance = fields.ArrayField(fields.IntegerField) self.assertEqual(instance.field_to_activity([0, 1]), ["0", "1"]) def test_html_field(self): - """ sanitizes html, the sanitizer has its own tests """ + """sanitizes html, the sanitizer has its own tests""" instance = fields.HtmlField() self.assertEqual( instance.field_from_activity("

hi

"), "

hi

" diff --git a/bookwyrm/tests/models/test_import_model.py b/bookwyrm/tests/models/test_import_model.py index 38c3b1ed..76a914d1 100644 --- a/bookwyrm/tests/models/test_import_model.py +++ b/bookwyrm/tests/models/test_import_model.py @@ -14,10 +14,10 @@ from bookwyrm.connectors.abstract_connector import SearchResult class ImportJob(TestCase): - """ this is a fancy one!!! """ + """this is a fancy one!!!""" def setUp(self): - """ data is from a goodreads export of The Raven Tower """ + """data is from a goodreads export of The Raven Tower""" read_data = { "Book Id": 39395857, "Title": "The Raven Tower", @@ -72,30 +72,30 @@ class ImportJob(TestCase): ) def test_isbn(self): - """ it unquotes the isbn13 field from data """ + """it unquotes the isbn13 field from data""" expected = "9780356506999" item = models.ImportItem.objects.get(index=1) self.assertEqual(item.isbn, expected) def test_shelf(self): - """ converts to the local shelf typology """ + """converts to the local shelf typology""" expected = "reading" self.assertEqual(self.item_1.shelf, expected) def test_date_added(self): - """ converts to the local shelf typology """ + """converts to the local shelf typology""" expected = datetime.datetime(2019, 4, 9, 0, 0, tzinfo=timezone.utc) item = models.ImportItem.objects.get(index=1) self.assertEqual(item.date_added, expected) def test_date_read(self): - """ converts to the local shelf typology """ + """converts to the local shelf typology""" expected = datetime.datetime(2019, 4, 12, 0, 0, tzinfo=timezone.utc) item = models.ImportItem.objects.get(index=2) self.assertEqual(item.date_read, expected) def test_currently_reading_reads(self): - """ infer currently reading dates where available """ + """infer currently reading dates where available""" expected = [ models.ReadThrough( start_date=datetime.datetime(2019, 4, 9, 0, 0, tzinfo=timezone.utc) @@ -106,7 +106,7 @@ class ImportJob(TestCase): self.assertEqual(actual.reads[0].finish_date, expected[0].finish_date) def test_read_reads(self): - """ infer read dates where available """ + """infer read dates where available""" actual = self.item_2 self.assertEqual( actual.reads[0].start_date, @@ -118,14 +118,14 @@ class ImportJob(TestCase): ) def test_unread_reads(self): - """ handle books with no read dates """ + """handle books with no read dates""" expected = [] actual = models.ImportItem.objects.get(index=3) self.assertEqual(actual.reads, expected) @responses.activate def test_get_book_from_isbn(self): - """ search and load books by isbn (9780356506999) """ + """search and load books by isbn (9780356506999)""" connector_info = models.Connector.objects.create( identifier="openlibrary.org", name="OpenLibrary", diff --git a/bookwyrm/tests/models/test_list.py b/bookwyrm/tests/models/test_list.py index 4e3460a9..8f5bd497 100644 --- a/bookwyrm/tests/models/test_list.py +++ b/bookwyrm/tests/models/test_list.py @@ -7,10 +7,10 @@ from bookwyrm import models, settings @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") class List(TestCase): - """ some activitypub oddness ahead """ + """some activitypub oddness ahead""" def setUp(self): - """ look, a list """ + """look, a list""" self.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" ) @@ -18,7 +18,7 @@ class List(TestCase): self.book = models.Edition.objects.create(title="hi", parent_work=work) def test_remote_id(self, _): - """ shelves use custom remote ids """ + """shelves use custom remote ids""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): book_list = models.List.objects.create( name="Test List", user=self.local_user @@ -27,7 +27,7 @@ class List(TestCase): self.assertEqual(book_list.get_remote_id(), expected_id) def test_to_activity(self, _): - """ jsonify it """ + """jsonify it""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): book_list = models.List.objects.create( name="Test List", user=self.local_user @@ -41,7 +41,7 @@ class List(TestCase): self.assertEqual(activity_json["owner"], self.local_user.remote_id) def test_list_item(self, _): - """ a list entry """ + """a list entry""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): book_list = models.List.objects.create( name="Test List", user=self.local_user, privacy="unlisted" @@ -59,7 +59,7 @@ class List(TestCase): self.assertEqual(item.recipients, []) def test_list_item_pending(self, _): - """ a list entry """ + """a list entry""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): book_list = models.List.objects.create( name="Test List", user=self.local_user diff --git a/bookwyrm/tests/models/test_readthrough_model.py b/bookwyrm/tests/models/test_readthrough_model.py index f69e8779..93e9e654 100644 --- a/bookwyrm/tests/models/test_readthrough_model.py +++ b/bookwyrm/tests/models/test_readthrough_model.py @@ -6,10 +6,10 @@ from bookwyrm import models, settings class ReadThrough(TestCase): - """ some activitypub oddness ahead """ + """some activitypub oddness ahead""" def setUp(self): - """ look, a shelf """ + """look, a shelf""" self.user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" ) @@ -27,7 +27,7 @@ class ReadThrough(TestCase): ) def test_progress_update(self): - """ Test progress updates """ + """Test progress updates""" self.readthrough.create_update() # No-op, no progress yet self.readthrough.progress = 10 self.readthrough.create_update() diff --git a/bookwyrm/tests/models/test_relationship_models.py b/bookwyrm/tests/models/test_relationship_models.py index 0e842b21..d629b5c7 100644 --- a/bookwyrm/tests/models/test_relationship_models.py +++ b/bookwyrm/tests/models/test_relationship_models.py @@ -6,10 +6,10 @@ from bookwyrm import models class Relationship(TestCase): - """ following, blocking, stuff like that """ + """following, blocking, stuff like that""" def setUp(self): - """ we need some users for this """ + """we need some users for this""" with patch("bookwyrm.models.user.set_remote_server.delay"): self.remote_user = models.User.objects.create_user( "rat", @@ -27,11 +27,11 @@ class Relationship(TestCase): self.local_user.save(broadcast=False) def test_user_follows_from_request(self): - """ convert a follow request into a follow """ + """convert a follow request into a follow""" real_broadcast = models.UserFollowRequest.broadcast def mock_broadcast(_, activity, user): - """ introspect what's being sent out """ + """introspect what's being sent out""" self.assertEqual(user.remote_id, self.local_user.remote_id) self.assertEqual(activity["type"], "Follow") @@ -54,7 +54,7 @@ class Relationship(TestCase): models.UserFollowRequest.broadcast = real_broadcast def test_user_follows_from_request_custom_remote_id(self): - """ store a specific remote id for a relationship provided by remote """ + """store a specific remote id for a relationship provided by remote""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): request = models.UserFollowRequest.objects.create( user_subject=self.local_user, @@ -71,7 +71,7 @@ class Relationship(TestCase): self.assertEqual(rel.user_object, self.remote_user) def test_follow_request_activity(self): - """ accept a request and make it a relationship """ + """accept a request and make it a relationship""" real_broadcast = models.UserFollowRequest.broadcast def mock_broadcast(_, activity, user): @@ -88,7 +88,7 @@ class Relationship(TestCase): models.UserFollowRequest.broadcast = real_broadcast def test_follow_request_accept(self): - """ accept a request and make it a relationship """ + """accept a request and make it a relationship""" real_broadcast = models.UserFollowRequest.broadcast def mock_broadcast(_, activity, user): @@ -115,7 +115,7 @@ class Relationship(TestCase): models.UserFollowRequest.broadcast = real_broadcast def test_follow_request_reject(self): - """ accept a request and make it a relationship """ + """accept a request and make it a relationship""" real_broadcast = models.UserFollowRequest.broadcast def mock_reject(_, activity, user): diff --git a/bookwyrm/tests/models/test_shelf_model.py b/bookwyrm/tests/models/test_shelf_model.py index 45ae1fa1..911df059 100644 --- a/bookwyrm/tests/models/test_shelf_model.py +++ b/bookwyrm/tests/models/test_shelf_model.py @@ -8,10 +8,10 @@ from bookwyrm import models, settings # pylint: disable=unused-argument class Shelf(TestCase): - """ some activitypub oddness ahead """ + """some activitypub oddness ahead""" def setUp(self): - """ look, a shelf """ + """look, a shelf""" self.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" ) @@ -19,7 +19,7 @@ class Shelf(TestCase): self.book = models.Edition.objects.create(title="test book", parent_work=work) def test_remote_id(self): - """ shelves use custom remote ids """ + """shelves use custom remote ids""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user @@ -28,7 +28,7 @@ class Shelf(TestCase): self.assertEqual(shelf.get_remote_id(), expected_id) def test_to_activity(self): - """ jsonify it """ + """jsonify it""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user @@ -42,7 +42,7 @@ class Shelf(TestCase): self.assertEqual(activity_json["owner"], self.local_user.remote_id) def test_create_update_shelf(self): - """ create and broadcast shelf creation """ + """create and broadcast shelf creation""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock: shelf = models.Shelf.objects.create( @@ -63,7 +63,7 @@ class Shelf(TestCase): self.assertEqual(shelf.name, "arthur russel") def test_shelve(self): - """ create and broadcast shelf creation """ + """create and broadcast shelf creation""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py index 52d6608a..4c8930bc 100644 --- a/bookwyrm/tests/models/test_status_model.py +++ b/bookwyrm/tests/models/test_status_model.py @@ -17,10 +17,10 @@ from bookwyrm import activitypub, models, settings @patch("bookwyrm.models.Status.broadcast") @patch("bookwyrm.activitystreams.ActivityStream.add_status") class Status(TestCase): - """ lotta types of statuses """ + """lotta types of statuses""" def setUp(self): - """ useful things for creating a status """ + """useful things for creating a status""" self.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" ) @@ -46,14 +46,14 @@ class Status(TestCase): self.book.cover.save("test.jpg", ContentFile(output.getvalue())) def test_status_generated_fields(self, *_): - """ setting remote id """ + """setting remote id""" status = models.Status.objects.create(content="bleh", user=self.local_user) expected_id = "https://%s/user/mouse/status/%d" % (settings.DOMAIN, status.id) self.assertEqual(status.remote_id, expected_id) self.assertEqual(status.privacy, "public") def test_replies(self, *_): - """ get a list of replies """ + """get a list of replies""" parent = models.Status.objects.create(content="hi", user=self.local_user) child = models.Status.objects.create( content="hello", reply_parent=parent, user=self.local_user @@ -72,7 +72,7 @@ class Status(TestCase): self.assertIsInstance(replies.last(), models.Review) def test_status_type(self, *_): - """ class name """ + """class name""" self.assertEqual(models.Status().status_type, "Note") self.assertEqual(models.Review().status_type, "Review") self.assertEqual(models.Quotation().status_type, "Quotation") @@ -80,14 +80,14 @@ class Status(TestCase): self.assertEqual(models.Boost().status_type, "Announce") def test_boostable(self, *_): - """ can a status be boosted, based on privacy """ + """can a status be boosted, based on privacy""" self.assertTrue(models.Status(privacy="public").boostable) self.assertTrue(models.Status(privacy="unlisted").boostable) self.assertFalse(models.Status(privacy="followers").boostable) self.assertFalse(models.Status(privacy="direct").boostable) def test_to_replies(self, *_): - """ activitypub replies collection """ + """activitypub replies collection""" parent = models.Status.objects.create(content="hi", user=self.local_user) child = models.Status.objects.create( content="hello", reply_parent=parent, user=self.local_user @@ -104,7 +104,7 @@ class Status(TestCase): self.assertEqual(replies["totalItems"], 2) def test_status_to_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.Status.objects.create( content="test content", user=self.local_user ) @@ -115,7 +115,7 @@ class Status(TestCase): self.assertEqual(activity["sensitive"], False) def test_status_to_activity_tombstone(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" with patch( "bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores" ): @@ -131,7 +131,7 @@ class Status(TestCase): self.assertFalse(hasattr(activity, "content")) def test_status_to_pure_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.Status.objects.create( content="test content", user=self.local_user ) @@ -143,7 +143,7 @@ class Status(TestCase): self.assertEqual(activity["attachment"], []) def test_generated_note_to_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.GeneratedNote.objects.create( content="test content", user=self.local_user ) @@ -157,7 +157,7 @@ class Status(TestCase): self.assertEqual(len(activity["tag"]), 2) def test_generated_note_to_pure_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.GeneratedNote.objects.create( content="test content", user=self.local_user ) @@ -181,7 +181,7 @@ class Status(TestCase): self.assertEqual(activity["attachment"][0].name, "Test Edition") def test_comment_to_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.Comment.objects.create( content="test content", user=self.local_user, book=self.book ) @@ -192,7 +192,7 @@ class Status(TestCase): self.assertEqual(activity["inReplyToBook"], self.book.remote_id) def test_comment_to_pure_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.Comment.objects.create( content="test content", user=self.local_user, book=self.book ) @@ -212,7 +212,7 @@ class Status(TestCase): self.assertEqual(activity["attachment"][0].name, "Test Edition") def test_quotation_to_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.Quotation.objects.create( quote="a sickening sense", content="test content", @@ -227,7 +227,7 @@ class Status(TestCase): self.assertEqual(activity["inReplyToBook"], self.book.remote_id) def test_quotation_to_pure_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.Quotation.objects.create( quote="a sickening sense", content="test content", @@ -250,7 +250,7 @@ class Status(TestCase): self.assertEqual(activity["attachment"][0].name, "Test Edition") def test_review_to_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.Review.objects.create( name="Review name", content="test content", @@ -267,7 +267,7 @@ class Status(TestCase): self.assertEqual(activity["inReplyToBook"], self.book.remote_id) def test_review_to_pure_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.Review.objects.create( name="Review's name", content="test content", @@ -291,7 +291,7 @@ class Status(TestCase): self.assertEqual(activity["attachment"][0].name, "Test Edition") def test_review_to_pure_activity_no_rating(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.Review.objects.create( name="Review name", content="test content", @@ -313,7 +313,7 @@ class Status(TestCase): self.assertEqual(activity["attachment"][0].name, "Test Edition") def test_reviewrating_to_pure_activity(self, *_): - """ subclass of the base model version with a "pure" serializer """ + """subclass of the base model version with a "pure" serializer""" status = models.ReviewRating.objects.create( rating=3.0, user=self.local_user, @@ -335,11 +335,11 @@ class Status(TestCase): self.assertEqual(activity["attachment"][0].name, "Test Edition") def test_favorite(self, *_): - """ fav a status """ + """fav a status""" real_broadcast = models.Favorite.broadcast def fav_broadcast_mock(_, activity, user): - """ ok """ + """ok""" self.assertEqual(user.remote_id, self.local_user.remote_id) self.assertEqual(activity["type"], "Like") @@ -361,7 +361,7 @@ class Status(TestCase): models.Favorite.broadcast = real_broadcast def test_boost(self, *_): - """ boosting, this one's a bit fussy """ + """boosting, this one's a bit fussy""" status = models.Status.objects.create( content="test content", user=self.local_user ) @@ -373,7 +373,7 @@ class Status(TestCase): self.assertEqual(activity, boost.to_activity(pure=True)) def test_notification(self, *_): - """ a simple model """ + """a simple model""" notification = models.Notification.objects.create( user=self.local_user, notification_type="FAVORITE" ) @@ -385,7 +385,7 @@ class Status(TestCase): ) def test_create_broadcast(self, _, broadcast_mock): - """ should send out two verions of a status on create """ + """should send out two verions of a status on create""" models.Comment.objects.create( content="hi", user=self.local_user, book=self.book ) @@ -405,7 +405,7 @@ class Status(TestCase): self.assertEqual(args["object"]["type"], "Comment") def test_recipients_with_mentions(self, *_): - """ get recipients to broadcast a status """ + """get recipients to broadcast a status""" status = models.GeneratedNote.objects.create( content="test content", user=self.local_user ) @@ -414,7 +414,7 @@ class Status(TestCase): self.assertEqual(status.recipients, [self.remote_user]) def test_recipients_with_reply_parent(self, *_): - """ get recipients to broadcast a status """ + """get recipients to broadcast a status""" parent_status = models.GeneratedNote.objects.create( content="test content", user=self.remote_user ) @@ -425,7 +425,7 @@ class Status(TestCase): self.assertEqual(status.recipients, [self.remote_user]) def test_recipients_with_reply_parent_and_mentions(self, *_): - """ get recipients to broadcast a status """ + """get recipients to broadcast a status""" parent_status = models.GeneratedNote.objects.create( content="test content", user=self.remote_user ) @@ -438,7 +438,7 @@ class Status(TestCase): @responses.activate def test_ignore_activity_boost(self, *_): - """ don't bother with most remote statuses """ + """don't bother with most remote statuses""" activity = activitypub.Announce( id="http://www.faraway.com/boost/12", actor=self.remote_user.remote_id, diff --git a/bookwyrm/tests/models/test_user_model.py b/bookwyrm/tests/models/test_user_model.py index 883ef669..b2791379 100644 --- a/bookwyrm/tests/models/test_user_model.py +++ b/bookwyrm/tests/models/test_user_model.py @@ -22,7 +22,7 @@ class User(TestCase): ) def test_computed_fields(self): - """ username instead of id here """ + """username instead of id here""" expected_id = "https://%s/user/mouse" % DOMAIN self.assertEqual(self.user.remote_id, expected_id) self.assertEqual(self.user.username, "mouse@%s" % DOMAIN) @@ -155,7 +155,7 @@ class User(TestCase): self.assertIsNone(server.application_version) def test_delete_user(self): - """ deactivate a user """ + """deactivate a user""" self.assertTrue(self.user.is_active) with patch( "bookwyrm.models.activitypub_mixin.broadcast_task.delay" diff --git a/bookwyrm/tests/test_activitystreams.py b/bookwyrm/tests/test_activitystreams.py index b4efeba3..59266383 100644 --- a/bookwyrm/tests/test_activitystreams.py +++ b/bookwyrm/tests/test_activitystreams.py @@ -7,10 +7,10 @@ from bookwyrm import activitystreams, models @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") @patch("bookwyrm.activitystreams.ActivityStream.add_status") class Activitystreams(TestCase): - """ using redis to build activity streams """ + """using redis to build activity streams""" def setUp(self): - """ use a test csv """ + """use a test csv""" self.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "password", local=True, localname="mouse" ) @@ -30,14 +30,14 @@ class Activitystreams(TestCase): self.book = models.Edition.objects.create(title="test book") class TestStream(activitystreams.ActivityStream): - """ test stream, don't have to do anything here """ + """test stream, don't have to do anything here""" key = "test" self.test_stream = TestStream() def test_activitystream_class_ids(self, *_): - """ the abstract base class for stream objects """ + """the abstract base class for stream objects""" self.assertEqual( self.test_stream.stream_id(self.local_user), "{}-test".format(self.local_user.id), @@ -48,7 +48,7 @@ class Activitystreams(TestCase): ) def test_abstractstream_get_audience(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Status.objects.create( user=self.remote_user, content="hi", privacy="public" ) @@ -59,7 +59,7 @@ class Activitystreams(TestCase): self.assertTrue(self.another_user in users) def test_abstractstream_get_audience_direct(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Status.objects.create( user=self.remote_user, content="hi", @@ -82,7 +82,7 @@ class Activitystreams(TestCase): self.assertFalse(self.remote_user in users) def test_abstractstream_get_audience_followers_remote_user(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Status.objects.create( user=self.remote_user, content="hi", @@ -92,7 +92,7 @@ class Activitystreams(TestCase): self.assertFalse(users.exists()) def test_abstractstream_get_audience_followers_self(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Comment.objects.create( user=self.local_user, content="hi", @@ -105,7 +105,7 @@ class Activitystreams(TestCase): self.assertFalse(self.remote_user in users) def test_abstractstream_get_audience_followers_with_mention(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Comment.objects.create( user=self.remote_user, content="hi", @@ -120,7 +120,7 @@ class Activitystreams(TestCase): self.assertFalse(self.remote_user in users) def test_abstractstream_get_audience_followers_with_relationship(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" self.remote_user.followers.add(self.local_user) status = models.Comment.objects.create( user=self.remote_user, @@ -134,7 +134,7 @@ class Activitystreams(TestCase): self.assertFalse(self.remote_user in users) def test_homestream_get_audience(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Status.objects.create( user=self.remote_user, content="hi", privacy="public" ) @@ -142,7 +142,7 @@ class Activitystreams(TestCase): self.assertFalse(users.exists()) def test_homestream_get_audience_with_mentions(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Status.objects.create( user=self.remote_user, content="hi", privacy="public" ) @@ -152,7 +152,7 @@ class Activitystreams(TestCase): self.assertFalse(self.another_user in users) def test_homestream_get_audience_with_relationship(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" self.remote_user.followers.add(self.local_user) status = models.Status.objects.create( user=self.remote_user, content="hi", privacy="public" @@ -162,7 +162,7 @@ class Activitystreams(TestCase): self.assertFalse(self.another_user in users) def test_localstream_get_audience_remote_status(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Status.objects.create( user=self.remote_user, content="hi", privacy="public" ) @@ -170,7 +170,7 @@ class Activitystreams(TestCase): self.assertEqual(users, []) def test_localstream_get_audience_local_status(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Status.objects.create( user=self.local_user, content="hi", privacy="public" ) @@ -179,7 +179,7 @@ class Activitystreams(TestCase): self.assertTrue(self.another_user in users) def test_localstream_get_audience_unlisted(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Status.objects.create( user=self.local_user, content="hi", privacy="unlisted" ) @@ -187,7 +187,7 @@ class Activitystreams(TestCase): self.assertEqual(users, []) def test_federatedstream_get_audience(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Status.objects.create( user=self.remote_user, content="hi", privacy="public" ) @@ -196,7 +196,7 @@ class Activitystreams(TestCase): self.assertTrue(self.another_user in users) def test_federatedstream_get_audience_unlisted(self, *_): - """ get a list of users that should see a status """ + """get a list of users that should see a status""" status = models.Status.objects.create( user=self.remote_user, content="hi", privacy="unlisted" ) diff --git a/bookwyrm/tests/test_emailing.py b/bookwyrm/tests/test_emailing.py index 5d7d4894..0f9cc365 100644 --- a/bookwyrm/tests/test_emailing.py +++ b/bookwyrm/tests/test_emailing.py @@ -10,10 +10,10 @@ from bookwyrm import emailing, models @patch("bookwyrm.emailing.send_email.delay") class Emailing(TestCase): - """ every response to a get request, html or json """ + """every response to a get request, html or json""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -25,7 +25,7 @@ class Emailing(TestCase): models.SiteSettings.objects.create() def test_invite_email(self, email_mock): - """ load the invite email """ + """load the invite email""" invite_request = models.InviteRequest.objects.create( email="test@email.com", invite=models.SiteInvite.objects.create(user=self.local_user), @@ -40,7 +40,7 @@ class Emailing(TestCase): self.assertEqual(len(args), 4) def test_password_reset_email(self, email_mock): - """ load the password reset email """ + """load the password reset email""" reset = models.PasswordReset.objects.create(user=self.local_user) emailing.password_reset_email(reset) diff --git a/bookwyrm/tests/test_sanitize_html.py b/bookwyrm/tests/test_sanitize_html.py index 2b3d0378..6c405348 100644 --- a/bookwyrm/tests/test_sanitize_html.py +++ b/bookwyrm/tests/test_sanitize_html.py @@ -5,10 +5,10 @@ from bookwyrm.sanitize_html import InputHtmlParser class Sanitizer(TestCase): - """ sanitizer tests """ + """sanitizer tests""" def test_no_html(self): - """ just text """ + """just text""" input_text = "no html " parser = InputHtmlParser() parser.feed(input_text) @@ -16,7 +16,7 @@ class Sanitizer(TestCase): self.assertEqual(input_text, output) def test_valid_html(self): - """ leave the html untouched """ + """leave the html untouched""" input_text = "yes html" parser = InputHtmlParser() parser.feed(input_text) @@ -24,7 +24,7 @@ class Sanitizer(TestCase): self.assertEqual(input_text, output) def test_valid_html_attrs(self): - """ and don't remove attributes """ + """and don't remove attributes""" input_text = 'yes html' parser = InputHtmlParser() parser.feed(input_text) @@ -32,7 +32,7 @@ class Sanitizer(TestCase): self.assertEqual(input_text, output) def test_invalid_html(self): - """ remove all html when the html is malformed """ + """remove all html when the html is malformed""" input_text = "yes html" parser = InputHtmlParser() parser.feed(input_text) @@ -46,7 +46,7 @@ class Sanitizer(TestCase): self.assertEqual("yes html ", output) def test_disallowed_html(self): - """ remove disallowed html but keep allowed html """ + """remove disallowed html but keep allowed html""" input_text = "
yes html
" parser = InputHtmlParser() parser.feed(input_text) diff --git a/bookwyrm/tests/test_signing.py b/bookwyrm/tests/test_signing.py index d9cc411c..758ba9bb 100644 --- a/bookwyrm/tests/test_signing.py +++ b/bookwyrm/tests/test_signing.py @@ -20,7 +20,7 @@ from bookwyrm.signatures import create_key_pair, make_signature, make_digest def get_follow_activity(follower, followee): - """ generates a test activity """ + """generates a test activity""" return Follow( id="https://test.com/user/follow/id", actor=follower.remote_id, @@ -33,10 +33,10 @@ Sender = namedtuple("Sender", ("remote_id", "key_pair")) class Signature(TestCase): - """ signature test """ + """signature test""" def setUp(self): - """ create users and test data """ + """create users and test data""" self.mouse = models.User.objects.create_user( "mouse@%s" % DOMAIN, "mouse@example.com", "", local=True, localname="mouse" ) @@ -56,7 +56,7 @@ class Signature(TestCase): models.SiteSettings.objects.create() def send(self, signature, now, data, digest): - """ test request """ + """test request""" c = Client() return c.post( urlsplit(self.rat.inbox).path, @@ -74,7 +74,7 @@ class Signature(TestCase): def send_test_request( # pylint: disable=too-many-arguments self, sender, signer=None, send_data=None, digest=None, date=None ): - """ sends a follow request to the "rat" user """ + """sends a follow request to the "rat" user""" now = date or http_date() data = json.dumps(get_follow_activity(sender, self.rat)) digest = digest or make_digest(data) @@ -84,7 +84,7 @@ class Signature(TestCase): return self.send(signature, now, send_data or data, digest) def test_correct_signature(self): - """ this one should just work """ + """this one should just work""" response = self.send_test_request(sender=self.mouse) self.assertEqual(response.status_code, 200) @@ -96,7 +96,7 @@ class Signature(TestCase): @responses.activate def test_remote_signer(self): - """ signtures for remote users """ + """signtures 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 @@ -119,7 +119,7 @@ class Signature(TestCase): @responses.activate def test_key_needs_refresh(self): - """ an out of date key should be updated and the new key work """ + """an out of date key should be updated and the new key work""" datafile = pathlib.Path(__file__).parent.joinpath("data/ap_user.json") data = json.loads(datafile.read_bytes()) data["id"] = self.fake_remote.remote_id @@ -155,7 +155,7 @@ class Signature(TestCase): @responses.activate def test_nonexistent_signer(self): - """ fail when unable to look up signer """ + """fail when unable to look up signer""" responses.add( responses.GET, self.fake_remote.remote_id, @@ -177,7 +177,7 @@ class Signature(TestCase): @pytest.mark.integration def test_invalid_digest(self): - """ signature digest must be valid """ + """signature digest must be valid""" with patch("bookwyrm.activitypub.resolve_remote_id"): response = self.send_test_request( self.mouse, digest="SHA-256=AAAAAAAAAAAAAAAAAA" diff --git a/bookwyrm/tests/test_templatetags.py b/bookwyrm/tests/test_templatetags.py index 2fadb978..a92e887a 100644 --- a/bookwyrm/tests/test_templatetags.py +++ b/bookwyrm/tests/test_templatetags.py @@ -12,10 +12,10 @@ from bookwyrm.templatetags import bookwyrm_tags @patch("bookwyrm.activitystreams.ActivityStream.add_status") class TemplateTags(TestCase): - """ lotta different things here """ + """lotta different things here""" def setUp(self): - """ create some filler objects """ + """create some filler objects""" self.user = models.User.objects.create_user( "mouse@example.com", "mouse@mouse.mouse", @@ -34,34 +34,34 @@ class TemplateTags(TestCase): self.book = models.Edition.objects.create(title="Test Book") def test_dict_key(self, _): - """ just getting a value out of a dict """ + """just getting a value out of a dict""" test_dict = {"a": 1, "b": 3} self.assertEqual(bookwyrm_tags.dict_key(test_dict, "a"), 1) self.assertEqual(bookwyrm_tags.dict_key(test_dict, "c"), 0) def test_get_user_rating(self, _): - """ get a user's most recent rating of a book """ + """get a user's most recent rating of a book""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): models.Review.objects.create(user=self.user, book=self.book, rating=3) self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 3) def test_get_user_rating_doesnt_exist(self, _): - """ there is no rating available """ + """there is no rating available""" self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 0) def test_get_user_identifer_local(self, _): - """ fall back to the simplest uid available """ + """fall back to the simplest uid available""" self.assertNotEqual(self.user.username, self.user.localname) self.assertEqual(bookwyrm_tags.get_user_identifier(self.user), "mouse") def test_get_user_identifer_remote(self, _): - """ for a remote user, should be their full username """ + """for a remote user, should be their full username""" self.assertEqual( bookwyrm_tags.get_user_identifier(self.remote_user), "rat@example.com" ) def test_get_notification_count(self, _): - """ just countin' """ + """just countin'""" self.assertEqual(bookwyrm_tags.get_notification_count(self.user), 0) models.Notification.objects.create(user=self.user, notification_type="FAVORITE") @@ -74,7 +74,7 @@ class TemplateTags(TestCase): self.assertEqual(bookwyrm_tags.get_notification_count(self.user), 2) def test_get_replies(self, _): - """ direct replies to a status """ + """direct replies to a status""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): parent = models.Review.objects.create( user=self.user, book=self.book, content="hi" @@ -102,7 +102,7 @@ class TemplateTags(TestCase): self.assertFalse(third_child in replies) def test_get_parent(self, _): - """ get the reply parent of a status """ + """get the reply parent of a status""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): parent = models.Review.objects.create( user=self.user, book=self.book, content="hi" @@ -116,7 +116,7 @@ class TemplateTags(TestCase): self.assertIsInstance(result, models.Review) def test_get_user_liked(self, _): - """ did a user like a status """ + """did a user like a status""" status = models.Review.objects.create(user=self.remote_user, book=self.book) self.assertFalse(bookwyrm_tags.get_user_liked(self.user, status)) @@ -125,7 +125,7 @@ class TemplateTags(TestCase): self.assertTrue(bookwyrm_tags.get_user_liked(self.user, status)) def test_get_user_boosted(self, _): - """ did a user boost a status """ + """did a user boost a status""" status = models.Review.objects.create(user=self.remote_user, book=self.book) self.assertFalse(bookwyrm_tags.get_user_boosted(self.user, status)) @@ -134,7 +134,7 @@ class TemplateTags(TestCase): self.assertTrue(bookwyrm_tags.get_user_boosted(self.user, status)) def test_follow_request_exists(self, _): - """ does a user want to follow """ + """does a user want to follow""" self.assertFalse( bookwyrm_tags.follow_request_exists(self.user, self.remote_user) ) @@ -152,7 +152,7 @@ class TemplateTags(TestCase): ) def test_get_boosted(self, _): - """ load a boosted status """ + """load a boosted status""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): status = models.Review.objects.create(user=self.remote_user, book=self.book) boost = models.Boost.objects.create(user=self.user, boosted_status=status) @@ -161,7 +161,7 @@ class TemplateTags(TestCase): self.assertEqual(boosted, status) def test_get_book_description(self, _): - """ grab it from the edition or the parent """ + """grab it from the edition or the parent""" work = models.Work.objects.create(title="Test Work") self.book.parent_work = work self.book.save() @@ -177,12 +177,12 @@ class TemplateTags(TestCase): self.assertEqual(bookwyrm_tags.get_book_description(self.book), "hello") def test_get_uuid(self, _): - """ uuid functionality """ + """uuid functionality""" uuid = bookwyrm_tags.get_uuid("hi") self.assertTrue(re.match(r"hi[A-Za-z0-9\-]", uuid)) def test_get_markdown(self, _): - """ mardown format data """ + """mardown format data""" result = bookwyrm_tags.get_markdown("_hi_") self.assertEqual(result, "

hi

") @@ -190,13 +190,13 @@ class TemplateTags(TestCase): self.assertEqual(result, "

hi

") def test_get_mentions(self, _): - """ list of people mentioned """ + """list of people mentioned""" status = models.Status.objects.create(content="hi", user=self.remote_user) result = bookwyrm_tags.get_mentions(status, self.user) self.assertEqual(result, "@rat@example.com ") def test_get_status_preview_name(self, _): - """ status context string """ + """status context string""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): status = models.Status.objects.create(content="hi", user=self.user) result = bookwyrm_tags.get_status_preview_name(status) @@ -221,7 +221,7 @@ class TemplateTags(TestCase): self.assertEqual(result, "quotation from Test Book") def test_related_status(self, _): - """ gets the subclass model for a notification status """ + """gets the subclass model for a notification status""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): status = models.Status.objects.create(content="hi", user=self.user) notification = models.Notification.objects.create( diff --git a/bookwyrm/tests/views/inbox/test_inbox.py b/bookwyrm/tests/views/inbox/test_inbox.py index c39a3fd2..697f4010 100644 --- a/bookwyrm/tests/views/inbox/test_inbox.py +++ b/bookwyrm/tests/views/inbox/test_inbox.py @@ -12,10 +12,10 @@ from bookwyrm import models, views # pylint: disable=too-many-public-methods class Inbox(TestCase): - """ readthrough tests """ + """readthrough tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" self.client = Client() self.factory = RequestFactory() local_user = models.User.objects.create_user( @@ -48,12 +48,12 @@ class Inbox(TestCase): models.SiteSettings.objects.create() def test_inbox_invalid_get(self): - """ shouldn't try to handle if the user is not found """ + """shouldn't try to handle if the user is not found""" result = self.client.get("/inbox", content_type="application/json") self.assertIsInstance(result, HttpResponseNotAllowed) def test_inbox_invalid_user(self): - """ shouldn't try to handle if the user is not found """ + """shouldn't try to handle if the user is not found""" result = self.client.post( "/user/bleh/inbox", '{"type": "Test", "object": "exists"}', @@ -62,7 +62,7 @@ class Inbox(TestCase): self.assertIsInstance(result, HttpResponseNotFound) def test_inbox_invalid_bad_signature(self): - """ bad request for invalid signature """ + """bad request for invalid signature""" with patch("bookwyrm.views.inbox.has_valid_signature") as mock_valid: mock_valid.return_value = False result = self.client.post( @@ -73,7 +73,7 @@ class Inbox(TestCase): self.assertEqual(result.status_code, 401) def test_inbox_invalid_bad_signature_delete(self): - """ invalid signature for Delete is okay though """ + """invalid signature for Delete is okay though""" with patch("bookwyrm.views.inbox.has_valid_signature") as mock_valid: mock_valid.return_value = False result = self.client.post( @@ -84,7 +84,7 @@ class Inbox(TestCase): self.assertEqual(result.status_code, 200) def test_inbox_unknown_type(self): - """ never heard of that activity type, don't have a handler for it """ + """never heard of that activity type, don't have a handler for it""" with patch("bookwyrm.views.inbox.has_valid_signature") as mock_valid: result = self.client.post( "/inbox", @@ -95,7 +95,7 @@ class Inbox(TestCase): self.assertIsInstance(result, HttpResponseNotFound) def test_inbox_success(self): - """ a known type, for which we start a task """ + """a known type, for which we start a task""" activity = self.create_json activity["object"] = { "id": "https://example.com/list/22", @@ -121,7 +121,7 @@ class Inbox(TestCase): self.assertEqual(result.status_code, 200) def test_is_blocked_user_agent(self): - """ check for blocked servers """ + """check for blocked servers""" request = self.factory.post( "", HTTP_USER_AGENT="http.rb/4.4.1 (Mastodon/3.3.0; +https://mastodon.social/)", @@ -134,7 +134,7 @@ class Inbox(TestCase): self.assertTrue(views.inbox.is_blocked_user_agent(request)) def test_is_blocked_activity(self): - """ check for blocked servers """ + """check for blocked servers""" activity = {"actor": "https://mastodon.social/user/whaatever/else"} self.assertFalse(views.inbox.is_blocked_activity(activity)) @@ -144,7 +144,7 @@ class Inbox(TestCase): self.assertTrue(views.inbox.is_blocked_activity(activity)) def test_create_by_deactivated_user(self): - """ don't let deactivated users post """ + """don't let deactivated users post""" self.remote_user.delete(broadcast=False) self.assertTrue(self.remote_user.deleted) datafile = pathlib.Path(__file__).parent.joinpath("../../data/ap_note.json") diff --git a/bookwyrm/tests/views/inbox/test_inbox_add.py b/bookwyrm/tests/views/inbox/test_inbox_add.py index a5c629a8..9f237b6d 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_add.py +++ b/bookwyrm/tests/views/inbox/test_inbox_add.py @@ -9,10 +9,10 @@ from bookwyrm import models, views # pylint: disable=too-many-public-methods class InboxAdd(TestCase): - """ inbox tests """ + """inbox tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" local_user = models.User.objects.create_user( "mouse@example.com", "mouse@mouse.com", @@ -42,7 +42,7 @@ class InboxAdd(TestCase): models.SiteSettings.objects.create() def test_handle_add_book_to_shelf(self): - """ shelving a book """ + """shelving a book""" shelf = models.Shelf.objects.create(user=self.remote_user, name="Test Shelf") shelf.remote_id = "https://bookwyrm.social/user/mouse/shelf/to-read" shelf.save() @@ -65,7 +65,7 @@ class InboxAdd(TestCase): @responses.activate def test_handle_add_book_to_list(self): - """ listing a book """ + """listing a book""" responses.add( responses.GET, "https://bookwyrm.social/user/mouse/list/to-read", diff --git a/bookwyrm/tests/views/inbox/test_inbox_announce.py b/bookwyrm/tests/views/inbox/test_inbox_announce.py index dbe4ec56..4243dc78 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_announce.py +++ b/bookwyrm/tests/views/inbox/test_inbox_announce.py @@ -9,10 +9,10 @@ from bookwyrm import models, views # pylint: disable=too-many-public-methods class InboxActivities(TestCase): - """ inbox tests """ + """inbox tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" self.local_user = models.User.objects.create_user( "mouse@example.com", "mouse@mouse.com", @@ -52,7 +52,7 @@ class InboxActivities(TestCase): @patch("bookwyrm.activitystreams.ActivityStream.add_status") def test_boost(self, redis_mock): - """ boost a status """ + """boost a status""" self.assertEqual(models.Notification.objects.count(), 0) activity = { "type": "Announce", @@ -82,7 +82,7 @@ class InboxActivities(TestCase): @responses.activate @patch("bookwyrm.activitystreams.ActivityStream.add_status") def test_boost_remote_status(self, redis_mock): - """ boost a status from a remote server """ + """boost a status from a remote server""" work = models.Work.objects.create(title="work title") book = models.Edition.objects.create( title="Test", @@ -131,7 +131,7 @@ class InboxActivities(TestCase): @responses.activate def test_discarded_boost(self): - """ test a boost of a mastodon status that will be discarded """ + """test a boost of a mastodon status that will be discarded""" status = models.Status( content="hi", user=self.remote_user, @@ -154,7 +154,7 @@ class InboxActivities(TestCase): self.assertEqual(models.Boost.objects.count(), 0) def test_unboost(self): - """ undo a boost """ + """undo a boost""" with patch("bookwyrm.activitystreams.ActivityStream.add_status"): boost = models.Boost.objects.create( boosted_status=self.status, user=self.remote_user @@ -183,7 +183,7 @@ class InboxActivities(TestCase): self.assertFalse(models.Boost.objects.exists()) def test_unboost_unknown_boost(self): - """ undo a boost """ + """undo a boost""" activity = { "type": "Undo", "actor": "hi", diff --git a/bookwyrm/tests/views/inbox/test_inbox_block.py b/bookwyrm/tests/views/inbox/test_inbox_block.py index e686c6b7..956cf538 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_block.py +++ b/bookwyrm/tests/views/inbox/test_inbox_block.py @@ -8,10 +8,10 @@ from bookwyrm import models, views # pylint: disable=too-many-public-methods class InboxBlock(TestCase): - """ inbox tests """ + """inbox tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" self.local_user = models.User.objects.create_user( "mouse@example.com", "mouse@mouse.com", @@ -35,7 +35,7 @@ class InboxBlock(TestCase): models.SiteSettings.objects.create() def test_handle_blocks(self): - """ create a "block" database entry from an activity """ + """create a "block" database entry from an activity""" self.local_user.followers.add(self.remote_user) with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): models.UserFollowRequest.objects.create( @@ -67,7 +67,7 @@ class InboxBlock(TestCase): self.assertFalse(models.UserFollowRequest.objects.exists()) def test_handle_unblock(self): - """ unblock a user """ + """unblock a user""" self.remote_user.blocks.add(self.local_user) block = models.UserBlocks.objects.get() diff --git a/bookwyrm/tests/views/inbox/test_inbox_create.py b/bookwyrm/tests/views/inbox/test_inbox_create.py index 3d2ce1c0..e7a12024 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_create.py +++ b/bookwyrm/tests/views/inbox/test_inbox_create.py @@ -11,10 +11,10 @@ from bookwyrm.activitypub import ActivitySerializerError # pylint: disable=too-many-public-methods class InboxCreate(TestCase): - """ readthrough tests """ + """readthrough tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" self.local_user = models.User.objects.create_user( "mouse@example.com", "mouse@mouse.com", @@ -53,7 +53,7 @@ class InboxCreate(TestCase): models.SiteSettings.objects.create() def test_create_status(self): - """ the "it justs works" mode """ + """the "it justs works" mode""" self.assertEqual(models.Status.objects.count(), 1) datafile = pathlib.Path(__file__).parent.joinpath( @@ -84,7 +84,7 @@ class InboxCreate(TestCase): self.assertEqual(models.Status.objects.count(), 2) def test_create_status_remote_note_with_mention(self): - """ should only create it under the right circumstances """ + """should only create it under the right circumstances""" self.assertEqual(models.Status.objects.count(), 1) self.assertFalse( models.Notification.objects.filter(user=self.local_user).exists() @@ -107,7 +107,7 @@ class InboxCreate(TestCase): self.assertEqual(models.Notification.objects.get().notification_type, "MENTION") def test_create_status_remote_note_with_reply(self): - """ should only create it under the right circumstances """ + """should only create it under the right circumstances""" self.assertEqual(models.Status.objects.count(), 1) self.assertFalse(models.Notification.objects.filter(user=self.local_user)) @@ -128,7 +128,7 @@ class InboxCreate(TestCase): self.assertEqual(models.Notification.objects.get().notification_type, "REPLY") def test_create_list(self): - """ a new list """ + """a new list""" activity = self.create_json activity["object"] = { "id": "https://example.com/list/22", @@ -152,7 +152,7 @@ class InboxCreate(TestCase): self.assertEqual(book_list.remote_id, "https://example.com/list/22") def test_create_unsupported_type(self): - """ ignore activities we know we can't handle """ + """ignore activities we know we can't handle""" activity = self.create_json activity["object"] = { "id": "https://example.com/status/887", @@ -162,7 +162,7 @@ class InboxCreate(TestCase): views.inbox.activity_task(activity) def test_create_unknown_type(self): - """ ignore activities we know we've never heard of """ + """ignore activities we know we've never heard of""" activity = self.create_json activity["object"] = { "id": "https://example.com/status/887", diff --git a/bookwyrm/tests/views/inbox/test_inbox_delete.py b/bookwyrm/tests/views/inbox/test_inbox_delete.py index 03598b88..617dcf6f 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_delete.py +++ b/bookwyrm/tests/views/inbox/test_inbox_delete.py @@ -9,10 +9,10 @@ from bookwyrm import models, views # pylint: disable=too-many-public-methods class InboxActivities(TestCase): - """ inbox tests """ + """inbox tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" self.local_user = models.User.objects.create_user( "mouse@example.com", "mouse@mouse.com", @@ -50,7 +50,7 @@ class InboxActivities(TestCase): models.SiteSettings.objects.create() def test_delete_status(self): - """ remove a status """ + """remove a status""" self.assertFalse(self.status.deleted) activity = { "type": "Delete", @@ -71,7 +71,7 @@ class InboxActivities(TestCase): self.assertIsInstance(status.deleted_date, datetime) def test_delete_status_notifications(self): - """ remove a status with related notifications """ + """remove a status with related notifications""" models.Notification.objects.create( related_status=self.status, user=self.local_user, @@ -106,7 +106,7 @@ class InboxActivities(TestCase): self.assertEqual(models.Notification.objects.get(), notif) def test_delete_user(self): - """ delete a user """ + """delete a user""" self.assertTrue(models.User.objects.get(username="rat@example.com").is_active) activity = { "@context": "https://www.w3.org/ns/activitystreams", @@ -121,7 +121,7 @@ class InboxActivities(TestCase): self.assertFalse(models.User.objects.get(username="rat@example.com").is_active) def test_delete_user_unknown(self): - """ don't worry about it if we don't know the user """ + """don't worry about it if we don't know the user""" self.assertEqual(models.User.objects.filter(is_active=True).count(), 2) activity = { "@context": "https://www.w3.org/ns/activitystreams", diff --git a/bookwyrm/tests/views/inbox/test_inbox_follow.py b/bookwyrm/tests/views/inbox/test_inbox_follow.py index b0177cb8..f5332b7a 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_follow.py +++ b/bookwyrm/tests/views/inbox/test_inbox_follow.py @@ -9,10 +9,10 @@ from bookwyrm import models, views # pylint: disable=too-many-public-methods class InboxRelationships(TestCase): - """ inbox tests """ + """inbox tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" self.local_user = models.User.objects.create_user( "mouse@example.com", "mouse@mouse.com", @@ -36,7 +36,7 @@ class InboxRelationships(TestCase): models.SiteSettings.objects.create() def test_follow(self): - """ remote user wants to follow local user """ + """remote user wants to follow local user""" activity = { "@context": "https://www.w3.org/ns/activitystreams", "id": "https://example.com/users/rat/follows/123", @@ -65,7 +65,7 @@ class InboxRelationships(TestCase): self.assertEqual(follow.user_subject, self.remote_user) def test_follow_duplicate(self): - """ remote user wants to follow local user twice """ + """remote user wants to follow local user twice""" activity = { "@context": "https://www.w3.org/ns/activitystreams", "id": "https://example.com/users/rat/follows/123", @@ -92,7 +92,7 @@ class InboxRelationships(TestCase): self.assertEqual(follow.user_subject, self.remote_user) def test_follow_manually_approved(self): - """ needs approval before following """ + """needs approval before following""" activity = { "@context": "https://www.w3.org/ns/activitystreams", "id": "https://example.com/users/rat/follows/123", @@ -122,7 +122,7 @@ class InboxRelationships(TestCase): self.assertEqual(list(follow), []) def test_undo_follow_request(self): - """ the requester cancels a follow request """ + """the requester cancels a follow request""" self.local_user.manually_approves_followers = True self.local_user.save(broadcast=False) with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): @@ -152,7 +152,7 @@ class InboxRelationships(TestCase): self.assertFalse(self.local_user.follower_requests.exists()) def test_unfollow(self): - """ remove a relationship """ + """remove a relationship""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): rel = models.UserFollows.objects.create( user_subject=self.remote_user, user_object=self.local_user @@ -177,7 +177,7 @@ class InboxRelationships(TestCase): self.assertIsNone(self.local_user.followers.first()) def test_follow_accept(self): - """ a remote user approved a follow request from local """ + """a remote user approved a follow request from local""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): rel = models.UserFollowRequest.objects.create( user_subject=self.local_user, user_object=self.remote_user @@ -208,7 +208,7 @@ class InboxRelationships(TestCase): self.assertEqual(follows.first(), self.local_user) def test_follow_reject(self): - """ turn down a follow request """ + """turn down a follow request""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): rel = models.UserFollowRequest.objects.create( user_subject=self.local_user, user_object=self.remote_user diff --git a/bookwyrm/tests/views/inbox/test_inbox_like.py b/bookwyrm/tests/views/inbox/test_inbox_like.py index 05105b75..a5f3a9f0 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_like.py +++ b/bookwyrm/tests/views/inbox/test_inbox_like.py @@ -8,10 +8,10 @@ from bookwyrm import models, views # pylint: disable=too-many-public-methods class InboxActivities(TestCase): - """ inbox tests """ + """inbox tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" self.local_user = models.User.objects.create_user( "mouse@example.com", "mouse@mouse.com", @@ -50,7 +50,7 @@ class InboxActivities(TestCase): models.SiteSettings.objects.create() def test_handle_favorite(self): - """ fav a status """ + """fav a status""" activity = { "@context": "https://www.w3.org/ns/activitystreams", "id": "https://example.com/fav/1", @@ -68,7 +68,7 @@ class InboxActivities(TestCase): self.assertEqual(fav.user, self.remote_user) def test_ignore_favorite(self): - """ don't try to save an unknown status """ + """don't try to save an unknown status""" activity = { "@context": "https://www.w3.org/ns/activitystreams", "id": "https://example.com/fav/1", @@ -83,7 +83,7 @@ class InboxActivities(TestCase): self.assertFalse(models.Favorite.objects.exists()) def test_handle_unfavorite(self): - """ fav a status """ + """fav a status""" activity = { "id": "https://example.com/fav/1#undo", "type": "Undo", diff --git a/bookwyrm/tests/views/inbox/test_inbox_remove.py b/bookwyrm/tests/views/inbox/test_inbox_remove.py index 8ac8740a..a0c4cdcf 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_remove.py +++ b/bookwyrm/tests/views/inbox/test_inbox_remove.py @@ -8,10 +8,10 @@ from bookwyrm import models, views # pylint: disable=too-many-public-methods class InboxRemove(TestCase): - """ inbox tests """ + """inbox tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" self.local_user = models.User.objects.create_user( "mouse@example.com", "mouse@mouse.com", @@ -41,7 +41,7 @@ class InboxRemove(TestCase): models.SiteSettings.objects.create() def test_handle_unshelve_book(self): - """ remove a book from a shelf """ + """remove a book from a shelf""" shelf = models.Shelf.objects.create(user=self.remote_user, name="Test Shelf") shelf.remote_id = "https://bookwyrm.social/user/mouse/shelf/to-read" shelf.save() @@ -70,7 +70,7 @@ class InboxRemove(TestCase): self.assertFalse(shelf.books.exists()) def test_handle_remove_book_from_list(self): - """ listing a book """ + """listing a book""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): booklist = models.List.objects.create( name="test list", diff --git a/bookwyrm/tests/views/inbox/test_inbox_update.py b/bookwyrm/tests/views/inbox/test_inbox_update.py index 5681ec88..9fdc9792 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_update.py +++ b/bookwyrm/tests/views/inbox/test_inbox_update.py @@ -10,10 +10,10 @@ from bookwyrm import models, views # pylint: disable=too-many-public-methods class InboxUpdate(TestCase): - """ inbox tests """ + """inbox tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" self.local_user = models.User.objects.create_user( "mouse@example.com", "mouse@mouse.com", @@ -45,7 +45,7 @@ class InboxUpdate(TestCase): models.SiteSettings.objects.create() def test_update_list(self): - """ a new list """ + """a new list""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): book_list = models.List.objects.create( name="hi", remote_id="https://example.com/list/22", user=self.local_user @@ -79,7 +79,7 @@ class InboxUpdate(TestCase): self.assertEqual(book_list.remote_id, "https://example.com/list/22") def test_update_user(self): - """ update an existing user """ + """update an existing user""" models.UserFollows.objects.create( user_subject=self.local_user, user_object=self.remote_user, @@ -116,7 +116,7 @@ class InboxUpdate(TestCase): self.assertTrue(self.local_user in self.remote_user.followers.all()) def test_update_edition(self): - """ update an existing edition """ + """update an existing edition""" datafile = pathlib.Path(__file__).parent.joinpath("../../data/bw_edition.json") bookdata = json.loads(datafile.read_bytes()) @@ -146,7 +146,7 @@ class InboxUpdate(TestCase): self.assertEqual(book.last_edited_by, self.remote_user) def test_update_work(self): - """ update an existing edition """ + """update an existing edition""" datafile = pathlib.Path(__file__).parent.joinpath("../../data/bw_work.json") bookdata = json.loads(datafile.read_bytes()) diff --git a/bookwyrm/tests/views/test_authentication.py b/bookwyrm/tests/views/test_authentication.py index f6d31861..c310b0a2 100644 --- a/bookwyrm/tests/views/test_authentication.py +++ b/bookwyrm/tests/views/test_authentication.py @@ -14,10 +14,10 @@ from bookwyrm.settings import DOMAIN # pylint: disable=too-many-public-methods class AuthenticationViews(TestCase): - """ login and password management """ + """login and password management""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -31,7 +31,7 @@ class AuthenticationViews(TestCase): self.settings = models.SiteSettings.objects.create(id=1) def test_login_get(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" login = views.Login.as_view() request = self.factory.get("") request.user = self.anonymous_user @@ -47,7 +47,7 @@ class AuthenticationViews(TestCase): self.assertEqual(result.status_code, 302) def test_register(self): - """ create a user """ + """create a user""" view = views.Register.as_view() self.assertEqual(models.User.objects.count(), 1) request = self.factory.post( @@ -68,7 +68,7 @@ class AuthenticationViews(TestCase): self.assertEqual(nutria.local, True) def test_register_trailing_space(self): - """ django handles this so weirdly """ + """django handles this so weirdly""" view = views.Register.as_view() request = self.factory.post( "register/", @@ -84,7 +84,7 @@ class AuthenticationViews(TestCase): self.assertEqual(nutria.local, True) def test_register_invalid_email(self): - """ gotta have an email """ + """gotta have an email""" view = views.Register.as_view() self.assertEqual(models.User.objects.count(), 1) request = self.factory.post( @@ -95,7 +95,7 @@ class AuthenticationViews(TestCase): response.render() def test_register_invalid_username(self): - """ gotta have an email """ + """gotta have an email""" view = views.Register.as_view() self.assertEqual(models.User.objects.count(), 1) request = self.factory.post( @@ -123,7 +123,7 @@ class AuthenticationViews(TestCase): response.render() def test_register_closed_instance(self): - """ you can't just register """ + """you can't just register""" view = views.Register.as_view() self.settings.allow_registration = False self.settings.save() @@ -135,7 +135,7 @@ class AuthenticationViews(TestCase): view(request) def test_register_invite(self): - """ you can't just register """ + """you can't just register""" view = views.Register.as_view() self.settings.allow_registration = False self.settings.save() diff --git a/bookwyrm/tests/views/test_author.py b/bookwyrm/tests/views/test_author.py index bb047b7c..5dfbc350 100644 --- a/bookwyrm/tests/views/test_author.py +++ b/bookwyrm/tests/views/test_author.py @@ -12,10 +12,10 @@ from bookwyrm.activitypub import ActivitypubResponse class AuthorViews(TestCase): - """ author views""" + """author views""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -42,7 +42,7 @@ class AuthorViews(TestCase): models.SiteSettings.objects.create() def test_author_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Author.as_view() author = models.Author.objects.create(name="Jessica") request = self.factory.get("") @@ -62,7 +62,7 @@ class AuthorViews(TestCase): self.assertEqual(result.status_code, 200) def test_edit_author_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.EditAuthor.as_view() author = models.Author.objects.create(name="Test Author") request = self.factory.get("") @@ -76,7 +76,7 @@ class AuthorViews(TestCase): self.assertEqual(result.status_code, 200) def test_edit_author(self): - """ edit an author """ + """edit an author""" view = views.EditAuthor.as_view() author = models.Author.objects.create(name="Test Author") self.local_user.groups.add(self.group) @@ -93,7 +93,7 @@ class AuthorViews(TestCase): self.assertEqual(author.last_edited_by, self.local_user) def test_edit_author_non_editor(self): - """ edit an author with invalid post data""" + """edit an author with invalid post data""" view = views.EditAuthor.as_view() author = models.Author.objects.create(name="Test Author") form = forms.AuthorForm(instance=author) @@ -108,7 +108,7 @@ class AuthorViews(TestCase): self.assertEqual(author.name, "Test Author") def test_edit_author_invalid_form(self): - """ edit an author with invalid post data""" + """edit an author with invalid post data""" view = views.EditAuthor.as_view() author = models.Author.objects.create(name="Test Author") self.local_user.groups.add(self.group) diff --git a/bookwyrm/tests/views/test_block.py b/bookwyrm/tests/views/test_block.py index 71583d70..0b754689 100644 --- a/bookwyrm/tests/views/test_block.py +++ b/bookwyrm/tests/views/test_block.py @@ -9,10 +9,10 @@ from bookwyrm import models, views @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") class BlockViews(TestCase): - """ view user and edit profile """ + """view user and edit profile""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -34,7 +34,7 @@ class BlockViews(TestCase): models.SiteSettings.objects.create() def test_block_get(self, _): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Block.as_view() request = self.factory.get("") request.user = self.local_user @@ -44,7 +44,7 @@ class BlockViews(TestCase): self.assertEqual(result.status_code, 200) def test_block_post(self, _): - """ create a "block" database entry from an activity """ + """create a "block" database entry from an activity""" view = views.Block.as_view() self.local_user.followers.add(self.remote_user) models.UserFollowRequest.objects.create( @@ -65,7 +65,7 @@ class BlockViews(TestCase): self.assertFalse(models.UserFollowRequest.objects.exists()) def test_unblock(self, _): - """ undo a block """ + """undo a block""" self.local_user.blocks.add(self.remote_user) request = self.factory.post("") request.user = self.local_user diff --git a/bookwyrm/tests/views/test_book.py b/bookwyrm/tests/views/test_book.py index a0fa0367..dce50868 100644 --- a/bookwyrm/tests/views/test_book.py +++ b/bookwyrm/tests/views/test_book.py @@ -18,10 +18,10 @@ from bookwyrm.activitypub import ActivitypubResponse class BookViews(TestCase): - """ books books books """ + """books books books""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -81,7 +81,7 @@ class BookViews(TestCase): ) def test_book_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Book.as_view() request = self.factory.get("") request.user = self.local_user @@ -100,7 +100,7 @@ class BookViews(TestCase): self.assertEqual(result.status_code, 200) def test_edit_book_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.EditBook.as_view() request = self.factory.get("") request.user = self.local_user @@ -111,7 +111,7 @@ class BookViews(TestCase): self.assertEqual(result.status_code, 200) def test_edit_book(self): - """ lets a user edit a book """ + """lets a user edit a book""" view = views.EditBook.as_view() self.local_user.groups.add(self.group) form = forms.EditionForm(instance=self.book) @@ -125,7 +125,7 @@ class BookViews(TestCase): self.assertEqual(self.book.title, "New Title") def test_edit_book_add_author(self): - """ lets a user edit a book with new authors """ + """lets a user edit a book with new authors""" view = views.EditBook.as_view() self.local_user.groups.add(self.group) form = forms.EditionForm(instance=self.book) @@ -143,7 +143,7 @@ class BookViews(TestCase): self.assertEqual(self.book.title, "Example Edition") def test_edit_book_add_new_author_confirm(self): - """ lets a user edit a book confirmed with new authors """ + """lets a user edit a book confirmed with new authors""" view = views.ConfirmEditBook.as_view() self.local_user.groups.add(self.group) form = forms.EditionForm(instance=self.book) @@ -162,7 +162,7 @@ class BookViews(TestCase): self.assertEqual(self.book.authors.first().name, "Sappho") def test_edit_book_remove_author(self): - """ remove an author from a book """ + """remove an author from a book""" author = models.Author.objects.create(name="Sappho") self.book.authors.add(author) form = forms.EditionForm(instance=self.book) @@ -182,7 +182,7 @@ class BookViews(TestCase): self.assertFalse(self.book.authors.exists()) def test_create_book(self): - """ create an entirely new book and work """ + """create an entirely new book and work""" view = views.ConfirmEditBook.as_view() self.local_user.groups.add(self.group) form = forms.EditionForm() @@ -196,7 +196,7 @@ class BookViews(TestCase): self.assertEqual(book.parent_work.title, "New Title") def test_create_book_existing_work(self): - """ create an entirely new book and work """ + """create an entirely new book and work""" view = views.ConfirmEditBook.as_view() self.local_user.groups.add(self.group) form = forms.EditionForm() @@ -211,7 +211,7 @@ class BookViews(TestCase): self.assertEqual(book.parent_work, self.work) def test_create_book_with_author(self): - """ create an entirely new book and work """ + """create an entirely new book and work""" view = views.ConfirmEditBook.as_view() self.local_user.groups.add(self.group) form = forms.EditionForm() @@ -229,7 +229,7 @@ class BookViews(TestCase): self.assertEqual(book.authors.first(), book.parent_work.authors.first()) def test_switch_edition(self): - """ updates user's relationships to a book """ + """updates user's relationships to a book""" work = models.Work.objects.create(title="test work") edition1 = models.Edition.objects.create(title="first ed", parent_work=work) edition2 = models.Edition.objects.create(title="second ed", parent_work=work) @@ -253,7 +253,7 @@ class BookViews(TestCase): self.assertEqual(models.ReadThrough.objects.get().book, edition2) def test_editions_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Editions.as_view() request = self.factory.get("") with patch("bookwyrm.views.books.is_api_request") as is_api: @@ -271,7 +271,7 @@ class BookViews(TestCase): self.assertEqual(result.status_code, 200) def test_upload_cover_file(self): - """ add a cover via file upload """ + """add a cover via file upload""" self.assertFalse(self.book.cover) image_file = pathlib.Path(__file__).parent.joinpath( "../../static/images/default_avi.jpg" @@ -296,7 +296,7 @@ class BookViews(TestCase): @responses.activate def test_upload_cover_url(self): - """ add a cover via url """ + """add a cover via url""" self.assertFalse(self.book.cover) image_file = pathlib.Path(__file__).parent.joinpath( "../../static/images/default_avi.jpg" diff --git a/bookwyrm/tests/views/test_directory.py b/bookwyrm/tests/views/test_directory.py index 80d9eaf7..cada50bc 100644 --- a/bookwyrm/tests/views/test_directory.py +++ b/bookwyrm/tests/views/test_directory.py @@ -7,10 +7,10 @@ from bookwyrm import models, views # pylint: disable=unused-argument class DirectoryViews(TestCase): - """ tag views""" + """tag views""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -32,7 +32,7 @@ class DirectoryViews(TestCase): models.SiteSettings.objects.create() def test_directory_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Directory.as_view() request = self.factory.get("") request.user = self.local_user diff --git a/bookwyrm/tests/views/test_federation.py b/bookwyrm/tests/views/test_federation.py index 2afdd6d3..f17f7624 100644 --- a/bookwyrm/tests/views/test_federation.py +++ b/bookwyrm/tests/views/test_federation.py @@ -10,10 +10,10 @@ from bookwyrm import forms, models, views class FederationViews(TestCase): - """ every response to a get request, html or json """ + """every response to a get request, html or json""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -35,7 +35,7 @@ class FederationViews(TestCase): models.SiteSettings.objects.create() def test_federation_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Federation.as_view() request = self.factory.get("") request.user = self.local_user @@ -46,7 +46,7 @@ class FederationViews(TestCase): self.assertEqual(result.status_code, 200) def test_server_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" server = models.FederatedServer.objects.create(server_name="hi.there.com") view = views.FederatedServer.as_view() request = self.factory.get("") @@ -59,7 +59,7 @@ class FederationViews(TestCase): self.assertEqual(result.status_code, 200) def test_server_page_block(self): - """ block a server """ + """block a server""" server = models.FederatedServer.objects.create(server_name="hi.there.com") self.remote_user.federated_server = server self.remote_user.save() @@ -79,7 +79,7 @@ class FederationViews(TestCase): self.assertFalse(self.remote_user.is_active) def test_server_page_unblock(self): - """ unblock a server """ + """unblock a server""" server = models.FederatedServer.objects.create( server_name="hi.there.com", status="blocked" ) @@ -100,7 +100,7 @@ class FederationViews(TestCase): self.assertTrue(self.remote_user.is_active) def test_add_view_get(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" # create mode view = views.AddFederatedServer.as_view() request = self.factory.get("") @@ -113,7 +113,7 @@ class FederationViews(TestCase): self.assertEqual(result.status_code, 200) def test_add_view_post_create(self): - """ create a server entry """ + """create a server entry""" form = forms.ServerForm() form.data["server_name"] = "remote.server" form.data["application_type"] = "coolsoft" @@ -131,7 +131,7 @@ class FederationViews(TestCase): self.assertEqual(server.status, "blocked") def test_import_blocklist(self): - """ load a json file with a list of servers to block """ + """load a json file with a list of servers to block""" server = models.FederatedServer.objects.create(server_name="hi.there.com") self.remote_user.federated_server = server self.remote_user.save() diff --git a/bookwyrm/tests/views/test_feed.py b/bookwyrm/tests/views/test_feed.py index dd38a3eb..a6a3d967 100644 --- a/bookwyrm/tests/views/test_feed.py +++ b/bookwyrm/tests/views/test_feed.py @@ -17,10 +17,10 @@ from bookwyrm.activitypub import ActivitypubResponse @patch("bookwyrm.activitystreams.ActivityStream.get_activity_stream") @patch("bookwyrm.activitystreams.ActivityStream.add_status") class FeedViews(TestCase): - """ activity feed, statuses, dms """ + """activity feed, statuses, dms""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -37,7 +37,7 @@ class FeedViews(TestCase): models.SiteSettings.objects.create() def test_feed(self, *_): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Feed.as_view() request = self.factory.get("") request.user = self.local_user @@ -47,7 +47,7 @@ class FeedViews(TestCase): self.assertEqual(result.status_code, 200) def test_status_page(self, *_): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Status.as_view() with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): status = models.Status.objects.create(content="hi", user=self.local_user) @@ -67,7 +67,7 @@ class FeedViews(TestCase): self.assertEqual(result.status_code, 200) def test_status_page_not_found(self, *_): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Status.as_view() request = self.factory.get("") @@ -79,7 +79,7 @@ class FeedViews(TestCase): self.assertEqual(result.status_code, 404) def test_status_page_with_image(self, *_): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Status.as_view() image_file = pathlib.Path(__file__).parent.joinpath( @@ -115,7 +115,7 @@ class FeedViews(TestCase): self.assertEqual(result.status_code, 200) def test_replies_page(self, *_): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Replies.as_view() with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): status = models.Status.objects.create(content="hi", user=self.local_user) @@ -135,7 +135,7 @@ class FeedViews(TestCase): self.assertEqual(result.status_code, 200) def test_direct_messages_page(self, *_): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.DirectMessage.as_view() request = self.factory.get("") request.user = self.local_user @@ -145,7 +145,7 @@ class FeedViews(TestCase): self.assertEqual(result.status_code, 200) def test_get_suggested_book(self, *_): - """ gets books the ~*~ algorithm ~*~ thinks you want to post about """ + """gets books the ~*~ algorithm ~*~ thinks you want to post about""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): models.ShelfBook.objects.create( book=self.book, diff --git a/bookwyrm/tests/views/test_follow.py b/bookwyrm/tests/views/test_follow.py index 6b4de05d..45e60d3c 100644 --- a/bookwyrm/tests/views/test_follow.py +++ b/bookwyrm/tests/views/test_follow.py @@ -11,10 +11,10 @@ from bookwyrm import models, views class BookViews(TestCase): - """ books books books """ + """books books books""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -50,7 +50,7 @@ class BookViews(TestCase): ) def test_handle_follow_remote(self): - """ send a follow request """ + """send a follow request""" request = self.factory.post("", {"user": self.remote_user.username}) request.user = self.local_user self.assertEqual(models.UserFollowRequest.objects.count(), 0) @@ -65,7 +65,7 @@ class BookViews(TestCase): self.assertEqual(rel.status, "follow_request") def test_handle_follow_local_manually_approves(self): - """ send a follow request """ + """send a follow request""" rat = models.User.objects.create_user( "rat@local.com", "rat@rat.com", @@ -88,7 +88,7 @@ class BookViews(TestCase): self.assertEqual(rel.status, "follow_request") def test_handle_follow_local(self): - """ send a follow request """ + """send a follow request""" rat = models.User.objects.create_user( "rat@local.com", "rat@rat.com", @@ -111,7 +111,7 @@ class BookViews(TestCase): self.assertEqual(rel.status, "follows") def test_handle_unfollow(self): - """ send an unfollow """ + """send an unfollow""" request = self.factory.post("", {"user": self.remote_user.username}) request.user = self.local_user self.remote_user.followers.add(self.local_user) @@ -125,7 +125,7 @@ class BookViews(TestCase): self.assertEqual(self.remote_user.followers.count(), 0) def test_handle_accept(self): - """ accept a follow request """ + """accept a follow request""" self.local_user.manually_approves_followers = True self.local_user.save(broadcast=False) request = self.factory.post("", {"user": self.remote_user.username}) @@ -142,7 +142,7 @@ class BookViews(TestCase): self.assertEqual(self.local_user.followers.first(), self.remote_user) def test_handle_reject(self): - """ reject a follow request """ + """reject a follow request""" self.local_user.manually_approves_followers = True self.local_user.save(broadcast=False) request = self.factory.post("", {"user": self.remote_user.username}) diff --git a/bookwyrm/tests/views/test_get_started.py b/bookwyrm/tests/views/test_get_started.py index 71eb4060..1c55da08 100644 --- a/bookwyrm/tests/views/test_get_started.py +++ b/bookwyrm/tests/views/test_get_started.py @@ -8,10 +8,10 @@ from bookwyrm import forms, models, views class GetStartedViews(TestCase): - """ helping new users get oriented """ + """helping new users get oriented""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -31,7 +31,7 @@ class GetStartedViews(TestCase): models.SiteSettings.objects.create() def test_profile_view(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.GetStartedProfile.as_view() request = self.factory.get("") request.user = self.local_user @@ -43,7 +43,7 @@ class GetStartedViews(TestCase): self.assertEqual(result.status_code, 200) def test_profile_view_post(self): - """ save basic user details """ + """save basic user details""" view = views.GetStartedProfile.as_view() form = forms.LimitedEditUserForm(instance=self.local_user) form.data["name"] = "New Name" @@ -61,7 +61,7 @@ class GetStartedViews(TestCase): self.assertTrue(self.local_user.discoverable) def test_books_view(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.GetStartedBooks.as_view() request = self.factory.get("") request.user = self.local_user @@ -73,7 +73,7 @@ class GetStartedViews(TestCase): self.assertEqual(result.status_code, 200) def test_books_view_with_query(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.GetStartedBooks.as_view() request = self.factory.get("?query=Example") request.user = self.local_user @@ -85,7 +85,7 @@ class GetStartedViews(TestCase): self.assertEqual(result.status_code, 200) def test_books_view_post(self): - """ shelve some books """ + """shelve some books""" view = views.GetStartedBooks.as_view() data = {self.book.id: self.local_user.shelf_set.first().id} request = self.factory.post("", data) @@ -103,7 +103,7 @@ class GetStartedViews(TestCase): self.assertEqual(shelfbook.user, self.local_user) def test_users_view(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.GetStartedUsers.as_view() request = self.factory.get("") request.user = self.local_user @@ -115,7 +115,7 @@ class GetStartedViews(TestCase): self.assertEqual(result.status_code, 200) def test_users_view_with_query(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.GetStartedUsers.as_view() request = self.factory.get("?query=rat") request.user = self.local_user diff --git a/bookwyrm/tests/views/test_goal.py b/bookwyrm/tests/views/test_goal.py index cbe4fe01..4e8f6ee2 100644 --- a/bookwyrm/tests/views/test_goal.py +++ b/bookwyrm/tests/views/test_goal.py @@ -11,10 +11,10 @@ from bookwyrm import models, views class GoalViews(TestCase): - """ viewing and creating statuses """ + """viewing and creating statuses""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -41,7 +41,7 @@ class GoalViews(TestCase): models.SiteSettings.objects.create() def test_goal_page_no_goal(self): - """ view a reading goal page for another's unset goal """ + """view a reading goal page for another's unset goal""" view = views.Goal.as_view() request = self.factory.get("") request.user = self.rat @@ -50,7 +50,7 @@ class GoalViews(TestCase): self.assertEqual(result.status_code, 404) def test_goal_page_no_goal_self(self): - """ view a reading goal page for your own unset goal """ + """view a reading goal page for your own unset goal""" view = views.Goal.as_view() request = self.factory.get("") request.user = self.local_user @@ -60,7 +60,7 @@ class GoalViews(TestCase): self.assertIsInstance(result, TemplateResponse) def test_goal_page_anonymous(self): - """ can't view it without login """ + """can't view it without login""" view = views.Goal.as_view() request = self.factory.get("") request.user = self.anonymous_user @@ -69,7 +69,7 @@ class GoalViews(TestCase): self.assertEqual(result.status_code, 302) def test_goal_page_public(self): - """ view a user's public goal """ + """view a user's public goal""" models.ReadThrough.objects.create( finish_date=timezone.now(), user=self.local_user, @@ -91,7 +91,7 @@ class GoalViews(TestCase): self.assertIsInstance(result, TemplateResponse) def test_goal_page_private(self): - """ view a user's private goal """ + """view a user's private goal""" models.AnnualGoal.objects.create( user=self.local_user, year=2020, goal=15, privacy="followers" ) @@ -104,7 +104,7 @@ class GoalViews(TestCase): @patch("bookwyrm.activitystreams.ActivityStream.add_status") def test_create_goal(self, _): - """ create a new goal """ + """create a new goal""" view = views.Goal.as_view() request = self.factory.post( "", diff --git a/bookwyrm/tests/views/test_helpers.py b/bookwyrm/tests/views/test_helpers.py index 2e5ed82d..e2e041e9 100644 --- a/bookwyrm/tests/views/test_helpers.py +++ b/bookwyrm/tests/views/test_helpers.py @@ -13,10 +13,10 @@ from bookwyrm.settings import USER_AGENT @patch("bookwyrm.activitystreams.ActivityStream.add_status") class ViewsHelpers(TestCase): - """ viewing and creating statuses """ + """viewing and creating statuses""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -53,12 +53,12 @@ class ViewsHelpers(TestCase): ) def test_get_edition(self, _): - """ given an edition or a work, returns an edition """ + """given an edition or a work, returns an edition""" self.assertEqual(views.helpers.get_edition(self.book.id), self.book) self.assertEqual(views.helpers.get_edition(self.work.id), self.book) def test_get_user_from_username(self, _): - """ works for either localname or username """ + """works for either localname or username""" self.assertEqual( views.helpers.get_user_from_username(self.local_user, "mouse"), self.local_user, @@ -71,7 +71,7 @@ class ViewsHelpers(TestCase): views.helpers.get_user_from_username(self.local_user, "mojfse@example.com") def test_is_api_request(self, _): - """ should it return html or json """ + """should it return html or json""" request = self.factory.get("/path") request.headers = {"Accept": "application/json"} self.assertTrue(views.helpers.is_api_request(request)) @@ -85,12 +85,12 @@ class ViewsHelpers(TestCase): self.assertFalse(views.helpers.is_api_request(request)) def test_is_api_request_no_headers(self, _): - """ should it return html or json """ + """should it return html or json""" request = self.factory.get("/path") self.assertFalse(views.helpers.is_api_request(request)) def test_is_bookwyrm_request(self, _): - """ checks if a request came from a bookwyrm instance """ + """checks if a request came from a bookwyrm instance""" request = self.factory.get("", {"q": "Test Book"}) self.assertFalse(views.helpers.is_bookwyrm_request(request)) @@ -105,7 +105,7 @@ class ViewsHelpers(TestCase): self.assertTrue(views.helpers.is_bookwyrm_request(request)) def test_existing_user(self, _): - """ simple database lookup by username """ + """simple database lookup by username""" result = views.helpers.handle_remote_webfinger("@mouse@local.com") self.assertEqual(result, self.local_user) @@ -117,7 +117,7 @@ class ViewsHelpers(TestCase): @responses.activate def test_load_user(self, _): - """ find a remote user using webfinger """ + """find a remote user using webfinger""" username = "mouse@example.com" wellknown = { "subject": "acct:mouse@example.com", @@ -147,7 +147,7 @@ class ViewsHelpers(TestCase): self.assertEqual(result.username, "mouse@example.com") def test_user_on_blocked_server(self, _): - """ find a remote user using webfinger """ + """find a remote user using webfinger""" models.FederatedServer.objects.create( server_name="example.com", status="blocked" ) @@ -156,7 +156,7 @@ class ViewsHelpers(TestCase): self.assertIsNone(result) def test_handle_reading_status_to_read(self, _): - """ posts shelve activities """ + """posts shelve activities""" shelf = self.local_user.shelf_set.get(identifier="to-read") with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): views.helpers.handle_reading_status( @@ -168,7 +168,7 @@ class ViewsHelpers(TestCase): self.assertEqual(status.content, "wants to read") def test_handle_reading_status_reading(self, _): - """ posts shelve activities """ + """posts shelve activities""" shelf = self.local_user.shelf_set.get(identifier="reading") with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): views.helpers.handle_reading_status( @@ -180,7 +180,7 @@ class ViewsHelpers(TestCase): self.assertEqual(status.content, "started reading") def test_handle_reading_status_read(self, _): - """ posts shelve activities """ + """posts shelve activities""" shelf = self.local_user.shelf_set.get(identifier="read") with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): views.helpers.handle_reading_status( @@ -192,7 +192,7 @@ class ViewsHelpers(TestCase): self.assertEqual(status.content, "finished reading") def test_handle_reading_status_other(self, _): - """ posts shelve activities """ + """posts shelve activities""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): views.helpers.handle_reading_status( self.local_user, self.shelf, self.book, "public" @@ -200,7 +200,7 @@ class ViewsHelpers(TestCase): self.assertFalse(models.GeneratedNote.objects.exists()) def test_get_annotated_users(self, _): - """ list of people you might know """ + """list of people you might know""" user_1 = models.User.objects.create_user( "nutria@local.com", "nutria@nutria.com", @@ -247,7 +247,7 @@ class ViewsHelpers(TestCase): self.assertEqual(remote_user_annotated.shared_books, 0) def test_get_annotated_users_counts(self, _): - """ correct counting for multiple shared attributed """ + """correct counting for multiple shared attributed""" user_1 = models.User.objects.create_user( "nutria@local.com", "nutria@nutria.com", diff --git a/bookwyrm/tests/views/test_import.py b/bookwyrm/tests/views/test_import.py index 4de2cfb9..22694623 100644 --- a/bookwyrm/tests/views/test_import.py +++ b/bookwyrm/tests/views/test_import.py @@ -9,10 +9,10 @@ from bookwyrm import views class ImportViews(TestCase): - """ goodreads import views """ + """goodreads import views""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -24,7 +24,7 @@ class ImportViews(TestCase): models.SiteSettings.objects.create() def test_import_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Import.as_view() request = self.factory.get("") request.user = self.local_user @@ -34,7 +34,7 @@ class ImportViews(TestCase): self.assertEqual(result.status_code, 200) def test_import_status(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.ImportStatus.as_view() import_job = models.ImportJob.objects.create(user=self.local_user) request = self.factory.get("") @@ -47,7 +47,7 @@ class ImportViews(TestCase): self.assertEqual(result.status_code, 200) def test_retry_import(self): - """ retry failed items """ + """retry failed items""" view = views.ImportStatus.as_view() import_job = models.ImportJob.objects.create( user=self.local_user, privacy="unlisted" diff --git a/bookwyrm/tests/views/test_interaction.py b/bookwyrm/tests/views/test_interaction.py index f767edfa..876d6053 100644 --- a/bookwyrm/tests/views/test_interaction.py +++ b/bookwyrm/tests/views/test_interaction.py @@ -9,10 +9,10 @@ from bookwyrm import models, views @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") class InteractionViews(TestCase): - """ viewing and creating statuses """ + """viewing and creating statuses""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -41,7 +41,7 @@ class InteractionViews(TestCase): ) def test_favorite(self, _): - """ create and broadcast faving a status """ + """create and broadcast faving a status""" view = views.Favorite.as_view() request = self.factory.post("") request.user = self.remote_user @@ -59,7 +59,7 @@ class InteractionViews(TestCase): self.assertEqual(notification.related_user, self.remote_user) def test_unfavorite(self, _): - """ unfav a status """ + """unfav a status""" view = views.Unfavorite.as_view() request = self.factory.post("") request.user = self.remote_user @@ -76,7 +76,7 @@ class InteractionViews(TestCase): self.assertEqual(models.Notification.objects.count(), 0) def test_boost(self, _): - """ boost a status """ + """boost a status""" view = views.Boost.as_view() request = self.factory.post("") request.user = self.remote_user @@ -98,7 +98,7 @@ class InteractionViews(TestCase): self.assertEqual(notification.related_status, status) def test_self_boost(self, _): - """ boost your own status """ + """boost your own status""" view = views.Boost.as_view() request = self.factory.post("") request.user = self.local_user @@ -122,7 +122,7 @@ class InteractionViews(TestCase): self.assertFalse(models.Notification.objects.exists()) def test_boost_unlisted(self, _): - """ boost a status """ + """boost a status""" view = views.Boost.as_view() request = self.factory.post("") request.user = self.local_user @@ -137,7 +137,7 @@ class InteractionViews(TestCase): self.assertEqual(boost.privacy, "unlisted") def test_boost_private(self, _): - """ boost a status """ + """boost a status""" view = views.Boost.as_view() request = self.factory.post("") request.user = self.local_user @@ -150,7 +150,7 @@ class InteractionViews(TestCase): self.assertFalse(models.Boost.objects.exists()) def test_boost_twice(self, _): - """ boost a status """ + """boost a status""" view = views.Boost.as_view() request = self.factory.post("") request.user = self.local_user @@ -162,7 +162,7 @@ class InteractionViews(TestCase): self.assertEqual(models.Boost.objects.count(), 1) def test_unboost(self, _): - """ undo a boost """ + """undo a boost""" view = views.Unboost.as_view() request = self.factory.post("") request.user = self.remote_user diff --git a/bookwyrm/tests/views/test_invite.py b/bookwyrm/tests/views/test_invite.py index 7bfc8fe5..7b5071b3 100644 --- a/bookwyrm/tests/views/test_invite.py +++ b/bookwyrm/tests/views/test_invite.py @@ -11,10 +11,10 @@ from bookwyrm import views class InviteViews(TestCase): - """ every response to a get request, html or json """ + """every response to a get request, html or json""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -26,7 +26,7 @@ class InviteViews(TestCase): models.SiteSettings.objects.create() def test_invite_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Invite.as_view() models.SiteInvite.objects.create(code="hi", user=self.local_user) request = self.factory.get("") @@ -41,7 +41,7 @@ class InviteViews(TestCase): self.assertEqual(result.status_code, 200) def test_manage_invites(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.ManageInvites.as_view() request = self.factory.get("") request.user = self.local_user @@ -52,7 +52,7 @@ class InviteViews(TestCase): self.assertEqual(result.status_code, 200) def test_invite_request(self): - """ request to join a server """ + """request to join a server""" form = forms.InviteRequestForm() form.data["email"] = "new@user.email" @@ -66,7 +66,7 @@ class InviteViews(TestCase): self.assertEqual(req.email, "new@user.email") def test_invite_request_email_taken(self): - """ request to join a server with an existing user email """ + """request to join a server with an existing user email""" form = forms.InviteRequestForm() form.data["email"] = "mouse@mouse.mouse" @@ -80,7 +80,7 @@ class InviteViews(TestCase): self.assertFalse(models.InviteRequest.objects.exists()) def test_manage_invite_requests(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.ManageInviteRequests.as_view() request = self.factory.get("") request.user = self.local_user @@ -98,7 +98,7 @@ class InviteViews(TestCase): self.assertEqual(result.status_code, 200) def test_manage_invite_requests_send(self): - """ send an invite """ + """send an invite""" req = models.InviteRequest.objects.create(email="fish@example.com") view = views.ManageInviteRequests.as_view() @@ -113,7 +113,7 @@ class InviteViews(TestCase): self.assertIsNotNone(req.invite) def test_ignore_invite_request(self): - """ don't invite that jerk """ + """don't invite that jerk""" req = models.InviteRequest.objects.create(email="fish@example.com") view = views.ignore_invite_request diff --git a/bookwyrm/tests/views/test_isbn.py b/bookwyrm/tests/views/test_isbn.py index 7f03a610..2aedd3ce 100644 --- a/bookwyrm/tests/views/test_isbn.py +++ b/bookwyrm/tests/views/test_isbn.py @@ -11,10 +11,10 @@ from bookwyrm.settings import DOMAIN class IsbnViews(TestCase): - """ tag views""" + """tag views""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -37,7 +37,7 @@ class IsbnViews(TestCase): models.SiteSettings.objects.create() def test_isbn_json_response(self): - """ searches local data only and returns book data in json format """ + """searches local data only and returns book data in json format""" view = views.Isbn.as_view() request = self.factory.get("") with patch("bookwyrm.views.isbn.is_api_request") as is_api: diff --git a/bookwyrm/tests/views/test_landing.py b/bookwyrm/tests/views/test_landing.py index 2513fecc..864e48f7 100644 --- a/bookwyrm/tests/views/test_landing.py +++ b/bookwyrm/tests/views/test_landing.py @@ -10,10 +10,10 @@ from bookwyrm import views class LandingViews(TestCase): - """ pages you land on without really trying """ + """pages you land on without really trying""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -27,7 +27,7 @@ class LandingViews(TestCase): models.SiteSettings.objects.create() def test_home_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Home.as_view() request = self.factory.get("") request.user = self.local_user @@ -43,7 +43,7 @@ class LandingViews(TestCase): result.render() def test_about_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.About.as_view() request = self.factory.get("") request.user = self.local_user @@ -53,7 +53,7 @@ class LandingViews(TestCase): self.assertEqual(result.status_code, 200) def test_discover(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Discover.as_view() request = self.factory.get("") result = view(request) diff --git a/bookwyrm/tests/views/test_list.py b/bookwyrm/tests/views/test_list.py index 215f3e61..3de35b1e 100644 --- a/bookwyrm/tests/views/test_list.py +++ b/bookwyrm/tests/views/test_list.py @@ -12,10 +12,10 @@ from bookwyrm.activitypub import ActivitypubResponse # pylint: disable=unused-argument class ListViews(TestCase): - """ tag views""" + """tag views""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -67,7 +67,7 @@ class ListViews(TestCase): models.SiteSettings.objects.create() def test_lists_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Lists.as_view() with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): models.List.objects.create(name="Public list", user=self.local_user) @@ -90,7 +90,7 @@ class ListViews(TestCase): self.assertEqual(result.status_code, 200) def test_lists_create(self): - """ create list view """ + """create list view""" view = views.Lists.as_view() request = self.factory.post( "", @@ -118,7 +118,7 @@ class ListViews(TestCase): self.assertEqual(new_list.curation, "open") def test_list_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.List.as_view() request = self.factory.get("") request.user = self.local_user @@ -153,7 +153,7 @@ class ListViews(TestCase): self.assertEqual(result.status_code, 200) def test_list_edit(self): - """ edit a list """ + """edit a list""" view = views.List.as_view() request = self.factory.post( "", @@ -185,7 +185,7 @@ class ListViews(TestCase): self.assertEqual(self.list.curation, "curated") def test_curate_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Curate.as_view() with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): models.List.objects.create(name="Public list", user=self.local_user) @@ -205,7 +205,7 @@ class ListViews(TestCase): self.assertEqual(result.status_code, 302) def test_curate_approve(self): - """ approve a pending item """ + """approve a pending item""" view = views.Curate.as_view() with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): pending = models.ListItem.objects.create( @@ -240,7 +240,7 @@ class ListViews(TestCase): self.assertTrue(pending.approved) def test_curate_reject(self): - """ approve a pending item """ + """approve a pending item""" view = views.Curate.as_view() with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): pending = models.ListItem.objects.create( @@ -266,7 +266,7 @@ class ListViews(TestCase): self.assertFalse(models.ListItem.objects.exists()) def test_add_book(self): - """ put a book on a list """ + """put a book on a list""" request = self.factory.post( "", { @@ -545,7 +545,7 @@ class ListViews(TestCase): self.assertEqual(items[2].order, 3) def test_add_book_outsider(self): - """ put a book on a list """ + """put a book on a list""" self.list.curation = "open" self.list.save(broadcast=False) request = self.factory.post( @@ -571,7 +571,7 @@ class ListViews(TestCase): self.assertTrue(item.approved) def test_add_book_pending(self): - """ put a book on a list awaiting approval """ + """put a book on a list awaiting approval""" self.list.curation = "curated" self.list.save(broadcast=False) request = self.factory.post( @@ -601,7 +601,7 @@ class ListViews(TestCase): self.assertFalse(item.approved) def test_add_book_self_curated(self): - """ put a book on a list automatically approved """ + """put a book on a list automatically approved""" self.list.curation = "curated" self.list.save(broadcast=False) request = self.factory.post( @@ -627,7 +627,7 @@ class ListViews(TestCase): self.assertTrue(item.approved) def test_remove_book(self): - """ take an item off a list """ + """take an item off a list""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): item = models.ListItem.objects.create( @@ -651,7 +651,7 @@ class ListViews(TestCase): self.assertFalse(self.list.listitem_set.exists()) def test_remove_book_unauthorized(self): - """ take an item off a list """ + """take an item off a list""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): item = models.ListItem.objects.create( book_list=self.list, user=self.local_user, book=self.book, order=1 diff --git a/bookwyrm/tests/views/test_notifications.py b/bookwyrm/tests/views/test_notifications.py index 6d92485e..182753f9 100644 --- a/bookwyrm/tests/views/test_notifications.py +++ b/bookwyrm/tests/views/test_notifications.py @@ -8,10 +8,10 @@ from bookwyrm import views class NotificationViews(TestCase): - """ notifications """ + """notifications""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -23,7 +23,7 @@ class NotificationViews(TestCase): models.SiteSettings.objects.create() def test_notifications_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Notifications.as_view() request = self.factory.get("") request.user = self.local_user @@ -33,7 +33,7 @@ class NotificationViews(TestCase): self.assertEqual(result.status_code, 200) def test_clear_notifications(self): - """ erase notifications """ + """erase notifications""" models.Notification.objects.create( user=self.local_user, notification_type="FAVORITE" ) diff --git a/bookwyrm/tests/views/test_outbox.py b/bookwyrm/tests/views/test_outbox.py index 0bcfde69..f89258e5 100644 --- a/bookwyrm/tests/views/test_outbox.py +++ b/bookwyrm/tests/views/test_outbox.py @@ -13,10 +13,10 @@ from bookwyrm.settings import USER_AGENT # pylint: disable=too-many-public-methods @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") class OutboxView(TestCase): - """ sends out activities """ + """sends out activities""" def setUp(self): - """ we'll need some data """ + """we'll need some data""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -34,19 +34,19 @@ class OutboxView(TestCase): ) def test_outbox(self, _): - """ returns user's statuses """ + """returns user's statuses""" request = self.factory.get("") result = views.Outbox.as_view()(request, "mouse") self.assertIsInstance(result, JsonResponse) def test_outbox_bad_method(self, _): - """ can't POST to outbox """ + """can't POST to outbox""" request = self.factory.post("") result = views.Outbox.as_view()(request, "mouse") self.assertEqual(result.status_code, 405) def test_outbox_unknown_user(self, _): - """ should 404 for unknown and remote users """ + """should 404 for unknown and remote users""" request = self.factory.post("") result = views.Outbox.as_view()(request, "beepboop") self.assertEqual(result.status_code, 405) @@ -54,7 +54,7 @@ class OutboxView(TestCase): self.assertEqual(result.status_code, 405) def test_outbox_privacy(self, _): - """ don't show dms et cetera in outbox """ + """don't show dms et cetera in outbox""" with patch("bookwyrm.activitystreams.ActivityStream.add_status"): models.Status.objects.create( content="PRIVATE!!", user=self.local_user, privacy="direct" @@ -77,7 +77,7 @@ class OutboxView(TestCase): self.assertEqual(data["totalItems"], 2) def test_outbox_filter(self, _): - """ if we only care about reviews, only get reviews """ + """if we only care about reviews, only get reviews""" with patch("bookwyrm.activitystreams.ActivityStream.add_status"): models.Review.objects.create( content="look at this", @@ -103,7 +103,7 @@ class OutboxView(TestCase): self.assertEqual(data["totalItems"], 1) def test_outbox_bookwyrm_request_true(self, _): - """ should differentiate between bookwyrm and outside requests """ + """should differentiate between bookwyrm and outside requests""" with patch("bookwyrm.activitystreams.ActivityStream.add_status"): models.Review.objects.create( name="hi", @@ -121,7 +121,7 @@ class OutboxView(TestCase): self.assertEqual(data["orderedItems"][0]["type"], "Review") def test_outbox_bookwyrm_request_false(self, _): - """ should differentiate between bookwyrm and outside requests """ + """should differentiate between bookwyrm and outside requests""" with patch("bookwyrm.activitystreams.ActivityStream.add_status"): models.Review.objects.create( name="hi", diff --git a/bookwyrm/tests/views/test_password.py b/bookwyrm/tests/views/test_password.py index 53a9bcbd..ec686db7 100644 --- a/bookwyrm/tests/views/test_password.py +++ b/bookwyrm/tests/views/test_password.py @@ -10,10 +10,10 @@ from bookwyrm import models, views class PasswordViews(TestCase): - """ view user and edit profile """ + """view user and edit profile""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -27,7 +27,7 @@ class PasswordViews(TestCase): models.SiteSettings.objects.create(id=1) def test_password_reset_request(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.PasswordResetRequest.as_view() request = self.factory.get("") request.user = self.local_user @@ -38,7 +38,7 @@ class PasswordViews(TestCase): self.assertEqual(result.status_code, 200) def test_password_reset_request_post(self): - """ send 'em an email """ + """send 'em an email""" request = self.factory.post("", {"email": "aa@bb.ccc"}) view = views.PasswordResetRequest.as_view() resp = view(request) @@ -53,7 +53,7 @@ class PasswordViews(TestCase): self.assertEqual(models.PasswordReset.objects.get().user, self.local_user) def test_password_reset(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.PasswordReset.as_view() code = models.PasswordReset.objects.create(user=self.local_user) request = self.factory.get("") @@ -64,7 +64,7 @@ class PasswordViews(TestCase): self.assertEqual(result.status_code, 200) def test_password_reset_post(self): - """ reset from code """ + """reset from code""" view = views.PasswordReset.as_view() code = models.PasswordReset.objects.create(user=self.local_user) request = self.factory.post("", {"password": "hi", "confirm-password": "hi"}) @@ -74,7 +74,7 @@ class PasswordViews(TestCase): self.assertFalse(models.PasswordReset.objects.exists()) def test_password_reset_wrong_code(self): - """ reset from code """ + """reset from code""" view = views.PasswordReset.as_view() models.PasswordReset.objects.create(user=self.local_user) request = self.factory.post("", {"password": "hi", "confirm-password": "hi"}) @@ -83,7 +83,7 @@ class PasswordViews(TestCase): self.assertTrue(models.PasswordReset.objects.exists()) def test_password_reset_mismatch(self): - """ reset from code """ + """reset from code""" view = views.PasswordReset.as_view() code = models.PasswordReset.objects.create(user=self.local_user) request = self.factory.post("", {"password": "hi", "confirm-password": "hihi"}) @@ -92,7 +92,7 @@ class PasswordViews(TestCase): self.assertTrue(models.PasswordReset.objects.exists()) def test_password_change_get(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.ChangePassword.as_view() request = self.factory.get("") request.user = self.local_user @@ -103,7 +103,7 @@ class PasswordViews(TestCase): self.assertEqual(result.status_code, 200) def test_password_change(self): - """ change password """ + """change password""" view = views.ChangePassword.as_view() password_hash = self.local_user.password request = self.factory.post("", {"password": "hi", "confirm-password": "hi"}) @@ -113,7 +113,7 @@ class PasswordViews(TestCase): self.assertNotEqual(self.local_user.password, password_hash) def test_password_change_mismatch(self): - """ change password """ + """change password""" view = views.ChangePassword.as_view() password_hash = self.local_user.password request = self.factory.post("", {"password": "hi", "confirm-password": "hihi"}) diff --git a/bookwyrm/tests/views/test_reading.py b/bookwyrm/tests/views/test_reading.py index b1ae6b88..c591aa60 100644 --- a/bookwyrm/tests/views/test_reading.py +++ b/bookwyrm/tests/views/test_reading.py @@ -10,10 +10,10 @@ from bookwyrm import models, views @patch("bookwyrm.activitystreams.ActivityStream.add_status") class ReadingViews(TestCase): - """ viewing and creating statuses """ + """viewing and creating statuses""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -41,7 +41,7 @@ class ReadingViews(TestCase): ) def test_start_reading(self, _): - """ begin a book """ + """begin a book""" shelf = self.local_user.shelf_set.get(identifier=models.Shelf.READING) self.assertFalse(shelf.books.exists()) self.assertFalse(models.Status.objects.exists()) @@ -72,7 +72,7 @@ class ReadingViews(TestCase): self.assertEqual(readthrough.book, self.book) def test_start_reading_reshelf(self, _): - """ begin a book """ + """begin a book""" to_read_shelf = self.local_user.shelf_set.get(identifier=models.Shelf.TO_READ) with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): models.ShelfBook.objects.create( @@ -92,7 +92,7 @@ class ReadingViews(TestCase): self.assertEqual(shelf.books.get(), self.book) def test_finish_reading(self, _): - """ begin a book """ + """begin a book""" shelf = self.local_user.shelf_set.get(identifier=models.Shelf.READ_FINISHED) self.assertFalse(shelf.books.exists()) self.assertFalse(models.Status.objects.exists()) @@ -128,7 +128,7 @@ class ReadingViews(TestCase): self.assertEqual(readthrough.book, self.book) def test_edit_readthrough(self, _): - """ adding dates to an ongoing readthrough """ + """adding dates to an ongoing readthrough""" start = timezone.make_aware(dateutil.parser.parse("2021-01-03")) readthrough = models.ReadThrough.objects.create( book=self.book, user=self.local_user, start_date=start @@ -155,7 +155,7 @@ class ReadingViews(TestCase): self.assertEqual(readthrough.book, self.book) def test_delete_readthrough(self, _): - """ remove a readthrough """ + """remove a readthrough""" readthrough = models.ReadThrough.objects.create( book=self.book, user=self.local_user ) @@ -172,7 +172,7 @@ class ReadingViews(TestCase): self.assertFalse(models.ReadThrough.objects.filter(id=readthrough.id).exists()) def test_create_readthrough(self, _): - """ adding new read dates """ + """adding new read dates""" request = self.factory.post( "", { diff --git a/bookwyrm/tests/views/test_readthrough.py b/bookwyrm/tests/views/test_readthrough.py index 5399f673..c9ebf216 100644 --- a/bookwyrm/tests/views/test_readthrough.py +++ b/bookwyrm/tests/views/test_readthrough.py @@ -9,10 +9,10 @@ from bookwyrm import models @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") class ReadThrough(TestCase): - """ readthrough tests """ + """readthrough tests""" def setUp(self): - """ basic user and book data """ + """basic user and book data""" self.client = Client() self.work = models.Work.objects.create(title="Example Work") @@ -52,7 +52,7 @@ class ReadThrough(TestCase): self.assertEqual(delay_mock.call_count, 1) def test_create_progress_readthrough(self, delay_mock): - """ a readthrough with progress """ + """a readthrough with progress""" self.assertEqual(self.edition.readthrough_set.count(), 0) self.client.post( diff --git a/bookwyrm/tests/views/test_reports.py b/bookwyrm/tests/views/test_reports.py index bce19993..84539489 100644 --- a/bookwyrm/tests/views/test_reports.py +++ b/bookwyrm/tests/views/test_reports.py @@ -7,10 +7,10 @@ from bookwyrm import forms, models, views class ReportViews(TestCase): - """ every response to a get request, html or json """ + """every response to a get request, html or json""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -29,7 +29,7 @@ class ReportViews(TestCase): models.SiteSettings.objects.create() def test_reports_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Reports.as_view() request = self.factory.get("") request.user = self.local_user @@ -41,7 +41,7 @@ class ReportViews(TestCase): self.assertEqual(result.status_code, 200) def test_reports_page_with_data(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Reports.as_view() request = self.factory.get("") request.user = self.local_user @@ -54,7 +54,7 @@ class ReportViews(TestCase): self.assertEqual(result.status_code, 200) def test_report_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Report.as_view() request = self.factory.get("") request.user = self.local_user @@ -68,7 +68,7 @@ class ReportViews(TestCase): self.assertEqual(result.status_code, 200) def test_report_comment(self): - """ comment on a report """ + """comment on a report""" view = views.Report.as_view() request = self.factory.post("", {"note": "hi"}) request.user = self.local_user @@ -83,7 +83,7 @@ class ReportViews(TestCase): self.assertEqual(comment.report, report) def test_make_report(self): - """ a user reports another user """ + """a user reports another user""" form = forms.ReportForm() form.data["reporter"] = self.local_user.id form.data["user"] = self.rat.id @@ -97,7 +97,7 @@ class ReportViews(TestCase): self.assertEqual(report.user, self.rat) def test_resolve_report(self): - """ toggle report resolution status """ + """toggle report resolution status""" report = models.Report.objects.create(reporter=self.local_user, user=self.rat) self.assertFalse(report.resolved) request = self.factory.post("") @@ -115,7 +115,7 @@ class ReportViews(TestCase): self.assertFalse(report.resolved) def test_suspend_user(self): - """ toggle whether a user is able to log in """ + """toggle whether a user is able to log in""" self.assertTrue(self.rat.is_active) request = self.factory.post("") request.user = self.local_user diff --git a/bookwyrm/tests/views/test_rss_feed.py b/bookwyrm/tests/views/test_rss_feed.py index 0230b4a9..eacb3c93 100644 --- a/bookwyrm/tests/views/test_rss_feed.py +++ b/bookwyrm/tests/views/test_rss_feed.py @@ -8,10 +8,10 @@ from bookwyrm.views import rss_feed class RssFeedView(TestCase): - """ rss feed behaves as expected """ + """rss feed behaves as expected""" def setUp(self): - """ test data """ + """test data""" self.site = models.SiteSettings.objects.create() self.user = models.User.objects.create_user( @@ -50,7 +50,7 @@ class RssFeedView(TestCase): @patch("bookwyrm.activitystreams.ActivityStream.get_activity_stream") def test_rss_feed(self, _): - """ load an rss feed """ + """load an rss feed""" view = rss_feed.RssFeed() request = self.factory.get("/user/rss_user/rss") request.user = self.user diff --git a/bookwyrm/tests/views/test_search.py b/bookwyrm/tests/views/test_search.py index 78c7a103..77727522 100644 --- a/bookwyrm/tests/views/test_search.py +++ b/bookwyrm/tests/views/test_search.py @@ -13,10 +13,10 @@ from bookwyrm.settings import DOMAIN class ShelfViews(TestCase): - """ tag views""" + """tag views""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -38,7 +38,7 @@ class ShelfViews(TestCase): models.SiteSettings.objects.create() def test_search_json_response(self): - """ searches local data only and returns book data in json format """ + """searches local data only and returns book data in json format""" view = views.Search.as_view() # we need a connector for this, sorry request = self.factory.get("", {"q": "Test Book"}) @@ -53,11 +53,11 @@ class ShelfViews(TestCase): self.assertEqual(data[0]["key"], "https://%s/book/%d" % (DOMAIN, self.book.id)) def test_search_html_response(self): - """ searches remote connectors """ + """searches remote connectors""" view = views.Search.as_view() class TestConnector(abstract_connector.AbstractMinimalConnector): - """ nothing added here """ + """nothing added here""" def format_search_result(self, search_result): pass @@ -106,7 +106,7 @@ class ShelfViews(TestCase): ) def test_search_html_response_users(self): - """ searches remote connectors """ + """searches remote connectors""" view = views.Search.as_view() request = self.factory.get("", {"q": "mouse"}) request.user = self.local_user diff --git a/bookwyrm/tests/views/test_shelf.py b/bookwyrm/tests/views/test_shelf.py index 7ab01562..239b3318 100644 --- a/bookwyrm/tests/views/test_shelf.py +++ b/bookwyrm/tests/views/test_shelf.py @@ -11,10 +11,10 @@ from bookwyrm.activitypub import ActivitypubResponse @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") class ShelfViews(TestCase): - """ tag views""" + """tag views""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -37,7 +37,7 @@ class ShelfViews(TestCase): models.SiteSettings.objects.create() def test_shelf_page(self, _): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Shelf.as_view() shelf = self.local_user.shelf_set.first() request = self.factory.get("") @@ -64,7 +64,7 @@ class ShelfViews(TestCase): self.assertEqual(result.status_code, 200) def test_edit_shelf_privacy(self, _): - """ set name or privacy on shelf """ + """set name or privacy on shelf""" view = views.Shelf.as_view() shelf = self.local_user.shelf_set.get(identifier="to-read") self.assertEqual(shelf.privacy, "public") @@ -84,7 +84,7 @@ class ShelfViews(TestCase): self.assertEqual(shelf.privacy, "unlisted") def test_edit_shelf_name(self, _): - """ change the name of an editable shelf """ + """change the name of an editable shelf""" view = views.Shelf.as_view() shelf = models.Shelf.objects.create(name="Test Shelf", user=self.local_user) self.assertEqual(shelf.privacy, "public") @@ -101,7 +101,7 @@ class ShelfViews(TestCase): self.assertEqual(shelf.identifier, "testshelf-%d" % shelf.id) def test_edit_shelf_name_not_editable(self, _): - """ can't change the name of an non-editable shelf """ + """can't change the name of an non-editable shelf""" view = views.Shelf.as_view() shelf = self.local_user.shelf_set.get(identifier="to-read") self.assertEqual(shelf.privacy, "public") @@ -116,7 +116,7 @@ class ShelfViews(TestCase): self.assertEqual(shelf.name, "To Read") def test_handle_shelve(self, _): - """ shelve a book """ + """shelve a book""" request = self.factory.post( "", {"book": self.book.id, "shelf": self.shelf.identifier} ) @@ -134,7 +134,7 @@ class ShelfViews(TestCase): self.assertEqual(self.shelf.books.get(), self.book) def test_handle_shelve_to_read(self, _): - """ special behavior for the to-read shelf """ + """special behavior for the to-read shelf""" shelf = models.Shelf.objects.get(identifier="to-read") request = self.factory.post( "", {"book": self.book.id, "shelf": shelf.identifier} @@ -147,7 +147,7 @@ class ShelfViews(TestCase): self.assertEqual(shelf.books.get(), self.book) def test_handle_shelve_reading(self, _): - """ special behavior for the reading shelf """ + """special behavior for the reading shelf""" shelf = models.Shelf.objects.get(identifier="reading") request = self.factory.post( "", {"book": self.book.id, "shelf": shelf.identifier} @@ -160,7 +160,7 @@ class ShelfViews(TestCase): self.assertEqual(shelf.books.get(), self.book) def test_handle_shelve_read(self, _): - """ special behavior for the read shelf """ + """special behavior for the read shelf""" shelf = models.Shelf.objects.get(identifier="read") request = self.factory.post( "", {"book": self.book.id, "shelf": shelf.identifier} @@ -173,7 +173,7 @@ class ShelfViews(TestCase): self.assertEqual(shelf.books.get(), self.book) def test_handle_unshelve(self, _): - """ remove a book from a shelf """ + """remove a book from a shelf""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): models.ShelfBook.objects.create( book=self.book, user=self.local_user, shelf=self.shelf diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index 5eb13b6b..6f2fd30d 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -10,10 +10,10 @@ from bookwyrm.settings import DOMAIN @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") class StatusViews(TestCase): - """ viewing and creating statuses """ + """viewing and creating statuses""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -43,7 +43,7 @@ class StatusViews(TestCase): models.SiteSettings.objects.create() def test_handle_status(self, _): - """ create a status """ + """create a status""" view = views.CreateStatus.as_view() form = forms.CommentForm( { @@ -66,7 +66,7 @@ class StatusViews(TestCase): self.assertEqual(status.book, self.book) def test_handle_status_reply(self, _): - """ create a status in reply to an existing status """ + """create a status in reply to an existing status""" view = views.CreateStatus.as_view() user = models.User.objects.create_user( "rat", "rat@rat.com", "password", local=True @@ -96,7 +96,7 @@ class StatusViews(TestCase): self.assertEqual(models.Notification.objects.get().user, self.local_user) def test_handle_status_mentions(self, _): - """ @mention a user in a post """ + """@mention a user in a post""" view = views.CreateStatus.as_view() user = models.User.objects.create_user( "rat@%s" % DOMAIN, "rat@rat.com", "password", local=True, localname="rat" @@ -124,7 +124,7 @@ class StatusViews(TestCase): ) def test_handle_status_reply_with_mentions(self, _): - """ reply to a post with an @mention'ed user """ + """reply to a post with an @mention'ed user""" view = views.CreateStatus.as_view() user = models.User.objects.create_user( "rat", "rat@rat.com", "password", local=True, localname="rat" @@ -168,7 +168,7 @@ class StatusViews(TestCase): self.assertTrue(self.local_user in reply.mention_users.all()) def test_delete_and_redraft(self, _): - """ delete and re-draft a status """ + """delete and re-draft a status""" view = views.DeleteAndRedraft.as_view() request = self.factory.post("") request.user = self.local_user @@ -189,7 +189,7 @@ class StatusViews(TestCase): self.assertTrue(status.deleted) def test_delete_and_redraft_invalid_status_type_rating(self, _): - """ you can't redraft generated statuses """ + """you can't redraft generated statuses""" view = views.DeleteAndRedraft.as_view() request = self.factory.post("") request.user = self.local_user @@ -209,7 +209,7 @@ class StatusViews(TestCase): self.assertFalse(status.deleted) def test_delete_and_redraft_invalid_status_type_generated_note(self, _): - """ you can't redraft generated statuses """ + """you can't redraft generated statuses""" view = views.DeleteAndRedraft.as_view() request = self.factory.post("") request.user = self.local_user @@ -229,7 +229,7 @@ class StatusViews(TestCase): self.assertFalse(status.deleted) def test_find_mentions(self, _): - """ detect and look up @ mentions of users """ + """detect and look up @ mentions of users""" user = models.User.objects.create_user( "nutria@%s" % DOMAIN, "nutria@nutria.com", @@ -275,7 +275,7 @@ class StatusViews(TestCase): ) def test_format_links(self, _): - """ find and format urls into a tags """ + """find and format urls into a tags""" url = "http://www.fish.com/" self.assertEqual( views.status.format_links(url), 'www.fish.com/' % url @@ -298,7 +298,7 @@ class StatusViews(TestCase): ) def test_to_markdown(self, _): - """ this is mostly handled in other places, but nonetheless """ + """this is mostly handled in other places, but nonetheless""" text = "_hi_ and http://fish.com is rad" result = views.status.to_markdown(text) self.assertEqual( @@ -307,13 +307,13 @@ class StatusViews(TestCase): ) def test_to_markdown_link(self, _): - """ this is mostly handled in other places, but nonetheless """ + """this is mostly handled in other places, but nonetheless""" text = "[hi](http://fish.com) is rad" result = views.status.to_markdown(text) self.assertEqual(result, '

hi ' "is rad

") def test_handle_delete_status(self, mock): - """ marks a status as deleted """ + """marks a status as deleted""" view = views.DeleteStatus.as_view() with patch("bookwyrm.activitystreams.ActivityStream.add_status"): status = models.Status.objects.create(user=self.local_user, content="hi") @@ -333,7 +333,7 @@ class StatusViews(TestCase): self.assertTrue(status.deleted) def test_handle_delete_status_permission_denied(self, _): - """ marks a status as deleted """ + """marks a status as deleted""" view = views.DeleteStatus.as_view() with patch("bookwyrm.activitystreams.ActivityStream.add_status"): status = models.Status.objects.create(user=self.local_user, content="hi") @@ -347,7 +347,7 @@ class StatusViews(TestCase): self.assertFalse(status.deleted) def test_handle_delete_status_moderator(self, mock): - """ marks a status as deleted """ + """marks a status as deleted""" view = views.DeleteStatus.as_view() with patch("bookwyrm.activitystreams.ActivityStream.add_status"): status = models.Status.objects.create(user=self.local_user, content="hi") diff --git a/bookwyrm/tests/views/test_updates.py b/bookwyrm/tests/views/test_updates.py index dff730e6..fb003f8d 100644 --- a/bookwyrm/tests/views/test_updates.py +++ b/bookwyrm/tests/views/test_updates.py @@ -10,10 +10,10 @@ from bookwyrm import models, views class UpdateViews(TestCase): - """ lets the ui check for unread notification """ + """lets the ui check for unread notification""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -25,7 +25,7 @@ class UpdateViews(TestCase): models.SiteSettings.objects.create() def test_get_notification_count(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" request = self.factory.get("") request.user = self.local_user @@ -43,7 +43,7 @@ class UpdateViews(TestCase): self.assertEqual(data["count"], 1) def test_get_unread_status_count(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" request = self.factory.get("") request.user = self.local_user diff --git a/bookwyrm/tests/views/test_user.py b/bookwyrm/tests/views/test_user.py index 7518b2bf..3b431de1 100644 --- a/bookwyrm/tests/views/test_user.py +++ b/bookwyrm/tests/views/test_user.py @@ -15,10 +15,10 @@ from bookwyrm.activitypub import ActivitypubResponse class UserViews(TestCase): - """ view user and edit profile """ + """view user and edit profile""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -43,7 +43,7 @@ class UserViews(TestCase): self.anonymous_user.is_authenticated = False def test_user_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.User.as_view() request = self.factory.get("") request.user = self.local_user @@ -69,7 +69,7 @@ class UserViews(TestCase): self.assertEqual(result.status_code, 200) def test_user_page_blocked(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.User.as_view() request = self.factory.get("") request.user = self.local_user @@ -80,7 +80,7 @@ class UserViews(TestCase): self.assertEqual(result.status_code, 404) def test_followers_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Followers.as_view() request = self.factory.get("") request.user = self.local_user @@ -98,7 +98,7 @@ class UserViews(TestCase): self.assertEqual(result.status_code, 200) def test_followers_page_blocked(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Followers.as_view() request = self.factory.get("") request.user = self.local_user @@ -109,7 +109,7 @@ class UserViews(TestCase): self.assertEqual(result.status_code, 404) def test_following_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Following.as_view() request = self.factory.get("") request.user = self.local_user @@ -127,7 +127,7 @@ class UserViews(TestCase): self.assertEqual(result.status_code, 200) def test_following_page_blocked(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.Following.as_view() request = self.factory.get("") request.user = self.local_user @@ -138,7 +138,7 @@ class UserViews(TestCase): self.assertEqual(result.status_code, 404) def test_edit_user_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.EditUser.as_view() request = self.factory.get("") request.user = self.local_user @@ -148,7 +148,7 @@ class UserViews(TestCase): self.assertEqual(result.status_code, 200) def test_edit_user(self): - """ use a form to update a user """ + """use a form to update a user""" view = views.EditUser.as_view() form = forms.EditUserForm(instance=self.local_user) form.data["name"] = "New Name" @@ -168,7 +168,7 @@ class UserViews(TestCase): # idk how to mock the upload form, got tired of triyng to make it work def test_edit_user_avatar(self): - """ use a form to update a user """ + """use a form to update a user""" view = views.EditUser.as_view() form = forms.EditUserForm(instance=self.local_user) form.data["name"] = "New Name" @@ -195,7 +195,7 @@ class UserViews(TestCase): self.assertEqual(self.local_user.avatar.height, 120) def test_crop_avatar(self): - """ reduce that image size """ + """reduce that image size""" image_file = pathlib.Path(__file__).parent.joinpath( "../../static/images/no_cover.jpg" ) diff --git a/bookwyrm/tests/views/test_user_admin.py b/bookwyrm/tests/views/test_user_admin.py index b1e9d639..a044a22c 100644 --- a/bookwyrm/tests/views/test_user_admin.py +++ b/bookwyrm/tests/views/test_user_admin.py @@ -9,10 +9,10 @@ from bookwyrm import models, views class UserAdminViews(TestCase): - """ every response to a get request, html or json """ + """every response to a get request, html or json""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -24,7 +24,7 @@ class UserAdminViews(TestCase): models.SiteSettings.objects.create() def test_user_admin_list_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.UserAdminList.as_view() request = self.factory.get("") request.user = self.local_user @@ -35,7 +35,7 @@ class UserAdminViews(TestCase): self.assertEqual(result.status_code, 200) def test_user_admin_page(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" view = views.UserAdmin.as_view() request = self.factory.get("") request.user = self.local_user @@ -48,7 +48,7 @@ class UserAdminViews(TestCase): self.assertEqual(result.status_code, 200) def test_user_admin_page_post(self): - """ set the user's group """ + """set the user's group""" group = Group.objects.create(name="editor") self.assertEqual( list(self.local_user.groups.values_list("name", flat=True)), [] diff --git a/bookwyrm/tests/views/test_wellknown.py b/bookwyrm/tests/views/test_wellknown.py index f408460f..244921d4 100644 --- a/bookwyrm/tests/views/test_wellknown.py +++ b/bookwyrm/tests/views/test_wellknown.py @@ -11,10 +11,10 @@ from bookwyrm import models, views class UserViews(TestCase): - """ view user and edit profile """ + """view user and edit profile""" def setUp(self): - """ we need basic test data and mocks """ + """we need basic test data and mocks""" self.factory = RequestFactory() self.local_user = models.User.objects.create_user( "mouse@local.com", @@ -41,7 +41,7 @@ class UserViews(TestCase): self.anonymous_user.is_authenticated = False def test_webfinger(self): - """ there are so many views, this just makes sure it LOADS """ + """there are so many views, this just makes sure it LOADS""" request = self.factory.get("", {"resource": "acct:mouse@local.com"}) request.user = self.anonymous_user @@ -51,7 +51,7 @@ class UserViews(TestCase): self.assertEqual(data["subject"], "acct:mouse@local.com") def test_nodeinfo_pointer(self): - """ just tells you where nodeinfo is """ + """just tells you where nodeinfo is""" request = self.factory.get("") request.user = self.anonymous_user @@ -61,7 +61,7 @@ class UserViews(TestCase): self.assertTrue("href" in data["links"][0]) def test_nodeinfo(self): - """ info about the instance """ + """info about the instance""" request = self.factory.get("") request.user = self.anonymous_user @@ -73,7 +73,7 @@ class UserViews(TestCase): self.assertEqual(models.User.objects.count(), 3) def test_instanceinfo(self): - """ about the instance's user activity """ + """about the instance's user activity""" request = self.factory.get("") request.user = self.anonymous_user diff --git a/bookwyrm/views/authentication.py b/bookwyrm/views/authentication.py index 22689a28..bfb49248 100644 --- a/bookwyrm/views/authentication.py +++ b/bookwyrm/views/authentication.py @@ -16,10 +16,10 @@ from bookwyrm.settings import DOMAIN # pylint: disable= no-self-use @method_decorator(csrf_exempt, name="dispatch") class Login(View): - """ authenticate an existing user """ + """authenticate an existing user""" def get(self, request): - """ login page """ + """login page""" if request.user.is_authenticated: return redirect("/") # sene user to the login page @@ -30,7 +30,7 @@ class Login(View): return TemplateResponse(request, "login.html", data) def post(self, request): - """ authentication action """ + """authentication action""" if request.user.is_authenticated: return redirect("/") login_form = forms.LoginForm(request.POST) @@ -61,10 +61,10 @@ class Login(View): class Register(View): - """ register a user """ + """register a user""" def post(self, request): - """ join the server """ + """join the server""" if not models.SiteSettings.get().allow_registration: invite_code = request.POST.get("invite_code") @@ -117,9 +117,9 @@ class Register(View): @method_decorator(login_required, name="dispatch") class Logout(View): - """ log out """ + """log out""" def get(self, request): - """ done with this place! outa here! """ + """done with this place! outa here!""" logout(request) return redirect("/") diff --git a/bookwyrm/views/author.py b/bookwyrm/views/author.py index 50a3588d..0bd7b0e0 100644 --- a/bookwyrm/views/author.py +++ b/bookwyrm/views/author.py @@ -13,10 +13,10 @@ from .helpers import is_api_request # pylint: disable= no-self-use class Author(View): - """ this person wrote a book """ + """this person wrote a book""" def get(self, request, author_id): - """ landing page for an author """ + """landing page for an author""" author = get_object_or_404(models.Author, id=author_id) if is_api_request(request): @@ -37,16 +37,16 @@ class Author(View): permission_required("bookwyrm.edit_book", raise_exception=True), name="dispatch" ) class EditAuthor(View): - """ edit author info """ + """edit author info""" def get(self, request, author_id): - """ info about a book """ + """info about a book""" author = get_object_or_404(models.Author, id=author_id) data = {"author": author, "form": forms.AuthorForm(instance=author)} return TemplateResponse(request, "edit_author.html", data) def post(self, request, author_id): - """ edit a author cool """ + """edit a author cool""" author = get_object_or_404(models.Author, id=author_id) form = forms.AuthorForm(request.POST, request.FILES, instance=author) diff --git a/bookwyrm/views/block.py b/bookwyrm/views/block.py index 6d6a8a58..99014a93 100644 --- a/bookwyrm/views/block.py +++ b/bookwyrm/views/block.py @@ -12,14 +12,14 @@ from bookwyrm import models # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Block(View): - """ blocking users """ + """blocking users""" def get(self, request): - """ list of blocked users? """ + """list of blocked users?""" return TemplateResponse(request, "preferences/blocks.html") def post(self, request, user_id): - """ block a user """ + """block a user""" to_block = get_object_or_404(models.User, id=user_id) models.UserBlocks.objects.create( user_subject=request.user, user_object=to_block @@ -30,7 +30,7 @@ class Block(View): @require_POST @login_required def unblock(request, user_id): - """ undo a block """ + """undo a block""" to_unblock = get_object_or_404(models.User, id=user_id) try: block = models.UserBlocks.objects.get( diff --git a/bookwyrm/views/books.py b/bookwyrm/views/books.py index 829408a8..448cf992 100644 --- a/bookwyrm/views/books.py +++ b/bookwyrm/views/books.py @@ -26,10 +26,10 @@ from .helpers import is_api_request, get_edition, privacy_filter # pylint: disable= no-self-use class Book(View): - """ a book! this is the stuff """ + """a book! this is the stuff""" def get(self, request, book_id, user_statuses=False): - """ info about a book """ + """info about a book""" try: book = models.Book.objects.select_subclasses().get(id=book_id) except models.Book.DoesNotExist: @@ -110,10 +110,10 @@ class Book(View): permission_required("bookwyrm.edit_book", raise_exception=True), name="dispatch" ) class EditBook(View): - """ edit a book """ + """edit a book""" def get(self, request, book_id=None): - """ info about a book """ + """info about a book""" book = None if book_id: book = get_edition(book_id) @@ -123,7 +123,7 @@ class EditBook(View): return TemplateResponse(request, "book/edit_book.html", data) def post(self, request, book_id=None): - """ edit a book cool """ + """edit a book cool""" # returns None if no match is found book = models.Edition.objects.filter(id=book_id).first() form = forms.EditionForm(request.POST, request.FILES, instance=book) @@ -209,10 +209,10 @@ class EditBook(View): permission_required("bookwyrm.edit_book", raise_exception=True), name="dispatch" ) class ConfirmEditBook(View): - """ confirm edits to a book """ + """confirm edits to a book""" def post(self, request, book_id=None): - """ edit a book cool """ + """edit a book cool""" # returns None if no match is found book = models.Edition.objects.filter(id=book_id).first() form = forms.EditionForm(request.POST, request.FILES, instance=book) @@ -260,10 +260,10 @@ class ConfirmEditBook(View): class Editions(View): - """ list of editions """ + """list of editions""" def get(self, request, book_id): - """ list of editions of a book """ + """list of editions of a book""" work = get_object_or_404(models.Work, id=book_id) if is_api_request(request): @@ -293,7 +293,7 @@ class Editions(View): @login_required @require_POST def upload_cover(request, book_id): - """ upload a new cover """ + """upload a new cover""" book = get_object_or_404(models.Edition, id=book_id) book.last_edited_by = request.user @@ -316,7 +316,7 @@ def upload_cover(request, book_id): def set_cover_from_url(url): - """ load it from a url """ + """load it from a url""" image_file = get_image(url) if not image_file: return None @@ -329,7 +329,7 @@ def set_cover_from_url(url): @require_POST @permission_required("bookwyrm.edit_book", raise_exception=True) def add_description(request, book_id): - """ upload a new cover """ + """upload a new cover""" if not request.method == "POST": return redirect("/") @@ -346,7 +346,7 @@ def add_description(request, book_id): @require_POST def resolve_book(request): - """ figure out the local path to a book from a remote_id """ + """figure out the local path to a book from a remote_id""" remote_id = request.POST.get("remote_id") connector = connector_manager.get_or_create_connector(remote_id) book = connector.get_or_create_book(remote_id) @@ -358,7 +358,7 @@ def resolve_book(request): @require_POST @transaction.atomic def switch_edition(request): - """ switch your copy of a book to a different edition """ + """switch your copy of a book to a different edition""" edition_id = request.POST.get("edition") new_edition = get_object_or_404(models.Edition, id=edition_id) shelfbooks = models.ShelfBook.objects.filter( diff --git a/bookwyrm/views/directory.py b/bookwyrm/views/directory.py index 7919dac0..a5786f74 100644 --- a/bookwyrm/views/directory.py +++ b/bookwyrm/views/directory.py @@ -11,10 +11,10 @@ from .helpers import get_annotated_users # pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class Directory(View): - """ display of known bookwyrm users """ + """display of known bookwyrm users""" def get(self, request): - """ lets see your cute faces """ + """lets see your cute faces""" filters = {} software = request.GET.get("software") if not software or software == "bookwyrm": @@ -38,7 +38,7 @@ class Directory(View): return TemplateResponse(request, "directory/directory.html", data) def post(self, request): - """ join the directory """ + """join the directory""" request.user.discoverable = True request.user.save() return redirect("directory") diff --git a/bookwyrm/views/federation.py b/bookwyrm/views/federation.py index 1acacf8f..d4a1af12 100644 --- a/bookwyrm/views/federation.py +++ b/bookwyrm/views/federation.py @@ -20,10 +20,10 @@ from bookwyrm.settings import PAGE_LENGTH name="dispatch", ) class Federation(View): - """ what servers do we federate with """ + """what servers do we federate with""" def get(self, request): - """ list of servers """ + """list of servers""" servers = models.FederatedServer.objects sort = request.GET.get("sort") @@ -43,15 +43,15 @@ class Federation(View): class AddFederatedServer(View): - """ manually add a server """ + """manually add a server""" def get(self, request): - """ add server form """ + """add server form""" data = {"form": forms.ServerForm()} return TemplateResponse(request, "settings/edit_server.html", data) def post(self, request): - """ add a server from the admin panel """ + """add a server from the admin panel""" form = forms.ServerForm(request.POST) if not form.is_valid(): data = {"form": form} @@ -66,14 +66,14 @@ class AddFederatedServer(View): name="dispatch", ) class ImportServerBlocklist(View): - """ manually add a server """ + """manually add a server""" def get(self, request): - """ add server form """ + """add server form""" return TemplateResponse(request, "settings/server_blocklist.html") def post(self, request): - """ add a server from the admin panel """ + """add a server from the admin panel""" json_data = json.load(request.FILES["json_file"]) failed = [] success_count = 0 @@ -102,10 +102,10 @@ class ImportServerBlocklist(View): name="dispatch", ) class FederatedServer(View): - """ views for handling a specific federated server """ + """views for handling a specific federated server""" def get(self, request, server): - """ load a server """ + """load a server""" server = get_object_or_404(models.FederatedServer, id=server) users = server.user_set data = { @@ -121,7 +121,7 @@ class FederatedServer(View): return TemplateResponse(request, "settings/federated_server.html", data) def post(self, request, server): # pylint: disable=unused-argument - """ update note """ + """update note""" server = get_object_or_404(models.FederatedServer, id=server) server.notes = request.POST.get("notes") server.save() @@ -133,7 +133,7 @@ class FederatedServer(View): @permission_required("bookwyrm.control_federation", raise_exception=True) # pylint: disable=unused-argument def block_server(request, server): - """ block a server """ + """block a server""" server = get_object_or_404(models.FederatedServer, id=server) server.block() return redirect("settings-federated-server", server.id) @@ -144,7 +144,7 @@ def block_server(request, server): @permission_required("bookwyrm.control_federation", raise_exception=True) # pylint: disable=unused-argument def unblock_server(request, server): - """ unblock a server """ + """unblock a server""" server = get_object_or_404(models.FederatedServer, id=server) server.unblock() return redirect("settings-federated-server", server.id) diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index 118473d0..98f365ea 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -18,10 +18,10 @@ from .helpers import is_api_request, is_bookwyrm_request # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Feed(View): - """ activity stream """ + """activity stream""" def get(self, request, tab): - """ user's homepage with activity feed """ + """user's homepage with activity feed""" if not tab in STREAMS: tab = "home" @@ -46,10 +46,10 @@ class Feed(View): @method_decorator(login_required, name="dispatch") class DirectMessage(View): - """ dm view """ + """dm view""" def get(self, request, username=None): - """ like a feed but for dms only """ + """like a feed but for dms only""" # remove fancy subclasses of status, keep just good ol' notes queryset = models.Status.objects.filter( review__isnull=True, @@ -85,10 +85,10 @@ class DirectMessage(View): class Status(View): - """ get posting """ + """get posting""" def get(self, request, username, status_id): - """ display a particular status (and replies, etc) """ + """display a particular status (and replies, etc)""" try: user = get_user_from_username(request.user, username) status = models.Status.objects.select_subclasses().get( @@ -120,10 +120,10 @@ class Status(View): class Replies(View): - """ replies page (a json view of status) """ + """replies page (a json view of status)""" def get(self, request, username, status_id): - """ ordered collection of replies to a status """ + """ordered collection of replies to a status""" # the html view is the same as Status if not is_api_request(request): status_view = Status.as_view() @@ -138,7 +138,7 @@ class Replies(View): def feed_page_data(user): - """ info we need for every feed page """ + """info we need for every feed page""" if not user.is_authenticated: return {} @@ -151,7 +151,7 @@ def feed_page_data(user): def get_suggested_books(user, max_books=5): - """ helper to get a user's recent books """ + """helper to get a user's recent books""" book_count = 0 preset_shelves = [("reading", max_books), ("read", 2), ("to-read", max_books)] suggested_books = [] diff --git a/bookwyrm/views/follow.py b/bookwyrm/views/follow.py index d9f455eb..09c2d53a 100644 --- a/bookwyrm/views/follow.py +++ b/bookwyrm/views/follow.py @@ -12,7 +12,7 @@ from .helpers import get_user_from_username @login_required @require_POST def follow(request): - """ follow another user, here or abroad """ + """follow another user, here or abroad""" username = request.POST["user"] try: to_follow = get_user_from_username(request.user, username) @@ -33,7 +33,7 @@ def follow(request): @login_required @require_POST def unfollow(request): - """ unfollow a user """ + """unfollow a user""" username = request.POST["user"] try: to_unfollow = get_user_from_username(request.user, username) @@ -61,7 +61,7 @@ def unfollow(request): @login_required @require_POST def accept_follow_request(request): - """ a user accepts a follow request """ + """a user accepts a follow request""" username = request.POST["user"] try: requester = get_user_from_username(request.user, username) @@ -83,7 +83,7 @@ def accept_follow_request(request): @login_required @require_POST def delete_follow_request(request): - """ a user rejects a follow request """ + """a user rejects a follow request""" username = request.POST["user"] try: requester = get_user_from_username(request.user, username) diff --git a/bookwyrm/views/get_started.py b/bookwyrm/views/get_started.py index a21723a3..5573bf19 100644 --- a/bookwyrm/views/get_started.py +++ b/bookwyrm/views/get_started.py @@ -20,12 +20,12 @@ from .user import save_user_form # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class GetStartedProfile(View): - """ tell us about yourself """ + """tell us about yourself""" next_view = "get-started-books" def get(self, request): - """ basic profile info """ + """basic profile info""" data = { "form": forms.LimitedEditUserForm(instance=request.user), "next": self.next_view, @@ -33,7 +33,7 @@ class GetStartedProfile(View): return TemplateResponse(request, "get_started/profile.html", data) def post(self, request): - """ update your profile """ + """update your profile""" form = forms.LimitedEditUserForm( request.POST, request.FILES, instance=request.user ) @@ -46,12 +46,12 @@ class GetStartedProfile(View): @method_decorator(login_required, name="dispatch") class GetStartedBooks(View): - """ name a book, any book, we gotta start somewhere """ + """name a book, any book, we gotta start somewhere""" next_view = "get-started-users" def get(self, request): - """ info about a book """ + """info about a book""" query = request.GET.get("query") book_results = popular_books = [] if query: @@ -82,7 +82,7 @@ class GetStartedBooks(View): return TemplateResponse(request, "get_started/books.html", data) def post(self, request): - """ shelve some books """ + """shelve some books""" shelve_actions = [ (k, v) for k, v in request.POST.items() @@ -100,10 +100,10 @@ class GetStartedBooks(View): @method_decorator(login_required, name="dispatch") class GetStartedUsers(View): - """ find friends """ + """find friends""" def get(self, request): - """ basic profile info """ + """basic profile info""" query = request.GET.get("query") user_results = ( models.User.viewer_aware_objects(request.user) diff --git a/bookwyrm/views/goal.py b/bookwyrm/views/goal.py index 1627d3da..84091fe3 100644 --- a/bookwyrm/views/goal.py +++ b/bookwyrm/views/goal.py @@ -16,10 +16,10 @@ from .helpers import get_user_from_username # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Goal(View): - """ track books for the year """ + """track books for the year""" def get(self, request, username, year): - """ reading goal page """ + """reading goal page""" user = get_user_from_username(request.user, username) year = int(year) goal = models.AnnualGoal.objects.filter(year=year, user=user).first() @@ -39,7 +39,7 @@ class Goal(View): return TemplateResponse(request, "goal.html", data) def post(self, request, username, year): - """ update or create an annual goal """ + """update or create an annual goal""" user = get_user_from_username(request.user, username) if user != request.user: return HttpResponseNotFound() @@ -71,7 +71,7 @@ class Goal(View): @require_POST @login_required def hide_goal(request): - """ don't keep bugging people to set a goal """ + """don't keep bugging people to set a goal""" request.user.show_goal = False request.user.save(broadcast=False) return redirect(request.headers.get("Referer", "/")) diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py index 57c33437..8a60b54c 100644 --- a/bookwyrm/views/helpers.py +++ b/bookwyrm/views/helpers.py @@ -11,7 +11,7 @@ from bookwyrm.utils import regex def get_user_from_username(viewer, username): - """ helper function to resolve a localname or a username to a user """ + """helper function to resolve a localname or a username to a user""" # raises DoesNotExist if user is now found try: return models.User.viewer_aware_objects(viewer).get(localname=username) @@ -20,12 +20,12 @@ def get_user_from_username(viewer, username): def is_api_request(request): - """ check whether a request is asking for html or data """ + """check whether a request is asking for html or data""" return "json" in request.headers.get("Accept", "") or request.path[-5:] == ".json" def is_bookwyrm_request(request): - """ check if the request is coming from another bookwyrm instance """ + """check if the request is coming from another bookwyrm instance""" user_agent = request.headers.get("User-Agent") if user_agent is None or re.search(regex.bookwyrm_user_agent, user_agent) is None: return False @@ -33,7 +33,7 @@ def is_bookwyrm_request(request): def privacy_filter(viewer, queryset, privacy_levels=None, following_only=False): - """ filter objects that have "user" and "privacy" fields """ + """filter objects that have "user" and "privacy" fields""" privacy_levels = privacy_levels or ["public", "unlisted", "followers", "direct"] # if there'd a deleted field, exclude deleted items try: @@ -84,7 +84,7 @@ def privacy_filter(viewer, queryset, privacy_levels=None, following_only=False): def handle_remote_webfinger(query): - """ webfingerin' other servers """ + """webfingerin' other servers""" user = None # usernames could be @user@domain or user@domain @@ -120,7 +120,7 @@ def handle_remote_webfinger(query): def get_edition(book_id): - """ look up a book in the db and return an edition """ + """look up a book in the db and return an edition""" book = models.Book.objects.select_subclasses().get(id=book_id) if isinstance(book, models.Work): book = book.get_default_edition() @@ -128,7 +128,7 @@ def get_edition(book_id): def handle_reading_status(user, shelf, book, privacy): - """ post about a user reading a book """ + """post about a user reading a book""" # tell the world about this cool thing that happened try: message = { @@ -145,14 +145,14 @@ def handle_reading_status(user, shelf, book, privacy): def is_blocked(viewer, user): - """ is this viewer blocked by the user? """ + """is this viewer blocked by the user?""" if viewer.is_authenticated and viewer in user.blocks.all(): return True return False def get_discover_books(): - """ list of books for the discover page """ + """list of books for the discover page""" return list( set( models.Edition.objects.filter( @@ -169,7 +169,7 @@ def get_discover_books(): def get_suggested_users(user): - """ bookwyrm users you don't already know """ + """bookwyrm users you don't already know""" return ( get_annotated_users( user, @@ -184,7 +184,7 @@ def get_suggested_users(user): def get_annotated_users(user, *args, **kwargs): - """ Users, annotated with things they have in common """ + """Users, annotated with things they have in common""" return ( models.User.objects.filter(discoverable=True, is_active=True, *args, **kwargs) .exclude(Q(id__in=user.blocks.all()) | Q(blocks=user)) diff --git a/bookwyrm/views/import_data.py b/bookwyrm/views/import_data.py index 5bdbe915..a2abbc69 100644 --- a/bookwyrm/views/import_data.py +++ b/bookwyrm/views/import_data.py @@ -16,10 +16,10 @@ from bookwyrm.tasks import app # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Import(View): - """ import view """ + """import view""" def get(self, request): - """ load import page """ + """load import page""" return TemplateResponse( request, "import.html", @@ -32,7 +32,7 @@ class Import(View): ) def post(self, request): - """ ingest a goodreads csv """ + """ingest a goodreads csv""" form = forms.ImportForm(request.POST, request.FILES) if form.is_valid(): include_reviews = request.POST.get("include_reviews") == "on" @@ -66,10 +66,10 @@ class Import(View): @method_decorator(login_required, name="dispatch") class ImportStatus(View): - """ status of an existing import """ + """status of an existing import""" def get(self, request, job_id): - """ status of an import job """ + """status of an import job""" job = models.ImportJob.objects.get(id=job_id) if job.user != request.user: raise PermissionDenied @@ -84,7 +84,7 @@ class ImportStatus(View): ) def post(self, request, job_id): - """ retry lines from an import """ + """retry lines from an import""" job = get_object_or_404(models.ImportJob, id=job_id) items = [] for item in request.POST.getlist("import_item"): diff --git a/bookwyrm/views/inbox.py b/bookwyrm/views/inbox.py index c701956d..a558c571 100644 --- a/bookwyrm/views/inbox.py +++ b/bookwyrm/views/inbox.py @@ -19,10 +19,10 @@ from bookwyrm.utils import regex @method_decorator(csrf_exempt, name="dispatch") # pylint: disable=no-self-use class Inbox(View): - """ requests sent by outside servers""" + """requests sent by outside servers""" def post(self, request, username=None): - """ only works as POST request """ + """only works as POST request""" # first check if this server is on our shitlist if is_blocked_user_agent(request): return HttpResponseForbidden() @@ -65,7 +65,7 @@ class Inbox(View): def is_blocked_user_agent(request): - """ check if a request is from a blocked server based on user agent """ + """check if a request is from a blocked server based on user agent""" # check user agent user_agent = request.headers.get("User-Agent") if not user_agent: @@ -78,7 +78,7 @@ def is_blocked_user_agent(request): def is_blocked_activity(activity_json): - """ get the sender out of activity json and check if it's blocked """ + """get the sender out of activity json and check if it's blocked""" actor = activity_json.get("actor") # check if the user is banned/deleted @@ -94,7 +94,7 @@ def is_blocked_activity(activity_json): @app.task def activity_task(activity_json): - """ do something with this json we think is legit """ + """do something with this json we think is legit""" # lets see if the activitypub module can make sense of this json activity = activitypub.parse(activity_json) @@ -104,7 +104,7 @@ def activity_task(activity_json): def has_valid_signature(request, activity): - """ verify incoming signature """ + """verify incoming signature""" try: signature = Signature.parse(request) diff --git a/bookwyrm/views/interaction.py b/bookwyrm/views/interaction.py index e337f2ef..e138e41c 100644 --- a/bookwyrm/views/interaction.py +++ b/bookwyrm/views/interaction.py @@ -12,10 +12,10 @@ from bookwyrm import models # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Favorite(View): - """ like a status """ + """like a status""" def post(self, request, status_id): - """ create a like """ + """create a like""" status = models.Status.objects.get(id=status_id) try: models.Favorite.objects.create(status=status, user=request.user) @@ -28,10 +28,10 @@ class Favorite(View): @method_decorator(login_required, name="dispatch") class Unfavorite(View): - """ take back a fav """ + """take back a fav""" def post(self, request, status_id): - """ unlike a status """ + """unlike a status""" status = models.Status.objects.get(id=status_id) try: favorite = models.Favorite.objects.get(status=status, user=request.user) @@ -45,10 +45,10 @@ class Unfavorite(View): @method_decorator(login_required, name="dispatch") class Boost(View): - """ boost a status """ + """boost a status""" def post(self, request, status_id): - """ boost a status """ + """boost a status""" status = models.Status.objects.get(id=status_id) # is it boostable? if not status.boostable: @@ -70,10 +70,10 @@ class Boost(View): @method_decorator(login_required, name="dispatch") class Unboost(View): - """ boost a status """ + """boost a status""" def post(self, request, status_id): - """ boost a status """ + """boost a status""" status = models.Status.objects.get(id=status_id) boost = models.Boost.objects.filter( boosted_status=status, user=request.user diff --git a/bookwyrm/views/invite.py b/bookwyrm/views/invite.py index cbb189b5..92f930f4 100644 --- a/bookwyrm/views/invite.py +++ b/bookwyrm/views/invite.py @@ -26,10 +26,10 @@ from . import helpers name="dispatch", ) class ManageInvites(View): - """ create invites """ + """create invites""" def get(self, request): - """ invite management page """ + """invite management page""" paginated = Paginator( models.SiteInvite.objects.filter(user=request.user).order_by( "-created_date" @@ -44,7 +44,7 @@ class ManageInvites(View): return TemplateResponse(request, "settings/manage_invites.html", data) def post(self, request): - """ creates an invite database entry """ + """creates an invite database entry""" form = forms.CreateInviteForm(request.POST) if not form.is_valid(): return HttpResponseBadRequest("ERRORS : %s" % (form.errors,)) @@ -64,10 +64,10 @@ class ManageInvites(View): class Invite(View): - """ use an invite to register """ + """use an invite to register""" def get(self, request, code): - """ endpoint for using an invites """ + """endpoint for using an invites""" if request.user.is_authenticated: return redirect("/") invite = get_object_or_404(models.SiteInvite, code=code) @@ -83,10 +83,10 @@ class Invite(View): class ManageInviteRequests(View): - """ grant invites like the benevolent lord you are """ + """grant invites like the benevolent lord you are""" def get(self, request): - """ view a list of requests """ + """view a list of requests""" ignored = request.GET.get("ignored", False) sort = request.GET.get("sort") sort_fields = [ @@ -132,7 +132,7 @@ class ManageInviteRequests(View): return TemplateResponse(request, "settings/manage_invite_requests.html", data) def post(self, request): - """ send out an invite """ + """send out an invite""" invite_request = get_object_or_404( models.InviteRequest, id=request.POST.get("invite-request") ) @@ -152,10 +152,10 @@ class ManageInviteRequests(View): class InviteRequest(View): - """ prospective users sign up here """ + """prospective users sign up here""" def post(self, request): - """ create a request """ + """create a request""" form = forms.InviteRequestForm(request.POST) received = False if form.is_valid(): @@ -172,7 +172,7 @@ class InviteRequest(View): @require_POST def ignore_invite_request(request): - """ hide an invite request """ + """hide an invite request""" invite_request = get_object_or_404( models.InviteRequest, id=request.POST.get("invite-request") ) diff --git a/bookwyrm/views/isbn.py b/bookwyrm/views/isbn.py index b7ba02dd..197088ba 100644 --- a/bookwyrm/views/isbn.py +++ b/bookwyrm/views/isbn.py @@ -13,10 +13,10 @@ from .helpers import is_api_request # pylint: disable= no-self-use class Isbn(View): - """ search a book by isbn """ + """search a book by isbn""" def get(self, request, isbn): - """ info about a book """ + """info about a book""" book_results = connector_manager.isbn_local_search(isbn) if is_api_request(request): diff --git a/bookwyrm/views/landing.py b/bookwyrm/views/landing.py index 407451fb..1361935e 100644 --- a/bookwyrm/views/landing.py +++ b/bookwyrm/views/landing.py @@ -9,18 +9,18 @@ from . import helpers # pylint: disable= no-self-use class About(View): - """ create invites """ + """create invites""" def get(self, request): - """ more information about the instance """ + """more information about the instance""" return TemplateResponse(request, "discover/about.html") class Home(View): - """ discover page or home feed depending on auth """ + """discover page or home feed depending on auth""" def get(self, request): - """ this is the same as the feed on the home tab """ + """this is the same as the feed on the home tab""" if request.user.is_authenticated: feed_view = Feed.as_view() return feed_view(request, "home") @@ -29,10 +29,10 @@ class Home(View): class Discover(View): - """ preview of recently reviewed books """ + """preview of recently reviewed books""" def get(self, request): - """ tiled book activity page """ + """tiled book activity page""" data = { "register_form": forms.RegisterForm(), "request_form": forms.InviteRequestForm(), diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py index a2cf7afe..992ea4f7 100644 --- a/bookwyrm/views/list.py +++ b/bookwyrm/views/list.py @@ -22,10 +22,10 @@ from .helpers import get_user_from_username # pylint: disable=no-self-use class Lists(View): - """ book list page """ + """book list page""" def get(self, request): - """ display a book list """ + """display a book list""" # hide lists with no approved books lists = ( models.List.objects.annotate( @@ -51,7 +51,7 @@ class Lists(View): @method_decorator(login_required, name="dispatch") # pylint: disable=unused-argument def post(self, request): - """ create a book_list """ + """create a book_list""" form = forms.ListForm(request.POST) if not form.is_valid(): return redirect("lists") @@ -61,10 +61,10 @@ class Lists(View): class UserLists(View): - """ a user's book list page """ + """a user's book list page""" def get(self, request, username): - """ display a book list """ + """display a book list""" user = get_user_from_username(request.user, username) lists = models.List.objects.filter(user=user) lists = privacy_filter(request.user, lists) @@ -81,10 +81,10 @@ class UserLists(View): class List(View): - """ book list page """ + """book list page""" def get(self, request, list_id): - """ display a book list """ + """display a book list""" book_list = get_object_or_404(models.List, id=list_id) if not book_list.visible_to_user(request.user): return HttpResponseNotFound() @@ -166,7 +166,7 @@ class List(View): @method_decorator(login_required, name="dispatch") # pylint: disable=unused-argument def post(self, request, list_id): - """ edit a list """ + """edit a list""" book_list = get_object_or_404(models.List, id=list_id) form = forms.ListForm(request.POST, instance=book_list) if not form.is_valid(): @@ -176,11 +176,11 @@ class List(View): class Curate(View): - """ approve or discard list suggestsions """ + """approve or discard list suggestsions""" @method_decorator(login_required, name="dispatch") def get(self, request, list_id): - """ display a pending list """ + """display a pending list""" book_list = get_object_or_404(models.List, id=list_id) if not book_list.user == request.user: # only the creater can curate the list @@ -196,7 +196,7 @@ class Curate(View): @method_decorator(login_required, name="dispatch") # pylint: disable=unused-argument def post(self, request, list_id): - """ edit a book_list """ + """edit a book_list""" book_list = get_object_or_404(models.List, id=list_id) suggestion = get_object_or_404(models.ListItem, id=request.POST.get("item")) approved = request.POST.get("approved") == "true" @@ -222,7 +222,7 @@ class Curate(View): @require_POST def add_book(request): - """ put a book on a list """ + """put a book on a list""" book_list = get_object_or_404(models.List, id=request.POST.get("list")) if not book_list.visible_to_user(request.user): return HttpResponseNotFound() @@ -268,7 +268,7 @@ def add_book(request): @require_POST def remove_book(request, list_id): - """ remove a book from a list """ + """remove a book from a list""" with transaction.atomic(): book_list = get_object_or_404(models.List, id=list_id) item = get_object_or_404(models.ListItem, id=request.POST.get("item")) @@ -336,7 +336,7 @@ def set_book_position(request, list_item_id): def increment_order_in_reverse( book_list_id: int, start: int, end: Optional[int] = None ): - """ increase the order nu,ber for every item in a list """ + """increase the order nu,ber for every item in a list""" try: book_list = models.List.objects.get(id=book_list_id) except models.List.DoesNotExist: @@ -352,7 +352,7 @@ def increment_order_in_reverse( @transaction.atomic def decrement_order(book_list_id, start, end): - """ decrement the order value for every item in a list """ + """decrement the order value for every item in a list""" try: book_list = models.List.objects.get(id=book_list_id) except models.List.DoesNotExist: @@ -367,7 +367,7 @@ def decrement_order(book_list_id, start, end): @transaction.atomic def normalize_book_list_ordering(book_list_id, start=0, add_offset=0): - """ gives each book in a list the proper sequential order number """ + """gives each book in a list the proper sequential order number""" try: book_list = models.List.objects.get(id=book_list_id) except models.List.DoesNotExist: diff --git a/bookwyrm/views/notifications.py b/bookwyrm/views/notifications.py index 7a62ec01..e0e2102d 100644 --- a/bookwyrm/views/notifications.py +++ b/bookwyrm/views/notifications.py @@ -9,10 +9,10 @@ from django.views import View # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Notifications(View): - """ notifications view """ + """notifications view""" def get(self, request): - """ people are interacting with you, get hyped """ + """people are interacting with you, get hyped""" notifications = request.user.notification_set.all().order_by("-created_date") unread = [n.id for n in notifications.filter(read=False)] data = { @@ -23,6 +23,6 @@ class Notifications(View): return TemplateResponse(request, "notifications.html", data) def post(self, request): - """ permanently delete notification for user """ + """permanently delete notification for user""" request.user.notification_set.filter(read=True).delete() return redirect("/notifications") diff --git a/bookwyrm/views/outbox.py b/bookwyrm/views/outbox.py index ec6f5cd3..4bc2d2b9 100644 --- a/bookwyrm/views/outbox.py +++ b/bookwyrm/views/outbox.py @@ -9,10 +9,10 @@ from .helpers import is_bookwyrm_request # pylint: disable= no-self-use class Outbox(View): - """ outbox """ + """outbox""" def get(self, request, username): - """ outbox for the requested user """ + """outbox for the requested user""" user = get_object_or_404(models.User, localname=username) filter_type = request.GET.get("type") if filter_type not in models.status_models: diff --git a/bookwyrm/views/password.py b/bookwyrm/views/password.py index 67010974..933817a8 100644 --- a/bookwyrm/views/password.py +++ b/bookwyrm/views/password.py @@ -14,17 +14,17 @@ from bookwyrm.emailing import password_reset_email # pylint: disable= no-self-use class PasswordResetRequest(View): - """ forgot password flow """ + """forgot password flow""" def get(self, request): - """ password reset page """ + """password reset page""" return TemplateResponse( request, "password_reset_request.html", ) def post(self, request): - """ create a password reset token """ + """create a password reset token""" email = request.POST.get("email") try: user = models.User.objects.get(email=email) @@ -43,10 +43,10 @@ class PasswordResetRequest(View): class PasswordReset(View): - """ set new password """ + """set new password""" def get(self, request, code): - """ endpoint for sending invites """ + """endpoint for sending invites""" if request.user.is_authenticated: return redirect("/") try: @@ -59,7 +59,7 @@ class PasswordReset(View): return TemplateResponse(request, "password_reset.html", {"code": code}) def post(self, request, code): - """ allow a user to change their password through an emailed token """ + """allow a user to change their password through an emailed token""" try: reset_code = models.PasswordReset.objects.get(code=code) except models.PasswordReset.DoesNotExist: @@ -84,15 +84,15 @@ class PasswordReset(View): @method_decorator(login_required, name="dispatch") class ChangePassword(View): - """ change password as logged in user """ + """change password as logged in user""" def get(self, request): - """ change password page """ + """change password page""" data = {"user": request.user} return TemplateResponse(request, "preferences/change_password.html", data) def post(self, request): - """ allow a user to change their password """ + """allow a user to change their password""" new_password = request.POST.get("password") confirm_password = request.POST.get("confirm-password") diff --git a/bookwyrm/views/reading.py b/bookwyrm/views/reading.py index f2d5b2c2..65ca717d 100644 --- a/bookwyrm/views/reading.py +++ b/bookwyrm/views/reading.py @@ -18,7 +18,7 @@ from .shelf import handle_unshelve @login_required @require_POST def start_reading(request, book_id): - """ begin reading a book """ + """begin reading a book""" book = get_edition(book_id) reading_shelf = models.Shelf.objects.filter( identifier=models.Shelf.READING, user=request.user @@ -60,7 +60,7 @@ def start_reading(request, book_id): @login_required @require_POST def finish_reading(request, book_id): - """ a user completed a book, yay """ + """a user completed a book, yay""" book = get_edition(book_id) finished_read_shelf = models.Shelf.objects.filter( identifier=models.Shelf.READ_FINISHED, user=request.user @@ -101,7 +101,7 @@ def finish_reading(request, book_id): @login_required @require_POST def edit_readthrough(request): - """ can't use the form because the dates are too finnicky """ + """can't use the form because the dates are too finnicky""" readthrough = update_readthrough(request, create=False) if not readthrough: return HttpResponseNotFound() @@ -121,7 +121,7 @@ def edit_readthrough(request): @login_required @require_POST def delete_readthrough(request): - """ remove a readthrough """ + """remove a readthrough""" readthrough = get_object_or_404(models.ReadThrough, id=request.POST.get("id")) # don't let people edit other people's data @@ -135,7 +135,7 @@ def delete_readthrough(request): @login_required @require_POST def create_readthrough(request): - """ can't use the form because the dates are too finnicky """ + """can't use the form because the dates are too finnicky""" book = get_object_or_404(models.Edition, id=request.POST.get("book")) readthrough = update_readthrough(request, create=True, book=book) if not readthrough: @@ -145,14 +145,14 @@ def create_readthrough(request): def load_date_in_user_tz_as_utc(date_str: str, user: models.User) -> datetime: - """ ensures that data is stored consistently in the UTC timezone """ + """ensures that data is stored consistently in the UTC timezone""" user_tz = dateutil.tz.gettz(user.preferred_timezone) start_date = dateutil.parser.parse(date_str, ignoretz=True) return start_date.replace(tzinfo=user_tz).astimezone(dateutil.tz.UTC) def update_readthrough(request, book=None, create=True): - """ updates but does not save dates on a readthrough """ + """updates but does not save dates on a readthrough""" try: read_id = request.POST.get("id") if not read_id: @@ -209,7 +209,7 @@ def update_readthrough(request, book=None, create=True): @login_required @require_POST def delete_progressupdate(request): - """ remove a progress update """ + """remove a progress update""" update = get_object_or_404(models.ProgressUpdate, id=request.POST.get("id")) # don't let people edit other people's data diff --git a/bookwyrm/views/reports.py b/bookwyrm/views/reports.py index 07eb9b97..46c23884 100644 --- a/bookwyrm/views/reports.py +++ b/bookwyrm/views/reports.py @@ -20,10 +20,10 @@ from bookwyrm import forms, models name="dispatch", ) class Reports(View): - """ list of reports """ + """list of reports""" def get(self, request): - """ view current reports """ + """view current reports""" filters = {} resolved = request.GET.get("resolved") == "true" @@ -52,17 +52,17 @@ class Reports(View): name="dispatch", ) class Report(View): - """ view a specific report """ + """view a specific report""" def get(self, request, report_id): - """ load a report """ + """load a report""" data = { "report": get_object_or_404(models.Report, id=report_id), } return TemplateResponse(request, "moderation/report.html", data) def post(self, request, report_id): - """ comment on a report """ + """comment on a report""" report = get_object_or_404(models.Report, id=report_id) models.ReportComment.objects.create( user=request.user, @@ -75,7 +75,7 @@ class Report(View): @login_required @permission_required("bookwyrm_moderate_user") def suspend_user(_, user_id): - """ mark an account as inactive """ + """mark an account as inactive""" user = get_object_or_404(models.User, id=user_id) user.is_active = not user.is_active # this isn't a full deletion, so we don't want to tell the world @@ -86,7 +86,7 @@ def suspend_user(_, user_id): @login_required @permission_required("bookwyrm_moderate_post") def resolve_report(_, report_id): - """ mark a report as (un)resolved """ + """mark a report as (un)resolved""" report = get_object_or_404(models.Report, id=report_id) report.resolved = not report.resolved report.save() @@ -98,7 +98,7 @@ def resolve_report(_, report_id): @login_required @require_POST def make_report(request): - """ a user reports something """ + """a user reports something""" form = forms.ReportForm(request.POST) if not form.is_valid(): raise ValueError(form.errors) diff --git a/bookwyrm/views/rss_feed.py b/bookwyrm/views/rss_feed.py index ed3e84f4..f1678b7f 100644 --- a/bookwyrm/views/rss_feed.py +++ b/bookwyrm/views/rss_feed.py @@ -5,25 +5,25 @@ from .helpers import get_user_from_username, privacy_filter # pylint: disable=no-self-use, unused-argument class RssFeed(Feed): - """ serialize user's posts in rss feed """ + """serialize user's posts in rss feed""" description_template = "snippets/rss_content.html" title_template = "snippets/rss_title.html" def get_object(self, request, username): - """ the user who's posts get serialized """ + """the user who's posts get serialized""" return get_user_from_username(request.user, username) def link(self, obj): - """ link to the user's profile """ + """link to the user's profile""" return obj.local_path def title(self, obj): - """ title of the rss feed entry """ + """title of the rss feed entry""" return f"Status updates from {obj.display_name}" def items(self, obj): - """ the user's activity feed """ + """the user's activity feed""" return privacy_filter( obj, obj.status_set.select_subclasses(), @@ -31,5 +31,5 @@ class RssFeed(Feed): ) def item_link(self, item): - """ link to the status """ + """link to the status""" return item.local_path diff --git a/bookwyrm/views/search.py b/bookwyrm/views/search.py index 9e7df9f4..4543b55e 100644 --- a/bookwyrm/views/search.py +++ b/bookwyrm/views/search.py @@ -16,10 +16,10 @@ from .helpers import handle_remote_webfinger # pylint: disable= no-self-use class Search(View): - """ search users or books """ + """search users or books""" def get(self, request): - """ that search bar up top """ + """that search bar up top""" query = request.GET.get("q") min_confidence = request.GET.get("min_confidence", 0.1) diff --git a/bookwyrm/views/shelf.py b/bookwyrm/views/shelf.py index 446bedba..9bcf0a4a 100644 --- a/bookwyrm/views/shelf.py +++ b/bookwyrm/views/shelf.py @@ -21,10 +21,10 @@ from .helpers import handle_reading_status, privacy_filter # pylint: disable= no-self-use class Shelf(View): - """ shelf page """ + """shelf page""" def get(self, request, username, shelf_identifier=None): - """ display a shelf """ + """display a shelf""" try: user = get_user_from_username(request.user, username) except models.User.DoesNotExist: @@ -73,7 +73,7 @@ class Shelf(View): @method_decorator(login_required, name="dispatch") # pylint: disable=unused-argument def post(self, request, username, shelf_identifier): - """ edit a shelf """ + """edit a shelf""" try: shelf = request.user.shelf_set.get(identifier=shelf_identifier) except models.Shelf.DoesNotExist: @@ -94,7 +94,7 @@ class Shelf(View): @login_required @require_POST def create_shelf(request): - """ user generated shelves """ + """user generated shelves""" form = forms.ShelfForm(request.POST) if not form.is_valid(): return redirect(request.headers.get("Referer", "/")) @@ -106,7 +106,7 @@ def create_shelf(request): @login_required @require_POST def delete_shelf(request, shelf_id): - """ user generated shelves """ + """user generated shelves""" shelf = get_object_or_404(models.Shelf, id=shelf_id) if request.user != shelf.user or not shelf.editable: return HttpResponseBadRequest() @@ -118,7 +118,7 @@ def delete_shelf(request, shelf_id): @login_required @require_POST def shelve(request): - """ put a book on a user's shelf """ + """put a book on a user's shelf""" book = get_edition(request.POST.get("book")) desired_shelf = models.Shelf.objects.filter( @@ -177,7 +177,7 @@ def shelve(request): @login_required @require_POST def unshelve(request): - """ put a on a user's shelf """ + """put a on a user's shelf""" book = models.Edition.objects.get(id=request.POST["book"]) current_shelf = models.Shelf.objects.get(id=request.POST["shelf"]) @@ -187,6 +187,6 @@ def unshelve(request): # pylint: disable=unused-argument def handle_unshelve(book, shelf): - """ unshelve a book """ + """unshelve a book""" row = models.ShelfBook.objects.get(book=book, shelf=shelf) row.delete() diff --git a/bookwyrm/views/site.py b/bookwyrm/views/site.py index e5897660..46bdf722 100644 --- a/bookwyrm/views/site.py +++ b/bookwyrm/views/site.py @@ -15,16 +15,16 @@ from bookwyrm import emailing, forms, models name="dispatch", ) class Site(View): - """ manage things like the instance name """ + """manage things like the instance name""" def get(self, request): - """ edit form """ + """edit form""" site = models.SiteSettings.objects.get() data = {"site_form": forms.SiteForm(instance=site)} return TemplateResponse(request, "settings/site.html", data) def post(self, request): - """ edit the site settings """ + """edit the site settings""" site = models.SiteSettings.objects.get() form = forms.SiteForm(request.POST, request.FILES, instance=site) if not form.is_valid(): @@ -38,7 +38,7 @@ class Site(View): @login_required @permission_required("bookwyrm.edit_instance_settings", raise_exception=True) def email_preview(request): - """ for development, renders and example email template """ + """for development, renders and example email template""" template = request.GET.get("email") data = emailing.email_data() data["subject_path"] = "email/{}/subject.html".format(template) diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index f0119e0e..2295c8cc 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -19,16 +19,16 @@ from .reading import edit_readthrough # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class CreateStatus(View): - """ the view for *posting* """ + """the view for *posting*""" def get(self, request): - """ compose view (used for delete-and-redraft """ + """compose view (used for delete-and-redraft""" book = get_object_or_404(models.Edition, id=request.GET.get("book")) data = {"book": book} return TemplateResponse(request, "compose.html", data) def post(self, request, status_type): - """ create status of whatever type """ + """create status of whatever type""" status_type = status_type[0].upper() + status_type[1:] try: @@ -80,10 +80,10 @@ class CreateStatus(View): @method_decorator(login_required, name="dispatch") class DeleteStatus(View): - """ tombstone that bad boy """ + """tombstone that bad boy""" def post(self, request, status_id): - """ delete and tombstone a status """ + """delete and tombstone a status""" status = get_object_or_404(models.Status, id=status_id) # don't let people delete other people's statuses @@ -97,10 +97,10 @@ class DeleteStatus(View): @method_decorator(login_required, name="dispatch") class DeleteAndRedraft(View): - """ delete a status but let the user re-create it """ + """delete a status but let the user re-create it""" def post(self, request, status_id): - """ delete and tombstone a status """ + """delete and tombstone a status""" status = get_object_or_404( models.Status.objects.select_subclasses(), id=status_id ) @@ -130,7 +130,7 @@ class DeleteAndRedraft(View): def find_mentions(content): - """ detect @mentions in raw status content """ + """detect @mentions in raw status content""" if not content: return for match in re.finditer(regex.strict_username, content): @@ -148,7 +148,7 @@ def find_mentions(content): def format_links(content): - """ detect and format links """ + """detect and format links""" return re.sub( r'([^(href=")]|^|\()(https?:\/\/(%s([\w\.\-_\/+&\?=:;,])*))' % regex.domain, r'\g<1>\g<3>', @@ -157,7 +157,7 @@ def format_links(content): def to_markdown(content): - """ catch links and convert to markdown """ + """catch links and convert to markdown""" content = markdown(content) content = format_links(content) # sanitize resulting html diff --git a/bookwyrm/views/updates.py b/bookwyrm/views/updates.py index cc5fc419..34902272 100644 --- a/bookwyrm/views/updates.py +++ b/bookwyrm/views/updates.py @@ -7,7 +7,7 @@ from bookwyrm import activitystreams @login_required def get_notification_count(request): - """ any notifications waiting? """ + """any notifications waiting?""" return JsonResponse( { "count": request.user.notification_set.filter(read=False).count(), @@ -17,7 +17,7 @@ def get_notification_count(request): @login_required def get_unread_status_count(request, stream="home"): - """ any unread statuses for this feed? """ + """any unread statuses for this feed?""" stream = activitystreams.streams.get(stream) if not stream: return JsonResponse({}) diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index 02db5971..05fdb606 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -22,10 +22,10 @@ from .helpers import is_blocked, privacy_filter # pylint: disable= no-self-use class User(View): - """ user profile page """ + """user profile page""" def get(self, request, username): - """ profile page for a user """ + """profile page for a user""" try: user = get_user_from_username(request.user, username) except models.User.DoesNotExist: @@ -90,10 +90,10 @@ class User(View): class Followers(View): - """ list of followers view """ + """list of followers view""" def get(self, request, username): - """ list of followers """ + """list of followers""" try: user = get_user_from_username(request.user, username) except models.User.DoesNotExist: @@ -115,10 +115,10 @@ class Followers(View): class Following(View): - """ list of following view """ + """list of following view""" def get(self, request, username): - """ list of followers """ + """list of followers""" try: user = get_user_from_username(request.user, username) except models.User.DoesNotExist: @@ -141,10 +141,10 @@ class Following(View): @method_decorator(login_required, name="dispatch") class EditUser(View): - """ edit user view """ + """edit user view""" def get(self, request): - """ edit profile page for a user """ + """edit profile page for a user""" data = { "form": forms.EditUserForm(instance=request.user), "user": request.user, @@ -152,7 +152,7 @@ class EditUser(View): return TemplateResponse(request, "preferences/edit_user.html", data) def post(self, request): - """ les get fancy with images """ + """les get fancy with images""" form = forms.EditUserForm(request.POST, request.FILES, instance=request.user) if not form.is_valid(): data = {"form": form, "user": request.user} @@ -164,7 +164,7 @@ class EditUser(View): def save_user_form(form): - """ special handling for the user form """ + """special handling for the user form""" user = form.save(commit=False) if "avatar" in form.files: @@ -181,7 +181,7 @@ def save_user_form(form): def crop_avatar(image): - """ reduce the size and make an avatar square """ + """reduce the size and make an avatar square""" target_size = 120 width, height = image.size thumbnail_scale = ( diff --git a/bookwyrm/views/user_admin.py b/bookwyrm/views/user_admin.py index 4537abce..9d08e930 100644 --- a/bookwyrm/views/user_admin.py +++ b/bookwyrm/views/user_admin.py @@ -17,10 +17,10 @@ from bookwyrm.settings import PAGE_LENGTH name="dispatch", ) class UserAdminList(View): - """ admin view of users on this server """ + """admin view of users on this server""" def get(self, request): - """ list of users """ + """list of users""" filters = {} server = request.GET.get("server") if server: @@ -59,16 +59,16 @@ class UserAdminList(View): name="dispatch", ) class UserAdmin(View): - """ moderate an individual user """ + """moderate an individual user""" def get(self, request, user): - """ user view """ + """user view""" user = get_object_or_404(models.User, id=user) data = {"user": user, "group_form": forms.UserGroupForm()} return TemplateResponse(request, "user_admin/user.html", data) def post(self, request, user): - """ update user group """ + """update user group""" user = get_object_or_404(models.User, id=user) form = forms.UserGroupForm(request.POST, instance=user) if form.is_valid(): diff --git a/bookwyrm/views/wellknown.py b/bookwyrm/views/wellknown.py index 178d558e..2462c5a4 100644 --- a/bookwyrm/views/wellknown.py +++ b/bookwyrm/views/wellknown.py @@ -13,7 +13,7 @@ from bookwyrm.settings import DOMAIN, VERSION @require_GET def webfinger(request): - """ allow other servers to ask about a user """ + """allow other servers to ask about a user""" resource = request.GET.get("resource") if not resource or not resource.startswith("acct:"): return HttpResponseNotFound() @@ -40,7 +40,7 @@ def webfinger(request): @require_GET def nodeinfo_pointer(_): - """ direct servers to nodeinfo """ + """direct servers to nodeinfo""" return JsonResponse( { "links": [ @@ -55,7 +55,7 @@ def nodeinfo_pointer(_): @require_GET def nodeinfo(_): - """ basic info about the server """ + """basic info about the server""" status_count = models.Status.objects.filter(user__local=True).count() user_count = models.User.objects.filter(local=True).count() @@ -90,7 +90,7 @@ def nodeinfo(_): @require_GET def instance_info(_): - """ let's talk about your cool unique instance """ + """let's talk about your cool unique instance""" user_count = models.User.objects.filter(local=True).count() status_count = models.Status.objects.filter(user__local=True).count() @@ -116,12 +116,12 @@ def instance_info(_): @require_GET def peers(_): - """ list of federated servers this instance connects with """ + """list of federated servers this instance connects with""" names = models.FederatedServer.objects.values_list("server_name", flat=True) return JsonResponse(list(names), safe=False) @require_GET def host_meta(request): - """ meta of the host """ + """meta of the host""" return TemplateResponse(request, "host_meta.xml", {"DOMAIN": DOMAIN}) diff --git a/requirements.txt b/requirements.txt index 6b7d82d3..665e3253 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,7 +15,7 @@ django-rename-app==0.1.2 pytz>=2021.1 # Dev -black==20.8b1 +black==21.4b0 coverage==5.1 pytest-django==4.1.0 pytest==6.1.2 From 7fcf48e84df267da030aacae638cd6ba072ed215 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 09:57:01 -0700 Subject: [PATCH 05/18] Adds success notification for adding books to lists --- bookwyrm/templates/lists/list.html | 10 + bookwyrm/views/list.py | 4 +- locale/de_DE/LC_MESSAGES/django.po | 2894 ++++++++++++++++++++------ locale/en_US/LC_MESSAGES/django.po | 2412 +++++++++++++++++---- locale/es/LC_MESSAGES/django.po | 2764 +++++++++++++++--------- locale/fr_FR/LC_MESSAGES/django.po | 2726 +++++++++++++++++++----- locale/zh_Hans/LC_MESSAGES/django.po | 2758 +++++++++++++++++++----- 7 files changed, 10401 insertions(+), 3167 deletions(-) diff --git a/bookwyrm/templates/lists/list.html b/bookwyrm/templates/lists/list.html index 80e2ba20..641038d0 100644 --- a/bookwyrm/templates/lists/list.html +++ b/bookwyrm/templates/lists/list.html @@ -13,6 +13,16 @@
+ {% if request.GET.updated %} +
+ {% if list.curation != "open" and request.user != list.user %} + {% trans "You successfully suggested a book for this list!" %} + {% else %} + {% trans "You successfully added a book to this list!" %} + {% endif %} +
+ {% endif %} + {% if not items.object_list.exists %}

{% trans "This list is currently empty" %}

{% else %} diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py index 50bcb863..6a241ada 100644 --- a/bookwyrm/views/list.py +++ b/bookwyrm/views/list.py @@ -270,7 +270,9 @@ def add_book(request): pass path = reverse("list", args=[book_list.id]) - return redirect("{:s}?{:s}".format(path, urlencode(request.GET))) + params = request.GET + params["updated"] = True + return redirect("{:s}?{:s}".format(path, urlencode(params))) @require_POST diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index 962b9736..7acc3f96 100644 --- a/locale/de_DE/LC_MESSAGES/django.po +++ b/locale/de_DE/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: 2021-04-01 13:14-0700\n" +"POT-Creation-Date: 2021-04-26 09:56-0700\n" "PO-Revision-Date: 2021-03-02 17:19-0800\n" "Last-Translator: Mouse Reeve \n" "Language-Team: English \n" @@ -18,39 +18,70 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: bookwyrm/forms.py:226 +#: bookwyrm/forms.py:224 #, fuzzy #| msgid "A user with that username already exists." msgid "A user with this email already exists." msgstr "Dieser Benutzename ist bereits vergeben." -#: bookwyrm/forms.py:240 +#: bookwyrm/forms.py:238 msgid "One Day" msgstr "Ein Tag" -#: bookwyrm/forms.py:241 +#: bookwyrm/forms.py:239 msgid "One Week" msgstr "Eine Woche" -#: bookwyrm/forms.py:242 +#: bookwyrm/forms.py:240 msgid "One Month" msgstr "Ein Monat" -#: bookwyrm/forms.py:243 +#: bookwyrm/forms.py:241 msgid "Does Not Expire" msgstr "Läuft nicht aus" -#: bookwyrm/forms.py:248 +#: bookwyrm/forms.py:246 #, python-format msgid "%(count)d uses" msgstr "%(count)d Benutzungen" -#: bookwyrm/forms.py:251 +#: bookwyrm/forms.py:249 #, fuzzy #| msgid "Unlisted" msgid "Unlimited" msgstr "Ungelistet" +#: bookwyrm/forms.py:293 +msgid "List Order" +msgstr "" + +#: bookwyrm/forms.py:294 +#, fuzzy +#| msgid "Title" +msgid "Book Title" +msgstr "Titel" + +#: bookwyrm/forms.py:295 bookwyrm/templates/snippets/create_status_form.html:31 +#: bookwyrm/templates/user/shelf.html:80 bookwyrm/templates/user/shelf.html:110 +msgid "Rating" +msgstr "" + +#: bookwyrm/forms.py:297 bookwyrm/templates/lists/list.html:82 +msgid "Sort By" +msgstr "" + +#: bookwyrm/forms.py:301 +#, fuzzy +#| msgid "Started reading" +msgid "Ascending" +msgstr "Zu lesen angefangen" + +#: bookwyrm/forms.py:302 +#, fuzzy +#| msgid "Started reading" +msgid "Descending" +msgstr "Zu lesen angefangen" + #: bookwyrm/models/fields.py:24 #, python-format msgid "%(value)s is not a valid remote_id" @@ -61,7 +92,7 @@ msgstr "%(value)s ist keine gültige remote_id" msgid "%(value)s is not a valid username" msgstr "%(value)s ist kein gültiger Username" -#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:157 +#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:153 msgid "username" msgstr "Username" @@ -69,23 +100,23 @@ msgstr "Username" msgid "A user with that username already exists." msgstr "Dieser Benutzename ist bereits vergeben." -#: bookwyrm/settings.py:150 +#: bookwyrm/settings.py:152 msgid "English" msgstr "Englisch" -#: bookwyrm/settings.py:151 +#: bookwyrm/settings.py:153 msgid "German" msgstr "Deutsch" -#: bookwyrm/settings.py:152 +#: bookwyrm/settings.py:154 msgid "Spanish" msgstr "Spanisch" -#: bookwyrm/settings.py:153 +#: bookwyrm/settings.py:155 msgid "French" msgstr "Französisch" -#: bookwyrm/settings.py:154 +#: bookwyrm/settings.py:156 msgid "Simplified Chinese" msgstr "Vereinfachtes Chinesisch" @@ -122,82 +153,72 @@ msgstr "" msgid "Books by %(name)s" msgstr "Bücher von %(name)s" -#: bookwyrm/templates/book/book.html:21 +#: bookwyrm/templates/book/book.html:33 #: bookwyrm/templates/discover/large-book.html:12 #: bookwyrm/templates/discover/small-book.html:9 msgid "by" msgstr "von" -#: bookwyrm/templates/book/book.html:29 bookwyrm/templates/book/book.html:30 +#: bookwyrm/templates/book/book.html:41 bookwyrm/templates/book/book.html:42 msgid "Edit Book" msgstr "Buch editieren" -#: bookwyrm/templates/book/book.html:49 +#: bookwyrm/templates/book/book.html:61 #: bookwyrm/templates/book/cover_modal.html:5 msgid "Add cover" msgstr "Cover hinzufügen" -#: bookwyrm/templates/book/book.html:53 +#: bookwyrm/templates/book/book.html:65 #, fuzzy #| msgid "Failed to load" msgid "Failed to load cover" msgstr "Laden fehlgeschlagen" -#: bookwyrm/templates/book/book.html:62 -msgid "ISBN:" -msgstr "" - -#: bookwyrm/templates/book/book.html:69 -#: bookwyrm/templates/book/edit_book.html:211 -msgid "OCLC Number:" -msgstr "OCLC Nummer:" - -#: bookwyrm/templates/book/book.html:76 -#: bookwyrm/templates/book/edit_book.html:215 -msgid "ASIN:" -msgstr "" - -#: bookwyrm/templates/book/book.html:85 +#: bookwyrm/templates/book/book.html:82 msgid "View on OpenLibrary" msgstr "In OpenLibrary ansehen" -#: bookwyrm/templates/book/book.html:94 +#: bookwyrm/templates/book/book.html:102 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s Bewertung)" msgstr[1] "(%(review_count)s Bewertungen)" -#: bookwyrm/templates/book/book.html:100 +#: bookwyrm/templates/book/book.html:114 msgid "Add Description" msgstr "Beschreibung hinzufügen" -#: bookwyrm/templates/book/book.html:107 -#: bookwyrm/templates/book/edit_book.html:101 +#: bookwyrm/templates/book/book.html:121 +#: bookwyrm/templates/book/edit_book.html:107 #: bookwyrm/templates/lists/form.html:12 msgid "Description:" msgstr "Beschreibung:" -#: bookwyrm/templates/book/book.html:111 -#: bookwyrm/templates/book/edit_book.html:225 +#: bookwyrm/templates/book/book.html:125 +#: bookwyrm/templates/book/edit_book.html:240 #: bookwyrm/templates/edit_author.html:78 bookwyrm/templates/lists/form.html:42 #: bookwyrm/templates/preferences/edit_user.html:70 +#: bookwyrm/templates/settings/edit_server.html:68 +#: bookwyrm/templates/settings/federated_server.html:93 #: bookwyrm/templates/settings/site.html:93 -#: bookwyrm/templates/snippets/readthrough.html:65 +#: bookwyrm/templates/snippets/readthrough.html:75 #: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42 #: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:34 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:38 msgid "Save" msgstr "Speichern" -#: bookwyrm/templates/book/book.html:112 bookwyrm/templates/book/book.html:161 +#: bookwyrm/templates/book/book.html:126 bookwyrm/templates/book/book.html:175 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:226 +#: bookwyrm/templates/book/edit_book.html:241 #: bookwyrm/templates/edit_author.html:79 -#: bookwyrm/templates/moderation/report_modal.html:32 +#: bookwyrm/templates/moderation/report_modal.html:34 +#: bookwyrm/templates/settings/federated_server.html:94 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 #: bookwyrm/templates/snippets/goal_form.html:32 -#: bookwyrm/templates/snippets/readthrough.html:66 +#: bookwyrm/templates/snippets/readthrough.html:76 #: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43 #: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:35 @@ -205,80 +226,124 @@ msgstr "Speichern" msgid "Cancel" msgstr "Abbrechen" -#: bookwyrm/templates/book/book.html:121 +#: bookwyrm/templates/book/book.html:135 #, fuzzy, python-format #| msgid "%(title)s by " msgid "%(count)s editions" msgstr "%(title)s von" -#: bookwyrm/templates/book/book.html:129 +#: bookwyrm/templates/book/book.html:143 #, fuzzy, python-format #| msgid "Direct Messages with %(username)s" msgid "This edition is on your %(shelf_name)s shelf." msgstr "Direktnachrichten mit %(username)s" -#: bookwyrm/templates/book/book.html:135 +#: bookwyrm/templates/book/book.html:149 #, fuzzy, python-format -#| msgid " added %(book_title)s to your list \"%(list_name)s\"" -msgid "A different edition of this book is on your %(shelf_name)s shelf." -msgstr "hat %(book_title)s zu deiner Liste \"%(list_name)s\" Hinzugefügt" +#| msgid "" +#| " added %(book_title)s to your list " +#| "\"%(list_name)s\"" +msgid "" +"A different edition of this book is on your %(shelf_name)s shelf." +msgstr "" +"hat %(book_title)s zu deiner Liste " +"\"%(list_name)s\" Hinzugefügt" -#: bookwyrm/templates/book/book.html:144 +#: bookwyrm/templates/book/book.html:158 msgid "Your reading activity" msgstr "Deine Leseaktivität" -#: bookwyrm/templates/book/book.html:146 +#: bookwyrm/templates/book/book.html:160 msgid "Add read dates" msgstr "Lesedaten hinzufügen" -#: bookwyrm/templates/book/book.html:151 +#: bookwyrm/templates/book/book.html:165 msgid "You don't have any reading activity for this book." msgstr "Du hast keine Leseaktivität für dieses Buch." -#: bookwyrm/templates/book/book.html:158 +#: bookwyrm/templates/book/book.html:172 msgid "Create" msgstr "Erstellen" -#: bookwyrm/templates/book/book.html:180 +#: bookwyrm/templates/book/book.html:194 msgid "Subjects" msgstr "Themen" -#: bookwyrm/templates/book/book.html:191 +#: bookwyrm/templates/book/book.html:206 msgid "Places" msgstr "Orte" -#: bookwyrm/templates/book/book.html:202 bookwyrm/templates/layout.html:64 +#: bookwyrm/templates/book/book.html:217 bookwyrm/templates/layout.html:65 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search_results.html:91 #: bookwyrm/templates/user/user_layout.html:62 msgid "Lists" msgstr "Listen" -#: bookwyrm/templates/book/book.html:213 +#: bookwyrm/templates/book/book.html:228 #, fuzzy #| msgid "Go to list" msgid "Add to list" msgstr "Zur Liste" -#: bookwyrm/templates/book/book.html:223 +#: bookwyrm/templates/book/book.html:238 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:90 +#: bookwyrm/templates/lists/list.html:133 msgid "Add" msgstr "Hinzufügen" -#: bookwyrm/templates/book/book.html:251 +#: bookwyrm/templates/book/book.html:254 +#, fuzzy +#| msgid "Review" +msgid "Reviews" +msgstr "Bewerten" + +#: bookwyrm/templates/book/book.html:259 +#, fuzzy +#| msgid "Your shelves" +msgid "Your reviews" +msgstr "Deine Regale" + +#: bookwyrm/templates/book/book.html:265 +#, fuzzy +#| msgid "Your Account" +msgid "Your comments" +msgstr "Dein Account" + +#: bookwyrm/templates/book/book.html:271 +#, fuzzy +#| msgid "Your books" +msgid "Your quotes" +msgstr "Deine Bücher" + +#: bookwyrm/templates/book/book.html:305 msgid "rated it" msgstr "bewertet" +#: bookwyrm/templates/book/book_identifiers.html:8 +msgid "ISBN:" +msgstr "" + +#: bookwyrm/templates/book/book_identifiers.html:15 +#: bookwyrm/templates/book/edit_book.html:226 +msgid "OCLC Number:" +msgstr "OCLC Nummer:" + +#: bookwyrm/templates/book/book_identifiers.html:22 +#: bookwyrm/templates/book/edit_book.html:230 +msgid "ASIN:" +msgstr "" + #: bookwyrm/templates/book/cover_modal.html:17 -#: bookwyrm/templates/book/edit_book.html:163 +#: bookwyrm/templates/book/edit_book.html:178 #, fuzzy #| msgid "Add cover" msgid "Upload cover:" msgstr "Cover hinzufügen" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:169 +#: bookwyrm/templates/book/edit_book.html:184 msgid "Load cover from url:" msgstr "Cover von URL laden:" @@ -358,93 +423,93 @@ msgstr "Zurück" msgid "Metadata" msgstr "Metadaten" -#: bookwyrm/templates/book/edit_book.html:91 +#: bookwyrm/templates/book/edit_book.html:92 msgid "Title:" msgstr "Titel:" -#: bookwyrm/templates/book/edit_book.html:96 +#: bookwyrm/templates/book/edit_book.html:100 msgid "Subtitle:" msgstr "Untertitel:" -#: bookwyrm/templates/book/edit_book.html:106 +#: bookwyrm/templates/book/edit_book.html:113 msgid "Series:" msgstr "Serie:" -#: bookwyrm/templates/book/edit_book.html:111 +#: bookwyrm/templates/book/edit_book.html:120 msgid "Series number:" msgstr "Seriennummer:" -#: bookwyrm/templates/book/edit_book.html:117 +#: bookwyrm/templates/book/edit_book.html:126 #, fuzzy #| msgid "Published" msgid "Publisher:" msgstr "Veröffentlicht" -#: bookwyrm/templates/book/edit_book.html:119 +#: bookwyrm/templates/book/edit_book.html:128 msgid "Separate multiple publishers with commas." msgstr "Mehrere Herausgeber:innen durch Kommata trennen" -#: bookwyrm/templates/book/edit_book.html:125 +#: bookwyrm/templates/book/edit_book.html:135 msgid "First published date:" msgstr "Erstveröffentlichungsdatum:" -#: bookwyrm/templates/book/edit_book.html:130 +#: bookwyrm/templates/book/edit_book.html:143 msgid "Published date:" msgstr "Veröffentlichungsdatum:" -#: bookwyrm/templates/book/edit_book.html:137 +#: bookwyrm/templates/book/edit_book.html:152 #, fuzzy #| msgid "Author" msgid "Authors" msgstr "Autor*in" -#: bookwyrm/templates/book/edit_book.html:143 +#: bookwyrm/templates/book/edit_book.html:158 #, fuzzy, python-format #| msgid "Direct Messages with %(username)s" msgid "Remove %(name)s" msgstr "Direktnachrichten mit %(username)s" -#: bookwyrm/templates/book/edit_book.html:148 +#: bookwyrm/templates/book/edit_book.html:163 #, fuzzy #| msgid "Edit Author" msgid "Add Authors:" msgstr "Autor*in editieren" -#: bookwyrm/templates/book/edit_book.html:149 +#: bookwyrm/templates/book/edit_book.html:164 msgid "John Doe, Jane Smith" msgstr "" -#: bookwyrm/templates/book/edit_book.html:155 -#: bookwyrm/templates/user/shelf.html:75 +#: bookwyrm/templates/book/edit_book.html:170 +#: bookwyrm/templates/user/shelf.html:74 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit_book.html:182 +#: bookwyrm/templates/book/edit_book.html:197 msgid "Physical Properties" msgstr "Physikalische Eigenschaften" -#: bookwyrm/templates/book/edit_book.html:183 +#: bookwyrm/templates/book/edit_book.html:198 #: bookwyrm/templates/book/format_filter.html:5 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:191 +#: bookwyrm/templates/book/edit_book.html:206 msgid "Pages:" msgstr "Seiten:" -#: bookwyrm/templates/book/edit_book.html:198 +#: bookwyrm/templates/book/edit_book.html:213 msgid "Book Identifiers" msgstr "Buchidentifikatoren" -#: bookwyrm/templates/book/edit_book.html:199 +#: bookwyrm/templates/book/edit_book.html:214 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:203 +#: bookwyrm/templates/book/edit_book.html:218 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:207 +#: bookwyrm/templates/book/edit_book.html:222 #: bookwyrm/templates/edit_author.html:59 msgid "Openlibrary key:" msgstr "" @@ -468,46 +533,57 @@ msgstr "" msgid "Language:" msgstr "" -#: bookwyrm/templates/book/publisher_info.html:6 +#: bookwyrm/templates/book/publisher_info.html:22 +#, python-format +msgid "%(format)s" +msgstr "" + +#: bookwyrm/templates/book/publisher_info.html:24 #, python-format msgid "%(format)s, %(pages)s pages" msgstr "%(format)s, %(pages)s Seiten" -#: bookwyrm/templates/book/publisher_info.html:8 +#: bookwyrm/templates/book/publisher_info.html:26 #, python-format msgid "%(pages)s pages" msgstr "%(pages)s Seiten" -#: bookwyrm/templates/book/publisher_info.html:13 +#: bookwyrm/templates/book/publisher_info.html:38 #, fuzzy, python-format #| msgid "%(pages)s pages" msgid "%(languages)s language" msgstr "%(pages)s Seiten" -#: bookwyrm/templates/book/publisher_info.html:18 +#: bookwyrm/templates/book/publisher_info.html:64 #, python-format msgid "Published %(date)s by %(publisher)s." msgstr "Am %(date)s von %(publisher)s veröffentlicht." -#: bookwyrm/templates/book/publisher_info.html:20 +#: bookwyrm/templates/book/publisher_info.html:66 #, fuzzy, python-format #| msgid "Published date:" msgid "Published %(date)s" msgstr "Veröffentlichungsdatum:" -#: bookwyrm/templates/book/publisher_info.html:22 +#: bookwyrm/templates/book/publisher_info.html:68 #, python-format msgid "Published by %(publisher)s." msgstr "Veröffentlicht von %(publisher)s." #: bookwyrm/templates/components/inline_form.html:8 #: bookwyrm/templates/components/modal.html:11 -#: bookwyrm/templates/feed/feed_layout.html:57 +#: bookwyrm/templates/feed/feed_layout.html:70 #: bookwyrm/templates/get_started/layout.html:19 #: bookwyrm/templates/get_started/layout.html:52 msgid "Close" msgstr "Schließen" +#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8 +#, fuzzy +#| msgid "Boost status" +msgid "Compose status" +msgstr "Status teilen" + #: bookwyrm/templates/directory/community_filter.html:5 #, fuzzy #| msgid "Comment" @@ -528,7 +604,7 @@ msgstr "Föderiert" #: bookwyrm/templates/directory/directory.html:6 #: bookwyrm/templates/directory/directory.html:11 -#: bookwyrm/templates/layout.html:97 +#: bookwyrm/templates/layout.html:93 msgid "Directory" msgstr "" @@ -538,9 +614,15 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:26 #, fuzzy, python-format -#| msgid "You can set or change your reading goal any time from your profile page" -msgid "You can opt-out at any time in your profile settings." -msgstr "Du kannst dein Leseziel jederzeit auf deiner Profilseite setzen oder ändern." +#| msgid "" +#| "You can set or change your reading goal any time from your profile page" +msgid "" +"You can opt-out at any time in your profile settings." +msgstr "" +"Du kannst dein Leseziel jederzeit auf deiner Profilseite setzen oder ändern." #: bookwyrm/templates/directory/directory.html:31 #: bookwyrm/templates/snippets/goal_card.html:22 @@ -661,7 +743,7 @@ msgid "Email address:" msgstr "E-Mail Adresse" #: bookwyrm/templates/discover/landing_layout.html:70 -#: bookwyrm/templates/moderation/report_modal.html:31 +#: bookwyrm/templates/moderation/report_modal.html:33 msgid "Submit" msgstr "Absenden" @@ -716,7 +798,9 @@ msgstr "" #: bookwyrm/templates/email/html_layout.html:21 #, python-format -msgid "BookWyrm hosted on %(site_name)s" +msgid "" +"BookWyrm hosted on " +"%(site_name)s" msgstr "" #: bookwyrm/templates/email/html_layout.html:23 @@ -736,12 +820,16 @@ msgstr "" #: bookwyrm/templates/email/invite/html_content.html:15 #, python-format -msgid "Learn more about this instance." +msgid "" +"Learn more about this instance." msgstr "" #: bookwyrm/templates/email/invite/text_content.html:4 #, python-format -msgid "You're invited to join %(site_name)s! Click the link below to create an account." +msgid "" +"You're invited to join %(site_name)s! Click the link below to create an " +"account." msgstr "" #: bookwyrm/templates/email/invite/text_content.html:8 @@ -753,7 +841,9 @@ msgstr "Mehr über diese Seite" #: bookwyrm/templates/email/password_reset/html_content.html:6 #: bookwyrm/templates/email/password_reset/text_content.html:4 #, python-format -msgid "You requested to reset your %(site_name)s password. Click the link below to set a new password and log in to your account." +msgid "" +"You requested to reset your %(site_name)s password. Click the link below to " +"set a new password and log in to your account." msgstr "" #: bookwyrm/templates/email/password_reset/html_content.html:9 @@ -766,7 +856,8 @@ msgstr "Passwort zurücksetzen!" #: bookwyrm/templates/email/password_reset/html_content.html:13 #: bookwyrm/templates/email/password_reset/text_content.html:8 -msgid "If you didn't request to reset your password, you can ignore this email." +msgid "" +"If you didn't request to reset your password, you can ignore this email." msgstr "" #: bookwyrm/templates/email/password_reset/subject.html:2 @@ -781,7 +872,7 @@ msgid "Direct Messages with %(username)s" msgstr "Direktnachrichten mit %(username)s" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:87 +#: bookwyrm/templates/layout.html:88 msgid "Direct Messages" msgstr "Direktnachrichten" @@ -816,6 +907,7 @@ msgid "Local" msgstr "Lokal" #: bookwyrm/templates/feed/feed.html:25 +#: bookwyrm/templates/settings/edit_server.html:40 msgid "Federated" msgstr "Föderiert" @@ -825,7 +917,8 @@ msgid "load 0 unread status(es)" msgstr "" #: bookwyrm/templates/feed/feed.html:48 -msgid "There aren't any activities right now! Try following a user to get started" +msgid "" +"There aren't any activities right now! Try following a user to get started" msgstr "Hier sind noch keine Aktivitäten! Folge anderen, um loszulegen" #: bookwyrm/templates/feed/feed.html:56 @@ -838,36 +931,38 @@ msgid "Updates" msgstr "" #: bookwyrm/templates/feed/feed_layout.html:11 -#: bookwyrm/templates/layout.html:58 +#: bookwyrm/templates/layout.html:59 #: bookwyrm/templates/user/books_header.html:3 msgid "Your books" msgstr "Deine Bücher" #: bookwyrm/templates/feed/feed_layout.html:13 -msgid "There are no books here right now! Try searching for a book to get started" -msgstr "Hier sind noch keine Bücher! Versuche nach Büchern zu suchen um loszulegen" +msgid "" +"There are no books here right now! Try searching for a book to get started" +msgstr "" +"Hier sind noch keine Bücher! Versuche nach Büchern zu suchen um loszulegen" -#: bookwyrm/templates/feed/feed_layout.html:23 +#: bookwyrm/templates/feed/feed_layout.html:24 #: bookwyrm/templates/user/shelf.html:28 #, fuzzy #| msgid "Read" msgid "To Read" msgstr "Auf der Leseliste" -#: bookwyrm/templates/feed/feed_layout.html:24 +#: bookwyrm/templates/feed/feed_layout.html:25 #: bookwyrm/templates/user/shelf.html:28 #, fuzzy #| msgid "Start reading" msgid "Currently Reading" msgstr "Gerade lesend" -#: bookwyrm/templates/feed/feed_layout.html:25 +#: bookwyrm/templates/feed/feed_layout.html:26 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:11 #: bookwyrm/templates/user/shelf.html:28 msgid "Read" msgstr "Gelesen" -#: bookwyrm/templates/feed/feed_layout.html:74 bookwyrm/templates/goal.html:26 +#: bookwyrm/templates/feed/feed_layout.html:88 bookwyrm/templates/goal.html:26 #: bookwyrm/templates/snippets/goal_card.html:6 #, python-format msgid "%(year)s Reading Goal" @@ -900,7 +995,7 @@ msgid "What are you reading?" msgstr "Zu lesen angefangen" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:58 +#: bookwyrm/templates/lists/list.html:101 msgid "Search for a book" msgstr "Nach einem Buch suchen" @@ -920,8 +1015,8 @@ msgstr "" #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38 -#: bookwyrm/templates/lists/list.html:62 +#: bookwyrm/templates/layout.html:38 bookwyrm/templates/layout.html:39 +#: bookwyrm/templates/lists/list.html:105 msgid "Search" msgstr "Suche" @@ -938,7 +1033,7 @@ msgid "Popular on %(site_name)s" msgstr "Über %(site_name)s" #: bookwyrm/templates/get_started/books.html:51 -#: bookwyrm/templates/lists/list.html:75 +#: bookwyrm/templates/lists/list.html:118 msgid "No books found" msgstr "Keine Bücher gefunden" @@ -1016,7 +1111,9 @@ msgid "Show this account in suggested users:" msgstr "" #: bookwyrm/templates/get_started/profile.html:52 -msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." +msgid "" +"Your account will show up in the directory, and may be recommended to other " +"BookWyrm users." msgstr "" #: bookwyrm/templates/get_started/users.html:11 @@ -1043,8 +1140,12 @@ msgstr "Ziel bearbeiten" #: bookwyrm/templates/goal.html:30 #: bookwyrm/templates/snippets/goal_card.html:13 #, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." -msgstr "Setze dir ein Ziel, wie viele Bücher du %(year)s lesen wirst und behalte deinen Fortschritt über's Jahr im Auge." +msgid "" +"Set a goal for how many books you'll finish reading in %(year)s, and track " +"your progress throughout the year." +msgstr "" +"Setze dir ein Ziel, wie viele Bücher du %(year)s lesen wirst und behalte " +"deinen Fortschritt über's Jahr im Auge." #: bookwyrm/templates/goal.html:39 #, python-format @@ -1062,7 +1163,7 @@ msgid "%(username)s's %(year)s Books" msgstr "%(username)ss %(year)s Bücher" #: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9 -#: bookwyrm/templates/layout.html:102 +#: bookwyrm/templates/layout.html:98 msgid "Import Books" msgstr "Bücher importieren" @@ -1085,6 +1186,7 @@ msgid "Privacy setting for imported reviews:" msgstr "Datenschutzeinstellung für importierte Bewertungen" #: bookwyrm/templates/import.html:48 +#: bookwyrm/templates/settings/server_blocklist.html:64 msgid "Import" msgstr "Importieren" @@ -1127,8 +1229,12 @@ msgstr "Laden fehlgeschlagen" #: bookwyrm/templates/import_status.html:44 #, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." -msgstr "Zum Ende der Liste springen, um die %(failed_count)s Einträge, deren Import fehlschlug, auszuwählen." +msgid "" +"Jump to the bottom of the list to select the %(failed_count)s items which " +"failed to import." +msgstr "" +"Zum Ende der Liste springen, um die %(failed_count)s Einträge, deren Import " +"fehlschlug, auszuwählen." #: bookwyrm/templates/import_status.html:79 msgid "Select all" @@ -1149,12 +1255,12 @@ msgstr "Buch" #: bookwyrm/templates/import_status.html:115 #: bookwyrm/templates/snippets/create_status_form.html:10 -#: bookwyrm/templates/user/shelf.html:76 +#: bookwyrm/templates/user/shelf.html:75 bookwyrm/templates/user/shelf.html:93 msgid "Title" msgstr "Titel" #: bookwyrm/templates/import_status.html:118 -#: bookwyrm/templates/user/shelf.html:77 +#: bookwyrm/templates/user/shelf.html:76 bookwyrm/templates/user/shelf.html:96 msgid "Author" msgstr "Autor*in" @@ -1191,91 +1297,94 @@ msgstr "Suchergebnisse für \"%(query)s\"" msgid "Matching Books" msgstr "Passende Bücher" -#: bookwyrm/templates/layout.html:33 +#: bookwyrm/templates/layout.html:34 msgid "Search for a book or user" msgstr "Suche nach Buch oder Benutzer*in" -#: bookwyrm/templates/layout.html:47 bookwyrm/templates/layout.html:48 +#: bookwyrm/templates/layout.html:48 bookwyrm/templates/layout.html:49 msgid "Main navigation menu" msgstr "Navigationshauptmenü" -#: bookwyrm/templates/layout.html:61 +#: bookwyrm/templates/layout.html:62 msgid "Feed" msgstr "" -#: bookwyrm/templates/layout.html:92 -#: bookwyrm/templates/preferences/preferences_layout.html:14 -msgid "Profile" -msgstr "Profil" - -#: bookwyrm/templates/layout.html:107 +#: bookwyrm/templates/layout.html:103 msgid "Settings" msgstr "Einstellungen" -#: bookwyrm/templates/layout.html:116 -#: bookwyrm/templates/settings/admin_layout.html:24 +#: bookwyrm/templates/layout.html:112 +#: bookwyrm/templates/settings/admin_layout.html:31 #: bookwyrm/templates/settings/manage_invite_requests.html:15 #: bookwyrm/templates/settings/manage_invites.html:3 #: bookwyrm/templates/settings/manage_invites.html:15 msgid "Invites" msgstr "Einladungen" -#: bookwyrm/templates/layout.html:123 +#: bookwyrm/templates/layout.html:119 msgid "Admin" msgstr "" -#: bookwyrm/templates/layout.html:130 +#: bookwyrm/templates/layout.html:126 msgid "Log out" msgstr "Abmelden" -#: bookwyrm/templates/layout.html:138 bookwyrm/templates/layout.html:139 +#: bookwyrm/templates/layout.html:134 bookwyrm/templates/layout.html:135 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:10 msgid "Notifications" msgstr "Benachrichtigungen" -#: bookwyrm/templates/layout.html:156 bookwyrm/templates/layout.html:160 +#: bookwyrm/templates/layout.html:152 bookwyrm/templates/layout.html:156 #: bookwyrm/templates/login.html:17 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "" -#: bookwyrm/templates/layout.html:161 +#: bookwyrm/templates/layout.html:157 msgid "password" msgstr "Passwort" -#: bookwyrm/templates/layout.html:162 bookwyrm/templates/login.html:36 +#: bookwyrm/templates/layout.html:158 bookwyrm/templates/login.html:36 msgid "Forgot your password?" msgstr "Passwort vergessen?" -#: bookwyrm/templates/layout.html:165 bookwyrm/templates/login.html:10 +#: bookwyrm/templates/layout.html:161 bookwyrm/templates/login.html:10 #: bookwyrm/templates/login.html:33 msgid "Log in" msgstr "Anmelden" -#: bookwyrm/templates/layout.html:173 +#: bookwyrm/templates/layout.html:169 msgid "Join" msgstr "" -#: bookwyrm/templates/layout.html:196 +#: bookwyrm/templates/layout.html:195 msgid "About this server" msgstr "Über diesen Server" -#: bookwyrm/templates/layout.html:200 +#: bookwyrm/templates/layout.html:199 msgid "Contact site admin" msgstr "Admin kontaktieren" -#: bookwyrm/templates/layout.html:207 +#: bookwyrm/templates/layout.html:206 #, python-format -msgid "Support %(site_name)s on %(support_title)s" -msgstr "%(site_name)s auf %(support_title)s unterstützen" +msgid "" +"Support %(site_name)s on " +"%(support_title)s" +msgstr "" +"%(site_name)s auf " +"%(support_title)s unterstützen" -#: bookwyrm/templates/layout.html:211 -msgid "BookWyrm is open source software. You can contribute or report issues on GitHub." -msgstr "BookWyrm ist open source Software. Du kannst dich auf GitHub beteiligen oder etwas melden." +#: bookwyrm/templates/layout.html:210 +msgid "" +"BookWyrm is open source software. You can contribute or report issues on GitHub." +msgstr "" +"BookWyrm ist open source Software. Du kannst dich auf GitHub beteiligen oder etwas melden." #: bookwyrm/templates/lists/create_form.html:5 -#: bookwyrm/templates/lists/lists.html:19 +#: bookwyrm/templates/lists/lists.html:20 msgid "Create List" msgstr "Liste erstellen" @@ -1341,7 +1450,7 @@ msgid "Anyone can suggest books, subject to your approval" msgstr "Alle können Bücher vorschlagen, du kannst diese bestätigen" #: bookwyrm/templates/lists/form.html:31 -#: bookwyrm/templates/moderation/reports.html:24 +#: bookwyrm/templates/moderation/reports.html:25 msgid "Open" msgstr "Offen" @@ -1349,46 +1458,84 @@ msgstr "Offen" msgid "Anyone can add books to this list" msgstr "Alle können Bücher hinzufügen" -#: bookwyrm/templates/lists/list.html:17 +#: bookwyrm/templates/lists/list.html:19 +msgid "You successfully suggested a book for this list!" +msgstr "" + +#: bookwyrm/templates/lists/list.html:21 +#, fuzzy +#| msgid "Anyone can add books to this list" +msgid "You successfully added a book to this list!" +msgstr "Alle können Bücher hinzufügen" + +#: bookwyrm/templates/lists/list.html:27 msgid "This list is currently empty" msgstr "Diese Liste ist momentan leer" -#: bookwyrm/templates/lists/list.html:35 +#: bookwyrm/templates/lists/list.html:46 #, fuzzy, python-format #| msgid "Direct Messages with %(username)s" msgid "Added by %(username)s" msgstr "Direktnachrichten mit %(username)s" -#: bookwyrm/templates/lists/list.html:41 -#: bookwyrm/templates/snippets/shelf_selector.html:28 +#: bookwyrm/templates/lists/list.html:58 +#, fuzzy +#| msgid "Started" +msgid "Set" +msgstr "Gestartet" + +#: bookwyrm/templates/lists/list.html:61 +#, fuzzy +#| msgid "List curation:" +msgid "List position" +msgstr "Listenkuratierung:" + +#: bookwyrm/templates/lists/list.html:67 +#: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Entfernen" -#: bookwyrm/templates/lists/list.html:54 +#: bookwyrm/templates/lists/list.html:80 bookwyrm/templates/lists/list.html:92 +#, fuzzy +#| msgid "Your Lists" +msgid "Sort List" +msgstr "Deine Listen" + +#: bookwyrm/templates/lists/list.html:86 +#, fuzzy +#| msgid "List curation:" +msgid "Direction" +msgstr "Listenkuratierung:" + +#: bookwyrm/templates/lists/list.html:97 msgid "Add Books" msgstr "Bücher hinzufügen" -#: bookwyrm/templates/lists/list.html:54 +#: bookwyrm/templates/lists/list.html:97 msgid "Suggest Books" msgstr "Bücher vorschlagen" -#: bookwyrm/templates/lists/list.html:63 +#: bookwyrm/templates/lists/list.html:106 msgid "search" msgstr "suchen" -#: bookwyrm/templates/lists/list.html:69 +#: bookwyrm/templates/lists/list.html:112 msgid "Clear search" msgstr "Suche leeren" -#: bookwyrm/templates/lists/list.html:74 +#: bookwyrm/templates/lists/list.html:117 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "Keine passenden Bücher zu \"%(query)s\" gefunden" -#: bookwyrm/templates/lists/list.html:90 +#: bookwyrm/templates/lists/list.html:133 msgid "Suggest" msgstr "Vorschlagen" +#: bookwyrm/templates/lists/lists.html:14 bookwyrm/templates/user/lists.html:9 +msgid "Your Lists" +msgstr "Deine Listen" + #: bookwyrm/templates/login.html:4 msgid "Login" msgstr "" @@ -1406,65 +1553,41 @@ msgstr "Kontaktiere für eine Einladung eine*n Admin" msgid "More about this site" msgstr "Mehr über diese Seite" -#: bookwyrm/templates/moderation/report.html:5 #: bookwyrm/templates/moderation/report.html:6 +#: bookwyrm/templates/moderation/report.html:7 #: bookwyrm/templates/moderation/report_preview.html:6 #, python-format msgid "Report #%(report_id)s: %(username)s" msgstr "Meldung #%(report_id)s: %(username)s" -#: bookwyrm/templates/moderation/report.html:10 +#: bookwyrm/templates/moderation/report.html:11 msgid "Back to reports" msgstr "Zurück zu den Meldungen" -#: bookwyrm/templates/moderation/report.html:18 -#, fuzzy -#| msgid "Notifications" -msgid "Actions" -msgstr "Benachrichtigungen" - -#: bookwyrm/templates/moderation/report.html:19 -#, fuzzy -#| msgid "User Profile" -msgid "View user profile" -msgstr "Benutzerprofil" - -#: bookwyrm/templates/moderation/report.html:22 -#: bookwyrm/templates/snippets/status/status_options.html:25 -#: bookwyrm/templates/snippets/user_options.html:13 -msgid "Send direct message" -msgstr "Direktnachricht senden" - -#: bookwyrm/templates/moderation/report.html:27 -msgid "Deactivate user" -msgstr "Nutzer:in deaktivieren" - -#: bookwyrm/templates/moderation/report.html:29 -msgid "Reactivate user" -msgstr "Nutzer:in reaktivieren" - -#: bookwyrm/templates/moderation/report.html:36 +#: bookwyrm/templates/moderation/report.html:23 msgid "Moderator Comments" msgstr "Moderator:innenkommentare" -#: bookwyrm/templates/moderation/report.html:54 -#: bookwyrm/templates/snippets/create_status.html:12 -#: bookwyrm/templates/snippets/create_status_form.html:52 +#: bookwyrm/templates/moderation/report.html:41 +#: bookwyrm/templates/snippets/create_status.html:28 +#: bookwyrm/templates/snippets/create_status_form.html:53 msgid "Comment" msgstr "Kommentieren" -#: bookwyrm/templates/moderation/report.html:59 +#: bookwyrm/templates/moderation/report.html:46 #, fuzzy #| msgid "Delete status" msgid "Reported statuses" msgstr "Post löschen" -#: bookwyrm/templates/moderation/report.html:61 +#: bookwyrm/templates/moderation/report.html:48 msgid "No statuses reported" msgstr "Keine Beiträge gemeldet" -#: bookwyrm/templates/moderation/report.html:67 -msgid "Statuses has been deleted" +#: bookwyrm/templates/moderation/report.html:54 +#, fuzzy +#| msgid "Statuses has been deleted" +msgid "Status has been deleted" msgstr "Beiträge wurden gelöscht" #: bookwyrm/templates/moderation/report_modal.html:6 @@ -1473,12 +1596,13 @@ msgstr "Beiträge wurden gelöscht" msgid "Report @%(username)s" msgstr "Listen: %(username)s" -#: bookwyrm/templates/moderation/report_modal.html:21 +#: bookwyrm/templates/moderation/report_modal.html:23 #, python-format msgid "This report will be sent to %(site_name)s's moderators for review." -msgstr "Diese Meldung wird an die Moderator:innen von %(site_name)s weitergeletiet." +msgstr "" +"Diese Meldung wird an die Moderator:innen von %(site_name)s weitergeletiet." -#: bookwyrm/templates/moderation/report_modal.html:22 +#: bookwyrm/templates/moderation/report_modal.html:24 #, fuzzy #| msgid "More about this site" msgid "More info about this report:" @@ -1509,26 +1633,26 @@ msgid "Reports: %(server_name)s" msgstr "Listen: %(username)s" #: bookwyrm/templates/moderation/reports.html:8 -#: bookwyrm/templates/moderation/reports.html:16 -#: bookwyrm/templates/settings/admin_layout.html:28 +#: bookwyrm/templates/moderation/reports.html:17 +#: bookwyrm/templates/settings/admin_layout.html:35 #, fuzzy #| msgid "Recent Imports" msgid "Reports" msgstr "Aktuelle Importe" -#: bookwyrm/templates/moderation/reports.html:13 +#: bookwyrm/templates/moderation/reports.html:14 #, fuzzy, python-format #| msgid "Lists: %(username)s" msgid "Reports: %(server_name)s" msgstr "Listen: %(username)s" -#: bookwyrm/templates/moderation/reports.html:27 +#: bookwyrm/templates/moderation/reports.html:28 #, fuzzy #| msgid "Shelved" msgid "Resolved" msgstr "Ins Regal gestellt" -#: bookwyrm/templates/moderation/reports.html:34 +#: bookwyrm/templates/moderation/reports.html:37 #, fuzzy #| msgid "No books found" msgid "No reports found." @@ -1540,18 +1664,30 @@ msgstr "Benachrichtigungen löschen" #: bookwyrm/templates/notifications.html:53 #, python-format -msgid "favorited your review of %(book_title)s" -msgstr "hat deine Bewertung von %(book_title)s favorisiert" +msgid "" +"favorited your review of %(book_title)s" +msgstr "" +"hat deine Bewertung von %(book_title)s favorisiert" #: bookwyrm/templates/notifications.html:55 #, python-format -msgid "favorited your comment on %(book_title)s" -msgstr "hat deinen Kommentar zu %(book_title)s favorisiert" +msgid "" +"favorited your comment on %(book_title)s" +msgstr "" +"hat deinen Kommentar zu %(book_title)s favorisiert" #: bookwyrm/templates/notifications.html:57 #, python-format -msgid "favorited your quote from %(book_title)s" -msgstr " hat dein Zitat aus %(book_title)s favorisiert" +msgid "" +"favorited your quote from %(book_title)s" +msgstr "" +" hat dein Zitat aus %(book_title)s " +"favorisiert" #: bookwyrm/templates/notifications.html:59 #, python-format @@ -1560,18 +1696,30 @@ msgstr "hat deinen Status favorisiert" #: bookwyrm/templates/notifications.html:64 #, python-format -msgid "mentioned you in a review of %(book_title)s" -msgstr "hat dich in einer Bewertung von %(book_title)s erwähnt" +msgid "" +"mentioned you in a review of " +"%(book_title)s" +msgstr "" +"hat dich in einer Bewertung von " +"%(book_title)s erwähnt" #: bookwyrm/templates/notifications.html:66 #, python-format -msgid "mentioned you in a comment on %(book_title)s" -msgstr "hat dich in einem Kommentar zu %(book_title)s erwähnt" +msgid "" +"mentioned you in a comment on " +"%(book_title)s" +msgstr "" +"hat dich in einem Kommentar zu " +"%(book_title)s erwähnt" #: bookwyrm/templates/notifications.html:68 #, python-format -msgid "mentioned you in a quote from %(book_title)s" -msgstr "hat dich in einem Zitat von %(book_title)s erwähnt" +msgid "" +"mentioned you in a quote from " +"%(book_title)s" +msgstr "" +"hat dich in einem Zitat von %(book_title)s erwähnt" #: bookwyrm/templates/notifications.html:70 #, python-format @@ -1580,23 +1728,39 @@ msgstr "hat dich in einem Status erwähnt" #: bookwyrm/templates/notifications.html:75 #, python-format -msgid "replied to your review of %(book_title)s" -msgstr "hat auf deine Bewertung von %(book_title)s geantwortet " +msgid "" +"replied to your review of %(book_title)s" +msgstr "" +"hat auf deine Bewertung von %(book_title)s geantwortet " #: bookwyrm/templates/notifications.html:77 #, python-format -msgid "replied to your comment on %(book_title)s" -msgstr "hat auf deinen Kommentar zu %(book_title)s geantwortet" +msgid "" +"replied to your comment on %(book_title)s" +msgstr "" +"hat auf deinen Kommentar zu %(book_title)s geantwortet" #: bookwyrm/templates/notifications.html:79 #, python-format -msgid "replied to your quote from %(book_title)s" -msgstr "hat auf dein Zitat aus %(book_title)s geantwortet" +msgid "" +"replied to your quote from %(book_title)s" +msgstr "" +"hat auf dein Zitat aus %(book_title)s geantwortet" #: bookwyrm/templates/notifications.html:81 #, python-format -msgid "replied to your status" -msgstr "hat auf deinen Status geantwortet" +msgid "" +"replied to your status" +msgstr "" +"hat auf deinen Status geantwortet" #: bookwyrm/templates/notifications.html:85 msgid "followed you" @@ -1608,18 +1772,30 @@ msgstr "hat dir eine Folgeanfrage geschickt" #: bookwyrm/templates/notifications.html:94 #, python-format -msgid "boosted your review of %(book_title)s" -msgstr "hat deine Bewertung von %(book_title)s geteilt" +msgid "" +"boosted your review of %(book_title)s" +msgstr "" +"hat deine Bewertung von %(book_title)s geteilt" #: bookwyrm/templates/notifications.html:96 #, python-format -msgid "boosted your comment on%(book_title)s" -msgstr "hat deinen Kommentar zu%(book_title)s geteilt" +msgid "" +"boosted your comment on%(book_title)s" +msgstr "" +"hat deinen Kommentar zu%(book_title)s geteilt" #: bookwyrm/templates/notifications.html:98 #, python-format -msgid "boosted your quote from %(book_title)s" -msgstr "hat dein Zitat aus %(book_title)s geteilt" +msgid "" +"boosted your quote from %(book_title)s" +msgstr "" +"hat dein Zitat aus %(book_title)s " +"geteilt" #: bookwyrm/templates/notifications.html:100 #, python-format @@ -1628,13 +1804,21 @@ msgstr "hat deinen Status geteilt" #: bookwyrm/templates/notifications.html:104 #, python-format -msgid " added %(book_title)s to your list \"%(list_name)s\"" -msgstr "hat %(book_title)s zu deiner Liste \"%(list_name)s\" Hinzugefügt" +msgid "" +" added %(book_title)s to your list " +"\"%(list_name)s\"" +msgstr "" +"hat %(book_title)s zu deiner Liste " +"\"%(list_name)s\" Hinzugefügt" #: bookwyrm/templates/notifications.html:106 #, python-format -msgid " suggested adding %(book_title)s to your list \"%(list_name)s\"" -msgstr "hat %(book_title)s für deine Liste \"%(list_name)s\" vorgeschlagen" +msgid "" +" suggested adding %(book_title)s to " +"your list \"%(list_name)s\"" +msgstr "" +"hat %(book_title)s für deine Liste " +"\"%(list_name)s\" vorgeschlagen" #: bookwyrm/templates/notifications.html:110 #, python-format @@ -1657,7 +1841,9 @@ msgstr "Passwort bestätigen:" #: bookwyrm/templates/password_reset_request.html:14 msgid "A link to reset your password will be sent to your email address" -msgstr "Ein Link zum Zurücksetzen deines Passworts wird an deine Mailadresse geschickt" +msgstr "" +"Ein Link zum Zurücksetzen deines Passworts wird an deine Mailadresse " +"geschickt" #: bookwyrm/templates/password_reset_request.html:28 msgid "Reset password" @@ -1695,7 +1881,9 @@ msgstr "Angegebenes Leseziel im Feed anzeigen." #: bookwyrm/templates/preferences/edit_user.html:62 #, python-format -msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." +msgid "" +"Your account will show up in the directory, and may " +"be recommended to other BookWyrm users." msgstr "" #: bookwyrm/templates/preferences/edit_user.html:65 @@ -1706,6 +1894,10 @@ msgstr "" msgid "Account" msgstr "" +#: bookwyrm/templates/preferences/preferences_layout.html:14 +msgid "Profile" +msgstr "Profil" + #: bookwyrm/templates/preferences/preferences_layout.html:20 msgid "Relationships" msgstr "Beziehungen" @@ -1735,133 +1927,215 @@ msgstr "Keine Liste für \"%(query)s\" gefunden" msgid "Administration" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:15 +#: bookwyrm/templates/settings/admin_layout.html:22 msgid "Manage Users" msgstr "Nutzer*innen verwalten" -#: bookwyrm/templates/settings/admin_layout.html:19 -#: bookwyrm/templates/settings/user_admin.html:3 -#: bookwyrm/templates/settings/user_admin.html:10 +#: bookwyrm/templates/settings/admin_layout.html:26 +#: bookwyrm/templates/user_admin/user_admin.html:3 +#: bookwyrm/templates/user_admin/user_admin.html:10 msgid "Users" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:32 +#: bookwyrm/templates/settings/admin_layout.html:39 #: bookwyrm/templates/settings/federation.html:3 #: bookwyrm/templates/settings/federation.html:5 msgid "Federated Servers" msgstr "Föderierende Server" -#: bookwyrm/templates/settings/admin_layout.html:37 +#: bookwyrm/templates/settings/admin_layout.html:44 msgid "Instance Settings" msgstr "Instanzeinstellungen" -#: bookwyrm/templates/settings/admin_layout.html:41 +#: bookwyrm/templates/settings/admin_layout.html:48 #: bookwyrm/templates/settings/site.html:4 #: bookwyrm/templates/settings/site.html:6 msgid "Site Settings" msgstr "Seiteneinstellungen" -#: bookwyrm/templates/settings/admin_layout.html:44 +#: bookwyrm/templates/settings/admin_layout.html:51 #: bookwyrm/templates/settings/site.html:13 msgid "Instance Info" msgstr "Instanzinformationen" -#: bookwyrm/templates/settings/admin_layout.html:45 +#: bookwyrm/templates/settings/admin_layout.html:52 #: bookwyrm/templates/settings/site.html:39 msgid "Images" msgstr "Bilder" -#: bookwyrm/templates/settings/admin_layout.html:46 +#: bookwyrm/templates/settings/admin_layout.html:53 #: bookwyrm/templates/settings/site.html:59 msgid "Footer Content" msgstr "Inhalt des Footers" -#: bookwyrm/templates/settings/admin_layout.html:47 +#: bookwyrm/templates/settings/admin_layout.html:54 #: bookwyrm/templates/settings/site.html:77 msgid "Registration" msgstr "Registrierung" -#: bookwyrm/templates/settings/federated_server.html:7 +#: bookwyrm/templates/settings/edit_server.html:3 +#: bookwyrm/templates/settings/edit_server.html:6 +#: bookwyrm/templates/settings/edit_server.html:20 +#: bookwyrm/templates/settings/federation.html:9 +#: bookwyrm/templates/settings/federation.html:10 +#: bookwyrm/templates/settings/server_blocklist.html:3 +#: bookwyrm/templates/settings/server_blocklist.html:20 +#, fuzzy +#| msgid "Add cover" +msgid "Add server" +msgstr "Cover hinzufügen" + +#: bookwyrm/templates/settings/edit_server.html:7 +#: bookwyrm/templates/settings/federated_server.html:12 +#: bookwyrm/templates/settings/server_blocklist.html:7 #, fuzzy #| msgid "Back to reports" msgid "Back to server list" msgstr "Zurück zu den Meldungen" -#: bookwyrm/templates/settings/federated_server.html:12 -msgid "Details" -msgstr "" - -#: bookwyrm/templates/settings/federated_server.html:15 -msgid "Software:" -msgstr "" - -#: bookwyrm/templates/settings/federated_server.html:19 +#: bookwyrm/templates/settings/edit_server.html:16 +#: bookwyrm/templates/settings/server_blocklist.html:16 #, fuzzy -#| msgid "Description:" -msgid "Version:" -msgstr "Beschreibung:" +#| msgid "Import book" +msgid "Import block list" +msgstr "Buch importieren" -#: bookwyrm/templates/settings/federated_server.html:23 +#: bookwyrm/templates/settings/edit_server.html:30 +#, fuzzy +#| msgid "Instance Name:" +msgid "Instance:" +msgstr "Instanzname" + +#: bookwyrm/templates/settings/edit_server.html:37 +#: bookwyrm/templates/settings/federated_server.html:29 +#: bookwyrm/templates/user_admin/user_info.html:34 #, fuzzy #| msgid "Import Status" msgid "Status:" msgstr "Importstatus" -#: bookwyrm/templates/settings/federated_server.html:30 +#: bookwyrm/templates/settings/edit_server.html:41 +#: bookwyrm/templates/settings/federated_server.html:9 +#, fuzzy +#| msgid "Blocked Users" +msgid "Blocked" +msgstr "Blockierte Nutzer*innen" + +#: bookwyrm/templates/settings/edit_server.html:48 +#: bookwyrm/templates/settings/federated_server.html:21 +#: bookwyrm/templates/user_admin/user_info.html:26 +msgid "Software:" +msgstr "" + +#: bookwyrm/templates/settings/edit_server.html:55 +#: bookwyrm/templates/settings/federated_server.html:25 +#: bookwyrm/templates/user_admin/user_info.html:30 +#, fuzzy +#| msgid "Description:" +msgid "Version:" +msgstr "Beschreibung:" + +#: bookwyrm/templates/settings/edit_server.html:64 +msgid "Notes:" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:18 +msgid "Details" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:36 #: bookwyrm/templates/user/user_layout.html:50 msgid "Activity" msgstr "Aktivität" -#: bookwyrm/templates/settings/federated_server.html:33 +#: bookwyrm/templates/settings/federated_server.html:39 msgid "Users:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:36 -#: bookwyrm/templates/settings/federated_server.html:43 +#: bookwyrm/templates/settings/federated_server.html:42 +#: bookwyrm/templates/settings/federated_server.html:49 msgid "View all" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:40 +#: bookwyrm/templates/settings/federated_server.html:46 #, fuzzy #| msgid "Recent Imports" msgid "Reports:" msgstr "Aktuelle Importe" -#: bookwyrm/templates/settings/federated_server.html:47 +#: bookwyrm/templates/settings/federated_server.html:53 #, fuzzy #| msgid "followed you" msgid "Followed by us:" msgstr "folgt dir" -#: bookwyrm/templates/settings/federated_server.html:53 +#: bookwyrm/templates/settings/federated_server.html:59 #, fuzzy #| msgid "followed you" msgid "Followed by them:" msgstr "folgt dir" -#: bookwyrm/templates/settings/federated_server.html:59 +#: bookwyrm/templates/settings/federated_server.html:65 #, fuzzy #| msgid "Blocked Users" msgid "Blocked by us:" msgstr "Blockierte Nutzer*innen" -#: bookwyrm/templates/settings/federation.html:13 +#: bookwyrm/templates/settings/federated_server.html:77 +#: bookwyrm/templates/user_admin/user_info.html:39 +msgid "Notes" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:80 +#, fuzzy +#| msgid "Edit Book" +msgid "Edit" +msgstr "Buch editieren" + +#: bookwyrm/templates/settings/federated_server.html:100 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:3 +#, fuzzy +#| msgid "Notifications" +msgid "Actions" +msgstr "Benachrichtigungen" + +#: bookwyrm/templates/settings/federated_server.html:104 +#: bookwyrm/templates/snippets/block_button.html:5 +msgid "Block" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:105 +msgid "All users from this instance will be deactivated." +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:110 +#: bookwyrm/templates/snippets/block_button.html:10 +msgid "Un-block" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:111 +msgid "All users from this instance will be re-activated." +msgstr "" + +#: bookwyrm/templates/settings/federation.html:20 +#: bookwyrm/templates/user_admin/server_filter.html:5 msgid "Server name" msgstr "Servername" -#: bookwyrm/templates/settings/federation.html:17 +#: bookwyrm/templates/settings/federation.html:24 #, fuzzy #| msgid "Federated" msgid "Date federated" msgstr "Föderiert" -#: bookwyrm/templates/settings/federation.html:21 +#: bookwyrm/templates/settings/federation.html:28 msgid "Software" msgstr "" -#: bookwyrm/templates/settings/federation.html:24 -#: bookwyrm/templates/settings/manage_invite_requests.html:33 -#: bookwyrm/templates/settings/user_admin.html:32 +#: bookwyrm/templates/settings/federation.html:31 +#: bookwyrm/templates/settings/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/status_filter.html:5 +#: bookwyrm/templates/user_admin/user_admin.html:34 msgid "Status" msgstr "" @@ -1878,63 +2152,74 @@ msgstr "Einladungen" msgid "Ignored Invite Requests" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:31 -msgid "Date" -msgstr "" +#: bookwyrm/templates/settings/manage_invite_requests.html:35 +#, fuzzy +#| msgid "Federated" +msgid "Date requested" +msgstr "Föderiert" -#: bookwyrm/templates/settings/manage_invite_requests.html:32 +#: bookwyrm/templates/settings/manage_invite_requests.html:39 +#, fuzzy +#| msgid "Accept" +msgid "Date accepted" +msgstr "Annehmen" + +#: bookwyrm/templates/settings/manage_invite_requests.html:42 msgid "Email" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:34 +#: bookwyrm/templates/settings/manage_invite_requests.html:47 #, fuzzy #| msgid "Notifications" msgid "Action" msgstr "Benachrichtigungen" -#: bookwyrm/templates/settings/manage_invite_requests.html:37 +#: bookwyrm/templates/settings/manage_invite_requests.html:50 #, fuzzy #| msgid "Follow Requests" msgid "No requests" msgstr "Folgeanfragen" -#: bookwyrm/templates/settings/manage_invite_requests.html:45 +#: bookwyrm/templates/settings/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/status_filter.html:16 #, fuzzy #| msgid "Accept" msgid "Accepted" msgstr "Annehmen" -#: bookwyrm/templates/settings/manage_invite_requests.html:47 +#: bookwyrm/templates/settings/manage_invite_requests.html:61 +#: bookwyrm/templates/settings/status_filter.html:12 msgid "Sent" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:49 +#: bookwyrm/templates/settings/manage_invite_requests.html:63 +#: bookwyrm/templates/settings/status_filter.html:8 msgid "Requested" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:57 +#: bookwyrm/templates/settings/manage_invite_requests.html:73 msgid "Send invite" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/manage_invite_requests.html:75 msgid "Re-send invite" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:70 +#: bookwyrm/templates/settings/manage_invite_requests.html:95 msgid "Ignore" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:72 -msgid "Un-gnore" +#: bookwyrm/templates/settings/manage_invite_requests.html:97 +msgid "Un-ignore" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:83 +#: bookwyrm/templates/settings/manage_invite_requests.html:108 #, fuzzy #| msgid "Back to reports" msgid "Back to pending requests" msgstr "Zurück zu den Meldungen" -#: bookwyrm/templates/settings/manage_invite_requests.html:85 +#: bookwyrm/templates/settings/manage_invite_requests.html:110 msgid "View ignored requests" msgstr "" @@ -1974,6 +2259,27 @@ msgstr "Mal benutzt" msgid "No active invites" msgstr "Keine aktiven Einladungen" +#: bookwyrm/templates/settings/server_blocklist.html:6 +#, fuzzy +#| msgid "Import Books" +msgid "Import Blocklist" +msgstr "Bücher importieren" + +#: bookwyrm/templates/settings/server_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:5 +msgid "Success!" +msgstr "Erfolg!" + +#: bookwyrm/templates/settings/server_blocklist.html:30 +#, fuzzy +#| msgid "Successfully imported" +msgid "Successfully blocked:" +msgstr "Erfolgreich importiert" + +#: bookwyrm/templates/settings/server_blocklist.html:32 +msgid "Failed:" +msgstr "" + #: bookwyrm/templates/settings/site.html:15 msgid "Instance Name:" msgstr "Instanzname" @@ -2032,152 +2338,108 @@ msgstr "Folgeanfragen" msgid "Registration closed text:" msgstr "Registrierungen geschlossen text" -#: bookwyrm/templates/settings/user_admin.html:7 -#, python-format -msgid "Users: %(server_name)s" -msgstr "" - -#: bookwyrm/templates/settings/user_admin.html:20 +#: bookwyrm/templates/snippets/book_cover.html:20 +#: bookwyrm/templates/snippets/search_result_text.html:10 #, fuzzy -#| msgid "username" -msgid "Username" -msgstr "Username" +#| msgid "Add cover" +msgid "No cover" +msgstr "Cover hinzufügen" -#: bookwyrm/templates/settings/user_admin.html:24 -#, fuzzy -#| msgid "Added:" -msgid "Date Added" -msgstr "Hinzugefügt:" - -#: bookwyrm/templates/settings/user_admin.html:28 -msgid "Last Active" -msgstr "" - -#: bookwyrm/templates/settings/user_admin.html:36 -#, fuzzy -#| msgid "Remove" -msgid "Remote server" -msgstr "Entfernen" - -#: bookwyrm/templates/settings/user_admin.html:45 -#, fuzzy -#| msgid "Activity" -msgid "Active" -msgstr "Aktivität" - -#: bookwyrm/templates/settings/user_admin.html:45 -msgid "Inactive" -msgstr "" - -#: bookwyrm/templates/settings/user_admin.html:50 -msgid "Not set" -msgstr "" - -#: bookwyrm/templates/snippets/block_button.html:5 -msgid "Block" -msgstr "" - -#: bookwyrm/templates/snippets/block_button.html:10 -msgid "Un-block" -msgstr "" - -#: bookwyrm/templates/snippets/book_titleby.html:3 +#: bookwyrm/templates/snippets/book_titleby.html:4 #, python-format msgid "%(title)s by " msgstr "%(title)s von " #: bookwyrm/templates/snippets/boost_button.html:8 #: bookwyrm/templates/snippets/boost_button.html:9 -#: bookwyrm/templates/snippets/status/status_body.html:51 -#: bookwyrm/templates/snippets/status/status_body.html:52 -msgid "Boost status" -msgstr "Status teilen" +#, fuzzy +#| msgid "boosted" +msgid "Boost" +msgstr "teilt" +#: bookwyrm/templates/snippets/boost_button.html:15 #: bookwyrm/templates/snippets/boost_button.html:16 -#: bookwyrm/templates/snippets/boost_button.html:17 -msgid "Un-boost status" +#, fuzzy +#| msgid "Un-boost status" +msgid "Un-boost" msgstr "Teilen zurücknehmen" #: bookwyrm/templates/snippets/content_warning_field.html:3 msgid "Spoiler alert:" msgstr "Spoileralarm:" -#: bookwyrm/templates/snippets/content_warning_field.html:4 +#: bookwyrm/templates/snippets/content_warning_field.html:10 msgid "Spoilers ahead!" msgstr "Spoileralarm!" -#: bookwyrm/templates/snippets/create_status.html:9 +#: bookwyrm/templates/snippets/create_status.html:17 msgid "Review" msgstr "Bewerten" -#: bookwyrm/templates/snippets/create_status.html:15 +#: bookwyrm/templates/snippets/create_status.html:39 msgid "Quote" msgstr "Zitieren" -#: bookwyrm/templates/snippets/create_status_form.html:18 +#: bookwyrm/templates/snippets/create_status_form.html:20 #, fuzzy #| msgid "Comment" msgid "Comment:" msgstr "Kommentieren" -#: bookwyrm/templates/snippets/create_status_form.html:20 +#: bookwyrm/templates/snippets/create_status_form.html:22 #, fuzzy #| msgid "Quote" msgid "Quote:" msgstr "Zitieren" -#: bookwyrm/templates/snippets/create_status_form.html:22 +#: bookwyrm/templates/snippets/create_status_form.html:24 #, fuzzy #| msgid "Review" msgid "Review:" msgstr "Bewerten" -#: bookwyrm/templates/snippets/create_status_form.html:29 -#: bookwyrm/templates/user/shelf.html:81 -msgid "Rating" -msgstr "" +#: bookwyrm/templates/snippets/create_status_form.html:42 +#: bookwyrm/templates/snippets/status/layout.html:30 +#: bookwyrm/templates/snippets/status/layout.html:48 +#: bookwyrm/templates/snippets/status/layout.html:49 +msgid "Reply" +msgstr "Antwort" -#: bookwyrm/templates/snippets/create_status_form.html:31 -#: bookwyrm/templates/snippets/rate_action.html:14 -#: bookwyrm/templates/snippets/stars.html:3 -msgid "No rating" -msgstr "Kein Rating" - -#: bookwyrm/templates/snippets/create_status_form.html:64 +#: bookwyrm/templates/snippets/create_status_form.html:67 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16 msgid "Progress:" msgstr "Fortschritt:" -#: bookwyrm/templates/snippets/create_status_form.html:71 +#: bookwyrm/templates/snippets/create_status_form.html:75 #: bookwyrm/templates/snippets/readthrough_form.html:22 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30 msgid "pages" msgstr "Seiten" -#: bookwyrm/templates/snippets/create_status_form.html:72 +#: bookwyrm/templates/snippets/create_status_form.html:76 #: bookwyrm/templates/snippets/readthrough_form.html:23 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31 msgid "percent" msgstr "Prozent" -#: bookwyrm/templates/snippets/create_status_form.html:77 +#: bookwyrm/templates/snippets/create_status_form.html:82 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36 #, python-format msgid "of %(pages)s pages" msgstr "von %(pages)s Seiten" -#: bookwyrm/templates/snippets/create_status_form.html:89 +#: bookwyrm/templates/snippets/create_status_form.html:97 msgid "Include spoiler alert" msgstr "Spoileralarm aktivieren" -#: bookwyrm/templates/snippets/create_status_form.html:95 +#: bookwyrm/templates/snippets/create_status_form.html:104 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy_select.html:19 msgid "Private" msgstr "Privat" -#: bookwyrm/templates/snippets/create_status_form.html:102 +#: bookwyrm/templates/snippets/create_status_form.html:115 msgid "Post" msgstr "Absenden" @@ -2187,24 +2449,28 @@ msgstr "Diese Lesedaten löschen?" #: bookwyrm/templates/snippets/delete_readthrough_modal.html:7 #, python-format -msgid "You are deleting this readthrough and its %(count)s associated progress updates." -msgstr "Du löscht diesen Leseforschritt und %(count)s zugehörige Fortschrittsupdates." +msgid "" +"You are deleting this readthrough and its %(count)s associated progress " +"updates." +msgstr "" +"Du löscht diesen Leseforschritt und %(count)s zugehörige Fortschrittsupdates." #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:13 +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:391 msgid "Delete" msgstr "Löschen" #: bookwyrm/templates/snippets/fav_button.html:7 -#: bookwyrm/templates/snippets/fav_button.html:8 -#: bookwyrm/templates/snippets/status/status_body.html:55 -#: bookwyrm/templates/snippets/status/status_body.html:56 -msgid "Like status" -msgstr "Status favorisieren" +#: bookwyrm/templates/snippets/fav_button.html:9 +msgid "Like" +msgstr "" #: bookwyrm/templates/snippets/fav_button.html:15 #: bookwyrm/templates/snippets/fav_button.html:16 -msgid "Un-like status" +#, fuzzy +#| msgid "Un-like status" +msgid "Un-like" msgstr "Favorisieren zurücknehmen" #: bookwyrm/templates/snippets/filters_panel/filters_panel.html:7 @@ -2217,11 +2483,11 @@ msgstr "Weniger anzeigen" msgid "Hide filters" msgstr "" -#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:19 +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:22 msgid "Apply filters" msgstr "" -#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:23 +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:26 #, fuzzy #| msgid "Clear search" msgid "Clear filters" @@ -2245,6 +2511,11 @@ msgstr "Entfolgen" msgid "Accept" msgstr "Annehmen" +#: bookwyrm/templates/snippets/form_rate_stars.html:20 +#: bookwyrm/templates/snippets/stars.html:13 +msgid "No rating" +msgstr "Kein Rating" + #: bookwyrm/templates/snippets/generated_status/goal.html:1 #, python-format msgid "set a goal to read %(counter)s book in %(year)s" @@ -2255,15 +2526,19 @@ msgstr[1] "Setze das Ziel, %(year)s %(counter)s Bücher zu lesen" #: bookwyrm/templates/snippets/generated_status/rating.html:3 #, fuzzy, python-format #| msgid "%(title)s by " -msgid "Rated %(title)s: %(display_rating)s star" -msgid_plural "Rated %(title)s: %(display_rating)s stars" +msgid "" +"Rated %(title)s: %(display_rating)s star" +msgid_plural "" +"Rated %(title)s: %(display_rating)s stars" msgstr[0] "%(title)s von " msgstr[1] "%(title)s von " #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4 #, python-format -msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" -msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" +msgid "" +"Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" +msgid_plural "" +"Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" msgstr[0] "" msgstr[1] "" @@ -2274,8 +2549,12 @@ msgstr "" #: bookwyrm/templates/snippets/goal_card.html:23 #, python-format -msgid "You can set or change your reading goal any time from your profile page" -msgstr "Du kannst dein Leseziel jederzeit auf deiner Profilseite setzen oder ändern." +msgid "" +"You can set or change your reading goal any time from your profile page" +msgstr "" +"Du kannst dein Leseziel jederzeit auf deiner Profilseite setzen oder ändern." #: bookwyrm/templates/snippets/goal_form.html:9 msgid "Reading goal:" @@ -2300,10 +2579,6 @@ msgstr "Posten" msgid "Set goal" msgstr "Ziel setzen" -#: bookwyrm/templates/snippets/goal_progress.html:5 -msgid "Success!" -msgstr "Erfolg!" - #: bookwyrm/templates/snippets/goal_progress.html:7 #, python-format msgid "%(percent)s%% complete!" @@ -2311,19 +2586,38 @@ msgstr "%(percent)s%% komplett!" #: bookwyrm/templates/snippets/goal_progress.html:10 #, python-format -msgid "You've read %(read_count)s of %(goal_count)s books." -msgstr "Du hast %(read_count)s von %(goal_count)s Büchern gelesen." +msgid "" +"You've read %(read_count)s of %(goal_count)s books." +msgstr "" +"Du hast %(read_count)s von %(goal_count)s Büchern " +"gelesen." #: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format -msgid "%(username)s has read %(read_count)s of %(goal_count)s books." -msgstr "%(username)s hat %(read_count)s von %(goal_count)s Büchern gelesen." +msgid "" +"%(username)s has read %(read_count)s of %(goal_count)s " +"books." +msgstr "" +"%(username)s hat %(read_count)s von %(goal_count)s " +"Büchern gelesen." -#: bookwyrm/templates/snippets/pagination.html:7 +#: bookwyrm/templates/snippets/page_text.html:4 +#, fuzzy, python-format +#| msgid "of %(pages)s pages" +msgid "page %(page)s of %(total_pages)s" +msgstr "von %(pages)s Seiten" + +#: bookwyrm/templates/snippets/page_text.html:6 +#, fuzzy, python-format +#| msgid "%(pages)s pages" +msgid "page %(page)s" +msgstr "%(pages)s Seiten" + +#: bookwyrm/templates/snippets/pagination.html:12 msgid "Previous" msgstr "Zurück" -#: bookwyrm/templates/snippets/pagination.html:15 +#: bookwyrm/templates/snippets/pagination.html:23 msgid "Next" msgstr "Weiter" @@ -2356,7 +2650,7 @@ msgstr "Folgende" msgid "Leave a rating" msgstr "Raten" -#: bookwyrm/templates/snippets/rate_action.html:29 +#: bookwyrm/templates/snippets/rate_action.html:19 msgid "Rate" msgstr "" @@ -2364,28 +2658,28 @@ msgstr "" msgid "Progress Updates:" msgstr "Fortschrittsupdates:" -#: bookwyrm/templates/snippets/readthrough.html:12 +#: bookwyrm/templates/snippets/readthrough.html:14 msgid "finished" msgstr "Abgeschlossen" -#: bookwyrm/templates/snippets/readthrough.html:15 +#: bookwyrm/templates/snippets/readthrough.html:25 msgid "Show all updates" msgstr "Zeige alle Updates" -#: bookwyrm/templates/snippets/readthrough.html:31 +#: bookwyrm/templates/snippets/readthrough.html:41 msgid "Delete this progress update" msgstr "Dieses Fortschrittsupdate löschen" -#: bookwyrm/templates/snippets/readthrough.html:41 +#: bookwyrm/templates/snippets/readthrough.html:51 msgid "started" msgstr "Angefangen" -#: bookwyrm/templates/snippets/readthrough.html:47 -#: bookwyrm/templates/snippets/readthrough.html:61 +#: bookwyrm/templates/snippets/readthrough.html:57 +#: bookwyrm/templates/snippets/readthrough.html:71 msgid "Edit read dates" msgstr "Lesedaten bearbeiten" -#: bookwyrm/templates/snippets/readthrough.html:51 +#: bookwyrm/templates/snippets/readthrough.html:61 msgid "Delete these read dates" msgstr "Diese Lesedaten löschen" @@ -2415,31 +2709,25 @@ msgid "Report" msgstr "Importieren" #: bookwyrm/templates/snippets/rss_title.html:5 -#: bookwyrm/templates/snippets/status/status_header.html:11 +#: bookwyrm/templates/snippets/status/status_header.html:34 msgid "rated" msgstr "" #: bookwyrm/templates/snippets/rss_title.html:7 -#: bookwyrm/templates/snippets/status/status_header.html:13 +#: bookwyrm/templates/snippets/status/status_header.html:36 msgid "reviewed" msgstr "bewertete" #: bookwyrm/templates/snippets/rss_title.html:9 -#: bookwyrm/templates/snippets/status/status_header.html:15 +#: bookwyrm/templates/snippets/status/status_header.html:38 msgid "commented on" msgstr "kommentierte" #: bookwyrm/templates/snippets/rss_title.html:11 -#: bookwyrm/templates/snippets/status/status_header.html:17 +#: bookwyrm/templates/snippets/status/status_header.html:40 msgid "quoted" msgstr "zitierte" -#: bookwyrm/templates/snippets/search_result_text.html:10 -#, fuzzy -#| msgid "Add cover" -msgid "No cover" -msgstr "Cover hinzufügen" - #: bookwyrm/templates/snippets/search_result_text.html:22 #, python-format msgid "by %(author)s" @@ -2461,7 +2749,7 @@ msgid "Finish \"%(book_title)s\"" msgstr "\"%(book_title)s\" abschließen" #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5 -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:35 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:34 #, fuzzy #| msgid "Progress" msgid "Update progress" @@ -2484,7 +2772,7 @@ msgstr "Lesen abschließen" msgid "Want to read" msgstr "Auf Leseliste setzen" -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:48 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45 #, fuzzy, python-format #| msgid "Lists: %(username)s" msgid "Remove from %(name)s" @@ -2500,64 +2788,68 @@ msgstr "\"%(book_title)s\" beginnen" msgid "Want to Read \"%(book_title)s\"" msgstr "\"%(book_title)s\" auf Leseliste setzen" +#: bookwyrm/templates/snippets/status/content_status.html:67 +#: bookwyrm/templates/snippets/trimmed_text.html:14 +msgid "Show more" +msgstr "Mehr anzeigen" + +#: bookwyrm/templates/snippets/status/content_status.html:82 +#: bookwyrm/templates/snippets/trimmed_text.html:29 +msgid "Show less" +msgstr "Weniger anzeigen" + +#: bookwyrm/templates/snippets/status/content_status.html:112 +msgid "Open image in new window" +msgstr "Bild in neuem Fenster öffnen" + +#: bookwyrm/templates/snippets/status/layout.html:22 +#: bookwyrm/templates/snippets/status/status_options.html:17 +msgid "Delete status" +msgstr "Post löschen" + +#: bookwyrm/templates/snippets/status/layout.html:52 +#: bookwyrm/templates/snippets/status/layout.html:53 +msgid "Boost status" +msgstr "Status teilen" + +#: bookwyrm/templates/snippets/status/layout.html:56 +#: bookwyrm/templates/snippets/status/layout.html:57 +msgid "Like status" +msgstr "Status favorisieren" + #: bookwyrm/templates/snippets/status/status.html:9 msgid "boosted" msgstr "teilt" -#: bookwyrm/templates/snippets/status/status_body.html:27 -#: bookwyrm/templates/snippets/status/status_options.html:18 -msgid "Delete status" -msgstr "Post löschen" - -#: bookwyrm/templates/snippets/status/status_body.html:34 -#: bookwyrm/templates/snippets/status/status_body.html:47 -#: bookwyrm/templates/snippets/status/status_body.html:48 -msgid "Reply" -msgstr "Antwort" - -#: bookwyrm/templates/snippets/status/status_content.html:18 -#: bookwyrm/templates/snippets/trimmed_text.html:15 -msgid "Show more" -msgstr "Mehr anzeigen" - -#: bookwyrm/templates/snippets/status/status_content.html:25 -#: bookwyrm/templates/snippets/trimmed_text.html:25 -msgid "Show less" -msgstr "Weniger anzeigen" - -#: bookwyrm/templates/snippets/status/status_content.html:46 -msgid "Open image in new window" -msgstr "Bild in neuem Fenster öffnen" - -#: bookwyrm/templates/snippets/status/status_header.html:22 +#: bookwyrm/templates/snippets/status/status_header.html:44 #, fuzzy, python-format -#| msgid "Direct Messages with %(username)s" -msgid "replied to %(username)s's review" -msgstr "Direktnachrichten mit %(username)s" - -#: bookwyrm/templates/snippets/status/status_header.html:24 -#, fuzzy, python-format -#| msgid "replied to your status" -msgid "replied to %(username)s's comment" -msgstr "hat auf deinen Status geantwortet" - -#: bookwyrm/templates/snippets/status/status_header.html:26 -#, fuzzy, python-format -#| msgid "replied to your status" -msgid "replied to %(username)s's quote" -msgstr "hat auf deinen Status geantwortet" - -#: bookwyrm/templates/snippets/status/status_header.html:28 -#, fuzzy, python-format -#| msgid "replied to your status" -msgid "replied to %(username)s's status" -msgstr "hat auf deinen Status geantwortet" +#| msgid "" +#| "replied to your status" +msgid "" +"replied to %(username)s's status" +msgstr "" +"hat auf deinen Status geantwortet" #: bookwyrm/templates/snippets/status/status_options.html:7 #: bookwyrm/templates/snippets/user_options.html:7 msgid "More options" msgstr "Mehr Optionen" +#: bookwyrm/templates/snippets/status/status_options.html:26 +#, fuzzy +#| msgid "Delete these read dates" +msgid "Delete & re-draft" +msgstr "Diese Lesedaten löschen" + +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:6 +msgid "Send direct message" +msgstr "Direktnachricht senden" + #: bookwyrm/templates/snippets/switch_edition_button.html:5 msgid "Switch to this edition" msgstr "Zu dieser Edition wechseln" @@ -2574,19 +2866,6 @@ msgstr "Zu lesen angefangen" msgid "Sorted descending" msgstr "Zu lesen angefangen" -#: bookwyrm/templates/snippets/tag.html:14 -msgid "Remove tag" -msgstr "Tag entfernen" - -#: bookwyrm/templates/snippets/tag.html:18 -msgid "Add tag" -msgstr "Tag hinzufügen" - -#: bookwyrm/templates/tag.html:9 -#, python-format -msgid "Books tagged \"%(tag.name)s\"" -msgstr "Mit \"%(tag.name)s\" markierte Bücher" - #: bookwyrm/templates/user/books_header.html:5 #, fuzzy, python-format #| msgid "%(username)s's %(year)s Books" @@ -2626,10 +2905,6 @@ msgstr "Folgend" msgid "%(username)s isn't following any users" msgstr "%(username)s folgt niemandem" -#: bookwyrm/templates/user/lists.html:9 -msgid "Your Lists" -msgstr "Deine Listen" - #: bookwyrm/templates/user/lists.html:11 #, python-format msgid "Lists: %(username)s" @@ -2639,7 +2914,7 @@ msgstr "Listen: %(username)s" msgid "Create list" msgstr "Liste Erstellen" -#: bookwyrm/templates/user/shelf.html:24 bookwyrm/views/shelf.py:56 +#: bookwyrm/templates/user/shelf.html:24 bookwyrm/views/shelf.py:51 #, fuzzy #| msgid "books" msgid "All books" @@ -2653,23 +2928,23 @@ msgstr "Regal erstellen" msgid "Edit shelf" msgstr "Regal bearbeiten" -#: bookwyrm/templates/user/shelf.html:78 +#: bookwyrm/templates/user/shelf.html:77 bookwyrm/templates/user/shelf.html:99 msgid "Shelved" msgstr "Ins Regal gestellt" -#: bookwyrm/templates/user/shelf.html:79 +#: bookwyrm/templates/user/shelf.html:78 bookwyrm/templates/user/shelf.html:103 msgid "Started" msgstr "Gestartet" -#: bookwyrm/templates/user/shelf.html:80 +#: bookwyrm/templates/user/shelf.html:79 bookwyrm/templates/user/shelf.html:106 msgid "Finished" msgstr "Abgeschlossen" -#: bookwyrm/templates/user/shelf.html:127 +#: bookwyrm/templates/user/shelf.html:132 msgid "This shelf is empty." msgstr "Dieses Regal ist leer." -#: bookwyrm/templates/user/shelf.html:133 +#: bookwyrm/templates/user/shelf.html:138 msgid "Delete shelf" msgstr "Regal löschen" @@ -2735,6 +3010,87 @@ msgstr[1] "%(counter)s Folgende" msgid "%(counter)s following" msgstr "Folgt %(counter)s" +#: bookwyrm/templates/user_admin/user.html:11 +#, fuzzy +#| msgid "Back to reports" +msgid "Back to users" +msgstr "Zurück zu den Meldungen" + +#: bookwyrm/templates/user_admin/user_admin.html:7 +#, python-format +msgid "Users: %(server_name)s" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:22 +#: bookwyrm/templates/user_admin/username_filter.html:5 +#, fuzzy +#| msgid "username" +msgid "Username" +msgstr "Username" + +#: bookwyrm/templates/user_admin/user_admin.html:26 +#, fuzzy +#| msgid "Added:" +msgid "Date Added" +msgstr "Hinzugefügt:" + +#: bookwyrm/templates/user_admin/user_admin.html:30 +msgid "Last Active" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:38 +#, fuzzy +#| msgid "Remove" +msgid "Remote server" +msgstr "Entfernen" + +#: bookwyrm/templates/user_admin/user_admin.html:47 +#, fuzzy +#| msgid "Activity" +msgid "Active" +msgstr "Aktivität" + +#: bookwyrm/templates/user_admin/user_admin.html:47 +msgid "Inactive" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:52 +#: bookwyrm/templates/user_admin/user_info.html:49 +msgid "Not set" +msgstr "" + +#: bookwyrm/templates/user_admin/user_info.html:5 +msgid "User details" +msgstr "" + +#: bookwyrm/templates/user_admin/user_info.html:14 +#, fuzzy +#| msgid "User Profile" +msgid "View user profile" +msgstr "Benutzerprofil" + +#: bookwyrm/templates/user_admin/user_info.html:20 +#, fuzzy +#| msgid "Instance Settings" +msgid "Instance details" +msgstr "Instanzeinstellungen" + +#: bookwyrm/templates/user_admin/user_info.html:46 +msgid "View instance" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:11 +msgid "Suspend user" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 +msgid "Un-suspend user" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:21 +msgid "Access level:" +msgstr "" + #: bookwyrm/views/password.py:32 #, fuzzy #| msgid "A user with that username already exists." @@ -2746,6 +3102,1443 @@ msgstr "Dieser Benutzename ist bereits vergeben." msgid "A password reset link sent to %s" msgstr "" +#: venv3/lib/python3.8/site-packages/_pytest/config/argparsing.py:442 +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/messages/apps.py:7 +#, fuzzy +#| msgid "All messages" +msgid "Messages" +msgstr "Alle Nachrichten" + +#: venv3/lib/python3.8/site-packages/django/contrib/sitemaps/apps.py:7 +msgid "Site Maps" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/staticfiles/apps.py:9 +msgid "Static Files" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/syndication/apps.py:7 +msgid "Syndication" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:45 +msgid "That page number is not an integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:47 +msgid "That page number is less than 1" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:52 +msgid "That page contains no results" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:32 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid value." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:103 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:659 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid URL." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:155 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid integer." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:166 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid email address." +msgstr "E-Mail Adresse" + +#. Translators: "letters" means latin letters: a-z and A-Z. +#: venv3/lib/python3.8/site-packages/django/core/validators.py:240 +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:247 +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:256 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:276 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid IPv4 address." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:261 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:277 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid IPv6 address." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:271 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:275 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:305 +msgid "Enter only digits separated by commas." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:311 +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:343 +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:352 +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:362 +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:377 +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:396 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:291 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:326 +#, fuzzy +#| msgid "Series number:" +msgid "Enter a number." +msgstr "Seriennummer:" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:398 +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:403 +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:408 +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:470 +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:522 +msgid "Null characters are not allowed." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/base.py:1181 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:759 +msgid "and" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/base.py:1183 +#, fuzzy, python-format +#| msgid "A user with that username already exists." +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "Dieser Benutzename ist bereits vergeben." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:104 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid remote_id" +msgid "Value %(value)r is not a valid choice." +msgstr "%(value)s ist keine gültige remote_id" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:105 +#, fuzzy +#| msgid "This shelf is empty." +msgid "This field cannot be null." +msgstr "Dieses Regal ist leer." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:106 +msgid "This field cannot be blank." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:107 +#, fuzzy, python-format +#| msgid "A user with that username already exists." +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Dieser Benutzename ist bereits vergeben." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:111 +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:130 +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:937 +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:938 +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:940 +msgid "Boolean (Either True or False)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:981 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1045 +#, fuzzy +#| msgid "No active invites" +msgid "Comma-separated integers" +msgstr "Keine aktiven Einladungen" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1094 +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1096 +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1239 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1099 +msgid "Date (without time)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1237 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1241 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1245 +msgid "Date (with time)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1393 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid username" +msgid "“%(value)s” value must be a decimal number." +msgstr "%(value)s ist kein gültiger Username" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1395 +#, fuzzy +#| msgid "Series number:" +msgid "Decimal number" +msgstr "Seriennummer:" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1534 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1537 +#, fuzzy +#| msgid "List curation:" +msgid "Duration" +msgstr "Listenkuratierung:" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1587 +#, fuzzy +#| msgid "Email address:" +msgid "Email address" +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1610 +msgid "File path" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1676 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid username" +msgid "“%(value)s” value must be a float." +msgstr "%(value)s ist kein gültiger Username" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1678 +msgid "Floating point number" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1716 +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1718 +msgid "Integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1801 +#, fuzzy +#| msgid "No active invites" +msgid "Big (8 byte) integer" +msgstr "Keine aktiven Einladungen" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1817 +#, fuzzy +#| msgid "Email address:" +msgid "IPv4 address" +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1848 +#, fuzzy +#| msgid "Email address:" +msgid "IP address" +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1928 +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1929 +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1931 +msgid "Boolean (Either True, False or None)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1966 +#, fuzzy +#| msgid "No active invites" +msgid "Positive integer" +msgstr "Keine aktiven Einladungen" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1979 +#, fuzzy +#| msgid "No active invites" +msgid "Positive small integer" +msgstr "Keine aktiven Einladungen" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1993 +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2025 +msgid "Small integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2032 +msgid "Text" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2060 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2062 +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2065 +msgid "Time" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2191 +msgid "URL" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2213 +msgid "Raw binary data" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2278 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid username" +msgid "“%(value)s” is not a valid UUID." +msgstr "%(value)s ist kein gültiger Username" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2280 +msgid "Universally unique identifier" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/files.py:221 +msgid "File" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/files.py:360 +#, fuzzy +#| msgid "Images" +msgid "Image" +msgstr "Bilder" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:778 +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:780 +msgid "Foreign Key (type determined by related field)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1012 +#, fuzzy +#| msgid "Relationships" +msgid "One-to-one relationship" +msgstr "Beziehungen" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1066 +#, fuzzy, python-format +#| msgid "Relationships" +msgid "%(from)s-%(to)s relationship" +msgstr "Beziehungen" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1067 +#, fuzzy, python-format +#| msgid "Relationships" +msgid "%(from)s-%(to)s relationships" +msgstr "Beziehungen" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1109 +#, fuzzy +#| msgid "Relationships" +msgid "Many-to-many relationship" +msgstr "Beziehungen" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the label +#: venv3/lib/python3.8/site-packages/django/forms/boundfield.py:149 +msgid ":?.!" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:53 +#, fuzzy +#| msgid "This shelf is empty." +msgid "This field is required." +msgstr "Dieses Regal ist leer." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:246 +#, fuzzy +#| msgid "Series number:" +msgid "Enter a whole number." +msgstr "Seriennummer:" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:397 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1127 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid date." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:421 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1128 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid time." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:443 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid date/time." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:472 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid duration." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:473 +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:533 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:534 +msgid "No file was submitted." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:535 +#, fuzzy +#| msgid "This shelf is empty." +msgid "The submitted file is empty." +msgstr "Dieses Regal ist leer." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:537 +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:540 +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:601 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:763 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:853 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1275 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:854 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:969 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1274 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a list of values." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:970 +msgid "Enter a complete value." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1186 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid UUID." +msgstr "E-Mail Adresse" + +#. Translators: This is the default suffix added to form field labels +#: venv3/lib/python3.8/site-packages/django/forms/forms.py:81 +msgid ":" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/forms.py:207 +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:93 +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:345 +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:352 +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:379 +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:386 +msgid "Order" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:754 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:758 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:764 +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:773 +msgid "Please correct the duplicate values below." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1094 +msgid "The inline value did not match the parent instance." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1161 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1277 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid username" +msgid "“%(pk)s” is not a valid value." +msgstr "%(value)s ist kein gültiger Username" + +#: venv3/lib/python3.8/site-packages/django/forms/utils.py:162 +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:395 +msgid "Clear" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:396 +#, fuzzy +#| msgid "Start reading" +msgid "Currently" +msgstr "Gerade lesend" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:397 +#, fuzzy +#| msgid "Change shelf" +msgid "Change" +msgstr "Regal wechseln" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:709 +msgid "Unknown" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:710 +msgid "Yes" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:711 +msgid "No" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:788 +msgid "yes,no,maybe" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:817 +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:834 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:836 +#, python-format +msgid "%s KB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:838 +#, python-format +msgid "%s MB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:840 +#, python-format +msgid "%s GB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:842 +#, python-format +msgid "%s TB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:844 +#, python-format +msgid "%s PB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:62 +msgid "p.m." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:63 +msgid "a.m." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:68 +msgid "PM" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:69 +msgid "AM" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:150 +msgid "midnight" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:152 +msgid "noon" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:295 +msgid "Monday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:296 +msgid "Tuesday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:297 +msgid "Wednesday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:298 +msgid "Thursday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:299 +msgid "Friday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:7 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:300 +msgid "Saturday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:7 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:301 +msgid "Sunday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Mon" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Tue" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Wed" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Thu" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Fri" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:11 +#, fuzzy +#| msgid "Started" +msgid "Sat" +msgstr "Gestartet" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:11 +msgid "Sun" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:281 +msgid "January" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:282 +msgid "February" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:283 +#, fuzzy +#| msgid "Search" +msgid "March" +msgstr "Suche" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:284 +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:285 +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:286 +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:287 +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:288 +msgid "August" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:289 +#, fuzzy +#| msgid "Series number:" +msgid "September" +msgstr "Seriennummer:" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:290 +msgid "October" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:291 +msgid "November" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:16 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:292 +#, fuzzy +#| msgid "Series number:" +msgid "December" +msgstr "Seriennummer:" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "jan" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "feb" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "mar" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "apr" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "may" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "jun" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "jul" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "aug" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "sep" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "oct" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "nov" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "dec" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:23 +msgctxt "abbrev. month" +msgid "Jan." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:24 +msgctxt "abbrev. month" +msgid "Feb." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:25 +#, fuzzy +#| msgid "Search" +msgctxt "abbrev. month" +msgid "March" +msgstr "Suche" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:26 +msgctxt "abbrev. month" +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:27 +msgctxt "abbrev. month" +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:28 +msgctxt "abbrev. month" +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:29 +msgctxt "abbrev. month" +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:30 +msgctxt "abbrev. month" +msgid "Aug." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:31 +msgctxt "abbrev. month" +msgid "Sept." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:32 +msgctxt "abbrev. month" +msgid "Oct." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:33 +msgctxt "abbrev. month" +msgid "Nov." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:34 +msgctxt "abbrev. month" +msgid "Dec." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:37 +msgctxt "alt. month" +msgid "January" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:38 +msgctxt "alt. month" +msgid "February" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:39 +#, fuzzy +#| msgid "Search" +msgctxt "alt. month" +msgid "March" +msgstr "Suche" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:40 +msgctxt "alt. month" +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:41 +msgctxt "alt. month" +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:42 +msgctxt "alt. month" +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:43 +msgctxt "alt. month" +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:44 +msgctxt "alt. month" +msgid "August" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:45 +#, fuzzy +#| msgid "Series number:" +msgctxt "alt. month" +msgid "September" +msgstr "Seriennummer:" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:46 +msgctxt "alt. month" +msgid "October" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:47 +msgctxt "alt. month" +msgid "November" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:48 +#, fuzzy +#| msgid "Series number:" +msgctxt "alt. month" +msgid "December" +msgstr "Seriennummer:" + +#: venv3/lib/python3.8/site-packages/django/utils/ipv6.py:8 +#, fuzzy +#| msgid "Email address:" +msgid "This is not a valid IPv6 address." +msgstr "E-Mail Adresse" + +#: venv3/lib/python3.8/site-packages/django/utils/text.py:69 +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/text.py:235 +msgid "or" +msgstr "" + +#. Translators: This string is used as a separator between list elements +#: venv3/lib/python3.8/site-packages/django/utils/text.py:254 +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:83 +msgid ", " +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:9 +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:10 +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:11 +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:12 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:13 +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:14 +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:72 +msgid "0 minutes" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:110 +msgid "Forbidden" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:111 +msgid "CSRF verification failed. Request aborted." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:115 +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:120 +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:124 +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:132 +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:137 +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:142 +msgid "More information is available with DEBUG=True." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:41 +msgid "No year specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:61 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:111 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:208 +msgid "Date out of range" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:90 +msgid "No month specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:142 +msgid "No day specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:188 +msgid "No week specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:338 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:367 +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:589 +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:623 +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/detail.py:54 +#, fuzzy, python-format +#| msgid "No books found matching the query \"%(query)s\"" +msgid "No %(verbose_name)s found matching the query" +msgstr "Keine passenden Bücher zu \"%(query)s\" gefunden" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:67 +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:72 +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:154 +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:40 +msgid "Directory indexes are not allowed here." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:42 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid username" +msgid "“%(path)s” does not exist" +msgstr "%(value)s ist kein gültiger Username" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:80 +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:7 +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:346 +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:368 +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:369 +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:384 +msgid "Django Documentation" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:385 +msgid "Topics, references, & how-to’s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:396 +msgid "Tutorial: A Polling App" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:397 +msgid "Get started with Django" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:408 +#, fuzzy +#| msgid "Comment" +msgid "Django Community" +msgstr "Kommentieren" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:409 +msgid "Connect, get help, or contribute" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1301 +#, python-format +msgid "Attempting to connect to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1306 +#, python-format +msgid "Connected to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1324 +#, python-format +msgid "Unable to connect to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:371 +msgid "1 second ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:377 +msgid "1 minute ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:382 +msgid "1 hour ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:385 +#, python-format +msgid "%(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:387 +msgid "yesterday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:387 +#, python-format +msgid "yesterday at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:389 +#, python-format +msgid "%(weekday)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:389 +#, python-format +msgid "%(weekday)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:392 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:445 +#, python-format +msgid "%(month_name)s %(day)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:394 +#, python-format +msgid "%(month_name)s %(day)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:399 +#, python-format +msgid "%(month_name)s %(day)s, %(year)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:401 +#, python-format +msgid "%(month_name)s %(day)s, %(year)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:439 +#, python-format +msgid "%(weekday)s, %(month_name)s %(day)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:462 +#, python-format +msgid "%(commas)s and %(last)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:68 +msgctxt "law" +msgid "right" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:69 +msgctxt "good" +msgid "right" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:71 +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:74 +msgctxt "organization" +msgid "club" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:76 +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:77 +msgctxt "stick" +msgid "club" +msgstr "" + +#~ msgid "Deactivate user" +#~ msgstr "Nutzer:in deaktivieren" + +#~ msgid "Reactivate user" +#~ msgstr "Nutzer:in reaktivieren" + +#, fuzzy, python-format +#~| msgid "Direct Messages with %(username)s" +#~ msgid "" +#~ "replied to %(username)s's review" +#~ msgstr "Direktnachrichten mit %(username)s" + +#, fuzzy, python-format +#~| msgid "" +#~| "replied to your status" +#~ msgid "" +#~ "replied to %(username)s's comment" +#~ msgstr "" +#~ "hat auf deinen Status geantwortet" + +#, fuzzy, python-format +#~| msgid "" +#~| "replied to your status" +#~ msgid "" +#~ "replied to %(username)s's quote" +#~ msgstr "" +#~ "hat auf deinen Status geantwortet" + +#~ msgid "Remove tag" +#~ msgstr "Tag entfernen" + +#~ msgid "Add tag" +#~ msgstr "Tag hinzufügen" + +#, python-format +#~ msgid "Books tagged \"%(tag.name)s\"" +#~ msgstr "Mit \"%(tag.name)s\" markierte Bücher" + #, fuzzy #~| msgid "Started" #~ msgid "Getting Started" @@ -2756,9 +4549,6 @@ msgstr "" #~ msgid "No users were found for \"%(query)s\"" #~ msgstr "Keine Nutzer*innen für \"%(query)s\" gefunden" -#~ msgid "Your shelves" -#~ msgstr "Deine Regale" - #~ msgid "Your lists" #~ msgstr "Deine Listen" @@ -2799,134 +4589,6 @@ msgstr "" #~ msgid "Send follow request" #~ msgstr "Folgeanfrage senden" -#, fuzzy -#~| msgid "All messages" -#~ msgid "Messages" -#~ msgstr "Alle Nachrichten" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "Enter a valid email address." -#~ msgstr "E-Mail Adresse" - -#, fuzzy -#~| msgid "Series number:" -#~ msgid "Enter a number." -#~ msgstr "Seriennummer:" - -#, fuzzy -#~| msgid "%(value)s is not a valid remote_id" -#~ msgid "Value %(value)r is not a valid choice." -#~ msgstr "%(value)s ist keine gültige remote_id" - -#, fuzzy -#~| msgid "Series number:" -#~ msgid "Decimal number" -#~ msgstr "Seriennummer:" - -#, fuzzy -#~| msgid "List curation:" -#~ msgid "Duration" -#~ msgstr "Listenkuratierung:" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "Email address" -#~ msgstr "E-Mail Adresse" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "IPv4 address" -#~ msgstr "E-Mail Adresse" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "IP address" -#~ msgstr "E-Mail Adresse" - -#, fuzzy -#~| msgid "No active invites" -#~ msgid "Positive integer" -#~ msgstr "Keine aktiven Einladungen" - -#, fuzzy -#~| msgid "%(value)s is not a valid username" -#~ msgid "“%(value)s” is not a valid UUID." -#~ msgstr "%(value)s ist kein gültiger Username" - -#, fuzzy -#~| msgid "Images" -#~ msgid "Image" -#~ msgstr "Bilder" - -#, fuzzy -#~| msgid "Relationships" -#~ msgid "One-to-one relationship" -#~ msgstr "Beziehungen" - -#, fuzzy -#~| msgid "This shelf is empty." -#~ msgid "This field is required." -#~ msgstr "Dieses Regal ist leer." - -#, fuzzy -#~| msgid "This shelf is empty." -#~ msgid "The submitted file is empty." -#~ msgstr "Dieses Regal ist leer." - -#, fuzzy -#~| msgid "%(value)s is not a valid username" -#~ msgid "“%(pk)s” is not a valid value." -#~ msgstr "%(value)s ist kein gültiger Username" - -#, fuzzy -#~| msgid "Start reading" -#~ msgid "Currently" -#~ msgstr "Gerade lesend" - -#, fuzzy -#~| msgid "Change shelf" -#~ msgid "Change" -#~ msgstr "Regal wechseln" - -#, fuzzy -#~| msgid "Started" -#~ msgid "Sat" -#~ msgstr "Gestartet" - -#, fuzzy -#~| msgid "Search" -#~ msgid "March" -#~ msgstr "Suche" - -#, fuzzy -#~| msgid "Series number:" -#~ msgid "September" -#~ msgstr "Seriennummer:" - -#, fuzzy -#~| msgid "Search" -#~ msgctxt "abbrev. month" -#~ msgid "March" -#~ msgstr "Suche" - -#, fuzzy -#~| msgid "Search" -#~ msgctxt "alt. month" -#~ msgid "March" -#~ msgstr "Suche" - -#, fuzzy -#~| msgid "Series number:" -#~ msgctxt "alt. month" -#~ msgid "September" -#~ msgstr "Seriennummer:" - -#, fuzzy -#~| msgid "No books found matching the query \"%(query)s\"" -#~ msgid "No %(verbose_name)s found matching the query" -#~ msgstr "Keine passenden Bücher zu \"%(query)s\" gefunden" - #~ msgid "Announcements" #~ msgstr "Ankündigungen" diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index a8720f17..6685605a 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: 2021-04-01 13:14-0700\n" +"POT-Creation-Date: 2021-04-26 09:56-0700\n" "PO-Revision-Date: 2021-02-28 17:19-0800\n" "Last-Translator: Mouse Reeve \n" "Language-Team: English \n" @@ -18,35 +18,60 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: bookwyrm/forms.py:226 +#: bookwyrm/forms.py:224 msgid "A user with this email already exists." msgstr "" -#: bookwyrm/forms.py:240 +#: bookwyrm/forms.py:238 msgid "One Day" msgstr "" -#: bookwyrm/forms.py:241 +#: bookwyrm/forms.py:239 msgid "One Week" msgstr "" -#: bookwyrm/forms.py:242 +#: bookwyrm/forms.py:240 msgid "One Month" msgstr "" -#: bookwyrm/forms.py:243 +#: bookwyrm/forms.py:241 msgid "Does Not Expire" msgstr "" -#: bookwyrm/forms.py:248 +#: bookwyrm/forms.py:246 #, python-format msgid "%(count)d uses" msgstr "" -#: bookwyrm/forms.py:251 +#: bookwyrm/forms.py:249 msgid "Unlimited" msgstr "" +#: bookwyrm/forms.py:293 +msgid "List Order" +msgstr "" + +#: bookwyrm/forms.py:294 +msgid "Book Title" +msgstr "" + +#: bookwyrm/forms.py:295 bookwyrm/templates/snippets/create_status_form.html:31 +#: bookwyrm/templates/user/shelf.html:80 bookwyrm/templates/user/shelf.html:110 +msgid "Rating" +msgstr "" + +#: bookwyrm/forms.py:297 bookwyrm/templates/lists/list.html:82 +msgid "Sort By" +msgstr "" + +#: bookwyrm/forms.py:301 +msgid "Ascending" +msgstr "" + +#: bookwyrm/forms.py:302 +msgid "Descending" +msgstr "" + #: bookwyrm/models/fields.py:24 #, python-format msgid "%(value)s is not a valid remote_id" @@ -57,7 +82,7 @@ msgstr "" msgid "%(value)s is not a valid username" msgstr "" -#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:157 +#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:153 msgid "username" msgstr "" @@ -65,23 +90,23 @@ msgstr "" msgid "A user with that username already exists." msgstr "" -#: bookwyrm/settings.py:150 +#: bookwyrm/settings.py:152 msgid "English" msgstr "" -#: bookwyrm/settings.py:151 +#: bookwyrm/settings.py:153 msgid "German" msgstr "" -#: bookwyrm/settings.py:152 +#: bookwyrm/settings.py:154 msgid "Spanish" msgstr "" -#: bookwyrm/settings.py:153 +#: bookwyrm/settings.py:155 msgid "French" msgstr "" -#: bookwyrm/settings.py:154 +#: bookwyrm/settings.py:156 msgid "Simplified Chinese" msgstr "" @@ -118,80 +143,70 @@ msgstr "" msgid "Books by %(name)s" msgstr "" -#: bookwyrm/templates/book/book.html:21 +#: bookwyrm/templates/book/book.html:33 #: bookwyrm/templates/discover/large-book.html:12 #: bookwyrm/templates/discover/small-book.html:9 msgid "by" msgstr "" -#: bookwyrm/templates/book/book.html:29 bookwyrm/templates/book/book.html:30 +#: bookwyrm/templates/book/book.html:41 bookwyrm/templates/book/book.html:42 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:49 +#: bookwyrm/templates/book/book.html:61 #: bookwyrm/templates/book/cover_modal.html:5 msgid "Add cover" msgstr "" -#: bookwyrm/templates/book/book.html:53 +#: bookwyrm/templates/book/book.html:65 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:62 -msgid "ISBN:" -msgstr "" - -#: bookwyrm/templates/book/book.html:69 -#: bookwyrm/templates/book/edit_book.html:211 -msgid "OCLC Number:" -msgstr "" - -#: bookwyrm/templates/book/book.html:76 -#: bookwyrm/templates/book/edit_book.html:215 -msgid "ASIN:" -msgstr "" - -#: bookwyrm/templates/book/book.html:85 +#: bookwyrm/templates/book/book.html:82 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/book/book.html:94 +#: bookwyrm/templates/book/book.html:102 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:100 +#: bookwyrm/templates/book/book.html:114 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:107 -#: bookwyrm/templates/book/edit_book.html:101 +#: bookwyrm/templates/book/book.html:121 +#: bookwyrm/templates/book/edit_book.html:107 #: bookwyrm/templates/lists/form.html:12 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:111 -#: bookwyrm/templates/book/edit_book.html:225 +#: bookwyrm/templates/book/book.html:125 +#: bookwyrm/templates/book/edit_book.html:240 #: bookwyrm/templates/edit_author.html:78 bookwyrm/templates/lists/form.html:42 #: bookwyrm/templates/preferences/edit_user.html:70 +#: bookwyrm/templates/settings/edit_server.html:68 +#: bookwyrm/templates/settings/federated_server.html:93 #: bookwyrm/templates/settings/site.html:93 -#: bookwyrm/templates/snippets/readthrough.html:65 +#: bookwyrm/templates/snippets/readthrough.html:75 #: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42 #: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:34 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:38 msgid "Save" msgstr "" -#: bookwyrm/templates/book/book.html:112 bookwyrm/templates/book/book.html:161 +#: bookwyrm/templates/book/book.html:126 bookwyrm/templates/book/book.html:175 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:226 +#: bookwyrm/templates/book/edit_book.html:241 #: bookwyrm/templates/edit_author.html:79 -#: bookwyrm/templates/moderation/report_modal.html:32 +#: bookwyrm/templates/moderation/report_modal.html:34 +#: bookwyrm/templates/settings/federated_server.html:94 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 #: bookwyrm/templates/snippets/goal_form.html:32 -#: bookwyrm/templates/snippets/readthrough.html:66 +#: bookwyrm/templates/snippets/readthrough.html:76 #: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43 #: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:35 @@ -199,73 +214,105 @@ msgstr "" msgid "Cancel" msgstr "" -#: bookwyrm/templates/book/book.html:121 +#: bookwyrm/templates/book/book.html:135 #, python-format msgid "%(count)s editions" msgstr "" -#: bookwyrm/templates/book/book.html:129 +#: bookwyrm/templates/book/book.html:143 #, python-format msgid "This edition is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:135 +#: bookwyrm/templates/book/book.html:149 #, python-format -msgid "A different edition of this book is on your %(shelf_name)s shelf." -msgstr "" - -#: bookwyrm/templates/book/book.html:144 -msgid "Your reading activity" -msgstr "" - -#: bookwyrm/templates/book/book.html:146 -msgid "Add read dates" -msgstr "" - -#: bookwyrm/templates/book/book.html:151 -msgid "You don't have any reading activity for this book." +msgid "" +"A different edition of this book is on your %(shelf_name)s shelf." msgstr "" #: bookwyrm/templates/book/book.html:158 +msgid "Your reading activity" +msgstr "" + +#: bookwyrm/templates/book/book.html:160 +msgid "Add read dates" +msgstr "" + +#: bookwyrm/templates/book/book.html:165 +msgid "You don't have any reading activity for this book." +msgstr "" + +#: bookwyrm/templates/book/book.html:172 msgid "Create" msgstr "" -#: bookwyrm/templates/book/book.html:180 +#: bookwyrm/templates/book/book.html:194 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:191 +#: bookwyrm/templates/book/book.html:206 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:202 bookwyrm/templates/layout.html:64 +#: bookwyrm/templates/book/book.html:217 bookwyrm/templates/layout.html:65 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search_results.html:91 #: bookwyrm/templates/user/user_layout.html:62 msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:213 +#: bookwyrm/templates/book/book.html:228 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:223 +#: bookwyrm/templates/book/book.html:238 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:90 +#: bookwyrm/templates/lists/list.html:133 msgid "Add" msgstr "" -#: bookwyrm/templates/book/book.html:251 +#: bookwyrm/templates/book/book.html:254 +msgid "Reviews" +msgstr "" + +#: bookwyrm/templates/book/book.html:259 +msgid "Your reviews" +msgstr "" + +#: bookwyrm/templates/book/book.html:265 +msgid "Your comments" +msgstr "" + +#: bookwyrm/templates/book/book.html:271 +msgid "Your quotes" +msgstr "" + +#: bookwyrm/templates/book/book.html:305 msgid "rated it" msgstr "" +#: bookwyrm/templates/book/book_identifiers.html:8 +msgid "ISBN:" +msgstr "" + +#: bookwyrm/templates/book/book_identifiers.html:15 +#: bookwyrm/templates/book/edit_book.html:226 +msgid "OCLC Number:" +msgstr "" + +#: bookwyrm/templates/book/book_identifiers.html:22 +#: bookwyrm/templates/book/edit_book.html:230 +msgid "ASIN:" +msgstr "" + #: bookwyrm/templates/book/cover_modal.html:17 -#: bookwyrm/templates/book/edit_book.html:163 +#: bookwyrm/templates/book/edit_book.html:178 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:169 +#: bookwyrm/templates/book/edit_book.html:184 msgid "Load cover from url:" msgstr "" @@ -341,86 +388,86 @@ msgstr "" msgid "Metadata" msgstr "" -#: bookwyrm/templates/book/edit_book.html:91 +#: bookwyrm/templates/book/edit_book.html:92 msgid "Title:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:96 +#: bookwyrm/templates/book/edit_book.html:100 msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:106 +#: bookwyrm/templates/book/edit_book.html:113 msgid "Series:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:111 +#: bookwyrm/templates/book/edit_book.html:120 msgid "Series number:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:117 +#: bookwyrm/templates/book/edit_book.html:126 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:119 +#: bookwyrm/templates/book/edit_book.html:128 msgid "Separate multiple publishers with commas." msgstr "" -#: bookwyrm/templates/book/edit_book.html:125 +#: bookwyrm/templates/book/edit_book.html:135 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:130 +#: bookwyrm/templates/book/edit_book.html:143 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:137 +#: bookwyrm/templates/book/edit_book.html:152 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit_book.html:143 +#: bookwyrm/templates/book/edit_book.html:158 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit_book.html:148 +#: bookwyrm/templates/book/edit_book.html:163 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:149 +#: bookwyrm/templates/book/edit_book.html:164 msgid "John Doe, Jane Smith" msgstr "" -#: bookwyrm/templates/book/edit_book.html:155 -#: bookwyrm/templates/user/shelf.html:75 +#: bookwyrm/templates/book/edit_book.html:170 +#: bookwyrm/templates/user/shelf.html:74 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit_book.html:182 +#: bookwyrm/templates/book/edit_book.html:197 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit_book.html:183 +#: bookwyrm/templates/book/edit_book.html:198 #: bookwyrm/templates/book/format_filter.html:5 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:191 +#: bookwyrm/templates/book/edit_book.html:206 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:198 +#: bookwyrm/templates/book/edit_book.html:213 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit_book.html:199 +#: bookwyrm/templates/book/edit_book.html:214 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:203 +#: bookwyrm/templates/book/edit_book.html:218 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:207 +#: bookwyrm/templates/book/edit_book.html:222 #: bookwyrm/templates/edit_author.html:59 msgid "Openlibrary key:" msgstr "" @@ -444,44 +491,53 @@ msgstr "" msgid "Language:" msgstr "" -#: bookwyrm/templates/book/publisher_info.html:6 +#: bookwyrm/templates/book/publisher_info.html:22 +#, python-format +msgid "%(format)s" +msgstr "" + +#: bookwyrm/templates/book/publisher_info.html:24 #, python-format msgid "%(format)s, %(pages)s pages" msgstr "" -#: bookwyrm/templates/book/publisher_info.html:8 +#: bookwyrm/templates/book/publisher_info.html:26 #, python-format msgid "%(pages)s pages" msgstr "" -#: bookwyrm/templates/book/publisher_info.html:13 +#: bookwyrm/templates/book/publisher_info.html:38 #, python-format msgid "%(languages)s language" msgstr "" -#: bookwyrm/templates/book/publisher_info.html:18 +#: bookwyrm/templates/book/publisher_info.html:64 #, python-format msgid "Published %(date)s by %(publisher)s." msgstr "" -#: bookwyrm/templates/book/publisher_info.html:20 +#: bookwyrm/templates/book/publisher_info.html:66 #, python-format msgid "Published %(date)s" msgstr "" -#: bookwyrm/templates/book/publisher_info.html:22 +#: bookwyrm/templates/book/publisher_info.html:68 #, python-format msgid "Published by %(publisher)s." msgstr "" #: bookwyrm/templates/components/inline_form.html:8 #: bookwyrm/templates/components/modal.html:11 -#: bookwyrm/templates/feed/feed_layout.html:57 +#: bookwyrm/templates/feed/feed_layout.html:70 #: bookwyrm/templates/get_started/layout.html:19 #: bookwyrm/templates/get_started/layout.html:52 msgid "Close" msgstr "" +#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8 +msgid "Compose status" +msgstr "" + #: bookwyrm/templates/directory/community_filter.html:5 msgid "Community" msgstr "" @@ -496,7 +552,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:6 #: bookwyrm/templates/directory/directory.html:11 -#: bookwyrm/templates/layout.html:97 +#: bookwyrm/templates/layout.html:93 msgid "Directory" msgstr "" @@ -506,7 +562,9 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:26 #, python-format -msgid "You can opt-out at any time in your profile settings." +msgid "" +"You can opt-out at any time in your profile settings." msgstr "" #: bookwyrm/templates/directory/directory.html:31 @@ -620,7 +678,7 @@ msgid "Email address:" msgstr "" #: bookwyrm/templates/discover/landing_layout.html:70 -#: bookwyrm/templates/moderation/report_modal.html:31 +#: bookwyrm/templates/moderation/report_modal.html:33 msgid "Submit" msgstr "" @@ -673,7 +731,9 @@ msgstr "" #: bookwyrm/templates/email/html_layout.html:21 #, python-format -msgid "BookWyrm hosted on %(site_name)s" +msgid "" +"BookWyrm hosted on " +"%(site_name)s" msgstr "" #: bookwyrm/templates/email/html_layout.html:23 @@ -692,12 +752,16 @@ msgstr "" #: bookwyrm/templates/email/invite/html_content.html:15 #, python-format -msgid "Learn more about this instance." +msgid "" +"Learn more about this instance." msgstr "" #: bookwyrm/templates/email/invite/text_content.html:4 #, python-format -msgid "You're invited to join %(site_name)s! Click the link below to create an account." +msgid "" +"You're invited to join %(site_name)s! Click the link below to create an " +"account." msgstr "" #: bookwyrm/templates/email/invite/text_content.html:8 @@ -707,7 +771,9 @@ msgstr "" #: bookwyrm/templates/email/password_reset/html_content.html:6 #: bookwyrm/templates/email/password_reset/text_content.html:4 #, python-format -msgid "You requested to reset your %(site_name)s password. Click the link below to set a new password and log in to your account." +msgid "" +"You requested to reset your %(site_name)s password. Click the link below to " +"set a new password and log in to your account." msgstr "" #: bookwyrm/templates/email/password_reset/html_content.html:9 @@ -720,7 +786,8 @@ msgstr "" #: bookwyrm/templates/email/password_reset/html_content.html:13 #: bookwyrm/templates/email/password_reset/text_content.html:8 -msgid "If you didn't request to reset your password, you can ignore this email." +msgid "" +"If you didn't request to reset your password, you can ignore this email." msgstr "" #: bookwyrm/templates/email/password_reset/subject.html:2 @@ -734,7 +801,7 @@ msgid "Direct Messages with %(username)s" msgstr "" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:87 +#: bookwyrm/templates/layout.html:88 msgid "Direct Messages" msgstr "" @@ -767,6 +834,7 @@ msgid "Local" msgstr "" #: bookwyrm/templates/feed/feed.html:25 +#: bookwyrm/templates/settings/edit_server.html:40 msgid "Federated" msgstr "" @@ -776,7 +844,8 @@ msgid "load 0 unread status(es)" msgstr "" #: bookwyrm/templates/feed/feed.html:48 -msgid "There aren't any activities right now! Try following a user to get started" +msgid "" +"There aren't any activities right now! Try following a user to get started" msgstr "" #: bookwyrm/templates/feed/feed.html:56 @@ -789,32 +858,33 @@ msgid "Updates" msgstr "" #: bookwyrm/templates/feed/feed_layout.html:11 -#: bookwyrm/templates/layout.html:58 +#: bookwyrm/templates/layout.html:59 #: bookwyrm/templates/user/books_header.html:3 msgid "Your books" msgstr "" #: bookwyrm/templates/feed/feed_layout.html:13 -msgid "There are no books here right now! Try searching for a book to get started" -msgstr "" - -#: bookwyrm/templates/feed/feed_layout.html:23 -#: bookwyrm/templates/user/shelf.html:28 -msgid "To Read" +msgid "" +"There are no books here right now! Try searching for a book to get started" msgstr "" #: bookwyrm/templates/feed/feed_layout.html:24 #: bookwyrm/templates/user/shelf.html:28 -msgid "Currently Reading" +msgid "To Read" msgstr "" #: bookwyrm/templates/feed/feed_layout.html:25 +#: bookwyrm/templates/user/shelf.html:28 +msgid "Currently Reading" +msgstr "" + +#: bookwyrm/templates/feed/feed_layout.html:26 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:11 #: bookwyrm/templates/user/shelf.html:28 msgid "Read" msgstr "" -#: bookwyrm/templates/feed/feed_layout.html:74 bookwyrm/templates/goal.html:26 +#: bookwyrm/templates/feed/feed_layout.html:88 bookwyrm/templates/goal.html:26 #: bookwyrm/templates/snippets/goal_card.html:6 #, python-format msgid "%(year)s Reading Goal" @@ -844,7 +914,7 @@ msgid "What are you reading?" msgstr "" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:58 +#: bookwyrm/templates/lists/list.html:101 msgid "Search for a book" msgstr "" @@ -864,8 +934,8 @@ msgstr "" #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38 -#: bookwyrm/templates/lists/list.html:62 +#: bookwyrm/templates/layout.html:38 bookwyrm/templates/layout.html:39 +#: bookwyrm/templates/lists/list.html:105 msgid "Search" msgstr "" @@ -879,7 +949,7 @@ msgid "Popular on %(site_name)s" msgstr "" #: bookwyrm/templates/get_started/books.html:51 -#: bookwyrm/templates/lists/list.html:75 +#: bookwyrm/templates/lists/list.html:118 msgid "No books found" msgstr "" @@ -948,7 +1018,9 @@ msgid "Show this account in suggested users:" msgstr "" #: bookwyrm/templates/get_started/profile.html:52 -msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." +msgid "" +"Your account will show up in the directory, and may be recommended to other " +"BookWyrm users." msgstr "" #: bookwyrm/templates/get_started/users.html:11 @@ -973,7 +1045,9 @@ msgstr "" #: bookwyrm/templates/goal.html:30 #: bookwyrm/templates/snippets/goal_card.html:13 #, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." +msgid "" +"Set a goal for how many books you'll finish reading in %(year)s, and track " +"your progress throughout the year." msgstr "" #: bookwyrm/templates/goal.html:39 @@ -992,7 +1066,7 @@ msgid "%(username)s's %(year)s Books" msgstr "" #: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9 -#: bookwyrm/templates/layout.html:102 +#: bookwyrm/templates/layout.html:98 msgid "Import Books" msgstr "" @@ -1013,6 +1087,7 @@ msgid "Privacy setting for imported reviews:" msgstr "" #: bookwyrm/templates/import.html:48 +#: bookwyrm/templates/settings/server_blocklist.html:64 msgid "Import" msgstr "" @@ -1055,7 +1130,9 @@ msgstr "" #: bookwyrm/templates/import_status.html:44 #, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." +msgid "" +"Jump to the bottom of the list to select the %(failed_count)s items which " +"failed to import." msgstr "" #: bookwyrm/templates/import_status.html:79 @@ -1077,12 +1154,12 @@ msgstr "" #: bookwyrm/templates/import_status.html:115 #: bookwyrm/templates/snippets/create_status_form.html:10 -#: bookwyrm/templates/user/shelf.html:76 +#: bookwyrm/templates/user/shelf.html:75 bookwyrm/templates/user/shelf.html:93 msgid "Title" msgstr "" #: bookwyrm/templates/import_status.html:118 -#: bookwyrm/templates/user/shelf.html:77 +#: bookwyrm/templates/user/shelf.html:76 bookwyrm/templates/user/shelf.html:96 msgid "Author" msgstr "" @@ -1119,91 +1196,90 @@ msgstr "" msgid "Matching Books" msgstr "" -#: bookwyrm/templates/layout.html:33 +#: bookwyrm/templates/layout.html:34 msgid "Search for a book or user" msgstr "" -#: bookwyrm/templates/layout.html:47 bookwyrm/templates/layout.html:48 +#: bookwyrm/templates/layout.html:48 bookwyrm/templates/layout.html:49 msgid "Main navigation menu" msgstr "" -#: bookwyrm/templates/layout.html:61 +#: bookwyrm/templates/layout.html:62 msgid "Feed" msgstr "" -#: bookwyrm/templates/layout.html:92 -#: bookwyrm/templates/preferences/preferences_layout.html:14 -msgid "Profile" -msgstr "" - -#: bookwyrm/templates/layout.html:107 +#: bookwyrm/templates/layout.html:103 msgid "Settings" msgstr "" -#: bookwyrm/templates/layout.html:116 -#: bookwyrm/templates/settings/admin_layout.html:24 +#: bookwyrm/templates/layout.html:112 +#: bookwyrm/templates/settings/admin_layout.html:31 #: bookwyrm/templates/settings/manage_invite_requests.html:15 #: bookwyrm/templates/settings/manage_invites.html:3 #: bookwyrm/templates/settings/manage_invites.html:15 msgid "Invites" msgstr "" -#: bookwyrm/templates/layout.html:123 +#: bookwyrm/templates/layout.html:119 msgid "Admin" msgstr "" -#: bookwyrm/templates/layout.html:130 +#: bookwyrm/templates/layout.html:126 msgid "Log out" msgstr "" -#: bookwyrm/templates/layout.html:138 bookwyrm/templates/layout.html:139 +#: bookwyrm/templates/layout.html:134 bookwyrm/templates/layout.html:135 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:10 msgid "Notifications" msgstr "" -#: bookwyrm/templates/layout.html:156 bookwyrm/templates/layout.html:160 +#: bookwyrm/templates/layout.html:152 bookwyrm/templates/layout.html:156 #: bookwyrm/templates/login.html:17 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "" -#: bookwyrm/templates/layout.html:161 +#: bookwyrm/templates/layout.html:157 msgid "password" msgstr "" -#: bookwyrm/templates/layout.html:162 bookwyrm/templates/login.html:36 +#: bookwyrm/templates/layout.html:158 bookwyrm/templates/login.html:36 msgid "Forgot your password?" msgstr "" -#: bookwyrm/templates/layout.html:165 bookwyrm/templates/login.html:10 +#: bookwyrm/templates/layout.html:161 bookwyrm/templates/login.html:10 #: bookwyrm/templates/login.html:33 msgid "Log in" msgstr "" -#: bookwyrm/templates/layout.html:173 +#: bookwyrm/templates/layout.html:169 msgid "Join" msgstr "" -#: bookwyrm/templates/layout.html:196 +#: bookwyrm/templates/layout.html:195 msgid "About this server" msgstr "" -#: bookwyrm/templates/layout.html:200 +#: bookwyrm/templates/layout.html:199 msgid "Contact site admin" msgstr "" -#: bookwyrm/templates/layout.html:207 +#: bookwyrm/templates/layout.html:206 #, python-format -msgid "Support %(site_name)s on %(support_title)s" +msgid "" +"Support %(site_name)s on " +"%(support_title)s" msgstr "" -#: bookwyrm/templates/layout.html:211 -msgid "BookWyrm is open source software. You can contribute or report issues on GitHub." +#: bookwyrm/templates/layout.html:210 +msgid "" +"BookWyrm is open source software. You can contribute or report issues on GitHub." msgstr "" #: bookwyrm/templates/lists/create_form.html:5 -#: bookwyrm/templates/lists/lists.html:19 +#: bookwyrm/templates/lists/lists.html:20 msgid "Create List" msgstr "" @@ -1267,7 +1343,7 @@ msgid "Anyone can suggest books, subject to your approval" msgstr "" #: bookwyrm/templates/lists/form.html:31 -#: bookwyrm/templates/moderation/reports.html:24 +#: bookwyrm/templates/moderation/reports.html:25 msgid "Open" msgstr "" @@ -1275,45 +1351,73 @@ msgstr "" msgid "Anyone can add books to this list" msgstr "" -#: bookwyrm/templates/lists/list.html:17 +#: bookwyrm/templates/lists/list.html:19 +msgid "You successfully suggested a book for this list!" +msgstr "" + +#: bookwyrm/templates/lists/list.html:21 +msgid "You successfully added a book to this list!" +msgstr "" + +#: bookwyrm/templates/lists/list.html:27 msgid "This list is currently empty" msgstr "" -#: bookwyrm/templates/lists/list.html:35 +#: bookwyrm/templates/lists/list.html:46 #, python-format msgid "Added by %(username)s" msgstr "" -#: bookwyrm/templates/lists/list.html:41 -#: bookwyrm/templates/snippets/shelf_selector.html:28 +#: bookwyrm/templates/lists/list.html:58 +msgid "Set" +msgstr "" + +#: bookwyrm/templates/lists/list.html:61 +msgid "List position" +msgstr "" + +#: bookwyrm/templates/lists/list.html:67 +#: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "" -#: bookwyrm/templates/lists/list.html:54 +#: bookwyrm/templates/lists/list.html:80 bookwyrm/templates/lists/list.html:92 +msgid "Sort List" +msgstr "" + +#: bookwyrm/templates/lists/list.html:86 +msgid "Direction" +msgstr "" + +#: bookwyrm/templates/lists/list.html:97 msgid "Add Books" msgstr "" -#: bookwyrm/templates/lists/list.html:54 +#: bookwyrm/templates/lists/list.html:97 msgid "Suggest Books" msgstr "" -#: bookwyrm/templates/lists/list.html:63 +#: bookwyrm/templates/lists/list.html:106 msgid "search" msgstr "" -#: bookwyrm/templates/lists/list.html:69 +#: bookwyrm/templates/lists/list.html:112 msgid "Clear search" msgstr "" -#: bookwyrm/templates/lists/list.html:74 +#: bookwyrm/templates/lists/list.html:117 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "" -#: bookwyrm/templates/lists/list.html:90 +#: bookwyrm/templates/lists/list.html:133 msgid "Suggest" msgstr "" +#: bookwyrm/templates/lists/lists.html:14 bookwyrm/templates/user/lists.html:9 +msgid "Your Lists" +msgstr "" + #: bookwyrm/templates/login.html:4 msgid "Login" msgstr "" @@ -1331,59 +1435,37 @@ msgstr "" msgid "More about this site" msgstr "" -#: bookwyrm/templates/moderation/report.html:5 #: bookwyrm/templates/moderation/report.html:6 +#: bookwyrm/templates/moderation/report.html:7 #: bookwyrm/templates/moderation/report_preview.html:6 #, python-format msgid "Report #%(report_id)s: %(username)s" msgstr "" -#: bookwyrm/templates/moderation/report.html:10 +#: bookwyrm/templates/moderation/report.html:11 msgid "Back to reports" msgstr "" -#: bookwyrm/templates/moderation/report.html:18 -msgid "Actions" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:19 -msgid "View user profile" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:22 -#: bookwyrm/templates/snippets/status/status_options.html:25 -#: bookwyrm/templates/snippets/user_options.html:13 -msgid "Send direct message" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:27 -msgid "Deactivate user" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:29 -msgid "Reactivate user" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:36 +#: bookwyrm/templates/moderation/report.html:23 msgid "Moderator Comments" msgstr "" -#: bookwyrm/templates/moderation/report.html:54 -#: bookwyrm/templates/snippets/create_status.html:12 -#: bookwyrm/templates/snippets/create_status_form.html:52 +#: bookwyrm/templates/moderation/report.html:41 +#: bookwyrm/templates/snippets/create_status.html:28 +#: bookwyrm/templates/snippets/create_status_form.html:53 msgid "Comment" msgstr "" -#: bookwyrm/templates/moderation/report.html:59 +#: bookwyrm/templates/moderation/report.html:46 msgid "Reported statuses" msgstr "" -#: bookwyrm/templates/moderation/report.html:61 +#: bookwyrm/templates/moderation/report.html:48 msgid "No statuses reported" msgstr "" -#: bookwyrm/templates/moderation/report.html:67 -msgid "Statuses has been deleted" +#: bookwyrm/templates/moderation/report.html:54 +msgid "Status has been deleted" msgstr "" #: bookwyrm/templates/moderation/report_modal.html:6 @@ -1391,12 +1473,12 @@ msgstr "" msgid "Report @%(username)s" msgstr "" -#: bookwyrm/templates/moderation/report_modal.html:21 +#: bookwyrm/templates/moderation/report_modal.html:23 #, python-format msgid "This report will be sent to %(site_name)s's moderators for review." msgstr "" -#: bookwyrm/templates/moderation/report_modal.html:22 +#: bookwyrm/templates/moderation/report_modal.html:24 msgid "More info about this report:" msgstr "" @@ -1423,21 +1505,21 @@ msgid "Reports: %(server_name)s" msgstr "" #: bookwyrm/templates/moderation/reports.html:8 -#: bookwyrm/templates/moderation/reports.html:16 -#: bookwyrm/templates/settings/admin_layout.html:28 +#: bookwyrm/templates/moderation/reports.html:17 +#: bookwyrm/templates/settings/admin_layout.html:35 msgid "Reports" msgstr "" -#: bookwyrm/templates/moderation/reports.html:13 +#: bookwyrm/templates/moderation/reports.html:14 #, python-format msgid "Reports: %(server_name)s" msgstr "" -#: bookwyrm/templates/moderation/reports.html:27 +#: bookwyrm/templates/moderation/reports.html:28 msgid "Resolved" msgstr "" -#: bookwyrm/templates/moderation/reports.html:34 +#: bookwyrm/templates/moderation/reports.html:37 msgid "No reports found." msgstr "" @@ -1447,17 +1529,23 @@ msgstr "" #: bookwyrm/templates/notifications.html:53 #, python-format -msgid "favorited your review of %(book_title)s" +msgid "" +"favorited your review of %(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:55 #, python-format -msgid "favorited your comment on %(book_title)s" +msgid "" +"favorited your comment on %(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:57 #, python-format -msgid "favorited your quote from %(book_title)s" +msgid "" +"favorited your quote from %(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:59 @@ -1467,17 +1555,23 @@ msgstr "" #: bookwyrm/templates/notifications.html:64 #, python-format -msgid "mentioned you in a review of %(book_title)s" +msgid "" +"mentioned you in a review of " +"%(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:66 #, python-format -msgid "mentioned you in a comment on %(book_title)s" +msgid "" +"mentioned you in a comment on " +"%(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:68 #, python-format -msgid "mentioned you in a quote from %(book_title)s" +msgid "" +"mentioned you in a quote from " +"%(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:70 @@ -1487,22 +1581,30 @@ msgstr "" #: bookwyrm/templates/notifications.html:75 #, python-format -msgid "replied to your review of %(book_title)s" +msgid "" +"replied to your review of %(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:77 #, python-format -msgid "replied to your comment on %(book_title)s" +msgid "" +"replied to your comment on %(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:79 #, python-format -msgid "replied to your quote from %(book_title)s" +msgid "" +"replied to your quote from %(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:81 #, python-format -msgid "replied to your status" +msgid "" +"replied to your status" msgstr "" #: bookwyrm/templates/notifications.html:85 @@ -1515,17 +1617,23 @@ msgstr "" #: bookwyrm/templates/notifications.html:94 #, python-format -msgid "boosted your review of %(book_title)s" +msgid "" +"boosted your review of %(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:96 #, python-format -msgid "boosted your comment on%(book_title)s" +msgid "" +"boosted your comment on%(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:98 #, python-format -msgid "boosted your quote from %(book_title)s" +msgid "" +"boosted your quote from %(book_title)s" msgstr "" #: bookwyrm/templates/notifications.html:100 @@ -1535,12 +1643,16 @@ msgstr "" #: bookwyrm/templates/notifications.html:104 #, python-format -msgid " added %(book_title)s to your list \"%(list_name)s\"" +msgid "" +" added %(book_title)s to your list " +"\"%(list_name)s\"" msgstr "" #: bookwyrm/templates/notifications.html:106 #, python-format -msgid " suggested adding %(book_title)s to your list \"%(list_name)s\"" +msgid "" +" suggested adding %(book_title)s to " +"your list \"%(list_name)s\"" msgstr "" #: bookwyrm/templates/notifications.html:110 @@ -1602,7 +1714,9 @@ msgstr "" #: bookwyrm/templates/preferences/edit_user.html:62 #, python-format -msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." +msgid "" +"Your account will show up in the directory, and may " +"be recommended to other BookWyrm users." msgstr "" #: bookwyrm/templates/preferences/edit_user.html:65 @@ -1613,6 +1727,10 @@ msgstr "" msgid "Account" msgstr "" +#: bookwyrm/templates/preferences/preferences_layout.html:14 +msgid "Profile" +msgstr "" + #: bookwyrm/templates/preferences/preferences_layout.html:20 msgid "Relationships" msgstr "" @@ -1642,117 +1760,187 @@ msgstr "" msgid "Administration" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:15 +#: bookwyrm/templates/settings/admin_layout.html:22 msgid "Manage Users" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:19 -#: bookwyrm/templates/settings/user_admin.html:3 -#: bookwyrm/templates/settings/user_admin.html:10 +#: bookwyrm/templates/settings/admin_layout.html:26 +#: bookwyrm/templates/user_admin/user_admin.html:3 +#: bookwyrm/templates/user_admin/user_admin.html:10 msgid "Users" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:32 +#: bookwyrm/templates/settings/admin_layout.html:39 #: bookwyrm/templates/settings/federation.html:3 #: bookwyrm/templates/settings/federation.html:5 msgid "Federated Servers" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:37 +#: bookwyrm/templates/settings/admin_layout.html:44 msgid "Instance Settings" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:41 +#: bookwyrm/templates/settings/admin_layout.html:48 #: bookwyrm/templates/settings/site.html:4 #: bookwyrm/templates/settings/site.html:6 msgid "Site Settings" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:44 +#: bookwyrm/templates/settings/admin_layout.html:51 #: bookwyrm/templates/settings/site.html:13 msgid "Instance Info" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:45 +#: bookwyrm/templates/settings/admin_layout.html:52 #: bookwyrm/templates/settings/site.html:39 msgid "Images" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:46 +#: bookwyrm/templates/settings/admin_layout.html:53 #: bookwyrm/templates/settings/site.html:59 msgid "Footer Content" msgstr "" -#: bookwyrm/templates/settings/admin_layout.html:47 +#: bookwyrm/templates/settings/admin_layout.html:54 #: bookwyrm/templates/settings/site.html:77 msgid "Registration" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:7 +#: bookwyrm/templates/settings/edit_server.html:3 +#: bookwyrm/templates/settings/edit_server.html:6 +#: bookwyrm/templates/settings/edit_server.html:20 +#: bookwyrm/templates/settings/federation.html:9 +#: bookwyrm/templates/settings/federation.html:10 +#: bookwyrm/templates/settings/server_blocklist.html:3 +#: bookwyrm/templates/settings/server_blocklist.html:20 +msgid "Add server" +msgstr "" + +#: bookwyrm/templates/settings/edit_server.html:7 +#: bookwyrm/templates/settings/federated_server.html:12 +#: bookwyrm/templates/settings/server_blocklist.html:7 msgid "Back to server list" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:12 -msgid "Details" +#: bookwyrm/templates/settings/edit_server.html:16 +#: bookwyrm/templates/settings/server_blocklist.html:16 +msgid "Import block list" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:15 -msgid "Software:" +#: bookwyrm/templates/settings/edit_server.html:30 +msgid "Instance:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:19 -msgid "Version:" -msgstr "" - -#: bookwyrm/templates/settings/federated_server.html:23 +#: bookwyrm/templates/settings/edit_server.html:37 +#: bookwyrm/templates/settings/federated_server.html:29 +#: bookwyrm/templates/user_admin/user_info.html:34 msgid "Status:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:30 +#: bookwyrm/templates/settings/edit_server.html:41 +#: bookwyrm/templates/settings/federated_server.html:9 +msgid "Blocked" +msgstr "" + +#: bookwyrm/templates/settings/edit_server.html:48 +#: bookwyrm/templates/settings/federated_server.html:21 +#: bookwyrm/templates/user_admin/user_info.html:26 +msgid "Software:" +msgstr "" + +#: bookwyrm/templates/settings/edit_server.html:55 +#: bookwyrm/templates/settings/federated_server.html:25 +#: bookwyrm/templates/user_admin/user_info.html:30 +msgid "Version:" +msgstr "" + +#: bookwyrm/templates/settings/edit_server.html:64 +msgid "Notes:" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:18 +msgid "Details" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:36 #: bookwyrm/templates/user/user_layout.html:50 msgid "Activity" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:33 +#: bookwyrm/templates/settings/federated_server.html:39 msgid "Users:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:36 -#: bookwyrm/templates/settings/federated_server.html:43 +#: bookwyrm/templates/settings/federated_server.html:42 +#: bookwyrm/templates/settings/federated_server.html:49 msgid "View all" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:40 +#: bookwyrm/templates/settings/federated_server.html:46 msgid "Reports:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:47 +#: bookwyrm/templates/settings/federated_server.html:53 msgid "Followed by us:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:53 +#: bookwyrm/templates/settings/federated_server.html:59 msgid "Followed by them:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:59 +#: bookwyrm/templates/settings/federated_server.html:65 msgid "Blocked by us:" msgstr "" -#: bookwyrm/templates/settings/federation.html:13 +#: bookwyrm/templates/settings/federated_server.html:77 +#: bookwyrm/templates/user_admin/user_info.html:39 +msgid "Notes" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:80 +msgid "Edit" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:100 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:3 +msgid "Actions" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:104 +#: bookwyrm/templates/snippets/block_button.html:5 +msgid "Block" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:105 +msgid "All users from this instance will be deactivated." +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:110 +#: bookwyrm/templates/snippets/block_button.html:10 +msgid "Un-block" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:111 +msgid "All users from this instance will be re-activated." +msgstr "" + +#: bookwyrm/templates/settings/federation.html:20 +#: bookwyrm/templates/user_admin/server_filter.html:5 msgid "Server name" msgstr "" -#: bookwyrm/templates/settings/federation.html:17 +#: bookwyrm/templates/settings/federation.html:24 msgid "Date federated" msgstr "" -#: bookwyrm/templates/settings/federation.html:21 +#: bookwyrm/templates/settings/federation.html:28 msgid "Software" msgstr "" -#: bookwyrm/templates/settings/federation.html:24 -#: bookwyrm/templates/settings/manage_invite_requests.html:33 -#: bookwyrm/templates/settings/user_admin.html:32 +#: bookwyrm/templates/settings/federation.html:31 +#: bookwyrm/templates/settings/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/status_filter.html:5 +#: bookwyrm/templates/user_admin/user_admin.html:34 msgid "Status" msgstr "" @@ -1767,55 +1955,62 @@ msgstr "" msgid "Ignored Invite Requests" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:31 -msgid "Date" +#: bookwyrm/templates/settings/manage_invite_requests.html:35 +msgid "Date requested" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:32 +#: bookwyrm/templates/settings/manage_invite_requests.html:39 +msgid "Date accepted" +msgstr "" + +#: bookwyrm/templates/settings/manage_invite_requests.html:42 msgid "Email" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:34 +#: bookwyrm/templates/settings/manage_invite_requests.html:47 msgid "Action" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:37 +#: bookwyrm/templates/settings/manage_invite_requests.html:50 msgid "No requests" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:45 +#: bookwyrm/templates/settings/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/status_filter.html:16 msgid "Accepted" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:47 +#: bookwyrm/templates/settings/manage_invite_requests.html:61 +#: bookwyrm/templates/settings/status_filter.html:12 msgid "Sent" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:49 +#: bookwyrm/templates/settings/manage_invite_requests.html:63 +#: bookwyrm/templates/settings/status_filter.html:8 msgid "Requested" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:57 +#: bookwyrm/templates/settings/manage_invite_requests.html:73 msgid "Send invite" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/manage_invite_requests.html:75 msgid "Re-send invite" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:70 +#: bookwyrm/templates/settings/manage_invite_requests.html:95 msgid "Ignore" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:72 -msgid "Un-gnore" +#: bookwyrm/templates/settings/manage_invite_requests.html:97 +msgid "Un-ignore" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:83 +#: bookwyrm/templates/settings/manage_invite_requests.html:108 msgid "Back to pending requests" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:85 +#: bookwyrm/templates/settings/manage_invite_requests.html:110 msgid "View ignored requests" msgstr "" @@ -1855,6 +2050,23 @@ msgstr "" msgid "No active invites" msgstr "" +#: bookwyrm/templates/settings/server_blocklist.html:6 +msgid "Import Blocklist" +msgstr "" + +#: bookwyrm/templates/settings/server_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:5 +msgid "Success!" +msgstr "" + +#: bookwyrm/templates/settings/server_blocklist.html:30 +msgid "Successfully blocked:" +msgstr "" + +#: bookwyrm/templates/settings/server_blocklist.html:32 +msgid "Failed:" +msgstr "" + #: bookwyrm/templates/settings/site.html:15 msgid "Instance Name:" msgstr "" @@ -1911,138 +2123,96 @@ msgstr "" msgid "Registration closed text:" msgstr "" -#: bookwyrm/templates/settings/user_admin.html:7 -#, python-format -msgid "Users: %(server_name)s" +#: bookwyrm/templates/snippets/book_cover.html:20 +#: bookwyrm/templates/snippets/search_result_text.html:10 +msgid "No cover" msgstr "" -#: bookwyrm/templates/settings/user_admin.html:20 -msgid "Username" -msgstr "" - -#: bookwyrm/templates/settings/user_admin.html:24 -msgid "Date Added" -msgstr "" - -#: bookwyrm/templates/settings/user_admin.html:28 -msgid "Last Active" -msgstr "" - -#: bookwyrm/templates/settings/user_admin.html:36 -msgid "Remote server" -msgstr "" - -#: bookwyrm/templates/settings/user_admin.html:45 -msgid "Active" -msgstr "" - -#: bookwyrm/templates/settings/user_admin.html:45 -msgid "Inactive" -msgstr "" - -#: bookwyrm/templates/settings/user_admin.html:50 -msgid "Not set" -msgstr "" - -#: bookwyrm/templates/snippets/block_button.html:5 -msgid "Block" -msgstr "" - -#: bookwyrm/templates/snippets/block_button.html:10 -msgid "Un-block" -msgstr "" - -#: bookwyrm/templates/snippets/book_titleby.html:3 +#: bookwyrm/templates/snippets/book_titleby.html:4 #, python-format msgid "%(title)s by " msgstr "" #: bookwyrm/templates/snippets/boost_button.html:8 #: bookwyrm/templates/snippets/boost_button.html:9 -#: bookwyrm/templates/snippets/status/status_body.html:51 -#: bookwyrm/templates/snippets/status/status_body.html:52 -msgid "Boost status" +msgid "Boost" msgstr "" +#: bookwyrm/templates/snippets/boost_button.html:15 #: bookwyrm/templates/snippets/boost_button.html:16 -#: bookwyrm/templates/snippets/boost_button.html:17 -msgid "Un-boost status" +msgid "Un-boost" msgstr "" #: bookwyrm/templates/snippets/content_warning_field.html:3 msgid "Spoiler alert:" msgstr "" -#: bookwyrm/templates/snippets/content_warning_field.html:4 +#: bookwyrm/templates/snippets/content_warning_field.html:10 msgid "Spoilers ahead!" msgstr "" -#: bookwyrm/templates/snippets/create_status.html:9 +#: bookwyrm/templates/snippets/create_status.html:17 msgid "Review" msgstr "" -#: bookwyrm/templates/snippets/create_status.html:15 +#: bookwyrm/templates/snippets/create_status.html:39 msgid "Quote" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:18 +#: bookwyrm/templates/snippets/create_status_form.html:20 msgid "Comment:" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:20 +#: bookwyrm/templates/snippets/create_status_form.html:22 msgid "Quote:" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:22 +#: bookwyrm/templates/snippets/create_status_form.html:24 msgid "Review:" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:29 -#: bookwyrm/templates/user/shelf.html:81 -msgid "Rating" +#: bookwyrm/templates/snippets/create_status_form.html:42 +#: bookwyrm/templates/snippets/status/layout.html:30 +#: bookwyrm/templates/snippets/status/layout.html:48 +#: bookwyrm/templates/snippets/status/layout.html:49 +msgid "Reply" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:31 -#: bookwyrm/templates/snippets/rate_action.html:14 -#: bookwyrm/templates/snippets/stars.html:3 -msgid "No rating" -msgstr "" - -#: bookwyrm/templates/snippets/create_status_form.html:64 +#: bookwyrm/templates/snippets/create_status_form.html:67 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16 msgid "Progress:" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:71 +#: bookwyrm/templates/snippets/create_status_form.html:75 #: bookwyrm/templates/snippets/readthrough_form.html:22 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30 msgid "pages" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:72 +#: bookwyrm/templates/snippets/create_status_form.html:76 #: bookwyrm/templates/snippets/readthrough_form.html:23 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31 msgid "percent" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:77 +#: bookwyrm/templates/snippets/create_status_form.html:82 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36 #, python-format msgid "of %(pages)s pages" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:89 +#: bookwyrm/templates/snippets/create_status_form.html:97 msgid "Include spoiler alert" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:95 +#: bookwyrm/templates/snippets/create_status_form.html:104 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy_select.html:19 msgid "Private" msgstr "" -#: bookwyrm/templates/snippets/create_status_form.html:102 +#: bookwyrm/templates/snippets/create_status_form.html:115 msgid "Post" msgstr "" @@ -2052,24 +2222,25 @@ msgstr "" #: bookwyrm/templates/snippets/delete_readthrough_modal.html:7 #, python-format -msgid "You are deleting this readthrough and its %(count)s associated progress updates." +msgid "" +"You are deleting this readthrough and its %(count)s associated progress " +"updates." msgstr "" #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:13 +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:391 msgid "Delete" msgstr "" #: bookwyrm/templates/snippets/fav_button.html:7 -#: bookwyrm/templates/snippets/fav_button.html:8 -#: bookwyrm/templates/snippets/status/status_body.html:55 -#: bookwyrm/templates/snippets/status/status_body.html:56 -msgid "Like status" +#: bookwyrm/templates/snippets/fav_button.html:9 +msgid "Like" msgstr "" #: bookwyrm/templates/snippets/fav_button.html:15 #: bookwyrm/templates/snippets/fav_button.html:16 -msgid "Un-like status" +msgid "Un-like" msgstr "" #: bookwyrm/templates/snippets/filters_panel/filters_panel.html:7 @@ -2080,11 +2251,11 @@ msgstr "" msgid "Hide filters" msgstr "" -#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:19 +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:22 msgid "Apply filters" msgstr "" -#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:23 +#: bookwyrm/templates/snippets/filters_panel/filters_panel.html:26 msgid "Clear filters" msgstr "" @@ -2104,6 +2275,11 @@ msgstr "" msgid "Accept" msgstr "" +#: bookwyrm/templates/snippets/form_rate_stars.html:20 +#: bookwyrm/templates/snippets/stars.html:13 +msgid "No rating" +msgstr "" + #: bookwyrm/templates/snippets/generated_status/goal.html:1 #, python-format msgid "set a goal to read %(counter)s book in %(year)s" @@ -2113,15 +2289,19 @@ msgstr[1] "" #: bookwyrm/templates/snippets/generated_status/rating.html:3 #, python-format -msgid "Rated %(title)s: %(display_rating)s star" -msgid_plural "Rated %(title)s: %(display_rating)s stars" +msgid "" +"Rated %(title)s: %(display_rating)s star" +msgid_plural "" +"Rated %(title)s: %(display_rating)s stars" msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4 #, python-format -msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" -msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" +msgid "" +"Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" +msgid_plural "" +"Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" msgstr[0] "" msgstr[1] "" @@ -2132,7 +2312,9 @@ msgstr "" #: bookwyrm/templates/snippets/goal_card.html:23 #, python-format -msgid "You can set or change your reading goal any time from your profile page" +msgid "" +"You can set or change your reading goal any time from your profile page" msgstr "" #: bookwyrm/templates/snippets/goal_form.html:9 @@ -2158,10 +2340,6 @@ msgstr "" msgid "Set goal" msgstr "" -#: bookwyrm/templates/snippets/goal_progress.html:5 -msgid "Success!" -msgstr "" - #: bookwyrm/templates/snippets/goal_progress.html:7 #, python-format msgid "%(percent)s%% complete!" @@ -2169,19 +2347,32 @@ msgstr "" #: bookwyrm/templates/snippets/goal_progress.html:10 #, python-format -msgid "You've read %(read_count)s of %(goal_count)s books." +msgid "" +"You've read %(read_count)s of %(goal_count)s books." msgstr "" #: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format -msgid "%(username)s has read %(read_count)s of %(goal_count)s books." +msgid "" +"%(username)s has read %(read_count)s of %(goal_count)s " +"books." msgstr "" -#: bookwyrm/templates/snippets/pagination.html:7 +#: bookwyrm/templates/snippets/page_text.html:4 +#, python-format +msgid "page %(page)s of %(total_pages)s" +msgstr "" + +#: bookwyrm/templates/snippets/page_text.html:6 +#, python-format +msgid "page %(page)s" +msgstr "" + +#: bookwyrm/templates/snippets/pagination.html:12 msgid "Previous" msgstr "" -#: bookwyrm/templates/snippets/pagination.html:15 +#: bookwyrm/templates/snippets/pagination.html:23 msgid "Next" msgstr "" @@ -2214,7 +2405,7 @@ msgstr "" msgid "Leave a rating" msgstr "" -#: bookwyrm/templates/snippets/rate_action.html:29 +#: bookwyrm/templates/snippets/rate_action.html:19 msgid "Rate" msgstr "" @@ -2222,28 +2413,28 @@ msgstr "" msgid "Progress Updates:" msgstr "" -#: bookwyrm/templates/snippets/readthrough.html:12 +#: bookwyrm/templates/snippets/readthrough.html:14 msgid "finished" msgstr "" -#: bookwyrm/templates/snippets/readthrough.html:15 +#: bookwyrm/templates/snippets/readthrough.html:25 msgid "Show all updates" msgstr "" -#: bookwyrm/templates/snippets/readthrough.html:31 +#: bookwyrm/templates/snippets/readthrough.html:41 msgid "Delete this progress update" msgstr "" -#: bookwyrm/templates/snippets/readthrough.html:41 +#: bookwyrm/templates/snippets/readthrough.html:51 msgid "started" msgstr "" -#: bookwyrm/templates/snippets/readthrough.html:47 -#: bookwyrm/templates/snippets/readthrough.html:61 +#: bookwyrm/templates/snippets/readthrough.html:57 +#: bookwyrm/templates/snippets/readthrough.html:71 msgid "Edit read dates" msgstr "" -#: bookwyrm/templates/snippets/readthrough.html:51 +#: bookwyrm/templates/snippets/readthrough.html:61 msgid "Delete these read dates" msgstr "" @@ -2271,29 +2462,25 @@ msgid "Report" msgstr "" #: bookwyrm/templates/snippets/rss_title.html:5 -#: bookwyrm/templates/snippets/status/status_header.html:11 +#: bookwyrm/templates/snippets/status/status_header.html:34 msgid "rated" msgstr "" #: bookwyrm/templates/snippets/rss_title.html:7 -#: bookwyrm/templates/snippets/status/status_header.html:13 +#: bookwyrm/templates/snippets/status/status_header.html:36 msgid "reviewed" msgstr "" #: bookwyrm/templates/snippets/rss_title.html:9 -#: bookwyrm/templates/snippets/status/status_header.html:15 +#: bookwyrm/templates/snippets/status/status_header.html:38 msgid "commented on" msgstr "" #: bookwyrm/templates/snippets/rss_title.html:11 -#: bookwyrm/templates/snippets/status/status_header.html:17 +#: bookwyrm/templates/snippets/status/status_header.html:40 msgid "quoted" msgstr "" -#: bookwyrm/templates/snippets/search_result_text.html:10 -msgid "No cover" -msgstr "" - #: bookwyrm/templates/snippets/search_result_text.html:22 #, python-format msgid "by %(author)s" @@ -2313,7 +2500,7 @@ msgid "Finish \"%(book_title)s\"" msgstr "" #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5 -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:35 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:34 msgid "Update progress" msgstr "" @@ -2334,7 +2521,7 @@ msgstr "" msgid "Want to read" msgstr "" -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:48 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45 #, python-format msgid "Remove from %(name)s" msgstr "" @@ -2349,53 +2536,44 @@ msgstr "" msgid "Want to Read \"%(book_title)s\"" msgstr "" +#: bookwyrm/templates/snippets/status/content_status.html:67 +#: bookwyrm/templates/snippets/trimmed_text.html:14 +msgid "Show more" +msgstr "" + +#: bookwyrm/templates/snippets/status/content_status.html:82 +#: bookwyrm/templates/snippets/trimmed_text.html:29 +msgid "Show less" +msgstr "" + +#: bookwyrm/templates/snippets/status/content_status.html:112 +msgid "Open image in new window" +msgstr "" + +#: bookwyrm/templates/snippets/status/layout.html:22 +#: bookwyrm/templates/snippets/status/status_options.html:17 +msgid "Delete status" +msgstr "" + +#: bookwyrm/templates/snippets/status/layout.html:52 +#: bookwyrm/templates/snippets/status/layout.html:53 +msgid "Boost status" +msgstr "" + +#: bookwyrm/templates/snippets/status/layout.html:56 +#: bookwyrm/templates/snippets/status/layout.html:57 +msgid "Like status" +msgstr "" + #: bookwyrm/templates/snippets/status/status.html:9 msgid "boosted" msgstr "" -#: bookwyrm/templates/snippets/status/status_body.html:27 -#: bookwyrm/templates/snippets/status/status_options.html:18 -msgid "Delete status" -msgstr "" - -#: bookwyrm/templates/snippets/status/status_body.html:34 -#: bookwyrm/templates/snippets/status/status_body.html:47 -#: bookwyrm/templates/snippets/status/status_body.html:48 -msgid "Reply" -msgstr "" - -#: bookwyrm/templates/snippets/status/status_content.html:18 -#: bookwyrm/templates/snippets/trimmed_text.html:15 -msgid "Show more" -msgstr "" - -#: bookwyrm/templates/snippets/status/status_content.html:25 -#: bookwyrm/templates/snippets/trimmed_text.html:25 -msgid "Show less" -msgstr "" - -#: bookwyrm/templates/snippets/status/status_content.html:46 -msgid "Open image in new window" -msgstr "" - -#: bookwyrm/templates/snippets/status/status_header.html:22 +#: bookwyrm/templates/snippets/status/status_header.html:44 #, python-format -msgid "replied to %(username)s's review" -msgstr "" - -#: bookwyrm/templates/snippets/status/status_header.html:24 -#, python-format -msgid "replied to %(username)s's comment" -msgstr "" - -#: bookwyrm/templates/snippets/status/status_header.html:26 -#, python-format -msgid "replied to %(username)s's quote" -msgstr "" - -#: bookwyrm/templates/snippets/status/status_header.html:28 -#, python-format -msgid "replied to %(username)s's status" +msgid "" +"replied to %(username)s's status" msgstr "" #: bookwyrm/templates/snippets/status/status_options.html:7 @@ -2403,6 +2581,16 @@ msgstr "" msgid "More options" msgstr "" +#: bookwyrm/templates/snippets/status/status_options.html:26 +msgid "Delete & re-draft" +msgstr "" + +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:6 +msgid "Send direct message" +msgstr "" + #: bookwyrm/templates/snippets/switch_edition_button.html:5 msgid "Switch to this edition" msgstr "" @@ -2415,19 +2603,6 @@ msgstr "" msgid "Sorted descending" msgstr "" -#: bookwyrm/templates/snippets/tag.html:14 -msgid "Remove tag" -msgstr "" - -#: bookwyrm/templates/snippets/tag.html:18 -msgid "Add tag" -msgstr "" - -#: bookwyrm/templates/tag.html:9 -#, python-format -msgid "Books tagged \"%(tag.name)s\"" -msgstr "" - #: bookwyrm/templates/user/books_header.html:5 #, python-format msgid "%(username)s's books" @@ -2466,10 +2641,6 @@ msgstr "" msgid "%(username)s isn't following any users" msgstr "" -#: bookwyrm/templates/user/lists.html:9 -msgid "Your Lists" -msgstr "" - #: bookwyrm/templates/user/lists.html:11 #, python-format msgid "Lists: %(username)s" @@ -2479,7 +2650,7 @@ msgstr "" msgid "Create list" msgstr "" -#: bookwyrm/templates/user/shelf.html:24 bookwyrm/views/shelf.py:56 +#: bookwyrm/templates/user/shelf.html:24 bookwyrm/views/shelf.py:51 msgid "All books" msgstr "" @@ -2491,23 +2662,23 @@ msgstr "" msgid "Edit shelf" msgstr "" -#: bookwyrm/templates/user/shelf.html:78 +#: bookwyrm/templates/user/shelf.html:77 bookwyrm/templates/user/shelf.html:99 msgid "Shelved" msgstr "" -#: bookwyrm/templates/user/shelf.html:79 +#: bookwyrm/templates/user/shelf.html:78 bookwyrm/templates/user/shelf.html:103 msgid "Started" msgstr "" -#: bookwyrm/templates/user/shelf.html:80 +#: bookwyrm/templates/user/shelf.html:79 bookwyrm/templates/user/shelf.html:106 msgid "Finished" msgstr "" -#: bookwyrm/templates/user/shelf.html:127 +#: bookwyrm/templates/user/shelf.html:132 msgid "This shelf is empty." msgstr "" -#: bookwyrm/templates/user/shelf.html:133 +#: bookwyrm/templates/user/shelf.html:138 msgid "Delete shelf" msgstr "" @@ -2570,6 +2741,73 @@ msgstr[1] "" msgid "%(counter)s following" msgstr "" +#: bookwyrm/templates/user_admin/user.html:11 +msgid "Back to users" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:7 +#, python-format +msgid "Users: %(server_name)s" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:22 +#: bookwyrm/templates/user_admin/username_filter.html:5 +msgid "Username" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:26 +msgid "Date Added" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:30 +msgid "Last Active" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:38 +msgid "Remote server" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:47 +msgid "Active" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:47 +msgid "Inactive" +msgstr "" + +#: bookwyrm/templates/user_admin/user_admin.html:52 +#: bookwyrm/templates/user_admin/user_info.html:49 +msgid "Not set" +msgstr "" + +#: bookwyrm/templates/user_admin/user_info.html:5 +msgid "User details" +msgstr "" + +#: bookwyrm/templates/user_admin/user_info.html:14 +msgid "View user profile" +msgstr "" + +#: bookwyrm/templates/user_admin/user_info.html:20 +msgid "Instance details" +msgstr "" + +#: bookwyrm/templates/user_admin/user_info.html:46 +msgid "View instance" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:11 +msgid "Suspend user" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 +msgid "Un-suspend user" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:21 +msgid "Access level:" +msgstr "" + #: bookwyrm/views/password.py:32 msgid "No user with that email address was found." msgstr "" @@ -2578,3 +2816,1299 @@ msgstr "" #, python-format msgid "A password reset link sent to %s" msgstr "" + +#: venv3/lib/python3.8/site-packages/_pytest/config/argparsing.py:442 +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/messages/apps.py:7 +msgid "Messages" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/sitemaps/apps.py:7 +msgid "Site Maps" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/staticfiles/apps.py:9 +msgid "Static Files" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/syndication/apps.py:7 +msgid "Syndication" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:45 +msgid "That page number is not an integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:47 +msgid "That page number is less than 1" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:52 +msgid "That page contains no results" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:32 +msgid "Enter a valid value." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:103 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:659 +msgid "Enter a valid URL." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:155 +msgid "Enter a valid integer." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:166 +msgid "Enter a valid email address." +msgstr "" + +#. Translators: "letters" means latin letters: a-z and A-Z. +#: venv3/lib/python3.8/site-packages/django/core/validators.py:240 +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:247 +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:256 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:276 +msgid "Enter a valid IPv4 address." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:261 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:277 +msgid "Enter a valid IPv6 address." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:271 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:275 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:305 +msgid "Enter only digits separated by commas." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:311 +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:343 +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:352 +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:362 +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:377 +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:396 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:291 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:326 +msgid "Enter a number." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:398 +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:403 +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:408 +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:470 +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:522 +msgid "Null characters are not allowed." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/base.py:1181 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:759 +msgid "and" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/base.py:1183 +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:104 +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:105 +msgid "This field cannot be null." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:106 +msgid "This field cannot be blank." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:107 +#, python-format +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "" + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:111 +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:130 +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:937 +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:938 +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:940 +msgid "Boolean (Either True or False)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:981 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1045 +msgid "Comma-separated integers" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1094 +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1096 +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1239 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1099 +msgid "Date (without time)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1237 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1241 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1245 +msgid "Date (with time)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1393 +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1395 +msgid "Decimal number" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1534 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1537 +msgid "Duration" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1587 +msgid "Email address" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1610 +msgid "File path" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1676 +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1678 +msgid "Floating point number" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1716 +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1718 +msgid "Integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1801 +msgid "Big (8 byte) integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1817 +msgid "IPv4 address" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1848 +msgid "IP address" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1928 +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1929 +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1931 +msgid "Boolean (Either True, False or None)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1966 +msgid "Positive integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1979 +msgid "Positive small integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1993 +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2025 +msgid "Small integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2032 +msgid "Text" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2060 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2062 +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2065 +msgid "Time" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2191 +msgid "URL" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2213 +msgid "Raw binary data" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2278 +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2280 +msgid "Universally unique identifier" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/files.py:221 +msgid "File" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/files.py:360 +msgid "Image" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:778 +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:780 +msgid "Foreign Key (type determined by related field)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1012 +msgid "One-to-one relationship" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1066 +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1067 +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1109 +msgid "Many-to-many relationship" +msgstr "" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the label +#: venv3/lib/python3.8/site-packages/django/forms/boundfield.py:149 +msgid ":?.!" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:53 +msgid "This field is required." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:246 +msgid "Enter a whole number." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:397 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1127 +msgid "Enter a valid date." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:421 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1128 +msgid "Enter a valid time." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:443 +msgid "Enter a valid date/time." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:472 +msgid "Enter a valid duration." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:473 +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:533 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:534 +msgid "No file was submitted." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:535 +msgid "The submitted file is empty." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:537 +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:540 +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:601 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:763 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:853 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1275 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:854 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:969 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1274 +msgid "Enter a list of values." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:970 +msgid "Enter a complete value." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1186 +msgid "Enter a valid UUID." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +#: venv3/lib/python3.8/site-packages/django/forms/forms.py:81 +msgid ":" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/forms.py:207 +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:93 +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:345 +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:352 +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:379 +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:386 +msgid "Order" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:754 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:758 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:764 +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:773 +msgid "Please correct the duplicate values below." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1094 +msgid "The inline value did not match the parent instance." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1161 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1277 +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/utils.py:162 +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:395 +msgid "Clear" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:396 +msgid "Currently" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:397 +msgid "Change" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:709 +msgid "Unknown" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:710 +msgid "Yes" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:711 +msgid "No" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:788 +msgid "yes,no,maybe" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:817 +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:834 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:836 +#, python-format +msgid "%s KB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:838 +#, python-format +msgid "%s MB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:840 +#, python-format +msgid "%s GB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:842 +#, python-format +msgid "%s TB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:844 +#, python-format +msgid "%s PB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:62 +msgid "p.m." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:63 +msgid "a.m." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:68 +msgid "PM" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:69 +msgid "AM" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:150 +msgid "midnight" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:152 +msgid "noon" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:295 +msgid "Monday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:296 +msgid "Tuesday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:297 +msgid "Wednesday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:298 +msgid "Thursday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:299 +msgid "Friday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:7 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:300 +msgid "Saturday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:7 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:301 +msgid "Sunday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Mon" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Tue" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Wed" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Thu" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Fri" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:11 +msgid "Sat" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:11 +msgid "Sun" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:281 +msgid "January" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:282 +msgid "February" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:283 +msgid "March" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:284 +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:285 +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:286 +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:287 +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:288 +msgid "August" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:289 +msgid "September" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:290 +msgid "October" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:291 +msgid "November" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:16 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:292 +msgid "December" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "jan" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "feb" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "mar" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "apr" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "may" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "jun" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "jul" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "aug" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "sep" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "oct" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "nov" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "dec" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:23 +msgctxt "abbrev. month" +msgid "Jan." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:24 +msgctxt "abbrev. month" +msgid "Feb." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:25 +msgctxt "abbrev. month" +msgid "March" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:26 +msgctxt "abbrev. month" +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:27 +msgctxt "abbrev. month" +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:28 +msgctxt "abbrev. month" +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:29 +msgctxt "abbrev. month" +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:30 +msgctxt "abbrev. month" +msgid "Aug." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:31 +msgctxt "abbrev. month" +msgid "Sept." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:32 +msgctxt "abbrev. month" +msgid "Oct." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:33 +msgctxt "abbrev. month" +msgid "Nov." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:34 +msgctxt "abbrev. month" +msgid "Dec." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:37 +msgctxt "alt. month" +msgid "January" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:38 +msgctxt "alt. month" +msgid "February" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:39 +msgctxt "alt. month" +msgid "March" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:40 +msgctxt "alt. month" +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:41 +msgctxt "alt. month" +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:42 +msgctxt "alt. month" +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:43 +msgctxt "alt. month" +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:44 +msgctxt "alt. month" +msgid "August" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:45 +msgctxt "alt. month" +msgid "September" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:46 +msgctxt "alt. month" +msgid "October" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:47 +msgctxt "alt. month" +msgid "November" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:48 +msgctxt "alt. month" +msgid "December" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/ipv6.py:8 +msgid "This is not a valid IPv6 address." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/text.py:69 +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/text.py:235 +msgid "or" +msgstr "" + +#. Translators: This string is used as a separator between list elements +#: venv3/lib/python3.8/site-packages/django/utils/text.py:254 +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:83 +msgid ", " +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:9 +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:10 +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:11 +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:12 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:13 +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:14 +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:72 +msgid "0 minutes" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:110 +msgid "Forbidden" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:111 +msgid "CSRF verification failed. Request aborted." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:115 +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:120 +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:124 +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:132 +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:137 +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:142 +msgid "More information is available with DEBUG=True." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:41 +msgid "No year specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:61 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:111 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:208 +msgid "Date out of range" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:90 +msgid "No month specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:142 +msgid "No day specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:188 +msgid "No week specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:338 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:367 +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:589 +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:623 +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/detail.py:54 +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:67 +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:72 +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:154 +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:40 +msgid "Directory indexes are not allowed here." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:42 +#, python-format +msgid "“%(path)s” does not exist" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:80 +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:7 +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:346 +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:368 +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:369 +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:384 +msgid "Django Documentation" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:385 +msgid "Topics, references, & how-to’s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:396 +msgid "Tutorial: A Polling App" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:397 +msgid "Get started with Django" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:408 +msgid "Django Community" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:409 +msgid "Connect, get help, or contribute" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1301 +#, python-format +msgid "Attempting to connect to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1306 +#, python-format +msgid "Connected to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1324 +#, python-format +msgid "Unable to connect to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:371 +msgid "1 second ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:377 +msgid "1 minute ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:382 +msgid "1 hour ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:385 +#, python-format +msgid "%(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:387 +msgid "yesterday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:387 +#, python-format +msgid "yesterday at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:389 +#, python-format +msgid "%(weekday)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:389 +#, python-format +msgid "%(weekday)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:392 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:445 +#, python-format +msgid "%(month_name)s %(day)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:394 +#, python-format +msgid "%(month_name)s %(day)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:399 +#, python-format +msgid "%(month_name)s %(day)s, %(year)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:401 +#, python-format +msgid "%(month_name)s %(day)s, %(year)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:439 +#, python-format +msgid "%(weekday)s, %(month_name)s %(day)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:462 +#, python-format +msgid "%(commas)s and %(last)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:68 +msgctxt "law" +msgid "right" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:69 +msgctxt "good" +msgid "right" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:71 +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:74 +msgctxt "organization" +msgid "club" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:76 +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:77 +msgctxt "stick" +msgid "club" +msgstr "" diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index 87f443a0..7994ce69 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/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: 2021-04-25 04:01+0000\n" +"POT-Creation-Date: 2021-04-26 09:56-0700\n" "PO-Revision-Date: 2021-03-19 11:49+0800\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -56,11 +56,11 @@ msgid "Book Title" msgstr "Título" #: bookwyrm/forms.py:295 bookwyrm/templates/snippets/create_status_form.html:31 -#: bookwyrm/templates/user/shelf.html:81 +#: bookwyrm/templates/user/shelf.html:80 bookwyrm/templates/user/shelf.html:110 msgid "Rating" msgstr "Calificación" -#: bookwyrm/forms.py:297 bookwyrm/templates/lists/list.html:72 +#: bookwyrm/forms.py:297 bookwyrm/templates/lists/list.html:82 msgid "Sort By" msgstr "Ordenar por" @@ -222,12 +222,17 @@ msgstr "%(count)s ediciones" #: bookwyrm/templates/book/book.html:143 #, python-format msgid "This edition is on your %(shelf_name)s shelf." -msgstr "Esta edición está en tu %(shelf_name)s estante." +msgstr "" +"Esta edición está en tu %(shelf_name)s estante." #: bookwyrm/templates/book/book.html:149 #, python-format -msgid "A different edition of this book is on your %(shelf_name)s shelf." -msgstr "Una edición diferente de este libro está en tu %(shelf_name)s estante." +msgid "" +"A different edition of this book is on your %(shelf_name)s shelf." +msgstr "" +"Una edición diferente de este libro está en tu " +"%(shelf_name)s estante." #: bookwyrm/templates/book/book.html:158 msgid "Your reading activity" @@ -266,11 +271,35 @@ msgstr "Agregar a lista" #: bookwyrm/templates/book/book.html:238 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:123 +#: bookwyrm/templates/lists/list.html:133 msgid "Add" msgstr "Agregar" -#: bookwyrm/templates/book/book.html:276 +#: bookwyrm/templates/book/book.html:254 +#, fuzzy +#| msgid "Review" +msgid "Reviews" +msgstr "Reseña" + +#: bookwyrm/templates/book/book.html:259 +#, fuzzy +#| msgid "Your shelves" +msgid "Your reviews" +msgstr "Tus estantes" + +#: bookwyrm/templates/book/book.html:265 +#, fuzzy +#| msgid "Your Account" +msgid "Your comments" +msgstr "Tu cuenta" + +#: bookwyrm/templates/book/book.html:271 +#, fuzzy +#| msgid "Your books" +msgid "Your quotes" +msgstr "Tus libros" + +#: bookwyrm/templates/book/book.html:305 msgid "rated it" msgstr "lo calificó con" @@ -420,7 +449,7 @@ msgid "John Doe, Jane Smith" msgstr "Juan Nadie, Natalia Natalia" #: bookwyrm/templates/book/edit_book.html:170 -#: bookwyrm/templates/user/shelf.html:75 +#: bookwyrm/templates/user/shelf.html:74 msgid "Cover" msgstr "Portada:" @@ -544,8 +573,12 @@ msgstr "Haz que tu perfil sea reconocible a otros usarios de BookWyrm." #: bookwyrm/templates/directory/directory.html:26 #, python-format -msgid "You can opt-out at any time in your profile settings." -msgstr "Puedes optar por no en cualquier hora en tus configuraciones de perfil." +msgid "" +"You can opt-out at any time in your profile settings." +msgstr "" +"Puedes optar por no en cualquier hora en tus configuraciones de perfil." #: bookwyrm/templates/directory/directory.html:31 #: bookwyrm/templates/snippets/goal_card.html:22 @@ -711,8 +744,12 @@ msgstr "Hola, " #: bookwyrm/templates/email/html_layout.html:21 #, python-format -msgid "BookWyrm hosted on %(site_name)s" -msgstr "BookWyrm alojado en %(site_name)s" +msgid "" +"BookWyrm hosted on " +"%(site_name)s" +msgstr "" +"BookWyrm alojado en " +"%(site_name)s" #: bookwyrm/templates/email/html_layout.html:23 msgid "Email preference" @@ -730,13 +767,21 @@ msgstr "Únete ahora" #: bookwyrm/templates/email/invite/html_content.html:15 #, python-format -msgid "Learn more about this instance." -msgstr "Aprenda más sobre esta instancia." +msgid "" +"Learn more about this instance." +msgstr "" +"Aprenda más sobre esta " +"instancia." #: bookwyrm/templates/email/invite/text_content.html:4 #, python-format -msgid "You're invited to join %(site_name)s! Click the link below to create an account." -msgstr "Estás invitado a unirte con %(site_name)s! Haz clic en el enlace a continuación para crear una cuenta." +msgid "" +"You're invited to join %(site_name)s! Click the link below to create an " +"account." +msgstr "" +"Estás invitado a unirte con %(site_name)s! Haz clic en el enlace a " +"continuación para crear una cuenta." #: bookwyrm/templates/email/invite/text_content.html:8 msgid "Learn more about this instance:" @@ -745,8 +790,13 @@ msgstr "Aprende más sobre esta intancia:" #: bookwyrm/templates/email/password_reset/html_content.html:6 #: bookwyrm/templates/email/password_reset/text_content.html:4 #, python-format -msgid "You requested to reset your %(site_name)s password. Click the link below to set a new password and log in to your account." -msgstr "Tú solicitaste reestablecer tu %(site_name)s contraseña. Haz clic en el enlace a continuación para establecer una nueva contraseña e ingresar a tu cuenta." +msgid "" +"You requested to reset your %(site_name)s password. Click the link below to " +"set a new password and log in to your account." +msgstr "" +"Tú solicitaste reestablecer tu %(site_name)s contraseña. Haz clic en el " +"enlace a continuación para establecer una nueva contraseña e ingresar a tu " +"cuenta." #: bookwyrm/templates/email/password_reset/html_content.html:9 #: bookwyrm/templates/password_reset.html:4 @@ -758,8 +808,10 @@ msgstr "Restablecer contraseña" #: bookwyrm/templates/email/password_reset/html_content.html:13 #: bookwyrm/templates/email/password_reset/text_content.html:8 -msgid "If you didn't request to reset your password, you can ignore this email." -msgstr "Si no solicitaste reestablecer tu contraseña, puedes ignorar este mensaje." +msgid "" +"If you didn't request to reset your password, you can ignore this email." +msgstr "" +"Si no solicitaste reestablecer tu contraseña, puedes ignorar este mensaje." #: bookwyrm/templates/email/password_reset/subject.html:2 #, python-format @@ -812,10 +864,12 @@ msgstr "Federalizado" #: bookwyrm/templates/feed/feed.html:33 #, python-format msgid "load 0 unread status(es)" -msgstr "cargar 0 status(es) no leídos" +msgstr "" +"cargar 0 status(es) no leídos" #: bookwyrm/templates/feed/feed.html:48 -msgid "There aren't any activities right now! Try following a user to get started" +msgid "" +"There aren't any activities right now! Try following a user to get started" msgstr "¡No hay actividad ahora mismo! Sigue a otro usuario para empezar" #: bookwyrm/templates/feed/feed.html:56 @@ -834,7 +888,8 @@ msgid "Your books" msgstr "Tus libros" #: bookwyrm/templates/feed/feed_layout.html:13 -msgid "There are no books here right now! Try searching for a book to get started" +msgid "" +"There are no books here right now! Try searching for a book to get started" msgstr "¡No hay ningún libro aqui ahorita! Busca a un libro para empezar" #: bookwyrm/templates/feed/feed_layout.html:24 @@ -883,7 +938,7 @@ msgid "What are you reading?" msgstr "¿Qué estás leyendo?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:91 +#: bookwyrm/templates/lists/list.html:101 msgid "Search for a book" msgstr "Buscar libros" @@ -904,7 +959,7 @@ msgstr "Puedes agregar libros cuando comiences a usar %(site_name)s." #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 #: bookwyrm/templates/layout.html:38 bookwyrm/templates/layout.html:39 -#: bookwyrm/templates/lists/list.html:95 +#: bookwyrm/templates/lists/list.html:105 msgid "Search" msgstr "Buscar" @@ -918,7 +973,7 @@ msgid "Popular on %(site_name)s" msgstr "Popular en %(site_name)s" #: bookwyrm/templates/get_started/books.html:51 -#: bookwyrm/templates/lists/list.html:108 +#: bookwyrm/templates/lists/list.html:118 msgid "No books found" msgstr "No se encontró ningún libro" @@ -987,8 +1042,12 @@ msgid "Show this account in suggested users:" msgstr "Mostrar esta cuenta en los usuarios sugeridos:" #: bookwyrm/templates/get_started/profile.html:52 -msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." -msgstr "Tu cuenta se aparecerá en el directorio, y puede ser recomendado a otros usuarios de BookWyrm." +msgid "" +"Your account will show up in the directory, and may be recommended to other " +"BookWyrm users." +msgstr "" +"Tu cuenta se aparecerá en el directorio, y puede ser recomendado a otros " +"usuarios de BookWyrm." #: bookwyrm/templates/get_started/users.html:11 msgid "Search for a user" @@ -1012,8 +1071,12 @@ msgstr "Editar meta" #: bookwyrm/templates/goal.html:30 #: bookwyrm/templates/snippets/goal_card.html:13 #, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." -msgstr "Establece una meta para cuantos libros leerás en %(year)s, y seguir tu progreso durante el año." +msgid "" +"Set a goal for how many books you'll finish reading in %(year)s, and track " +"your progress throughout the year." +msgstr "" +"Establece una meta para cuantos libros leerás en %(year)s, y seguir tu " +"progreso durante el año." #: bookwyrm/templates/goal.html:39 #, python-format @@ -1095,8 +1158,12 @@ msgstr "No se pudo cargar" #: bookwyrm/templates/import_status.html:44 #, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." -msgstr "Saltar al final de la lista para seleccionar los %(failed_count)s artículos que no se pudieron importar." +msgid "" +"Jump to the bottom of the list to select the %(failed_count)s items which " +"failed to import." +msgstr "" +"Saltar al final de la lista para seleccionar los %(failed_count)s artículos " +"que no se pudieron importar." #: bookwyrm/templates/import_status.html:79 msgid "Select all" @@ -1117,12 +1184,12 @@ msgstr "Libro" #: bookwyrm/templates/import_status.html:115 #: bookwyrm/templates/snippets/create_status_form.html:10 -#: bookwyrm/templates/user/shelf.html:76 +#: bookwyrm/templates/user/shelf.html:75 bookwyrm/templates/user/shelf.html:93 msgid "Title" msgstr "Título" #: bookwyrm/templates/import_status.html:118 -#: bookwyrm/templates/user/shelf.html:77 +#: bookwyrm/templates/user/shelf.html:76 bookwyrm/templates/user/shelf.html:96 msgid "Author" msgstr "Autor/Autora" @@ -1230,12 +1297,20 @@ msgstr "Contactarse con administradores del sitio" #: bookwyrm/templates/layout.html:206 #, python-format -msgid "Support %(site_name)s on %(support_title)s" -msgstr "Apoyar %(site_name)s en %(support_title)s" +msgid "" +"Support %(site_name)s on " +"%(support_title)s" +msgstr "" +"Apoyar %(site_name)s en " +"%(support_title)s" #: bookwyrm/templates/layout.html:210 -msgid "BookWyrm is open source software. You can contribute or report issues on GitHub." -msgstr "BookWyrm es software de código abierto. Puedes contribuir o reportar problemas en GitHub." +msgid "" +"BookWyrm is open source software. You can contribute or report issues on GitHub." +msgstr "" +"BookWyrm es software de código abierto. Puedes contribuir o reportar " +"problemas en GitHub." #: bookwyrm/templates/lists/create_form.html:5 #: bookwyrm/templates/lists/lists.html:20 @@ -1310,58 +1385,69 @@ msgstr "Abierto" msgid "Anyone can add books to this list" msgstr "Cualquer usuario puede agregar libros a esta lista" -#: bookwyrm/templates/lists/list.html:17 +#: bookwyrm/templates/lists/list.html:19 +msgid "You successfully suggested a book for this list!" +msgstr "" + +#: bookwyrm/templates/lists/list.html:21 +#, fuzzy +#| msgid "Anyone can add books to this list" +msgid "You successfully added a book to this list!" +msgstr "Cualquer usuario puede agregar libros a esta lista" + +#: bookwyrm/templates/lists/list.html:27 msgid "This list is currently empty" msgstr "Esta lista está vacia" -#: bookwyrm/templates/lists/list.html:36 +#: bookwyrm/templates/lists/list.html:46 #, python-format msgid "Added by %(username)s" msgstr "Agregado por %(username)s" -#: bookwyrm/templates/lists/list.html:48 +#: bookwyrm/templates/lists/list.html:58 msgid "Set" msgstr "Establecido" -#: bookwyrm/templates/lists/list.html:51 +#: bookwyrm/templates/lists/list.html:61 msgid "List position" msgstr "Posición" -#: bookwyrm/templates/lists/list.html:57 +#: bookwyrm/templates/lists/list.html:67 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Quitar" -#: bookwyrm/templates/lists/list.html:70 bookwyrm/templates/lists/list.html:82 +#: bookwyrm/templates/lists/list.html:80 bookwyrm/templates/lists/list.html:92 msgid "Sort List" msgstr "Ordena la lista" -#: bookwyrm/templates/lists/list.html:76 +#: bookwyrm/templates/lists/list.html:86 msgid "Direction" msgstr "Dirección" -#: bookwyrm/templates/lists/list.html:87 +#: bookwyrm/templates/lists/list.html:97 msgid "Add Books" msgstr "Agregar libros" -#: bookwyrm/templates/lists/list.html:87 +#: bookwyrm/templates/lists/list.html:97 msgid "Suggest Books" msgstr "Sugerir libros" -#: bookwyrm/templates/lists/list.html:96 +#: bookwyrm/templates/lists/list.html:106 msgid "search" msgstr "buscar" -#: bookwyrm/templates/lists/list.html:102 +#: bookwyrm/templates/lists/list.html:112 msgid "Clear search" msgstr "Borrar búsqueda" -#: bookwyrm/templates/lists/list.html:107 +#: bookwyrm/templates/lists/list.html:117 #, python-format msgid "No books found matching the query \"%(query)s\"" -msgstr "No se encontró ningún libro correspondiente a la búsqueda: \"%(query)s\"" +msgstr "" +"No se encontró ningún libro correspondiente a la búsqueda: \"%(query)s\"" -#: bookwyrm/templates/lists/list.html:123 +#: bookwyrm/templates/lists/list.html:133 msgid "Suggest" msgstr "Sugerir" @@ -1427,7 +1513,8 @@ msgstr "Reportar @%(username)s" #: bookwyrm/templates/moderation/report_modal.html:23 #, python-format msgid "This report will be sent to %(site_name)s's moderators for review." -msgstr "Este informe se enviará a los moderadores de %(site_name)s para la revisión." +msgstr "" +"Este informe se enviará a los moderadores de %(site_name)s para la revisión." #: bookwyrm/templates/moderation/report_modal.html:24 msgid "More info about this report:" @@ -1480,18 +1567,29 @@ msgstr "Borrar notificaciones" #: bookwyrm/templates/notifications.html:53 #, python-format -msgid "favorited your review of %(book_title)s" -msgstr "le gustó tu reseña de %(book_title)s" +msgid "" +"favorited your review of %(book_title)s" +msgstr "" +"le gustó tu reseña de %(book_title)s" #: bookwyrm/templates/notifications.html:55 #, python-format -msgid "favorited your comment on %(book_title)s" -msgstr "le gustó tu comentario en %(book_title)s" +msgid "" +"favorited your comment on %(book_title)s" +msgstr "" +"le gustó tu comentario en %(book_title)s" #: bookwyrm/templates/notifications.html:57 #, python-format -msgid "favorited your quote from %(book_title)s" -msgstr "le gustó tu cita de %(book_title)s" +msgid "" +"favorited your quote from %(book_title)s" +msgstr "" +"le gustó tu cita de %(book_title)s" #: bookwyrm/templates/notifications.html:59 #, python-format @@ -1500,18 +1598,30 @@ msgstr "le gustó tu status" #: bookwyrm/templates/notifications.html:64 #, python-format -msgid "mentioned you in a review of %(book_title)s" -msgstr "te mencionó en una reseña de %(book_title)s" +msgid "" +"mentioned you in a review of " +"%(book_title)s" +msgstr "" +"te mencionó en una reseña de " +"%(book_title)s" #: bookwyrm/templates/notifications.html:66 #, python-format -msgid "mentioned you in a comment on %(book_title)s" -msgstr "te mencionó en un comentario de %(book_title)s" +msgid "" +"mentioned you in a comment on " +"%(book_title)s" +msgstr "" +"te mencionó en un comentario de " +"%(book_title)s" #: bookwyrm/templates/notifications.html:68 #, python-format -msgid "mentioned you in a quote from %(book_title)s" -msgstr "te mencionó en una cita de %(book_title)s" +msgid "" +"mentioned you in a quote from " +"%(book_title)s" +msgstr "" +"te mencionó en una cita de %(book_title)s" #: bookwyrm/templates/notifications.html:70 #, python-format @@ -1520,23 +1630,39 @@ msgstr "te mencionó en un status" #: bookwyrm/templates/notifications.html:75 #, python-format -msgid "replied to your review of %(book_title)s" -msgstr "respondió a tu reseña de %(book_title)s" +msgid "" +"replied to your review of %(book_title)s" +msgstr "" +"respondió a tu reseña de %(book_title)s" #: bookwyrm/templates/notifications.html:77 #, python-format -msgid "replied to your comment on %(book_title)s" -msgstr "respondió a tu comentario en %(book_title)s" +msgid "" +"replied to your comment on %(book_title)s" +msgstr "" +"respondió a tu comentario en %(book_title)s" #: bookwyrm/templates/notifications.html:79 #, python-format -msgid "replied to your quote from %(book_title)s" -msgstr "respondió a tu cita de %(book_title)s" +msgid "" +"replied to your quote from %(book_title)s" +msgstr "" +"respondió a tu cita de %(book_title)s" #: bookwyrm/templates/notifications.html:81 #, python-format -msgid "replied to your status" -msgstr "respondió a tu status" +msgid "" +"replied to your status" +msgstr "" +"respondió a tu status" #: bookwyrm/templates/notifications.html:85 msgid "followed you" @@ -1548,18 +1674,29 @@ msgstr "te quiere seguir" #: bookwyrm/templates/notifications.html:94 #, python-format -msgid "boosted your review of %(book_title)s" -msgstr "respaldó tu reseña de %(book_title)s" +msgid "" +"boosted your review of %(book_title)s" +msgstr "" +"respaldó tu reseña de %(book_title)s" #: bookwyrm/templates/notifications.html:96 #, python-format -msgid "boosted your comment on%(book_title)s" -msgstr "respaldó tu comentario en%(book_title)s" +msgid "" +"boosted your comment on%(book_title)s" +msgstr "" +"respaldó tu comentario en%(book_title)s" #: bookwyrm/templates/notifications.html:98 #, python-format -msgid "boosted your quote from %(book_title)s" -msgstr "respaldó tucita de %(book_title)s" +msgid "" +"boosted your quote from %(book_title)s" +msgstr "" +"respaldó tucita de %(book_title)s" #: bookwyrm/templates/notifications.html:100 #, python-format @@ -1568,13 +1705,21 @@ msgstr "respaldó tu status" #: bookwyrm/templates/notifications.html:104 #, python-format -msgid " added %(book_title)s to your list \"%(list_name)s\"" -msgstr " agregó %(book_title)s a tu lista \"%(list_name)s\"" +msgid "" +" added %(book_title)s to your list " +"\"%(list_name)s\"" +msgstr "" +" agregó %(book_title)s a tu lista " +"\"%(list_name)s\"" #: bookwyrm/templates/notifications.html:106 #, python-format -msgid " suggested adding %(book_title)s to your list \"%(list_name)s\"" -msgstr " sugirió agregar %(book_title)s a tu lista \"%(list_name)s\"" +msgid "" +" suggested adding %(book_title)s to " +"your list \"%(list_name)s\"" +msgstr "" +" sugirió agregar %(book_title)s a tu " +"lista \"%(list_name)s\"" #: bookwyrm/templates/notifications.html:110 #, python-format @@ -1597,7 +1742,9 @@ msgstr "Confirmar contraseña:" #: bookwyrm/templates/password_reset_request.html:14 msgid "A link to reset your password will be sent to your email address" -msgstr "Un enlace para restablecer tu contraseña se enviará a tu dirección de correo electrónico" +msgstr "" +"Un enlace para restablecer tu contraseña se enviará a tu dirección de correo " +"electrónico" #: bookwyrm/templates/password_reset_request.html:28 msgid "Reset password" @@ -1635,8 +1782,12 @@ msgstr "Mostrar meta de lectura en el feed:" #: bookwyrm/templates/preferences/edit_user.html:62 #, python-format -msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." -msgstr "Tu cuenta se aparecerá en el directorio, y puede ser recomendado a otros usuarios de BookWyrm." +msgid "" +"Your account will show up in the directory, and may " +"be recommended to other BookWyrm users." +msgstr "" +"Tu cuenta se aparecerá en el directorio, y puede " +"ser recomendado a otros usuarios de BookWyrm." #: bookwyrm/templates/preferences/edit_user.html:65 msgid "Preferred Timezone: " @@ -2054,14 +2205,16 @@ msgstr "%(title)s por " #: bookwyrm/templates/snippets/boost_button.html:8 #: bookwyrm/templates/snippets/boost_button.html:9 -#: bookwyrm/templates/snippets/status/layout.html:47 -#: bookwyrm/templates/snippets/status/layout.html:48 -msgid "Boost status" -msgstr "Status de respaldo" +#, fuzzy +#| msgid "boosted" +msgid "Boost" +msgstr "respaldó" +#: bookwyrm/templates/snippets/boost_button.html:15 #: bookwyrm/templates/snippets/boost_button.html:16 -#: bookwyrm/templates/snippets/boost_button.html:17 -msgid "Un-boost status" +#, fuzzy +#| msgid "Un-boost status" +msgid "Un-boost" msgstr "Status de des-respaldo" #: bookwyrm/templates/snippets/content_warning_field.html:3 @@ -2094,8 +2247,8 @@ msgstr "Reseña:" #: bookwyrm/templates/snippets/create_status_form.html:42 #: bookwyrm/templates/snippets/status/layout.html:30 -#: bookwyrm/templates/snippets/status/layout.html:43 -#: bookwyrm/templates/snippets/status/layout.html:44 +#: bookwyrm/templates/snippets/status/layout.html:48 +#: bookwyrm/templates/snippets/status/layout.html:49 msgid "Reply" msgstr "Respuesta" @@ -2143,24 +2296,29 @@ msgstr "¿Eliminar estas fechas de lectura?" #: bookwyrm/templates/snippets/delete_readthrough_modal.html:7 #, python-format -msgid "You are deleting this readthrough and its %(count)s associated progress updates." -msgstr "Estás eliminando esta lectura y sus %(count)s actualizaciones de progreso asociados." +msgid "" +"You are deleting this readthrough and its %(count)s associated progress " +"updates." +msgstr "" +"Estás eliminando esta lectura y sus %(count)s actualizaciones de progreso " +"asociados." #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:13 +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:391 msgid "Delete" msgstr "Eliminar" #: bookwyrm/templates/snippets/fav_button.html:7 -#: bookwyrm/templates/snippets/fav_button.html:8 -#: bookwyrm/templates/snippets/status/layout.html:51 -#: bookwyrm/templates/snippets/status/layout.html:52 -msgid "Like status" -msgstr "Me gusta status" +#: bookwyrm/templates/snippets/fav_button.html:9 +msgid "Like" +msgstr "" #: bookwyrm/templates/snippets/fav_button.html:15 #: bookwyrm/templates/snippets/fav_button.html:16 -msgid "Un-like status" +#, fuzzy +#| msgid "Un-like status" +msgid "Un-like" msgstr "Quitar me gusta de status" #: bookwyrm/templates/snippets/filters_panel/filters_panel.html:7 @@ -2200,14 +2358,6 @@ msgstr "Aceptar" msgid "No rating" msgstr "No calificación" -#: bookwyrm/templates/snippets/form_rate_stars.html:45 -#: bookwyrm/templates/snippets/stars.html:7 -#, python-format -msgid "%(rating)s star" -msgid_plural "%(rating)s stars" -msgstr[0] "%(rating)s estrella" -msgstr[1] "%(rating)s estrellas" - #: bookwyrm/templates/snippets/generated_status/goal.html:1 #, python-format msgid "set a goal to read %(counter)s book in %(year)s" @@ -2217,17 +2367,27 @@ msgstr[1] "estableció una meta de leer %(counter)s libros en %(year)s" #: bookwyrm/templates/snippets/generated_status/rating.html:3 #, python-format -msgid "Rated %(title)s: %(display_rating)s star" -msgid_plural "Rated %(title)s: %(display_rating)s stars" -msgstr[0] "Reseño %(title)s: %(display_rating)s estrella" -msgstr[1] "Reseño %(title)s: %(display_rating)s estrellas" +msgid "" +"Rated %(title)s: %(display_rating)s star" +msgid_plural "" +"Rated %(title)s: %(display_rating)s stars" +msgstr[0] "" +"Reseño %(title)s: %(display_rating)s " +"estrella" +msgstr[1] "" +"Reseño %(title)s: %(display_rating)s " +"estrellas" #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4 #, python-format -msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" -msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" -msgstr[0] "Reseña de \"%(book_title)s\" (%(display_rating)s estrella): %(review_title)s" -msgstr[1] "Reseña de \"%(book_title)s\" (%(display_rating)s estrellas): %(review_title)s" +msgid "" +"Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" +msgid_plural "" +"Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" +msgstr[0] "" +"Reseña de \"%(book_title)s\" (%(display_rating)s estrella): %(review_title)s" +msgstr[1] "" +"Reseña de \"%(book_title)s\" (%(display_rating)s estrellas): %(review_title)s" #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:8 #, python-format @@ -2236,8 +2396,12 @@ msgstr "Reseña de \"%(book_title)s\": %(review_title)s" #: bookwyrm/templates/snippets/goal_card.html:23 #, python-format -msgid "You can set or change your reading goal any time from your profile page" -msgstr "Puedes establecer o cambiar tu meta de lectura en cualquier momento que desees desde tu perfil" +msgid "" +"You can set or change your reading goal any time from your profile page" +msgstr "" +"Puedes establecer o cambiar tu meta de lectura en cualquier momento que " +"desees desde tu perfil" #: bookwyrm/templates/snippets/goal_form.html:9 msgid "Reading goal:" @@ -2269,13 +2433,19 @@ msgstr "%(percent)s%% terminado!" #: bookwyrm/templates/snippets/goal_progress.html:10 #, python-format -msgid "You've read %(read_count)s of %(goal_count)s books." -msgstr "Has leído %(read_count)s de %(goal_count)s libros." +msgid "" +"You've read %(read_count)s of %(goal_count)s books." +msgstr "" +"Has leído %(read_count)s de %(goal_count)s libros." #: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format -msgid "%(username)s has read %(read_count)s of %(goal_count)s books." -msgstr "%(username)s ha leído %(read_count)s de %(goal_count)s libros." +msgid "" +"%(username)s has read %(read_count)s of %(goal_count)s " +"books." +msgstr "" +"%(username)s ha leído %(read_count)s de %(goal_count)s " +"libros." #: bookwyrm/templates/snippets/page_text.html:4 #, python-format @@ -2283,6 +2453,8 @@ msgid "page %(page)s of %(total_pages)s" msgstr "página %(page)s de %(total_pages)s" #: bookwyrm/templates/snippets/page_text.html:6 +#, fuzzy, python-format +#| msgid "page %(page)s" msgid "page %(page)s" msgstr "página %(pages)s" @@ -2380,22 +2552,22 @@ msgid "Report" msgstr "Reportar" #: bookwyrm/templates/snippets/rss_title.html:5 -#: bookwyrm/templates/snippets/status/status_header.html:21 +#: bookwyrm/templates/snippets/status/status_header.html:34 msgid "rated" msgstr "calificó" #: bookwyrm/templates/snippets/rss_title.html:7 -#: bookwyrm/templates/snippets/status/status_header.html:23 +#: bookwyrm/templates/snippets/status/status_header.html:36 msgid "reviewed" msgstr "reseñó" #: bookwyrm/templates/snippets/rss_title.html:9 -#: bookwyrm/templates/snippets/status/status_header.html:25 +#: bookwyrm/templates/snippets/status/status_header.html:38 msgid "commented on" msgstr "comentó en" #: bookwyrm/templates/snippets/rss_title.html:11 -#: bookwyrm/templates/snippets/status/status_header.html:27 +#: bookwyrm/templates/snippets/status/status_header.html:40 msgid "quoted" msgstr "citó" @@ -2454,62 +2626,58 @@ msgstr "Empezar \"%(book_title)s\"" msgid "Want to Read \"%(book_title)s\"" msgstr "Quiero leer \"%(book_title)s\"" -#: bookwyrm/templates/snippets/status/content_status.html:60 -#: bookwyrm/templates/snippets/status/status_content.html:50 +#: bookwyrm/templates/snippets/status/content_status.html:67 #: bookwyrm/templates/snippets/trimmed_text.html:14 msgid "Show more" msgstr "Mostrar más" -#: bookwyrm/templates/snippets/status/content_status.html:75 -#: bookwyrm/templates/snippets/status/status_content.html:65 +#: bookwyrm/templates/snippets/status/content_status.html:82 #: bookwyrm/templates/snippets/trimmed_text.html:29 msgid "Show less" msgstr "Mostrar menos" -#: bookwyrm/templates/snippets/status/content_status.html:105 -#: bookwyrm/templates/snippets/status/status_content.html:95 +#: bookwyrm/templates/snippets/status/content_status.html:112 msgid "Open image in new window" msgstr "Abrir imagen en una nueva ventana" #: bookwyrm/templates/snippets/status/layout.html:22 -#: bookwyrm/templates/snippets/status/status_options.html:18 +#: bookwyrm/templates/snippets/status/status_options.html:17 msgid "Delete status" msgstr "Eliminar status" +#: bookwyrm/templates/snippets/status/layout.html:52 +#: bookwyrm/templates/snippets/status/layout.html:53 +msgid "Boost status" +msgstr "Status de respaldo" + +#: bookwyrm/templates/snippets/status/layout.html:56 +#: bookwyrm/templates/snippets/status/layout.html:57 +msgid "Like status" +msgstr "Me gusta status" + #: bookwyrm/templates/snippets/status/status.html:9 msgid "boosted" msgstr "respaldó" -#: bookwyrm/templates/snippets/status/status_header.html:32 +#: bookwyrm/templates/snippets/status/status_header.html:44 #, python-format -msgid "replied to %(username)s's review" -msgstr "respondió a la reseña de %(username)s " - -#: bookwyrm/templates/snippets/status/status_header.html:34 -#, python-format -msgid "replied to %(username)s's comment" -msgstr "respondió al comentario de %(username)s " - -#: bookwyrm/templates/snippets/status/status_header.html:36 -#, python-format -msgid "replied to %(username)s's quote" -msgstr "respondió a la cita de %(username)s " - -#: bookwyrm/templates/snippets/status/status_header.html:38 -#, python-format -msgid "replied to %(username)s's status" -msgstr "respondió al status de %(username)s " +msgid "" +"replied to %(username)s's status" +msgstr "" +"respondió al status de %(username)s " #: bookwyrm/templates/snippets/status/status_options.html:7 #: bookwyrm/templates/snippets/user_options.html:7 msgid "More options" msgstr "Más opciones" -#: bookwyrm/templates/snippets/status/status_options.html:27 +#: bookwyrm/templates/snippets/status/status_options.html:26 msgid "Delete & re-draft" msgstr "Eliminar y recomponer" -#: bookwyrm/templates/snippets/status/status_options.html:36 +#: bookwyrm/templates/snippets/status/status_options.html:35 #: bookwyrm/templates/snippets/user_options.html:13 #: bookwyrm/templates/user_admin/user_moderation_actions.html:6 msgid "Send direct message" @@ -2586,23 +2754,23 @@ msgstr "Crear estante" msgid "Edit shelf" msgstr "Editar estante" -#: bookwyrm/templates/user/shelf.html:78 +#: bookwyrm/templates/user/shelf.html:77 bookwyrm/templates/user/shelf.html:99 msgid "Shelved" msgstr "Archivado" -#: bookwyrm/templates/user/shelf.html:79 +#: bookwyrm/templates/user/shelf.html:78 bookwyrm/templates/user/shelf.html:103 msgid "Started" msgstr "Empezado" -#: bookwyrm/templates/user/shelf.html:80 +#: bookwyrm/templates/user/shelf.html:79 bookwyrm/templates/user/shelf.html:106 msgid "Finished" msgstr "Terminado" -#: bookwyrm/templates/user/shelf.html:129 +#: bookwyrm/templates/user/shelf.html:132 msgid "This shelf is empty." msgstr "Este estante está vacio." -#: bookwyrm/templates/user/shelf.html:135 +#: bookwyrm/templates/user/shelf.html:138 msgid "Delete shelf" msgstr "Eliminar estante" @@ -2734,13 +2902,1433 @@ msgstr "Nivel de acceso:" #: bookwyrm/views/password.py:32 msgid "No user with that email address was found." -msgstr "No se pudo encontrar un usuario con esa dirección de correo electrónico." +msgstr "" +"No se pudo encontrar un usuario con esa dirección de correo electrónico." #: bookwyrm/views/password.py:41 #, python-format msgid "A password reset link sent to %s" msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" +#: venv3/lib/python3.8/site-packages/_pytest/config/argparsing.py:442 +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "opción ambiguo: %(option)s pudiera coincidir con %(matches)s" + +#: venv3/lib/python3.8/site-packages/django/contrib/messages/apps.py:7 +msgid "Messages" +msgstr "Mensajes" + +#: venv3/lib/python3.8/site-packages/django/contrib/sitemaps/apps.py:7 +msgid "Site Maps" +msgstr "Mapas de sitio" + +#: venv3/lib/python3.8/site-packages/django/contrib/staticfiles/apps.py:9 +msgid "Static Files" +msgstr "Archivos estáticos" + +#: venv3/lib/python3.8/site-packages/django/contrib/syndication/apps.py:7 +msgid "Syndication" +msgstr "Sindicación" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:45 +msgid "That page number is not an integer" +msgstr "Ese numero de pagina no es un entero" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:47 +msgid "That page number is less than 1" +msgstr "Ese numero de pagina es menos que uno" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:52 +msgid "That page contains no results" +msgstr "Esa pagina no contiene resultados" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:32 +msgid "Enter a valid value." +msgstr "Ingrese un valor válido." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:103 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:659 +msgid "Enter a valid URL." +msgstr "Ingrese una URL válida." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:155 +msgid "Enter a valid integer." +msgstr "Ingrese un entero válido." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:166 +msgid "Enter a valid email address." +msgstr "Ingrese una dirección de correo electrónico válida." + +#. Translators: "letters" means latin letters: a-z and A-Z. +#: venv3/lib/python3.8/site-packages/django/core/validators.py:240 +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" +"Ingrese un “slug” válido que consiste de letras, numeros, guiones bajos, o " +"guiones" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:247 +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" +"Ingrese un “slug” válido que consiste de letras Unicode, numeros, guiones " +"bajos, o guiones" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:256 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:276 +msgid "Enter a valid IPv4 address." +msgstr "Ingrese una dirección IPv4 válida." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:261 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:277 +msgid "Enter a valid IPv6 address." +msgstr "Ingrese una dirección IPv6 válida." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:271 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:275 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Ingrese una dirección IPv4 o IPv6 válida." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:305 +msgid "Enter only digits separated by commas." +msgstr "Ingrese solo digitos separados por comas." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:311 +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "Asegura que este valor es %(limit_value)s (es %(show_value)s)." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:343 +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "Asegura que este valor es menor que o iguala a %(limit_value)s." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:352 +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "Asegura que este valor es más que o que iguala a %(limit_value)s." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:362 +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Verifica que este valor tiene por lo menos %(limit_value)d carácter. (Tiene " +"%(show_value)d).)" +msgstr[1] "" +"Verifica que este valor tiene por lo menos %(limit_value)d caracteres. " +"(Tiene %(show_value)d).)" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:377 +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +"Verifica que este valor tiene a lo sumo %(limit_value)d carácter. (Tiene " +"%(show_value)d).)" +msgstr[1] "" +"Verifica que este valor tiene a lo sumo %(limit_value)d caracteres. (Tiene " +"%(show_value)d).)" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:396 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:291 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:326 +msgid "Enter a number." +msgstr "Ingrese un número." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:398 +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "Verifica que no hay más que %(max)s digito en total." +msgstr[1] "Verifica que no hay más que %(max)s digitos en total." + +# is +#: venv3/lib/python3.8/site-packages/django/core/validators.py:403 +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "Verifica que no hay más que %(max)s cifra decimal." +msgstr[1] "Verifica que no hay más que %(max)s cifras decimales." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:408 +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +"Verifica que no hay más que %(max)s digito antes de la coma decimal." +msgstr[1] "" +"Verifica que no hay más que %(max)s digitos antes de la coma decimal." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:470 +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" +"No se permite la extensión de archivo “%(extension)s”. Extensiones " +"permitidas son: %(allowed_extensions)s." + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:522 +msgid "Null characters are not allowed." +msgstr "No se permiten caracteres nulos" + +#: venv3/lib/python3.8/site-packages/django/db/models/base.py:1181 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:759 +msgid "and" +msgstr "y" + +#: venv3/lib/python3.8/site-packages/django/db/models/base.py:1183 +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "Ya existe %(model_name)s con este %(field_labels)s." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:104 +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "El valor %(value)s no es una opción válida." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:105 +msgid "This field cannot be null." +msgstr "Este campo no puede ser nulo." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:106 +msgid "This field cannot be blank." +msgstr "Este campo no puede ser vacio." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:107 +#, fuzzy, python-format +#| msgid "%(model_name)s with this %(field_label)s already exists." +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Ya existe %(model_name)s con este %(field_labels)s." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:111 +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" +"%(field_label)s deben ser unicos por %(date_field_label)s %(lookup_type)s." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:130 +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "Campo de tipo: %(field_type)s" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:937 +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "“%(value)s” valor debe ser o verdadero o falso." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:938 +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "%(value)s” valor debe ser o True, False, o None." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:940 +msgid "Boolean (Either True or False)" +msgstr "Booleano (O True O False)" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:981 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "Cadena (máximo de %(max_length)s caracteres)" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1045 +msgid "Comma-separated integers" +msgstr "Enteros separados por comas" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1094 +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" +"“%(value)s” valor tiene un formato de fecha inválido. Hay que estar de " +"formato YYYY-MM-DD." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1096 +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1239 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" +"“%(value)s” valor tiene el formato correcto (YYYY-MM-DD) pero la fecha es " +"invalida." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1099 +msgid "Date (without time)" +msgstr "Fecha (sin la hora)" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1237 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" +"“%(value)s” valor tiene un formato invalido. Debe estar en formato YYYY-MM-" +"DD HH:MM[:ss[.uuuuuu]][TZ]." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1241 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" +"“%(value)s” valor tiene el formato correcto (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) pero es una fecha/hora invalida." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1245 +msgid "Date (with time)" +msgstr "Fecha (con la hora)" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1393 +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "El valor de “%(value)s” debe ser un número decimal." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1395 +msgid "Decimal number" +msgstr "Número decimal" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1534 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" +"“%(value)s” valor tiene un formato invalido. Debe estar en formato [DD] " +"[[HH:]MM:]ss[.uuuuuu]." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1537 +msgid "Duration" +msgstr "Duración" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1587 +msgid "Email address" +msgstr "Dirección de correo electrónico" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1610 +msgid "File path" +msgstr "Ruta de archivo" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1676 +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "%(value)s no es un usuario válido" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1678 +msgid "Floating point number" +msgstr "Número de coma flotante" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1716 +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "“%(value)s” valor debe ser un entero." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1718 +msgid "Integer" +msgstr "Entero" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1801 +msgid "Big (8 byte) integer" +msgstr "Entero grande (8 byte)" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1817 +msgid "IPv4 address" +msgstr "Dirección IPv4" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1848 +msgid "IP address" +msgstr "Dirección IP" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1928 +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1929 +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "Valor “%(value)s” debe ser o None, True, o False." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1931 +msgid "Boolean (Either True, False or None)" +msgstr "Booleano (O True, Falso, o None)" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1966 +msgid "Positive integer" +msgstr "Entero positivo" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1979 +msgid "Positive small integer" +msgstr "Entero positivo pequeño " + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1993 +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "Slug (máximo de %(max_length)s)" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2025 +msgid "Small integer" +msgstr "Entero pequeño" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2032 +msgid "Text" +msgstr "Texto" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2060 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" +"“%(value)s” valor tiene un formato invalido. Debe estar en formato HH:MM[:" +"ss[.uuuuuu]]." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2062 +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" +"“%(value)s” valor tiene el formato correcto (HH:MM[:ss[.uuuuuu]]) pero es " +"una hora invalida." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2065 +msgid "Time" +msgstr "Tiempo" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2191 +msgid "URL" +msgstr "URL" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2213 +msgid "Raw binary data" +msgstr "Datos binarios sin procesar" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2278 +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "%(value)s no es una UUID válida." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2280 +msgid "Universally unique identifier" +msgstr "Identificador universalmente único" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/files.py:221 +msgid "File" +msgstr "Archivo" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/files.py:360 +msgid "Image" +msgstr "Imágen" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:778 +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "%(model)s instancia con %(field)s %(value)r no existe." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:780 +msgid "Foreign Key (type determined by related field)" +msgstr "Clave externa (tipo determinado por campo relacionado)" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1012 +msgid "One-to-one relationship" +msgstr "Relación uno-a-uno" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1066 +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "relación %(from)s-%(to)s" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1067 +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "relaciones %(from)s-%(to)s" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1109 +msgid "Many-to-many relationship" +msgstr "Relaciones mucho-a-mucho" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the label +#: venv3/lib/python3.8/site-packages/django/forms/boundfield.py:149 +msgid ":?.!" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:53 +msgid "This field is required." +msgstr "Este campo es requerido." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:246 +msgid "Enter a whole number." +msgstr "Ingrese un número entero." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:397 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1127 +msgid "Enter a valid date." +msgstr "Ingrese una fecha válida." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:421 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1128 +msgid "Enter a valid time." +msgstr "Ingrese una hora válida." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:443 +msgid "Enter a valid date/time." +msgstr "Ingrese una fecha/hora válida." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:472 +msgid "Enter a valid duration." +msgstr "Ingrese una duración válida." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:473 +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "El número de dias debe ser entre {min_days} y {max_days}." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:533 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" +"No se aceptó ningun archivo. Verfica el tipo de codificación en el " +"formulario." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:534 +msgid "No file was submitted." +msgstr "No se aceptó ningun archivo." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:535 +msgid "The submitted file is empty." +msgstr "El archivo enviado está vacio." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:537 +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +"Verifica que este nombre de archivo no tiene más que %(max)d carácter. " +"(Tiene %(length)d)." +msgstr[1] "" +"Verifica que este nombre de archivo no tiene más que %(max)d caracteres. " +"(Tiene %(length)d)." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:540 +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "Por favor, o envia un archivo o marca la casilla vacia, no los dos." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:601 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" +"Subir una imagen válida. El archivo que subiste o no fue imagen o fue " +"corrupto." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:763 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:853 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1275 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" +"Selecciona una opción válida. %(value)s no es una de las opciones " +"disponibles." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:854 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:969 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1274 +msgid "Enter a list of values." +msgstr "Ingrese una lista de valores." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:970 +msgid "Enter a complete value." +msgstr "Ingresa un valor completo." + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1186 +msgid "Enter a valid UUID." +msgstr "Ingrese una UUID válida." + +#. Translators: This is the default suffix added to form field labels +#: venv3/lib/python3.8/site-packages/django/forms/forms.py:81 +msgid ":" +msgstr ":" + +#: venv3/lib/python3.8/site-packages/django/forms/forms.py:207 +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "(Campo oculto %(name)s) %(error)s" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:93 +msgid "ManagementForm data is missing or has been tampered with" +msgstr "Datos de ManagementForm está ausento o ha sido corrompido" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:345 +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "Por favor, enviar %d o menos formularios." +msgstr[1] "Por favor, enviar %d o menos formularios." + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:352 +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "Por favor, enviar %d o más formularios." +msgstr[1] "Por favor, enviar %d o más formularios." + +# TODO cc @mouse is this a verb or noun +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:379 +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:386 +#, fuzzy +msgid "Order" +msgstr "Pedir" + +# if verb +# msgstr "Pedido" # if noun +#: venv3/lib/python3.8/site-packages/django/forms/models.py:754 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "Por favor corrige los datos duplicados en %(field)s." + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:758 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" +"Por favor corrige los datos duplicados en %(field)s, los cuales deben ser " +"unicos." + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:764 +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" +"Por favor corrige los datos duplicados en %(field_name)s los cuales deben " +"ser unicos por el %(lookup)s en %(date_field)s." + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:773 +msgid "Please correct the duplicate values below." +msgstr "Por favor corrige los valores duplicados a continuación." + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1094 +msgid "The inline value did not match the parent instance." +msgstr "El valor en línea no empareja la instancia progenitor." + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1161 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" +"Selecciona una opción válida. Esa opción no es una de las opciones " +"disponibles." + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1277 +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "“%(pk)s” no es un valor válido." + +#: venv3/lib/python3.8/site-packages/django/forms/utils.py:162 +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" +"%(datetime)s no se pudo interpretar en la zona horaria %(current_timezone)s; " +"puede ser ambiguo o puede que no exista." + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:395 +msgid "Clear" +msgstr "Borrar" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:396 +msgid "Currently" +msgstr "Actualmente" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:397 +msgid "Change" +msgstr "Cambiar" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:709 +msgid "Unknown" +msgstr "Desconocido" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:710 +msgid "Yes" +msgstr "Sí" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:711 +msgid "No" +msgstr "No" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:788 +msgid "yes,no,maybe" +msgstr "sí,no,quizás" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:817 +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:834 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "%(size)d byte" +msgstr[1] "%(size)d bytes" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:836 +#, python-format +msgid "%s KB" +msgstr "%s KB" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:838 +#, python-format +msgid "%s MB" +msgstr "%s MB" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:840 +#, python-format +msgid "%s GB" +msgstr "%s GB" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:842 +#, python-format +msgid "%s TB" +msgstr "%s TB" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:844 +#, python-format +msgid "%s PB" +msgstr "%s PB" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:62 +msgid "p.m." +msgstr "p.m." + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:63 +msgid "a.m." +msgstr "a.m." + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:68 +msgid "PM" +msgstr "PM" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:69 +msgid "AM" +msgstr "AM" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:150 +msgid "midnight" +msgstr "medianoche" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:152 +msgid "noon" +msgstr "mediodia" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:295 +msgid "Monday" +msgstr "Lunes" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:296 +msgid "Tuesday" +msgstr "Martes" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:297 +msgid "Wednesday" +msgstr "Miercoles" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:298 +msgid "Thursday" +msgstr "Jueves" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:299 +msgid "Friday" +msgstr "Viernes" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:7 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:300 +msgid "Saturday" +msgstr "Sábado" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:7 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:301 +msgid "Sunday" +msgstr "Domino" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Mon" +msgstr "Lun" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Tue" +msgstr "Mar" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Wed" +msgstr "Mie" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Thu" +msgstr "Jue" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Fri" +msgstr "Vie" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:11 +msgid "Sat" +msgstr "Sáb" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:11 +msgid "Sun" +msgstr "Dom" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:281 +msgid "January" +msgstr "Enero" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:282 +msgid "February" +msgstr "Febrero" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:283 +msgid "March" +msgstr "Marzo" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:284 +msgid "April" +msgstr "Abril" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:285 +msgid "May" +msgstr "Mayo" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:286 +msgid "June" +msgstr "Junio" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:287 +msgid "July" +msgstr "Julio" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:288 +msgid "August" +msgstr "Agosto" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:289 +msgid "September" +msgstr "Septiembre" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:290 +msgid "October" +msgstr "Octubre" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:291 +msgid "November" +msgstr "Noviembre" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:16 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:292 +msgid "December" +msgstr "Diciembre" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "jan" +msgstr "ene" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "feb" +msgstr "feb" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "mar" +msgstr "mar" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "apr" +msgstr "abr" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "may" +msgstr "may" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "jun" +msgstr "jun" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "jul" +msgstr "jul" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "aug" +msgstr "ago" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "sep" +msgstr "sep" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "oct" +msgstr "oct" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "nov" +msgstr "nov" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "dec" +msgstr "dic" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:23 +msgctxt "abbrev. month" +msgid "Jan." +msgstr "en." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:24 +msgctxt "abbrev. month" +msgid "Feb." +msgstr "feb." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:25 +msgctxt "abbrev. month" +msgid "March" +msgstr "mzo." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:26 +msgctxt "abbrev. month" +msgid "April" +msgstr "abr." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:27 +msgctxt "abbrev. month" +msgid "May" +msgstr "my." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:28 +msgctxt "abbrev. month" +msgid "June" +msgstr "jun." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:29 +msgctxt "abbrev. month" +msgid "July" +msgstr "jul." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:30 +msgctxt "abbrev. month" +msgid "Aug." +msgstr "agto." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:31 +msgctxt "abbrev. month" +msgid "Sept." +msgstr "set." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:32 +msgctxt "abbrev. month" +msgid "Oct." +msgstr "oct." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:33 +msgctxt "abbrev. month" +msgid "Nov." +msgstr "nov." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:34 +msgctxt "abbrev. month" +msgid "Dec." +msgstr "dic." + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:37 +msgctxt "alt. month" +msgid "January" +msgstr "Enero" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:38 +msgctxt "alt. month" +msgid "February" +msgstr "Febrero" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:39 +msgctxt "alt. month" +msgid "March" +msgstr "Marzo" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:40 +msgctxt "alt. month" +msgid "April" +msgstr "Abril" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:41 +msgctxt "alt. month" +msgid "May" +msgstr "Mayo" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:42 +msgctxt "alt. month" +msgid "June" +msgstr "Junio" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:43 +msgctxt "alt. month" +msgid "July" +msgstr "Julio" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:44 +msgctxt "alt. month" +msgid "August" +msgstr "Agosto" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:45 +msgctxt "alt. month" +msgid "September" +msgstr "Septiembre" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:46 +msgctxt "alt. month" +msgid "October" +msgstr "Octubre" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:47 +msgctxt "alt. month" +msgid "November" +msgstr "Noviembre" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:48 +msgctxt "alt. month" +msgid "December" +msgstr "Diciembre" + +#: venv3/lib/python3.8/site-packages/django/utils/ipv6.py:8 +msgid "This is not a valid IPv6 address." +msgstr "Esta no es una dirección IPv6 válida." + +#: venv3/lib/python3.8/site-packages/django/utils/text.py:69 +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "%(truncated_text)s…" + +#: venv3/lib/python3.8/site-packages/django/utils/text.py:235 +msgid "or" +msgstr "o" + +#. Translators: This string is used as a separator between list elements +#: venv3/lib/python3.8/site-packages/django/utils/text.py:254 +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:83 +msgid ", " +msgstr ", " + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:9 +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "%d año" +msgstr[1] "%d años" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:10 +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "%d mes" +msgstr[1] "%d meses" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:11 +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "%d semana" +msgstr[1] "%d semanas" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:12 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "%d día" +msgstr[1] "%d días" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:13 +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "%d hora" +msgstr[1] "%d horas" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:14 +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "%d minuto" +msgstr[1] "%d minutos" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:72 +#, fuzzy +#| msgid "%d minute" +#| msgid_plural "%d minutes" +msgid "0 minutes" +msgstr "%d minuto" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:110 +msgid "Forbidden" +msgstr "Prohibido" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:111 +msgid "CSRF verification failed. Request aborted." +msgstr "Se falló la verificación CSRF. Se abortó la solicitud." + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:115 +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" +"Estás viendo este mensaje porque este sitio HTTPS requiere que tu navegador " +"Web envie un “Referer header”, pero no se la envió. Esta cabecedera se " +"requiere por razones de seguridad, para asegurar que tu navegador no sea " +"secuestrado por terceros." + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:120 +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" +"Si has configurado su navegador para deshabilitar las cabecederas “Referer”, " +"vuelva a habilitarlos, al menos para este sitio, o para conexiones HTTPS, o " +"para solicitudes del “same-origin”. " + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:124 +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" +"Si estás usando la eqtigueta o estás incluyendo la cabecedera “Referrer-Policy: no-referrer”, " +"quitalas por favor. La protección CSRF require la cabecedera “Referer” para " +"hacer verficación “strict referer“. Si te preocupa la privacidad, utiliza " +"alternativas como para sitios de terceros." + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:132 +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" +"Estás viendo este mensaje porque este sitio requiere un cookie CSRF cuando " +"se envie formularios. Este cookie se requiere por razones de seguridad, para " +"asegurar que tu navegador no sea secuestrado por terceros." + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:137 +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" +"Si has configurado su navegador para deshabilitar los cookies, vuelva a " +"habilitarlos, al menos para este sitio, o para conexiones HTTPS, o para " +"solicitudes del “same-origin”. " + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:142 +msgid "More information is available with DEBUG=True." +msgstr "Más información es disponible con DEBUG=True." + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:41 +msgid "No year specified" +msgstr "Ningun año fue especificado" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:61 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:111 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:208 +msgid "Date out of range" +msgstr "Fecha fuera de rango" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:90 +msgid "No month specified" +msgstr "Ningun mes fue especificado" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:142 +msgid "No day specified" +msgstr "Ningun día fue especificado" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:188 +msgid "No week specified" +msgstr "Ninguna semana fue especificado" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:338 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:367 +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "No %(verbose_name_plural)s disponible" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:589 +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" +"%(verbose_name_plural)s del futuro no está disponible porque %(class_name)s." +"allow_future es False." + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:623 +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "Cadena de fecha invalida “%(datestr)s” dado el formato “%(format)s”" + +#: venv3/lib/python3.8/site-packages/django/views/generic/detail.py:54 +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "No se encontró ningún %(verbose_name)s correspondiente a la búsqueda" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:67 +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "Página no es “last”, ni puede ser convertido en un int." + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:72 +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "Página invalida (%(page_number)s): %(message)s" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:154 +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "Lista vacia y “%(class_name)s.allow_empty” es False." + +#: venv3/lib/python3.8/site-packages/django/views/static.py:40 +msgid "Directory indexes are not allowed here." +msgstr "Indices directorios no se permiten aquí." + +#: venv3/lib/python3.8/site-packages/django/views/static.py:42 +#, python-format +msgid "“%(path)s” does not exist" +msgstr "“%(path)s” no existe" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:80 +#, python-format +msgid "Index of %(directory)s" +msgstr "Indice de %(directory)s" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:7 +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "Django: el estructura Web para perfeccionistas con fechas límites." + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:346 +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" +"Ver notas de lanzamiento por Django " +"%(version)s" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:368 +msgid "The install worked successfully! Congratulations!" +msgstr "¡La instalación fue exitoso! ¡Felicidades!" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:369 +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" +"Estás viendo esta pagina porque DEBUG=True está en tu archivo de configuración y no has configurado " +"ningún URL." + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:384 +msgid "Django Documentation" +msgstr "Documentación de Django" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:385 +msgid "Topics, references, & how-to’s" +msgstr "Tópicos, referencias, & instrucciones paso-a-paso" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:396 +msgid "Tutorial: A Polling App" +msgstr "Tutorial: Una aplicación polling" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:397 +msgid "Get started with Django" +msgstr "Empezar con Django" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:408 +msgid "Django Community" +msgstr "Comunidad Django" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:409 +msgid "Connect, get help, or contribute" +msgstr "Conectarse, encontrar ayuda, o contribuir" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1301 +#, python-format +msgid "Attempting to connect to qpid with SASL mechanism %s" +msgstr "Intentando conectar con qpid con mecanismo SASL %s" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1306 +#, python-format +msgid "Connected to qpid with SASL mechanism %s" +msgstr "Conectado con qpid con mecanismo SASL %s" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1324 +#, python-format +msgid "Unable to connect to qpid with SASL mechanism %s" +msgstr "No se pudo conectar con qpid con mecanismo SASL %s" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:371 +msgid "1 second ago" +msgstr "Hace 1 segundo" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:377 +msgid "1 minute ago" +msgstr "Hace 1 minuto" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:382 +msgid "1 hour ago" +msgstr "Hace 1 hora" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:385 +#, python-format +msgid "%(time)s" +msgstr "%(time)s" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:387 +msgid "yesterday" +msgstr "ayer" + +# TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock +# a working clock is broken twice a day! +#: venv3/lib/python3.8/site-packages/tornado/locale.py:387 +#, python-format +msgid "yesterday at %(time)s" +msgstr "ayer a las %(time)s" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:389 +#, python-format +msgid "%(weekday)s" +msgstr "%(weekday)s" + +# TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock +# a working clock is broken twice a day! +#: venv3/lib/python3.8/site-packages/tornado/locale.py:389 +#, python-format +msgid "%(weekday)s at %(time)s" +msgstr "%(weekday)s a las %(time)s" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:392 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:445 +#, python-format +msgid "%(month_name)s %(day)s" +msgstr "%(day)s %(month_name)s" + +# TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock +# a working clock is broken twice a day! +#: venv3/lib/python3.8/site-packages/tornado/locale.py:394 +#, python-format +msgid "%(month_name)s %(day)s at %(time)s" +msgstr "%(day)s %(month_name)s a las %(time)s" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:399 +#, python-format +msgid "%(month_name)s %(day)s, %(year)s" +msgstr "%(day)s %(month_name)s, %(year)s" + +# TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock +# a working clock is broken twice a day! +#: venv3/lib/python3.8/site-packages/tornado/locale.py:401 +#, python-format +msgid "%(month_name)s %(day)s, %(year)s at %(time)s" +msgstr "%(day)s %(month_name)s, %(year)s a las %(time)s" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:439 +#, python-format +msgid "%(weekday)s, %(month_name)s %(day)s" +msgstr "%(weekday)s, %(day)s %(month_name)s" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:462 +#, python-format +msgid "%(commas)s and %(last)s" +msgstr "%(commas)s y %(last)s" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:68 +msgctxt "law" +msgid "right" +msgstr "justo" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:69 +msgctxt "good" +msgid "right" +msgstr "correcto" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:71 +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:74 +msgctxt "organization" +msgid "club" +msgstr "club" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:76 +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:77 +msgctxt "stick" +msgid "club" +msgstr "garrote" + +#, python-format +#~ msgid "%(rating)s star" +#~ msgid_plural "%(rating)s stars" +#~ msgstr[0] "%(rating)s estrella" +#~ msgstr[1] "%(rating)s estrellas" + +#, python-format +#~ msgid "" +#~ "replied to %(username)s's review" +#~ msgstr "" +#~ "respondió a la reseña de %(username)s " + +#, python-format +#~ msgid "" +#~ "replied to %(username)s's comment" +#~ msgstr "" +#~ "respondió al comentario de %(username)s " + +#, python-format +#~ msgid "" +#~ "replied to %(username)s's quote" +#~ msgstr "" +#~ "respondió a la cita de %(username)s " + #~ msgid "Remove tag" #~ msgstr "Eliminar etiqueta" @@ -2756,867 +4344,18 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Reactivate user" #~ msgstr "Reactivar usuario" -#~ msgid "ambiguous option: %(option)s could match %(matches)s" -#~ msgstr "opción ambiguo: %(option)s pudiera coincidir con %(matches)s" - -#~ msgid "Messages" -#~ msgstr "Mensajes" - -#~ msgid "Site Maps" -#~ msgstr "Mapas de sitio" - -#~ msgid "Static Files" -#~ msgstr "Archivos estáticos" - -#~ msgid "Syndication" -#~ msgstr "Sindicación" - -#~ msgid "That page number is not an integer" -#~ msgstr "Ese numero de pagina no es un entero" - -#~ msgid "That page number is less than 1" -#~ msgstr "Ese numero de pagina es menos que uno" - -#~ msgid "That page contains no results" -#~ msgstr "Esa pagina no contiene resultados" - -#~ msgid "Enter a valid value." -#~ msgstr "Ingrese un valor válido." - -#~ msgid "Enter a valid URL." -#~ msgstr "Ingrese una URL válida." - -#~ msgid "Enter a valid integer." -#~ msgstr "Ingrese un entero válido." - -#~ msgid "Enter a valid email address." -#~ msgstr "Ingrese una dirección de correo electrónico válida." - -#~ msgid "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." -#~ msgstr "Ingrese un “slug” válido que consiste de letras, numeros, guiones bajos, o guiones" - -#~ msgid "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or hyphens." -#~ msgstr "Ingrese un “slug” válido que consiste de letras Unicode, numeros, guiones bajos, o guiones" - -#~ msgid "Enter a valid IPv4 address." -#~ msgstr "Ingrese una dirección IPv4 válida." - -#~ msgid "Enter a valid IPv6 address." -#~ msgstr "Ingrese una dirección IPv6 válida." - -#~ msgid "Enter a valid IPv4 or IPv6 address." -#~ msgstr "Ingrese una dirección IPv4 o IPv6 válida." - -#~ msgid "Enter only digits separated by commas." -#~ msgstr "Ingrese solo digitos separados por comas." - -#~ msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." -#~ msgstr "Asegura que este valor es %(limit_value)s (es %(show_value)s)." - -#~ msgid "Ensure this value is less than or equal to %(limit_value)s." -#~ msgstr "Asegura que este valor es menor que o iguala a %(limit_value)s." - -#~ msgid "Ensure this value is greater than or equal to %(limit_value)s." -#~ msgstr "Asegura que este valor es más que o que iguala a %(limit_value)s." - -#~ msgid "Ensure this value has at least %(limit_value)d character (it has %(show_value)d)." -#~ msgid_plural "Ensure this value has at least %(limit_value)d characters (it has %(show_value)d)." -#~ msgstr[0] "Verifica que este valor tiene por lo menos %(limit_value)d carácter. (Tiene %(show_value)d).)" -#~ msgstr[1] "Verifica que este valor tiene por lo menos %(limit_value)d caracteres. (Tiene %(show_value)d).)" - -#~ msgid "Ensure this value has at most %(limit_value)d character (it has %(show_value)d)." -#~ msgid_plural "Ensure this value has at most %(limit_value)d characters (it has %(show_value)d)." -#~ msgstr[0] "Verifica que este valor tiene a lo sumo %(limit_value)d carácter. (Tiene %(show_value)d).)" -#~ msgstr[1] "Verifica que este valor tiene a lo sumo %(limit_value)d caracteres. (Tiene %(show_value)d).)" - -#~ msgid "Enter a number." -#~ msgstr "Ingrese un número." - -#~ msgid "Ensure that there are no more than %(max)s digit in total." -#~ msgid_plural "Ensure that there are no more than %(max)s digits in total." -#~ msgstr[0] "Verifica que no hay más que %(max)s digito en total." -#~ msgstr[1] "Verifica que no hay más que %(max)s digitos en total." - -# is -#~ msgid "Ensure that there are no more than %(max)s decimal place." -#~ msgid_plural "Ensure that there are no more than %(max)s decimal places." -#~ msgstr[0] "Verifica que no hay más que %(max)s cifra decimal." -#~ msgstr[1] "Verifica que no hay más que %(max)s cifras decimales." - -#~ msgid "Ensure that there are no more than %(max)s digit before the decimal point." -#~ msgid_plural "Ensure that there are no more than %(max)s digits before the decimal point." -#~ msgstr[0] "Verifica que no hay más que %(max)s digito antes de la coma decimal." -#~ msgstr[1] "Verifica que no hay más que %(max)s digitos antes de la coma decimal." - -#~ msgid "File extension “%(extension)s” is not allowed. Allowed extensions are: %(allowed_extensions)s." -#~ msgstr "No se permite la extensión de archivo “%(extension)s”. Extensiones permitidas son: %(allowed_extensions)s." - -#~ msgid "Null characters are not allowed." -#~ msgstr "No se permiten caracteres nulos" - -#~ msgid "and" -#~ msgstr "y" - -#~ msgid "%(model_name)s with this %(field_labels)s already exists." -#~ msgstr "Ya existe %(model_name)s con este %(field_labels)s." - -#~ msgid "Value %(value)r is not a valid choice." -#~ msgstr "El valor %(value)s no es una opción válida." - -#~ msgid "This field cannot be null." -#~ msgstr "Este campo no puede ser nulo." - -#~ msgid "This field cannot be blank." -#~ msgstr "Este campo no puede ser vacio." - -#~ msgid "%(model_name)s with this %(field_label)s already exists." -#~ msgstr "Ya existe %(model_name)s con este %(field_labels)s." - -#~ msgid "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." -#~ msgstr "%(field_label)s deben ser unicos por %(date_field_label)s %(lookup_type)s." - -#~ msgid "Field of type: %(field_type)s" -#~ msgstr "Campo de tipo: %(field_type)s" - -#~ msgid "“%(value)s” value must be either True or False." -#~ msgstr "“%(value)s” valor debe ser o verdadero o falso." - -#~ msgid "“%(value)s” value must be either True, False, or None." -#~ msgstr "%(value)s” valor debe ser o True, False, o None." - -#~ msgid "Boolean (Either True or False)" -#~ msgstr "Booleano (O True O False)" - -#~ msgid "String (up to %(max_length)s)" -#~ msgstr "Cadena (máximo de %(max_length)s caracteres)" - -#~ msgid "Comma-separated integers" -#~ msgstr "Enteros separados por comas" - -#~ msgid "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD format." -#~ msgstr "“%(value)s” valor tiene un formato de fecha inválido. Hay que estar de formato YYYY-MM-DD." - -#~ msgid "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid date." -#~ msgstr "“%(value)s” valor tiene el formato correcto (YYYY-MM-DD) pero la fecha es invalida." - -#~ msgid "Date (without time)" -#~ msgstr "Fecha (sin la hora)" - -#~ msgid "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format." -#~ msgstr "“%(value)s” valor tiene un formato invalido. Debe estar en formato YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." - -#~ msgid "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) but it is an invalid date/time." -#~ msgstr "“%(value)s” valor tiene el formato correcto (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) pero es una fecha/hora invalida." - -#~ msgid "Date (with time)" -#~ msgstr "Fecha (con la hora)" - -#~ msgid "“%(value)s” value must be a decimal number." -#~ msgstr "El valor de “%(value)s” debe ser un número decimal." - -#~ msgid "Decimal number" -#~ msgstr "Número decimal" - -#~ msgid "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[.uuuuuu] format." -#~ msgstr "“%(value)s” valor tiene un formato invalido. Debe estar en formato [DD] [[HH:]MM:]ss[.uuuuuu]." - -#~ msgid "Duration" -#~ msgstr "Duración" - -#~ msgid "Email address" -#~ msgstr "Dirección de correo electrónico" - -#~ msgid "File path" -#~ msgstr "Ruta de archivo" - -#~ msgid "“%(value)s” value must be a float." -#~ msgstr "%(value)s no es un usuario válido" - -#~ msgid "Floating point number" -#~ msgstr "Número de coma flotante" - -#~ msgid "“%(value)s” value must be an integer." -#~ msgstr "“%(value)s” valor debe ser un entero." - -#~ msgid "Integer" -#~ msgstr "Entero" - -#~ msgid "Big (8 byte) integer" -#~ msgstr "Entero grande (8 byte)" - -#~ msgid "IPv4 address" -#~ msgstr "Dirección IPv4" - -#~ msgid "IP address" -#~ msgstr "Dirección IP" - -#~ msgid "“%(value)s” value must be either None, True or False." -#~ msgstr "Valor “%(value)s” debe ser o None, True, o False." - -#~ msgid "Boolean (Either True, False or None)" -#~ msgstr "Booleano (O True, Falso, o None)" - #~ msgid "Positive big integer" #~ msgstr "Entero positivo grande" -#~ msgid "Positive integer" -#~ msgstr "Entero positivo" - -#~ msgid "Positive small integer" -#~ msgstr "Entero positivo pequeño " - -#~ msgid "Slug (up to %(max_length)s)" -#~ msgstr "Slug (máximo de %(max_length)s)" - -#~ msgid "Small integer" -#~ msgstr "Entero pequeño" - -#~ msgid "Text" -#~ msgstr "Texto" - -#~ msgid "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] format." -#~ msgstr "“%(value)s” valor tiene un formato invalido. Debe estar en formato HH:MM[:ss[.uuuuuu]]." - -#~ msgid "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an invalid time." -#~ msgstr "“%(value)s” valor tiene el formato correcto (HH:MM[:ss[.uuuuuu]]) pero es una hora invalida." - -#~ msgid "Time" -#~ msgstr "Tiempo" - -#~ msgid "URL" -#~ msgstr "URL" - -#~ msgid "Raw binary data" -#~ msgstr "Datos binarios sin procesar" - -#~ msgid "“%(value)s” is not a valid UUID." -#~ msgstr "%(value)s no es una UUID válida." - -#~ msgid "Universally unique identifier" -#~ msgstr "Identificador universalmente único" - -#~ msgid "File" -#~ msgstr "Archivo" - -#~ msgid "Image" -#~ msgstr "Imágen" - #~ msgid "A JSON object" #~ msgstr "Un objeto JSON" #~ msgid "Value must be valid JSON." #~ msgstr "Valor debe ser JSON válido." -#~ msgid "%(model)s instance with %(field)s %(value)r does not exist." -#~ msgstr "%(model)s instancia con %(field)s %(value)r no existe." - -#~ msgid "Foreign Key (type determined by related field)" -#~ msgstr "Clave externa (tipo determinado por campo relacionado)" - -#~ msgid "One-to-one relationship" -#~ msgstr "Relación uno-a-uno" - -#~ msgid "%(from)s-%(to)s relationship" -#~ msgstr "relación %(from)s-%(to)s" - -#~ msgid "%(from)s-%(to)s relationships" -#~ msgstr "relaciones %(from)s-%(to)s" - -#~ msgid "Many-to-many relationship" -#~ msgstr "Relaciones mucho-a-mucho" - -#~ msgid "This field is required." -#~ msgstr "Este campo es requerido." - -#~ msgid "Enter a whole number." -#~ msgstr "Ingrese un número entero." - -#~ msgid "Enter a valid date." -#~ msgstr "Ingrese una fecha válida." - -#~ msgid "Enter a valid time." -#~ msgstr "Ingrese una hora válida." - -#~ msgid "Enter a valid date/time." -#~ msgstr "Ingrese una fecha/hora válida." - -#~ msgid "Enter a valid duration." -#~ msgstr "Ingrese una duración válida." - -#~ msgid "The number of days must be between {min_days} and {max_days}." -#~ msgstr "El número de dias debe ser entre {min_days} y {max_days}." - -#~ msgid "No file was submitted. Check the encoding type on the form." -#~ msgstr "No se aceptó ningun archivo. Verfica el tipo de codificación en el formulario." - -#~ msgid "No file was submitted." -#~ msgstr "No se aceptó ningun archivo." - -#~ msgid "The submitted file is empty." -#~ msgstr "El archivo enviado está vacio." - -#~ msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." -#~ msgid_plural "Ensure this filename has at most %(max)d characters (it has %(length)d)." -#~ msgstr[0] "Verifica que este nombre de archivo no tiene más que %(max)d carácter. (Tiene %(length)d)." -#~ msgstr[1] "Verifica que este nombre de archivo no tiene más que %(max)d caracteres. (Tiene %(length)d)." - -#~ msgid "Please either submit a file or check the clear checkbox, not both." -#~ msgstr "Por favor, o envia un archivo o marca la casilla vacia, no los dos." - -#~ msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image." -#~ msgstr "Subir una imagen válida. El archivo que subiste o no fue imagen o fue corrupto." - -#~ msgid "Select a valid choice. %(value)s is not one of the available choices." -#~ msgstr "Selecciona una opción válida. %(value)s no es una de las opciones disponibles." - -#~ msgid "Enter a list of values." -#~ msgstr "Ingrese una lista de valores." - -#~ msgid "Enter a complete value." -#~ msgstr "Ingresa un valor completo." - -#~ msgid "Enter a valid UUID." -#~ msgstr "Ingrese una UUID válida." - #~ msgid "Enter a valid JSON." #~ msgstr "Ingrese una JSON válida." -#~ msgid ":" -#~ msgstr ":" - -#~ msgid "(Hidden field %(name)s) %(error)s" -#~ msgstr "(Campo oculto %(name)s) %(error)s" - -#~ msgid "ManagementForm data is missing or has been tampered with" -#~ msgstr "Datos de ManagementForm está ausento o ha sido corrompido" - -#~ msgid "Please submit %d or fewer forms." -#~ msgid_plural "Please submit %d or fewer forms." -#~ msgstr[0] "Por favor, enviar %d o menos formularios." -#~ msgstr[1] "Por favor, enviar %d o menos formularios." - -#~ msgid "Please submit %d or more forms." -#~ msgid_plural "Please submit %d or more forms." -#~ msgstr[0] "Por favor, enviar %d o más formularios." -#~ msgstr[1] "Por favor, enviar %d o más formularios." - -# TODO cc @mouse is this a verb or noun -#, fuzzy -#~ msgid "Order" -#~ msgstr "Pedir" - -# if verb -# msgstr "Pedido" # if noun -#~ msgid "Please correct the duplicate data for %(field)s." -#~ msgstr "Por favor corrige los datos duplicados en %(field)s." - -#~ msgid "Please correct the duplicate data for %(field)s, which must be unique." -#~ msgstr "Por favor corrige los datos duplicados en %(field)s, los cuales deben ser unicos." - -#~ msgid "Please correct the duplicate data for %(field_name)s which must be unique for the %(lookup)s in %(date_field)s." -#~ msgstr "Por favor corrige los datos duplicados en %(field_name)s los cuales deben ser unicos por el %(lookup)s en %(date_field)s." - -#~ msgid "Please correct the duplicate values below." -#~ msgstr "Por favor corrige los valores duplicados a continuación." - -#~ msgid "The inline value did not match the parent instance." -#~ msgstr "El valor en línea no empareja la instancia progenitor." - -#~ msgid "Select a valid choice. That choice is not one of the available choices." -#~ msgstr "Selecciona una opción válida. Esa opción no es una de las opciones disponibles." - -#~ msgid "“%(pk)s” is not a valid value." -#~ msgstr "“%(pk)s” no es un valor válido." - -#~ msgid "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it may be ambiguous or it may not exist." -#~ msgstr "%(datetime)s no se pudo interpretar en la zona horaria %(current_timezone)s; puede ser ambiguo o puede que no exista." - -#~ msgid "Clear" -#~ msgstr "Borrar" - -#~ msgid "Currently" -#~ msgstr "Actualmente" - -#~ msgid "Change" -#~ msgstr "Cambiar" - -#~ msgid "Unknown" -#~ msgstr "Desconocido" - -#~ msgid "Yes" -#~ msgstr "Sí" - -#~ msgid "No" -#~ msgstr "No" - -#~ msgid "yes,no,maybe" -#~ msgstr "sí,no,quizás" - -#~ msgid "%(size)d byte" -#~ msgid_plural "%(size)d bytes" -#~ msgstr[0] "%(size)d byte" -#~ msgstr[1] "%(size)d bytes" - -#~ msgid "%s KB" -#~ msgstr "%s KB" - -#~ msgid "%s MB" -#~ msgstr "%s MB" - -#~ msgid "%s GB" -#~ msgstr "%s GB" - -#~ msgid "%s TB" -#~ msgstr "%s TB" - -#~ msgid "%s PB" -#~ msgstr "%s PB" - -#~ msgid "p.m." -#~ msgstr "p.m." - -#~ msgid "a.m." -#~ msgstr "a.m." - -#~ msgid "PM" -#~ msgstr "PM" - -#~ msgid "AM" -#~ msgstr "AM" - -#~ msgid "midnight" -#~ msgstr "medianoche" - -#~ msgid "noon" -#~ msgstr "mediodia" - -#~ msgid "Monday" -#~ msgstr "Lunes" - -#~ msgid "Tuesday" -#~ msgstr "Martes" - -#~ msgid "Wednesday" -#~ msgstr "Miercoles" - -#~ msgid "Thursday" -#~ msgstr "Jueves" - -#~ msgid "Friday" -#~ msgstr "Viernes" - -#~ msgid "Saturday" -#~ msgstr "Sábado" - -#~ msgid "Sunday" -#~ msgstr "Domino" - -#~ msgid "Mon" -#~ msgstr "Lun" - -#~ msgid "Tue" -#~ msgstr "Mar" - -#~ msgid "Wed" -#~ msgstr "Mie" - -#~ msgid "Thu" -#~ msgstr "Jue" - -#~ msgid "Fri" -#~ msgstr "Vie" - -#~ msgid "Sat" -#~ msgstr "Sáb" - -#~ msgid "Sun" -#~ msgstr "Dom" - -#~ msgid "January" -#~ msgstr "Enero" - -#~ msgid "February" -#~ msgstr "Febrero" - -#~ msgid "March" -#~ msgstr "Marzo" - -#~ msgid "April" -#~ msgstr "Abril" - -#~ msgid "May" -#~ msgstr "Mayo" - -#~ msgid "June" -#~ msgstr "Junio" - -#~ msgid "July" -#~ msgstr "Julio" - -#~ msgid "August" -#~ msgstr "Agosto" - -#~ msgid "September" -#~ msgstr "Septiembre" - -#~ msgid "October" -#~ msgstr "Octubre" - -#~ msgid "November" -#~ msgstr "Noviembre" - -#~ msgid "December" -#~ msgstr "Diciembre" - -#~ msgid "jan" -#~ msgstr "ene" - -#~ msgid "feb" -#~ msgstr "feb" - -#~ msgid "mar" -#~ msgstr "mar" - -#~ msgid "apr" -#~ msgstr "abr" - -#~ msgid "may" -#~ msgstr "may" - -#~ msgid "jun" -#~ msgstr "jun" - -#~ msgid "jul" -#~ msgstr "jul" - -#~ msgid "aug" -#~ msgstr "ago" - -#~ msgid "sep" -#~ msgstr "sep" - -#~ msgid "oct" -#~ msgstr "oct" - -#~ msgid "nov" -#~ msgstr "nov" - -#~ msgid "dec" -#~ msgstr "dic" - -#~ msgctxt "abbrev. month" -#~ msgid "Jan." -#~ msgstr "en." - -#~ msgctxt "abbrev. month" -#~ msgid "Feb." -#~ msgstr "feb." - -#~ msgctxt "abbrev. month" -#~ msgid "March" -#~ msgstr "mzo." - -#~ msgctxt "abbrev. month" -#~ msgid "April" -#~ msgstr "abr." - -#~ msgctxt "abbrev. month" -#~ msgid "May" -#~ msgstr "my." - -#~ msgctxt "abbrev. month" -#~ msgid "June" -#~ msgstr "jun." - -#~ msgctxt "abbrev. month" -#~ msgid "July" -#~ msgstr "jul." - -#~ msgctxt "abbrev. month" -#~ msgid "Aug." -#~ msgstr "agto." - -#~ msgctxt "abbrev. month" -#~ msgid "Sept." -#~ msgstr "set." - -#~ msgctxt "abbrev. month" -#~ msgid "Oct." -#~ msgstr "oct." - -#~ msgctxt "abbrev. month" -#~ msgid "Nov." -#~ msgstr "nov." - -#~ msgctxt "abbrev. month" -#~ msgid "Dec." -#~ msgstr "dic." - -#~ msgctxt "alt. month" -#~ msgid "January" -#~ msgstr "Enero" - -#~ msgctxt "alt. month" -#~ msgid "February" -#~ msgstr "Febrero" - -#~ msgctxt "alt. month" -#~ msgid "March" -#~ msgstr "Marzo" - -#~ msgctxt "alt. month" -#~ msgid "April" -#~ msgstr "Abril" - -#~ msgctxt "alt. month" -#~ msgid "May" -#~ msgstr "Mayo" - -#~ msgctxt "alt. month" -#~ msgid "June" -#~ msgstr "Junio" - -#~ msgctxt "alt. month" -#~ msgid "July" -#~ msgstr "Julio" - -#~ msgctxt "alt. month" -#~ msgid "August" -#~ msgstr "Agosto" - -#~ msgctxt "alt. month" -#~ msgid "September" -#~ msgstr "Septiembre" - -#~ msgctxt "alt. month" -#~ msgid "October" -#~ msgstr "Octubre" - -#~ msgctxt "alt. month" -#~ msgid "November" -#~ msgstr "Noviembre" - -#~ msgctxt "alt. month" -#~ msgid "December" -#~ msgstr "Diciembre" - -#~ msgid "This is not a valid IPv6 address." -#~ msgstr "Esta no es una dirección IPv6 válida." - -#~ msgctxt "String to return when truncating text" -#~ msgid "%(truncated_text)s…" -#~ msgstr "%(truncated_text)s…" - -#~ msgid "or" -#~ msgstr "o" - -#~ msgid ", " -#~ msgstr ", " - -#~ msgid "%d year" -#~ msgid_plural "%d years" -#~ msgstr[0] "%d año" -#~ msgstr[1] "%d años" - -#~ msgid "%d month" -#~ msgid_plural "%d months" -#~ msgstr[0] "%d mes" -#~ msgstr[1] "%d meses" - -#~ msgid "%d week" -#~ msgid_plural "%d weeks" -#~ msgstr[0] "%d semana" -#~ msgstr[1] "%d semanas" - -#~ msgid "%d day" -#~ msgid_plural "%d days" -#~ msgstr[0] "%d día" -#~ msgstr[1] "%d días" - -#~ msgid "%d hour" -#~ msgid_plural "%d hours" -#~ msgstr[0] "%d hora" -#~ msgstr[1] "%d horas" - -#~ msgid "%d minute" -#~ msgid_plural "%d minutes" -#~ msgstr[0] "%d minuto" -#~ msgstr[1] "%d minutos" - -#~ msgid "Forbidden" -#~ msgstr "Prohibido" - -#~ msgid "CSRF verification failed. Request aborted." -#~ msgstr "Se falló la verificación CSRF. Se abortó la solicitud." - -#~ msgid "You are seeing this message because this HTTPS site requires a “Referer header” to be sent by your Web browser, but none was sent. This header is required for security reasons, to ensure that your browser is not being hijacked by third parties." -#~ msgstr "Estás viendo este mensaje porque este sitio HTTPS requiere que tu navegador Web envie un “Referer header”, pero no se la envió. Esta cabecedera se requiere por razones de seguridad, para asegurar que tu navegador no sea secuestrado por terceros." - -#~ msgid "If you have configured your browser to disable “Referer” headers, please re-enable them, at least for this site, or for HTTPS connections, or for “same-origin” requests." -#~ msgstr "Si has configurado su navegador para deshabilitar las cabecederas “Referer”, vuelva a habilitarlos, al menos para este sitio, o para conexiones HTTPS, o para solicitudes del “same-origin”. " - -#~ msgid "If you are using the tag or including the “Referrer-Policy: no-referrer” header, please remove them. The CSRF protection requires the “Referer” header to do strict referer checking. If you’re concerned about privacy, use alternatives like for links to third-party sites." -#~ msgstr "Si estás usando la eqtigueta o estás incluyendo la cabecedera “Referrer-Policy: no-referrer”, quitalas por favor. La protección CSRF require la cabecedera “Referer” para hacer verficación “strict referer“. Si te preocupa la privacidad, utiliza alternativas como para sitios de terceros." - -#~ msgid "You are seeing this message because this site requires a CSRF cookie when submitting forms. This cookie is required for security reasons, to ensure that your browser is not being hijacked by third parties." -#~ msgstr "Estás viendo este mensaje porque este sitio requiere un cookie CSRF cuando se envie formularios. Este cookie se requiere por razones de seguridad, para asegurar que tu navegador no sea secuestrado por terceros." - -#~ msgid "If you have configured your browser to disable cookies, please re-enable them, at least for this site, or for “same-origin” requests." -#~ msgstr "Si has configurado su navegador para deshabilitar los cookies, vuelva a habilitarlos, al menos para este sitio, o para conexiones HTTPS, o para solicitudes del “same-origin”. " - -#~ msgid "More information is available with DEBUG=True." -#~ msgstr "Más información es disponible con DEBUG=True." - -#~ msgid "No year specified" -#~ msgstr "Ningun año fue especificado" - -#~ msgid "Date out of range" -#~ msgstr "Fecha fuera de rango" - -#~ msgid "No month specified" -#~ msgstr "Ningun mes fue especificado" - -#~ msgid "No day specified" -#~ msgstr "Ningun día fue especificado" - -#~ msgid "No week specified" -#~ msgstr "Ninguna semana fue especificado" - -#~ msgid "No %(verbose_name_plural)s available" -#~ msgstr "No %(verbose_name_plural)s disponible" - -#~ msgid "Future %(verbose_name_plural)s not available because %(class_name)s.allow_future is False." -#~ msgstr "%(verbose_name_plural)s del futuro no está disponible porque %(class_name)s.allow_future es False." - -#~ msgid "Invalid date string “%(datestr)s” given format “%(format)s”" -#~ msgstr "Cadena de fecha invalida “%(datestr)s” dado el formato “%(format)s”" - -#~ msgid "No %(verbose_name)s found matching the query" -#~ msgstr "No se encontró ningún %(verbose_name)s correspondiente a la búsqueda" - -#~ msgid "Page is not “last”, nor can it be converted to an int." -#~ msgstr "Página no es “last”, ni puede ser convertido en un int." - -#~ msgid "Invalid page (%(page_number)s): %(message)s" -#~ msgstr "Página invalida (%(page_number)s): %(message)s" - -#~ msgid "Empty list and “%(class_name)s.allow_empty” is False." -#~ msgstr "Lista vacia y “%(class_name)s.allow_empty” es False." - -#~ msgid "Directory indexes are not allowed here." -#~ msgstr "Indices directorios no se permiten aquí." - -#~ msgid "“%(path)s” does not exist" -#~ msgstr "“%(path)s” no existe" - -#~ msgid "Index of %(directory)s" -#~ msgstr "Indice de %(directory)s" - -#~ msgid "Django: the Web framework for perfectionists with deadlines." -#~ msgstr "Django: el estructura Web para perfeccionistas con fechas límites." - -#~ msgid "View release notes for Django %(version)s" -#~ msgstr "Ver notas de lanzamiento por Django %(version)s" - -#~ msgid "The install worked successfully! Congratulations!" -#~ msgstr "¡La instalación fue exitoso! ¡Felicidades!" - -#~ msgid "You are seeing this page because DEBUG=True is in your settings file and you have not configured any URLs." -#~ msgstr "Estás viendo esta pagina porque DEBUG=True está en tu archivo de configuración y no has configurado ningún URL." - -#~ msgid "Django Documentation" -#~ msgstr "Documentación de Django" - -#~ msgid "Topics, references, & how-to’s" -#~ msgstr "Tópicos, referencias, & instrucciones paso-a-paso" - -#~ msgid "Tutorial: A Polling App" -#~ msgstr "Tutorial: Una aplicación polling" - -#~ msgid "Get started with Django" -#~ msgstr "Empezar con Django" - -#~ msgid "Django Community" -#~ msgstr "Comunidad Django" - -#~ msgid "Connect, get help, or contribute" -#~ msgstr "Conectarse, encontrar ayuda, o contribuir" - -#~ msgid "Attempting to connect to qpid with SASL mechanism %s" -#~ msgstr "Intentando conectar con qpid con mecanismo SASL %s" - -#~ msgid "Connected to qpid with SASL mechanism %s" -#~ msgstr "Conectado con qpid con mecanismo SASL %s" - -#~ msgid "Unable to connect to qpid with SASL mechanism %s" -#~ msgstr "No se pudo conectar con qpid con mecanismo SASL %s" - -#~ msgid "1 second ago" -#~ msgstr "Hace 1 segundo" - -#~ msgid "1 minute ago" -#~ msgstr "Hace 1 minuto" - -#~ msgid "1 hour ago" -#~ msgstr "Hace 1 hora" - -#~ msgid "%(time)s" -#~ msgstr "%(time)s" - -#~ msgid "yesterday" -#~ msgstr "ayer" - -# TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock -# a working clock is broken twice a day! -#~ msgid "yesterday at %(time)s" -#~ msgstr "ayer a las %(time)s" - -#~ msgid "%(weekday)s" -#~ msgstr "%(weekday)s" - -# TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock -# a working clock is broken twice a day! -#~ msgid "%(weekday)s at %(time)s" -#~ msgstr "%(weekday)s a las %(time)s" - -#~ msgid "%(month_name)s %(day)s" -#~ msgstr "%(day)s %(month_name)s" - -# TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock -# a working clock is broken twice a day! -#~ msgid "%(month_name)s %(day)s at %(time)s" -#~ msgstr "%(day)s %(month_name)s a las %(time)s" - -#~ msgid "%(month_name)s %(day)s, %(year)s" -#~ msgstr "%(day)s %(month_name)s, %(year)s" - -# TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock -# a working clock is broken twice a day! -#~ msgid "%(month_name)s %(day)s, %(year)s at %(time)s" -#~ msgstr "%(day)s %(month_name)s, %(year)s a las %(time)s" - -#~ msgid "%(weekday)s, %(month_name)s %(day)s" -#~ msgstr "%(weekday)s, %(day)s %(month_name)s" - -#~ msgid "%(commas)s and %(last)s" -#~ msgstr "%(commas)s y %(last)s" - -#~ msgctxt "law" -#~ msgid "right" -#~ msgstr "justo" - -#~ msgctxt "good" -#~ msgid "right" -#~ msgstr "correcto" - -#~ msgctxt "organization" -#~ msgid "club" -#~ msgstr "club" - -#~ msgctxt "stick" -#~ msgid "club" -#~ msgstr "garrote" - #, fuzzy #~| msgid "Started" #~ msgid "Getting Started" @@ -3630,9 +4369,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Tags" #~ msgstr "Etiquetas" -#~ msgid "Your shelves" -#~ msgstr "Tus estantes" - #~ msgid "Your lists" #~ msgstr "Tus listas" diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po index c05a9f7a..ee2f7936 100644 --- a/locale/fr_FR/LC_MESSAGES/django.po +++ b/locale/fr_FR/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-09 21:53+0000\n" +"POT-Creation-Date: 2021-04-26 09:56-0700\n" "PO-Revision-Date: 2021-04-05 12:44+0100\n" "Last-Translator: Fabien Basmaison \n" "Language-Team: Mouse Reeve \n" @@ -18,35 +18,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: bookwyrm/forms.py:226 +#: bookwyrm/forms.py:224 msgid "A user with this email already exists." msgstr "Cet email est déjà associé à un compte." -#: bookwyrm/forms.py:240 +#: bookwyrm/forms.py:238 msgid "One Day" msgstr "Un jour" -#: bookwyrm/forms.py:241 +#: bookwyrm/forms.py:239 msgid "One Week" msgstr "Une semaine" -#: bookwyrm/forms.py:242 +#: bookwyrm/forms.py:240 msgid "One Month" msgstr "Un mois" -#: bookwyrm/forms.py:243 +#: bookwyrm/forms.py:241 msgid "Does Not Expire" msgstr "Sans expiration" -#: bookwyrm/forms.py:248 +#: bookwyrm/forms.py:246 #, python-format msgid "%(count)d uses" msgstr "%(count)d utilisations" -#: bookwyrm/forms.py:251 +#: bookwyrm/forms.py:249 msgid "Unlimited" msgstr "Sans limite" +#: bookwyrm/forms.py:293 +msgid "List Order" +msgstr "" + +#: bookwyrm/forms.py:294 +#, fuzzy +#| msgid "Title" +msgid "Book Title" +msgstr "Titre" + +#: bookwyrm/forms.py:295 bookwyrm/templates/snippets/create_status_form.html:31 +#: bookwyrm/templates/user/shelf.html:80 bookwyrm/templates/user/shelf.html:110 +msgid "Rating" +msgstr "Note" + +#: bookwyrm/forms.py:297 bookwyrm/templates/lists/list.html:82 +msgid "Sort By" +msgstr "" + +#: bookwyrm/forms.py:301 +#, fuzzy +#| msgid "Sorted ascending" +msgid "Ascending" +msgstr "Trié par ordre croissant" + +#: bookwyrm/forms.py:302 +#, fuzzy +#| msgid "Sorted ascending" +msgid "Descending" +msgstr "Trié par ordre croissant" + #: bookwyrm/models/fields.py:24 #, python-format msgid "%(value)s is not a valid remote_id" @@ -57,7 +88,7 @@ msgstr "%(value)s n’est pas une remote_id valide." msgid "%(value)s is not a valid username" msgstr "%(value)s n’est pas un nom de compte valide." -#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:152 +#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:153 msgid "username" msgstr "nom du compte :" @@ -65,23 +96,23 @@ msgstr "nom du compte :" msgid "A user with that username already exists." msgstr "Ce nom est déjà associé à un compte." -#: bookwyrm/settings.py:150 +#: bookwyrm/settings.py:152 msgid "English" msgstr "English" -#: bookwyrm/settings.py:151 +#: bookwyrm/settings.py:153 msgid "German" msgstr "Deutsch" -#: bookwyrm/settings.py:152 +#: bookwyrm/settings.py:154 msgid "Spanish" msgstr "Español" -#: bookwyrm/settings.py:153 +#: bookwyrm/settings.py:155 msgid "French" msgstr "Français" -#: bookwyrm/settings.py:154 +#: bookwyrm/settings.py:156 msgid "Simplified Chinese" msgstr "简化字" @@ -137,58 +168,48 @@ msgstr "Ajouter une couverture" msgid "Failed to load cover" msgstr "La couverture n’a pu être chargée" -#: bookwyrm/templates/book/book.html:74 -msgid "ISBN:" -msgstr "ISBN :" - -#: bookwyrm/templates/book/book.html:81 -#: bookwyrm/templates/book/edit_book.html:223 -msgid "OCLC Number:" -msgstr "Numéro OCLC :" - -#: bookwyrm/templates/book/book.html:88 -#: bookwyrm/templates/book/edit_book.html:227 -msgid "ASIN:" -msgstr "ASIN :" - -#: bookwyrm/templates/book/book.html:97 +#: bookwyrm/templates/book/book.html:82 msgid "View on OpenLibrary" msgstr "Voir sur OpenLibrary" -#: bookwyrm/templates/book/book.html:117 +#: bookwyrm/templates/book/book.html:102 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s critique)" msgstr[1] "(%(review_count)s critiques)" -#: bookwyrm/templates/book/book.html:129 +#: bookwyrm/templates/book/book.html:114 msgid "Add Description" msgstr "Ajouter une description" -#: bookwyrm/templates/book/book.html:136 +#: bookwyrm/templates/book/book.html:121 #: bookwyrm/templates/book/edit_book.html:107 #: bookwyrm/templates/lists/form.html:12 msgid "Description:" msgstr "Description :" -#: bookwyrm/templates/book/book.html:140 -#: bookwyrm/templates/book/edit_book.html:237 +#: bookwyrm/templates/book/book.html:125 +#: bookwyrm/templates/book/edit_book.html:240 #: bookwyrm/templates/edit_author.html:78 bookwyrm/templates/lists/form.html:42 #: bookwyrm/templates/preferences/edit_user.html:70 +#: bookwyrm/templates/settings/edit_server.html:68 +#: bookwyrm/templates/settings/federated_server.html:93 #: bookwyrm/templates/settings/site.html:93 #: bookwyrm/templates/snippets/readthrough.html:75 #: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42 #: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:34 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:38 msgid "Save" msgstr "Enregistrer" -#: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:126 bookwyrm/templates/book/book.html:175 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:238 +#: bookwyrm/templates/book/edit_book.html:241 #: bookwyrm/templates/edit_author.html:79 -#: bookwyrm/templates/moderation/report_modal.html:32 +#: bookwyrm/templates/moderation/report_modal.html:34 +#: bookwyrm/templates/settings/federated_server.html:94 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 #: bookwyrm/templates/snippets/goal_form.html:32 #: bookwyrm/templates/snippets/readthrough.html:76 @@ -199,73 +220,116 @@ msgstr "Enregistrer" msgid "Cancel" msgstr "Annuler" -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:135 #, python-format msgid "%(count)s editions" msgstr "%(count)s éditions" -#: bookwyrm/templates/book/book.html:158 +#: bookwyrm/templates/book/book.html:143 #, python-format msgid "This edition is on your %(shelf_name)s shelf." -msgstr "Cette édition est sur votre étagère %(shelf_name)s." +msgstr "" +"Cette édition est sur votre étagère %(shelf_name)s." -#: bookwyrm/templates/book/book.html:164 +#: bookwyrm/templates/book/book.html:149 #, python-format -msgid "A different edition of this book is on your %(shelf_name)s shelf." -msgstr "Une édition différente de ce livre existe sur votre étagère %(shelf_name)s." +msgid "" +"A different edition of this book is on your %(shelf_name)s shelf." +msgstr "" +"Une édition différente de ce livre existe sur " +"votre étagère %(shelf_name)s." -#: bookwyrm/templates/book/book.html:173 +#: bookwyrm/templates/book/book.html:158 msgid "Your reading activity" msgstr "Votre activité de lecture" -#: bookwyrm/templates/book/book.html:175 +#: bookwyrm/templates/book/book.html:160 msgid "Add read dates" msgstr "Ajouter des dates de lecture" -#: bookwyrm/templates/book/book.html:180 +#: bookwyrm/templates/book/book.html:165 msgid "You don't have any reading activity for this book." msgstr "Vous n’avez aucune activité de lecture pour ce livre" -#: bookwyrm/templates/book/book.html:187 +#: bookwyrm/templates/book/book.html:172 msgid "Create" msgstr "Créer" -#: bookwyrm/templates/book/book.html:209 +#: bookwyrm/templates/book/book.html:194 msgid "Subjects" msgstr "Sujets" -#: bookwyrm/templates/book/book.html:221 +#: bookwyrm/templates/book/book.html:206 msgid "Places" msgstr "Lieux" -#: bookwyrm/templates/book/book.html:232 bookwyrm/templates/layout.html:64 +#: bookwyrm/templates/book/book.html:217 bookwyrm/templates/layout.html:65 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search_results.html:91 #: bookwyrm/templates/user/user_layout.html:62 msgid "Lists" msgstr "Listes" -#: bookwyrm/templates/book/book.html:243 +#: bookwyrm/templates/book/book.html:228 msgid "Add to list" msgstr "Ajouter à la liste" -#: bookwyrm/templates/book/book.html:253 +#: bookwyrm/templates/book/book.html:238 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:90 +#: bookwyrm/templates/lists/list.html:133 msgid "Add" msgstr "Ajouter" -#: bookwyrm/templates/book/book.html:291 +#: bookwyrm/templates/book/book.html:254 +#, fuzzy +#| msgid "Review" +msgid "Reviews" +msgstr "Critique" + +#: bookwyrm/templates/book/book.html:259 +#, fuzzy +#| msgid "Your shelves" +msgid "Your reviews" +msgstr "Vos étagères" + +#: bookwyrm/templates/book/book.html:265 +#, fuzzy +#| msgid "Your Account" +msgid "Your comments" +msgstr "Votre compte" + +#: bookwyrm/templates/book/book.html:271 +#, fuzzy +#| msgid "Your books" +msgid "Your quotes" +msgstr "Vos livres" + +#: bookwyrm/templates/book/book.html:305 msgid "rated it" msgstr "l’a noté" +#: bookwyrm/templates/book/book_identifiers.html:8 +msgid "ISBN:" +msgstr "ISBN :" + +#: bookwyrm/templates/book/book_identifiers.html:15 +#: bookwyrm/templates/book/edit_book.html:226 +msgid "OCLC Number:" +msgstr "Numéro OCLC :" + +#: bookwyrm/templates/book/book_identifiers.html:22 +#: bookwyrm/templates/book/edit_book.html:230 +msgid "ASIN:" +msgstr "ASIN :" + #: bookwyrm/templates/book/cover_modal.html:17 -#: bookwyrm/templates/book/edit_book.html:175 +#: bookwyrm/templates/book/edit_book.html:178 msgid "Upload cover:" msgstr "Charger une couverture :" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:181 +#: bookwyrm/templates/book/edit_book.html:184 msgid "Load cover from url:" msgstr "Charger la couverture depuis une URL :" @@ -349,78 +413,78 @@ msgstr "Titre :" msgid "Subtitle:" msgstr "Sous‑titre :" -#: bookwyrm/templates/book/edit_book.html:112 +#: bookwyrm/templates/book/edit_book.html:113 msgid "Series:" msgstr "Série :" -#: bookwyrm/templates/book/edit_book.html:117 +#: bookwyrm/templates/book/edit_book.html:120 msgid "Series number:" msgstr "Numéro dans la série :" -#: bookwyrm/templates/book/edit_book.html:123 +#: bookwyrm/templates/book/edit_book.html:126 msgid "Publisher:" msgstr "Éditeur :" -#: bookwyrm/templates/book/edit_book.html:125 +#: bookwyrm/templates/book/edit_book.html:128 msgid "Separate multiple publishers with commas." msgstr "Séparez plusieurs éditeurs par une virgule." -#: bookwyrm/templates/book/edit_book.html:132 +#: bookwyrm/templates/book/edit_book.html:135 msgid "First published date:" msgstr "Première date de publication :" -#: bookwyrm/templates/book/edit_book.html:140 +#: bookwyrm/templates/book/edit_book.html:143 msgid "Published date:" msgstr "Date de publication :" -#: bookwyrm/templates/book/edit_book.html:149 +#: bookwyrm/templates/book/edit_book.html:152 msgid "Authors" msgstr "Auteurs ou autrices" -#: bookwyrm/templates/book/edit_book.html:155 +#: bookwyrm/templates/book/edit_book.html:158 #, python-format msgid "Remove %(name)s" msgstr "Supprimer %(name)s" -#: bookwyrm/templates/book/edit_book.html:160 +#: bookwyrm/templates/book/edit_book.html:163 msgid "Add Authors:" msgstr "Ajouter des auteurs ou autrices :" -#: bookwyrm/templates/book/edit_book.html:161 +#: bookwyrm/templates/book/edit_book.html:164 msgid "John Doe, Jane Smith" msgstr "Claude Dupont, Dominique Durand" -#: bookwyrm/templates/book/edit_book.html:167 -#: bookwyrm/templates/user/shelf.html:75 +#: bookwyrm/templates/book/edit_book.html:170 +#: bookwyrm/templates/user/shelf.html:74 msgid "Cover" msgstr "Couverture" -#: bookwyrm/templates/book/edit_book.html:194 +#: bookwyrm/templates/book/edit_book.html:197 msgid "Physical Properties" msgstr "Propriétés physiques" -#: bookwyrm/templates/book/edit_book.html:195 +#: bookwyrm/templates/book/edit_book.html:198 #: bookwyrm/templates/book/format_filter.html:5 msgid "Format:" msgstr "Format :" -#: bookwyrm/templates/book/edit_book.html:203 +#: bookwyrm/templates/book/edit_book.html:206 msgid "Pages:" msgstr "Pages :" -#: bookwyrm/templates/book/edit_book.html:210 +#: bookwyrm/templates/book/edit_book.html:213 msgid "Book Identifiers" msgstr "Identifiants du livre" -#: bookwyrm/templates/book/edit_book.html:211 +#: bookwyrm/templates/book/edit_book.html:214 msgid "ISBN 13:" msgstr "ISBN 13 :" -#: bookwyrm/templates/book/edit_book.html:215 +#: bookwyrm/templates/book/edit_book.html:218 msgid "ISBN 10:" msgstr "ISBN 10 :" -#: bookwyrm/templates/book/edit_book.html:219 +#: bookwyrm/templates/book/edit_book.html:222 #: bookwyrm/templates/edit_author.html:59 msgid "Openlibrary key:" msgstr "Clé Openlibrary :" @@ -464,17 +528,17 @@ msgstr "%(pages)s pages" msgid "%(languages)s language" msgstr "%(languages)s langues" -#: bookwyrm/templates/book/publisher_info.html:65 +#: bookwyrm/templates/book/publisher_info.html:64 #, python-format msgid "Published %(date)s by %(publisher)s." msgstr "Publié %(date)s par %(publisher)s." -#: bookwyrm/templates/book/publisher_info.html:67 +#: bookwyrm/templates/book/publisher_info.html:66 #, python-format msgid "Published %(date)s" msgstr "Publié %(date)s" -#: bookwyrm/templates/book/publisher_info.html:69 +#: bookwyrm/templates/book/publisher_info.html:68 #, python-format msgid "Published by %(publisher)s." msgstr "Publié par %(publisher)s." @@ -505,18 +569,24 @@ msgstr "Communauté fédérée" #: bookwyrm/templates/directory/directory.html:6 #: bookwyrm/templates/directory/directory.html:11 -#: bookwyrm/templates/layout.html:92 +#: bookwyrm/templates/layout.html:93 msgid "Directory" msgstr "Répertoire" #: bookwyrm/templates/directory/directory.html:19 msgid "Make your profile discoverable to other BookWyrm users." -msgstr "Autoriser d’autres utilisateurs ou utilisatrices de BookWyrm à découvrir votre profil." +msgstr "" +"Autoriser d’autres utilisateurs ou utilisatrices de BookWyrm à découvrir " +"votre profil." #: bookwyrm/templates/directory/directory.html:26 #, python-format -msgid "You can opt-out at any time in your profile settings." -msgstr "Vous pouvez décider de ne plus y figurer à n’importe quel moment depuis vos paramètres de profil." +msgid "" +"You can opt-out at any time in your profile settings." +msgstr "" +"Vous pouvez décider de ne plus y figurer à n’importe quel moment depuis vos " +"paramètres de profil." #: bookwyrm/templates/directory/directory.html:31 #: bookwyrm/templates/snippets/goal_card.html:22 @@ -629,7 +699,7 @@ msgid "Email address:" msgstr "Adresse email :" #: bookwyrm/templates/discover/landing_layout.html:70 -#: bookwyrm/templates/moderation/report_modal.html:31 +#: bookwyrm/templates/moderation/report_modal.html:33 msgid "Submit" msgstr "Valider" @@ -682,8 +752,12 @@ msgstr "Bien le bonjour," #: bookwyrm/templates/email/html_layout.html:21 #, python-format -msgid "BookWyrm hosted on %(site_name)s" -msgstr "BookWyrm, hébergé par %(site_name)s" +msgid "" +"BookWyrm hosted on " +"%(site_name)s" +msgstr "" +"BookWyrm, hébergé par %(site_name)s" #: bookwyrm/templates/email/html_layout.html:23 msgid "Email preference" @@ -701,13 +775,21 @@ msgstr "S’enregistrer maintenant" #: bookwyrm/templates/email/invite/html_content.html:15 #, python-format -msgid "Learn more about this instance." -msgstr "En savoir plus sur cette instance." +msgid "" +"Learn more about this instance." +msgstr "" +"En savoir plus sur cette " +"instance." #: bookwyrm/templates/email/invite/text_content.html:4 #, python-format -msgid "You're invited to join %(site_name)s! Click the link below to create an account." -msgstr "Vous avez reçu une invitation à rejoindre %(site_name)s ! Cliquez le lien suivant pour créer un compte." +msgid "" +"You're invited to join %(site_name)s! Click the link below to create an " +"account." +msgstr "" +"Vous avez reçu une invitation à rejoindre %(site_name)s ! Cliquez le lien " +"suivant pour créer un compte." #: bookwyrm/templates/email/invite/text_content.html:8 msgid "Learn more about this instance:" @@ -716,8 +798,13 @@ msgstr "En savoir plus sur cete instance :" #: bookwyrm/templates/email/password_reset/html_content.html:6 #: bookwyrm/templates/email/password_reset/text_content.html:4 #, python-format -msgid "You requested to reset your %(site_name)s password. Click the link below to set a new password and log in to your account." -msgstr "Une demande de réinitialisation de votre mot de passe sur %(site_name)s a été initialisée. Cliquez le lien suivant pour définir un nouveau mot de passe et vous connecter à votre compte." +msgid "" +"You requested to reset your %(site_name)s password. Click the link below to " +"set a new password and log in to your account." +msgstr "" +"Une demande de réinitialisation de votre mot de passe sur %(site_name)s a été initialisée. Cliquez le lien suivant pour définir un nouveau mot de " +"passe et vous connecter à votre compte." #: bookwyrm/templates/email/password_reset/html_content.html:9 #: bookwyrm/templates/password_reset.html:4 @@ -729,8 +816,11 @@ msgstr "Changez le mot de passe" #: bookwyrm/templates/email/password_reset/html_content.html:13 #: bookwyrm/templates/email/password_reset/text_content.html:8 -msgid "If you didn't request to reset your password, you can ignore this email." -msgstr "Si vous n’avez pas demandé la réinitialisation de votre mot de passe, vous pouvez ignorer cet email." +msgid "" +"If you didn't request to reset your password, you can ignore this email." +msgstr "" +"Si vous n’avez pas demandé la réinitialisation de votre mot de passe, vous " +"pouvez ignorer cet email." #: bookwyrm/templates/email/password_reset/subject.html:2 #, python-format @@ -743,7 +833,7 @@ msgid "Direct Messages with %(username)s" msgstr "Messages directs avec %(username)s" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:87 +#: bookwyrm/templates/layout.html:88 msgid "Direct Messages" msgstr "Messages directs" @@ -776,17 +866,21 @@ msgid "Local" msgstr "Local" #: bookwyrm/templates/feed/feed.html:25 +#: bookwyrm/templates/settings/edit_server.html:40 msgid "Federated" msgstr "Fédéré" #: bookwyrm/templates/feed/feed.html:33 #, python-format msgid "load 0 unread status(es)" -msgstr "charger le(s) 0 statut(s) non lu(s)" +msgstr "" +"charger le(s) 0 statut(s) non lu(s)" #: bookwyrm/templates/feed/feed.html:48 -msgid "There aren't any activities right now! Try following a user to get started" -msgstr "Aucune activité pour l’instant ! Abonnez‑vous à quelqu’un pour commencer" +msgid "" +"There aren't any activities right now! Try following a user to get started" +msgstr "" +"Aucune activité pour l’instant ! Abonnez‑vous à quelqu’un pour commencer" #: bookwyrm/templates/feed/feed.html:56 #: bookwyrm/templates/get_started/users.html:6 @@ -798,13 +892,14 @@ msgid "Updates" msgstr "Mises à jour" #: bookwyrm/templates/feed/feed_layout.html:11 -#: bookwyrm/templates/layout.html:58 +#: bookwyrm/templates/layout.html:59 #: bookwyrm/templates/user/books_header.html:3 msgid "Your books" msgstr "Vos livres" #: bookwyrm/templates/feed/feed_layout.html:13 -msgid "There are no books here right now! Try searching for a book to get started" +msgid "" +"There are no books here right now! Try searching for a book to get started" msgstr "Aucun livre ici pour l’instant ! Cherchez un livre pour commencer" #: bookwyrm/templates/feed/feed_layout.html:24 @@ -853,7 +948,7 @@ msgid "What are you reading?" msgstr "Que lisez‑vous ?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:58 +#: bookwyrm/templates/lists/list.html:101 msgid "Search for a book" msgstr "Chercher un livre" @@ -867,14 +962,16 @@ msgstr "Aucun livre trouvé pour « %(query)s »" #: bookwyrm/templates/get_started/books.html:11 #, python-format msgid "You can add books when you start using %(site_name)s." -msgstr "Vous pourrez ajouter des livres lorsque vous commencerez à utiliser %(site_name)s." +msgstr "" +"Vous pourrez ajouter des livres lorsque vous commencerez à utiliser " +"%(site_name)s." #: bookwyrm/templates/get_started/books.html:16 #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38 -#: bookwyrm/templates/lists/list.html:62 +#: bookwyrm/templates/layout.html:38 bookwyrm/templates/layout.html:39 +#: bookwyrm/templates/lists/list.html:105 msgid "Search" msgstr "Chercher" @@ -888,7 +985,7 @@ msgid "Popular on %(site_name)s" msgstr "Populaire sur %(site_name)s" #: bookwyrm/templates/get_started/books.html:51 -#: bookwyrm/templates/lists/list.html:75 +#: bookwyrm/templates/lists/list.html:118 msgid "No books found" msgstr "Aucun livre trouvé" @@ -957,8 +1054,12 @@ msgid "Show this account in suggested users:" msgstr "Afficher ce compte dans ceux suggérés :" #: bookwyrm/templates/get_started/profile.html:52 -msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." -msgstr "Votre compte sera listé dans le répertoire et pourra être recommandé à d’autres utilisateurs ou utilisatrices de BookWyrm." +msgid "" +"Your account will show up in the directory, and may be recommended to other " +"BookWyrm users." +msgstr "" +"Votre compte sera listé dans le répertoire et pourra être recommandé à " +"d’autres utilisateurs ou utilisatrices de BookWyrm." #: bookwyrm/templates/get_started/users.html:11 msgid "Search for a user" @@ -982,8 +1083,12 @@ msgstr "Modifier le défi" #: bookwyrm/templates/goal.html:30 #: bookwyrm/templates/snippets/goal_card.html:13 #, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." -msgstr "Définissez un nombre de livre à lire comme objectif pour %(year)s, et suivezvotre progression au fil de l’année." +msgid "" +"Set a goal for how many books you'll finish reading in %(year)s, and track " +"your progress throughout the year." +msgstr "" +"Définissez un nombre de livre à lire comme objectif pour %(year)s, et " +"suivezvotre progression au fil de l’année." #: bookwyrm/templates/goal.html:39 #, python-format @@ -1001,7 +1106,7 @@ msgid "%(username)s's %(year)s Books" msgstr "Livres de %(username)s en %(year)s" #: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9 -#: bookwyrm/templates/layout.html:97 +#: bookwyrm/templates/layout.html:98 msgid "Import Books" msgstr "Importer des livres" @@ -1022,6 +1127,7 @@ msgid "Privacy setting for imported reviews:" msgstr "Confidentialité des critiques importées :" #: bookwyrm/templates/import.html:48 +#: bookwyrm/templates/settings/server_blocklist.html:64 msgid "Import" msgstr "Importer" @@ -1064,8 +1170,12 @@ msgstr "Items non importés" #: bookwyrm/templates/import_status.html:44 #, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." -msgstr "Sauter en bas de liste pour sélectionner les %(failed_count)s items n’ayant pu être importés." +msgid "" +"Jump to the bottom of the list to select the %(failed_count)s items which " +"failed to import." +msgstr "" +"Sauter en bas de liste pour sélectionner les %(failed_count)s items n’ayant " +"pu être importés." #: bookwyrm/templates/import_status.html:79 msgid "Select all" @@ -1086,12 +1196,12 @@ msgstr "Livre" #: bookwyrm/templates/import_status.html:115 #: bookwyrm/templates/snippets/create_status_form.html:10 -#: bookwyrm/templates/user/shelf.html:76 +#: bookwyrm/templates/user/shelf.html:75 bookwyrm/templates/user/shelf.html:93 msgid "Title" msgstr "Titre" #: bookwyrm/templates/import_status.html:118 -#: bookwyrm/templates/user/shelf.html:77 +#: bookwyrm/templates/user/shelf.html:76 bookwyrm/templates/user/shelf.html:96 msgid "Author" msgstr "Auteur ou autrice" @@ -1128,86 +1238,94 @@ msgstr "Résultats de recherche pour « %(query)s »" msgid "Matching Books" msgstr "Livres correspondants" -#: bookwyrm/templates/layout.html:33 +#: bookwyrm/templates/layout.html:34 msgid "Search for a book or user" msgstr "Chercher un livre ou un compte" -#: bookwyrm/templates/layout.html:47 bookwyrm/templates/layout.html:48 +#: bookwyrm/templates/layout.html:48 bookwyrm/templates/layout.html:49 msgid "Main navigation menu" msgstr "Menu de navigation principal " -#: bookwyrm/templates/layout.html:61 +#: bookwyrm/templates/layout.html:62 msgid "Feed" msgstr "Fil d’actualité" -#: bookwyrm/templates/layout.html:102 +#: bookwyrm/templates/layout.html:103 msgid "Settings" msgstr "Paramètres" -#: bookwyrm/templates/layout.html:111 -#: bookwyrm/templates/settings/admin_layout.html:24 +#: bookwyrm/templates/layout.html:112 +#: bookwyrm/templates/settings/admin_layout.html:31 #: bookwyrm/templates/settings/manage_invite_requests.html:15 #: bookwyrm/templates/settings/manage_invites.html:3 #: bookwyrm/templates/settings/manage_invites.html:15 msgid "Invites" msgstr "Invitations" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:119 msgid "Admin" msgstr "Admin" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:126 msgid "Log out" msgstr "Se déconnecter" -#: bookwyrm/templates/layout.html:133 bookwyrm/templates/layout.html:134 +#: bookwyrm/templates/layout.html:134 bookwyrm/templates/layout.html:135 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:10 msgid "Notifications" msgstr "Notifications" -#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155 +#: bookwyrm/templates/layout.html:152 bookwyrm/templates/layout.html:156 #: bookwyrm/templates/login.html:17 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "Nom du compte :" -#: bookwyrm/templates/layout.html:156 +#: bookwyrm/templates/layout.html:157 msgid "password" msgstr "Mot de passe" -#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36 +#: bookwyrm/templates/layout.html:158 bookwyrm/templates/login.html:36 msgid "Forgot your password?" msgstr "Mot de passe oublié ?" -#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10 +#: bookwyrm/templates/layout.html:161 bookwyrm/templates/login.html:10 #: bookwyrm/templates/login.html:33 msgid "Log in" msgstr "Se connecter" -#: bookwyrm/templates/layout.html:168 +#: bookwyrm/templates/layout.html:169 msgid "Join" msgstr "Rejoindre" -#: bookwyrm/templates/layout.html:191 +#: bookwyrm/templates/layout.html:195 msgid "About this server" msgstr "À propos de ce serveur" -#: bookwyrm/templates/layout.html:195 +#: bookwyrm/templates/layout.html:199 msgid "Contact site admin" msgstr "Contacter l’administrateur du site" -#: bookwyrm/templates/layout.html:202 -#, python-format -msgid "Support %(site_name)s on %(support_title)s" -msgstr "Soutenez %(site_name)s avec %(support_title)s" - #: bookwyrm/templates/layout.html:206 -msgid "BookWyrm is open source software. You can contribute or report issues on GitHub." -msgstr "BookWyrm est un logiciel libre. Vous pouvez contribuer ou faire des rapports de bogues via GitHub." +#, python-format +msgid "" +"Support %(site_name)s on " +"%(support_title)s" +msgstr "" +"Soutenez %(site_name)s avec " +"%(support_title)s" + +#: bookwyrm/templates/layout.html:210 +msgid "" +"BookWyrm is open source software. You can contribute or report issues on GitHub." +msgstr "" +"BookWyrm est un logiciel libre. Vous pouvez contribuer ou faire des rapports " +"de bogues via GitHub." #: bookwyrm/templates/lists/create_form.html:5 -#: bookwyrm/templates/lists/lists.html:19 +#: bookwyrm/templates/lists/lists.html:20 msgid "Create List" msgstr "Créer une liste" @@ -1271,7 +1389,7 @@ msgid "Anyone can suggest books, subject to your approval" msgstr "N’importe qui peut suggérer des livres, soumis à votre approbation" #: bookwyrm/templates/lists/form.html:31 -#: bookwyrm/templates/moderation/reports.html:24 +#: bookwyrm/templates/moderation/reports.html:25 msgid "Open" msgstr "Ouverte" @@ -1279,42 +1397,76 @@ msgstr "Ouverte" msgid "Anyone can add books to this list" msgstr "N’importe qui peut suggérer des livres" -#: bookwyrm/templates/lists/list.html:17 +#: bookwyrm/templates/lists/list.html:19 +msgid "You successfully suggested a book for this list!" +msgstr "" + +#: bookwyrm/templates/lists/list.html:21 +#, fuzzy +#| msgid "Anyone can add books to this list" +msgid "You successfully added a book to this list!" +msgstr "N’importe qui peut suggérer des livres" + +#: bookwyrm/templates/lists/list.html:27 msgid "This list is currently empty" msgstr "Cette liste est vide actuellement" -#: bookwyrm/templates/lists/list.html:35 +#: bookwyrm/templates/lists/list.html:46 #, python-format msgid "Added by %(username)s" msgstr "Ajoutée par %(username)s" -#: bookwyrm/templates/lists/list.html:41 +#: bookwyrm/templates/lists/list.html:58 +#, fuzzy +#| msgid "Sent" +msgid "Set" +msgstr "Envoyé(e)s" + +#: bookwyrm/templates/lists/list.html:61 +#, fuzzy +#| msgid "List curation:" +msgid "List position" +msgstr "Modération de la liste :" + +#: bookwyrm/templates/lists/list.html:67 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Supprimer" -#: bookwyrm/templates/lists/list.html:54 +#: bookwyrm/templates/lists/list.html:80 bookwyrm/templates/lists/list.html:92 +#, fuzzy +#| msgid "Your Lists" +msgid "Sort List" +msgstr "Vos listes" + +#: bookwyrm/templates/lists/list.html:86 +#, fuzzy +#| msgid "Directory" +msgid "Direction" +msgstr "Répertoire" + +#: bookwyrm/templates/lists/list.html:97 msgid "Add Books" msgstr "Ajouter des livres" -#: bookwyrm/templates/lists/list.html:54 +#: bookwyrm/templates/lists/list.html:97 msgid "Suggest Books" msgstr "Suggérer des livres" -#: bookwyrm/templates/lists/list.html:63 +#: bookwyrm/templates/lists/list.html:106 msgid "search" msgstr "Chercher" -#: bookwyrm/templates/lists/list.html:69 +#: bookwyrm/templates/lists/list.html:112 msgid "Clear search" msgstr "Vider la requête" -#: bookwyrm/templates/lists/list.html:74 +#: bookwyrm/templates/lists/list.html:117 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "Aucun livre trouvé pour la requête « %(query)s »" -#: bookwyrm/templates/lists/list.html:90 +#: bookwyrm/templates/lists/list.html:133 msgid "Suggest" msgstr "Suggérer" @@ -1339,59 +1491,39 @@ msgstr "Contacter un administrateur pour obtenir une invitation" msgid "More about this site" msgstr "En savoir plus sur ce site" -#: bookwyrm/templates/moderation/report.html:5 #: bookwyrm/templates/moderation/report.html:6 +#: bookwyrm/templates/moderation/report.html:7 #: bookwyrm/templates/moderation/report_preview.html:6 #, python-format msgid "Report #%(report_id)s: %(username)s" msgstr "Signalement #%(report_id)s : %(username)s" -#: bookwyrm/templates/moderation/report.html:10 +#: bookwyrm/templates/moderation/report.html:11 msgid "Back to reports" msgstr "Retour aux signalements" -#: bookwyrm/templates/moderation/report.html:18 -msgid "Actions" -msgstr "Actions" - -#: bookwyrm/templates/moderation/report.html:19 -msgid "View user profile" -msgstr "Voir le profil" - -#: bookwyrm/templates/moderation/report.html:22 -#: bookwyrm/templates/snippets/status/status_options.html:35 -#: bookwyrm/templates/snippets/user_options.html:13 -msgid "Send direct message" -msgstr "Envoyer un message direct" - -#: bookwyrm/templates/moderation/report.html:27 -msgid "Deactivate user" -msgstr "Désactiver le compte" - -#: bookwyrm/templates/moderation/report.html:29 -msgid "Reactivate user" -msgstr "Réactiver le compte" - -#: bookwyrm/templates/moderation/report.html:36 +#: bookwyrm/templates/moderation/report.html:23 msgid "Moderator Comments" msgstr "Commentaires de l’équipe de modération" -#: bookwyrm/templates/moderation/report.html:54 +#: bookwyrm/templates/moderation/report.html:41 #: bookwyrm/templates/snippets/create_status.html:28 -#: bookwyrm/templates/snippets/create_status_form.html:44 +#: bookwyrm/templates/snippets/create_status_form.html:53 msgid "Comment" msgstr "Commentaire" -#: bookwyrm/templates/moderation/report.html:59 +#: bookwyrm/templates/moderation/report.html:46 msgid "Reported statuses" msgstr "Statuts signalés" -#: bookwyrm/templates/moderation/report.html:61 +#: bookwyrm/templates/moderation/report.html:48 msgid "No statuses reported" msgstr "Aucun statut signalé" -#: bookwyrm/templates/moderation/report.html:67 -msgid "Statuses has been deleted" +#: bookwyrm/templates/moderation/report.html:54 +#, fuzzy +#| msgid "Statuses has been deleted" +msgid "Status has been deleted" msgstr "Les statuts ont été supprimés" #: bookwyrm/templates/moderation/report_modal.html:6 @@ -1399,12 +1531,14 @@ msgstr "Les statuts ont été supprimés" msgid "Report @%(username)s" msgstr "Signaler @%(username)s" -#: bookwyrm/templates/moderation/report_modal.html:21 +#: bookwyrm/templates/moderation/report_modal.html:23 #, python-format msgid "This report will be sent to %(site_name)s's moderators for review." -msgstr "Ce signalement sera envoyé à l’équipe de modération de %(site_name)s pour traitement." +msgstr "" +"Ce signalement sera envoyé à l’équipe de modération de %(site_name)s pour " +"traitement." -#: bookwyrm/templates/moderation/report_modal.html:22 +#: bookwyrm/templates/moderation/report_modal.html:24 msgid "More info about this report:" msgstr "En savoir plus sur ce signalement :" @@ -1431,21 +1565,21 @@ msgid "Reports: %(server_name)s" msgstr "Signalements : %(server_name)s" #: bookwyrm/templates/moderation/reports.html:8 -#: bookwyrm/templates/moderation/reports.html:16 -#: bookwyrm/templates/settings/admin_layout.html:28 +#: bookwyrm/templates/moderation/reports.html:17 +#: bookwyrm/templates/settings/admin_layout.html:35 msgid "Reports" msgstr "Signalements" -#: bookwyrm/templates/moderation/reports.html:13 +#: bookwyrm/templates/moderation/reports.html:14 #, python-format msgid "Reports: %(server_name)s" msgstr "Signalements: %(server_name)s" -#: bookwyrm/templates/moderation/reports.html:27 +#: bookwyrm/templates/moderation/reports.html:28 msgid "Resolved" msgstr "Résolus" -#: bookwyrm/templates/moderation/reports.html:34 +#: bookwyrm/templates/moderation/reports.html:37 msgid "No reports found." msgstr "Aucun signalement trouvé." @@ -1455,18 +1589,30 @@ msgstr "Supprimer les notifications" #: bookwyrm/templates/notifications.html:53 #, python-format -msgid "favorited your review of %(book_title)s" -msgstr "a ajouté votre critique de %(book_title)s à ses favoris" +msgid "" +"favorited your review of %(book_title)s" +msgstr "" +"a ajouté votre critique de %(book_title)s à ses favoris" #: bookwyrm/templates/notifications.html:55 #, python-format -msgid "favorited your comment on %(book_title)s" -msgstr "a ajouté votre commentaire sur %(book_title)s à ses favoris" +msgid "" +"favorited your comment on %(book_title)s" +msgstr "" +"a ajouté votre commentaire sur " +"%(book_title)s à ses favoris" #: bookwyrm/templates/notifications.html:57 #, python-format -msgid "favorited your quote from %(book_title)s" -msgstr "a ajouté votre citation de %(book_title)s à ses favoris" +msgid "" +"favorited your quote from %(book_title)s" +msgstr "" +"a ajouté votre citation de %(book_title)s à ses favoris" #: bookwyrm/templates/notifications.html:59 #, python-format @@ -1475,18 +1621,30 @@ msgstr "a ajouté votre statut à ses favoris" #: bookwyrm/templates/notifications.html:64 #, python-format -msgid "mentioned you in a review of %(book_title)s" -msgstr "vous a mentionné dans sa critique de %(book_title)s" +msgid "" +"mentioned you in a review of " +"%(book_title)s" +msgstr "" +"vous a mentionné dans sa critique de " +"%(book_title)s" #: bookwyrm/templates/notifications.html:66 #, python-format -msgid "mentioned you in a comment on %(book_title)s" -msgstr "vous a mentionné dans son commentaire sur %(book_title)s" +msgid "" +"mentioned you in a comment on " +"%(book_title)s" +msgstr "" +"vous a mentionné dans son commentaire sur " +"%(book_title)s" #: bookwyrm/templates/notifications.html:68 #, python-format -msgid "mentioned you in a quote from %(book_title)s" -msgstr "vous a mentionné dans sa citation de %(book_title)s" +msgid "" +"mentioned you in a quote from " +"%(book_title)s" +msgstr "" +"vous a mentionné dans sa citation de " +"%(book_title)s" #: bookwyrm/templates/notifications.html:70 #, python-format @@ -1495,23 +1653,39 @@ msgstr "vous a mentionné dans son statut" #: bookwyrm/templates/notifications.html:75 #, python-format -msgid "replied to your review of %(book_title)s" -msgstr "a répondu à votre critique de %(book_title)s" +msgid "" +"replied to your review of %(book_title)s" +msgstr "" +"a répondu à votre critique de %(book_title)s" #: bookwyrm/templates/notifications.html:77 #, python-format -msgid "replied to your comment on %(book_title)s" -msgstr "a répondu à votre commentaire sur %(book_title)s" +msgid "" +"replied to your comment on %(book_title)s" +msgstr "" +"a répondu à votre commentaire sur %(book_title)s" #: bookwyrm/templates/notifications.html:79 #, python-format -msgid "replied to your quote from %(book_title)s" -msgstr "a répondu à votre citation de %(book_title)s" +msgid "" +"replied to your quote from %(book_title)s" +msgstr "" +"a répondu à votre citation de %(book_title)s" #: bookwyrm/templates/notifications.html:81 #, python-format -msgid "replied to your status" -msgstr "a répondu à votre statut" +msgid "" +"replied to your status" +msgstr "" +"a répondu à votre statut" #: bookwyrm/templates/notifications.html:85 msgid "followed you" @@ -1523,18 +1697,30 @@ msgstr "vous a envoyé une demande d’abonnement" #: bookwyrm/templates/notifications.html:94 #, python-format -msgid "boosted your review of %(book_title)s" -msgstr "a partagé votre critique de %(book_title)s" +msgid "" +"boosted your review of %(book_title)s" +msgstr "" +"a partagé votre critique de %(book_title)s" #: bookwyrm/templates/notifications.html:96 #, python-format -msgid "boosted your comment on%(book_title)s" -msgstr "a partagé votre commentaire sur %(book_title)s" +msgid "" +"boosted your comment on%(book_title)s" +msgstr "" +"a partagé votre commentaire sur " +"%(book_title)s" #: bookwyrm/templates/notifications.html:98 #, python-format -msgid "boosted your quote from %(book_title)s" -msgstr "a partagé votre citation de %(book_title)s" +msgid "" +"boosted your quote from %(book_title)s" +msgstr "" +"a partagé votre citation de %(book_title)s" #: bookwyrm/templates/notifications.html:100 #, python-format @@ -1543,13 +1729,21 @@ msgstr "a partagé votre statut" #: bookwyrm/templates/notifications.html:104 #, python-format -msgid " added %(book_title)s to your list \"%(list_name)s\"" -msgstr " a ajouté %(book_title)s à votre liste « %(list_name)s »" +msgid "" +" added %(book_title)s to your list " +"\"%(list_name)s\"" +msgstr "" +" a ajouté %(book_title)s à votre " +"liste « %(list_name)s »" #: bookwyrm/templates/notifications.html:106 #, python-format -msgid " suggested adding %(book_title)s to your list \"%(list_name)s\"" -msgstr " a suggégré l’ajout de %(book_title)s à votre liste « %(list_name)s »" +msgid "" +" suggested adding %(book_title)s to " +"your list \"%(list_name)s\"" +msgstr "" +" a suggégré l’ajout de %(book_title)s " +"à votre liste « %(list_name)s »" #: bookwyrm/templates/notifications.html:110 #, python-format @@ -1559,7 +1753,8 @@ msgstr "Votre importation est terminée." #: bookwyrm/templates/notifications.html:113 #, python-format msgid "A new report needs moderation." -msgstr "Un nouveau signalement a besoin d’être traité." +msgstr "" +"Un nouveau signalement a besoin d’être traité." #: bookwyrm/templates/notifications.html:139 msgid "You're all caught up!" @@ -1572,7 +1767,8 @@ msgstr "Confirmez le mot de passe :" #: bookwyrm/templates/password_reset_request.html:14 msgid "A link to reset your password will be sent to your email address" -msgstr "Un lien pour changer votre mot de passe sera envoyé à votre addresse email" +msgstr "" +"Un lien pour changer votre mot de passe sera envoyé à votre addresse email" #: bookwyrm/templates/password_reset_request.html:28 msgid "Reset password" @@ -1606,12 +1802,17 @@ msgstr "Modifier le profil" #: bookwyrm/templates/preferences/edit_user.html:46 msgid "Show set reading goal prompt in feed:" -msgstr "Afficher le message pour définir un défi lecture dans le fil d’actualité :" +msgstr "" +"Afficher le message pour définir un défi lecture dans le fil d’actualité :" #: bookwyrm/templates/preferences/edit_user.html:62 #, python-format -msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." -msgstr "Votre compte sera listé dans le répertoire et pourra être recommandé à d’autres utilisateurs ou utilisatrices de BookWyrm." +msgid "" +"Your account will show up in the directory, and may " +"be recommended to other BookWyrm users." +msgstr "" +"Votre compte sera listé dans le répertoire et " +"pourra être recommandé à d’autres utilisateurs ou utilisatrices de BookWyrm." #: bookwyrm/templates/preferences/edit_user.html:65 msgid "Preferred Timezone: " @@ -1654,118 +1855,197 @@ msgstr "Aucune liste trouvée pour « %(query)s »" msgid "Administration" msgstr "Administration" -#: bookwyrm/templates/settings/admin_layout.html:15 +#: bookwyrm/templates/settings/admin_layout.html:22 msgid "Manage Users" msgstr "Gérer les comptes" -#: bookwyrm/templates/settings/admin_layout.html:19 -#: bookwyrm/templates/settings/user_admin.html:3 -#: bookwyrm/templates/settings/user_admin.html:10 +#: bookwyrm/templates/settings/admin_layout.html:26 +#: bookwyrm/templates/user_admin/user_admin.html:3 +#: bookwyrm/templates/user_admin/user_admin.html:10 msgid "Users" msgstr "Comptes" -#: bookwyrm/templates/settings/admin_layout.html:32 +#: bookwyrm/templates/settings/admin_layout.html:39 #: bookwyrm/templates/settings/federation.html:3 #: bookwyrm/templates/settings/federation.html:5 msgid "Federated Servers" msgstr "Serveurs fédérés" -#: bookwyrm/templates/settings/admin_layout.html:37 +#: bookwyrm/templates/settings/admin_layout.html:44 msgid "Instance Settings" msgstr "Paramètres de l’instance" -#: bookwyrm/templates/settings/admin_layout.html:41 +#: bookwyrm/templates/settings/admin_layout.html:48 #: bookwyrm/templates/settings/site.html:4 #: bookwyrm/templates/settings/site.html:6 msgid "Site Settings" msgstr "Paramètres du site" -#: bookwyrm/templates/settings/admin_layout.html:44 +#: bookwyrm/templates/settings/admin_layout.html:51 #: bookwyrm/templates/settings/site.html:13 msgid "Instance Info" msgstr "Information sur l’instance" -#: bookwyrm/templates/settings/admin_layout.html:45 +#: bookwyrm/templates/settings/admin_layout.html:52 #: bookwyrm/templates/settings/site.html:39 msgid "Images" msgstr "Images" -#: bookwyrm/templates/settings/admin_layout.html:46 +#: bookwyrm/templates/settings/admin_layout.html:53 #: bookwyrm/templates/settings/site.html:59 msgid "Footer Content" msgstr "Contenu du pied de page" -#: bookwyrm/templates/settings/admin_layout.html:47 +#: bookwyrm/templates/settings/admin_layout.html:54 #: bookwyrm/templates/settings/site.html:77 msgid "Registration" msgstr "Enregistrement" -#: bookwyrm/templates/settings/federated_server.html:7 +#: bookwyrm/templates/settings/edit_server.html:3 +#: bookwyrm/templates/settings/edit_server.html:6 +#: bookwyrm/templates/settings/edit_server.html:20 +#: bookwyrm/templates/settings/federation.html:9 +#: bookwyrm/templates/settings/federation.html:10 +#: bookwyrm/templates/settings/server_blocklist.html:3 +#: bookwyrm/templates/settings/server_blocklist.html:20 +#, fuzzy +#| msgid "Add cover" +msgid "Add server" +msgstr "Ajouter une couverture" + +#: bookwyrm/templates/settings/edit_server.html:7 +#: bookwyrm/templates/settings/federated_server.html:12 +#: bookwyrm/templates/settings/server_blocklist.html:7 msgid "Back to server list" msgstr "Retour à la liste des serveurs" -#: bookwyrm/templates/settings/federated_server.html:12 -msgid "Details" -msgstr "Détails" +#: bookwyrm/templates/settings/edit_server.html:16 +#: bookwyrm/templates/settings/server_blocklist.html:16 +#, fuzzy +#| msgid "Import book" +msgid "Import block list" +msgstr "Importer le livre" -#: bookwyrm/templates/settings/federated_server.html:15 -msgid "Software:" -msgstr "Logiciel :" +#: bookwyrm/templates/settings/edit_server.html:30 +#, fuzzy +#| msgid "Instance Name:" +msgid "Instance:" +msgstr "Nom de l’instance :" -#: bookwyrm/templates/settings/federated_server.html:19 -msgid "Version:" -msgstr "Description :" - -#: bookwyrm/templates/settings/federated_server.html:23 +#: bookwyrm/templates/settings/edit_server.html:37 +#: bookwyrm/templates/settings/federated_server.html:29 +#: bookwyrm/templates/user_admin/user_info.html:34 msgid "Status:" msgstr "Statut :" -#: bookwyrm/templates/settings/federated_server.html:30 +#: bookwyrm/templates/settings/edit_server.html:41 +#: bookwyrm/templates/settings/federated_server.html:9 +#, fuzzy +#| msgid "Block" +msgid "Blocked" +msgstr "Bloquer" + +#: bookwyrm/templates/settings/edit_server.html:48 +#: bookwyrm/templates/settings/federated_server.html:21 +#: bookwyrm/templates/user_admin/user_info.html:26 +msgid "Software:" +msgstr "Logiciel :" + +#: bookwyrm/templates/settings/edit_server.html:55 +#: bookwyrm/templates/settings/federated_server.html:25 +#: bookwyrm/templates/user_admin/user_info.html:30 +msgid "Version:" +msgstr "Description :" + +#: bookwyrm/templates/settings/edit_server.html:64 +msgid "Notes:" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:18 +msgid "Details" +msgstr "Détails" + +#: bookwyrm/templates/settings/federated_server.html:36 #: bookwyrm/templates/user/user_layout.html:50 msgid "Activity" msgstr "Activité" -#: bookwyrm/templates/settings/federated_server.html:33 +#: bookwyrm/templates/settings/federated_server.html:39 msgid "Users:" msgstr "Comptes :" -#: bookwyrm/templates/settings/federated_server.html:36 -#: bookwyrm/templates/settings/federated_server.html:43 +#: bookwyrm/templates/settings/federated_server.html:42 +#: bookwyrm/templates/settings/federated_server.html:49 msgid "View all" msgstr "Voir tous" -#: bookwyrm/templates/settings/federated_server.html:40 +#: bookwyrm/templates/settings/federated_server.html:46 msgid "Reports:" msgstr "Signalements :" -#: bookwyrm/templates/settings/federated_server.html:47 +#: bookwyrm/templates/settings/federated_server.html:53 msgid "Followed by us:" msgstr "Suivi par nous :" -#: bookwyrm/templates/settings/federated_server.html:53 +#: bookwyrm/templates/settings/federated_server.html:59 msgid "Followed by them:" msgstr "Suivi par eux :" -#: bookwyrm/templates/settings/federated_server.html:59 +#: bookwyrm/templates/settings/federated_server.html:65 msgid "Blocked by us:" msgstr "Bloqués par nous :" -#: bookwyrm/templates/settings/federation.html:13 +#: bookwyrm/templates/settings/federated_server.html:77 +#: bookwyrm/templates/user_admin/user_info.html:39 +msgid "Notes" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:80 +#, fuzzy +#| msgid "Edit Book" +msgid "Edit" +msgstr "Modifier le livre" + +#: bookwyrm/templates/settings/federated_server.html:100 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:3 +msgid "Actions" +msgstr "Actions" + +#: bookwyrm/templates/settings/federated_server.html:104 +#: bookwyrm/templates/snippets/block_button.html:5 +msgid "Block" +msgstr "Bloquer" + +#: bookwyrm/templates/settings/federated_server.html:105 +msgid "All users from this instance will be deactivated." +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:110 +#: bookwyrm/templates/snippets/block_button.html:10 +msgid "Un-block" +msgstr "Débloquer" + +#: bookwyrm/templates/settings/federated_server.html:111 +msgid "All users from this instance will be re-activated." +msgstr "" + +#: bookwyrm/templates/settings/federation.html:20 +#: bookwyrm/templates/user_admin/server_filter.html:5 msgid "Server name" msgstr "Nom du serveur" -#: bookwyrm/templates/settings/federation.html:17 +#: bookwyrm/templates/settings/federation.html:24 msgid "Date federated" msgstr "Date de fédération" -#: bookwyrm/templates/settings/federation.html:21 +#: bookwyrm/templates/settings/federation.html:28 msgid "Software" msgstr "Logiciel" -#: bookwyrm/templates/settings/federation.html:24 +#: bookwyrm/templates/settings/federation.html:31 #: bookwyrm/templates/settings/manage_invite_requests.html:44 #: bookwyrm/templates/settings/status_filter.html:5 -#: bookwyrm/templates/settings/user_admin.html:32 +#: bookwyrm/templates/user_admin/user_admin.html:34 msgid "Status" msgstr "Statut" @@ -1875,6 +2155,27 @@ msgstr "Nombre de fois utilisée" msgid "No active invites" msgstr "Aucune invitation active" +#: bookwyrm/templates/settings/server_blocklist.html:6 +#, fuzzy +#| msgid "Import Books" +msgid "Import Blocklist" +msgstr "Importer des livres" + +#: bookwyrm/templates/settings/server_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:5 +msgid "Success!" +msgstr "Bravo !" + +#: bookwyrm/templates/settings/server_blocklist.html:30 +#, fuzzy +#| msgid "Successfully imported" +msgid "Successfully blocked:" +msgstr "Importation réussie" + +#: bookwyrm/templates/settings/server_blocklist.html:32 +msgid "Failed:" +msgstr "" + #: bookwyrm/templates/settings/site.html:15 msgid "Instance Name:" msgstr "Nom de l’instance :" @@ -1931,67 +2232,28 @@ msgstr "Autoriser les demandes d’invitation :" msgid "Registration closed text:" msgstr "Texte affiché lorsque les enregistrements sont clos :" -#: bookwyrm/templates/settings/user_admin.html:7 -#, python-format -msgid "Users: %(server_name)s" -msgstr "Comptes : %(server_name)s" - -#: bookwyrm/templates/settings/user_admin.html:20 -msgid "Username" -msgstr "Nom du compte" - -#: bookwyrm/templates/settings/user_admin.html:24 -msgid "Date Added" -msgstr "Date d’ajout" - -#: bookwyrm/templates/settings/user_admin.html:28 -msgid "Last Active" -msgstr "Dernière activité" - -#: bookwyrm/templates/settings/user_admin.html:36 -msgid "Remote server" -msgstr "Serveur distant" - -#: bookwyrm/templates/settings/user_admin.html:45 -msgid "Active" -msgstr "Actif" - -#: bookwyrm/templates/settings/user_admin.html:45 -msgid "Inactive" -msgstr "Inactif" - -#: bookwyrm/templates/settings/user_admin.html:50 -msgid "Not set" -msgstr "Non défini" - -#: bookwyrm/templates/snippets/block_button.html:5 -msgid "Block" -msgstr "Bloquer" - -#: bookwyrm/templates/snippets/block_button.html:10 -msgid "Un-block" -msgstr "Débloquer" - #: bookwyrm/templates/snippets/book_cover.html:20 #: bookwyrm/templates/snippets/search_result_text.html:10 msgid "No cover" msgstr "Aucune couverture" -#: bookwyrm/templates/snippets/book_titleby.html:3 +#: bookwyrm/templates/snippets/book_titleby.html:4 #, python-format msgid "%(title)s by " msgstr "%(title)s par " #: bookwyrm/templates/snippets/boost_button.html:8 #: bookwyrm/templates/snippets/boost_button.html:9 -#: bookwyrm/templates/snippets/status/status_body.html:52 -#: bookwyrm/templates/snippets/status/status_body.html:53 -msgid "Boost status" -msgstr "Partager le statut" +#, fuzzy +#| msgid "boosted" +msgid "Boost" +msgstr "partagé" +#: bookwyrm/templates/snippets/boost_button.html:15 #: bookwyrm/templates/snippets/boost_button.html:16 -#: bookwyrm/templates/snippets/boost_button.html:17 -msgid "Un-boost status" +#, fuzzy +#| msgid "Un-boost status" +msgid "Un-boost" msgstr "Annuler le partage du statut" #: bookwyrm/templates/snippets/content_warning_field.html:3 @@ -2010,58 +2272,60 @@ msgstr "Critique" msgid "Quote" msgstr "Citation" -#: bookwyrm/templates/snippets/create_status_form.html:18 +#: bookwyrm/templates/snippets/create_status_form.html:20 msgid "Comment:" msgstr "Commentaire :" -#: bookwyrm/templates/snippets/create_status_form.html:20 +#: bookwyrm/templates/snippets/create_status_form.html:22 msgid "Quote:" msgstr "Citation :" -#: bookwyrm/templates/snippets/create_status_form.html:22 +#: bookwyrm/templates/snippets/create_status_form.html:24 msgid "Review:" msgstr "Critique :" -#: bookwyrm/templates/snippets/create_status_form.html:29 -#: bookwyrm/templates/user/shelf.html:81 -msgid "Rating" -msgstr "Note" +#: bookwyrm/templates/snippets/create_status_form.html:42 +#: bookwyrm/templates/snippets/status/layout.html:30 +#: bookwyrm/templates/snippets/status/layout.html:48 +#: bookwyrm/templates/snippets/status/layout.html:49 +msgid "Reply" +msgstr "Répondre" -#: bookwyrm/templates/snippets/create_status_form.html:56 +#: bookwyrm/templates/snippets/create_status_form.html:67 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16 msgid "Progress:" msgstr "Progression :" -#: bookwyrm/templates/snippets/create_status_form.html:63 +#: bookwyrm/templates/snippets/create_status_form.html:75 #: bookwyrm/templates/snippets/readthrough_form.html:22 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30 msgid "pages" msgstr "pages" -#: bookwyrm/templates/snippets/create_status_form.html:64 +#: bookwyrm/templates/snippets/create_status_form.html:76 #: bookwyrm/templates/snippets/readthrough_form.html:23 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31 msgid "percent" msgstr "pourcent" -#: bookwyrm/templates/snippets/create_status_form.html:69 +#: bookwyrm/templates/snippets/create_status_form.html:82 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36 #, python-format msgid "of %(pages)s pages" msgstr "sur %(pages)s pages" -#: bookwyrm/templates/snippets/create_status_form.html:81 +#: bookwyrm/templates/snippets/create_status_form.html:97 msgid "Include spoiler alert" msgstr "Afficher une alerte spoiler" -#: bookwyrm/templates/snippets/create_status_form.html:88 +#: bookwyrm/templates/snippets/create_status_form.html:104 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy_select.html:19 msgid "Private" msgstr "Privé" -#: bookwyrm/templates/snippets/create_status_form.html:99 +#: bookwyrm/templates/snippets/create_status_form.html:115 msgid "Post" msgstr "Publier" @@ -2071,24 +2335,27 @@ msgstr "Supprimer ces dates de lecture ?" #: bookwyrm/templates/snippets/delete_readthrough_modal.html:7 #, python-format -msgid "You are deleting this readthrough and its %(count)s associated progress updates." +msgid "" +"You are deleting this readthrough and its %(count)s associated progress " +"updates." msgstr "Vous avez supprimé ce résumé et ses %(count)s progressions associées." #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:13 +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:391 msgid "Delete" msgstr "Supprimer" #: bookwyrm/templates/snippets/fav_button.html:7 -#: bookwyrm/templates/snippets/fav_button.html:8 -#: bookwyrm/templates/snippets/status/status_body.html:56 -#: bookwyrm/templates/snippets/status/status_body.html:57 -msgid "Like status" -msgstr "Ajouter le statut aux favoris" +#: bookwyrm/templates/snippets/fav_button.html:9 +msgid "Like" +msgstr "" #: bookwyrm/templates/snippets/fav_button.html:15 #: bookwyrm/templates/snippets/fav_button.html:16 -msgid "Un-like status" +#, fuzzy +#| msgid "Un-like status" +msgid "Un-like" msgstr "Retirer le statut des favoris" #: bookwyrm/templates/snippets/filters_panel/filters_panel.html:7 @@ -2128,14 +2395,6 @@ msgstr "Accepter" msgid "No rating" msgstr "Aucune note" -#: bookwyrm/templates/snippets/form_rate_stars.html:45 -#: bookwyrm/templates/snippets/stars.html:7 -#, python-format -msgid "%(rating)s star" -msgid_plural "%(rating)s stars" -msgstr[0] "%(rating)s étoile" -msgstr[1] "%(rating)s étoiles" - #: bookwyrm/templates/snippets/generated_status/goal.html:1 #, python-format msgid "set a goal to read %(counter)s book in %(year)s" @@ -2145,17 +2404,24 @@ msgstr[1] "souhaite lire %(counter)s livres en %(year)s" #: bookwyrm/templates/snippets/generated_status/rating.html:3 #, python-format -msgid "Rated %(title)s: %(display_rating)s star" -msgid_plural "Rated %(title)s: %(display_rating)s stars" +msgid "" +"Rated %(title)s: %(display_rating)s star" +msgid_plural "" +"Rated %(title)s: %(display_rating)s stars" msgstr[0] "A noté %(title)s : %(display_rating)s star" -msgstr[1] "A noté %(title)s : %(display_rating)s stars" +msgstr[1] "" +"A noté %(title)s : %(display_rating)s stars" #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4 #, python-format -msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" -msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" -msgstr[0] "Critique de « %(book_title)s » (%(display_rating)s star): %(review_title)s" -msgstr[1] "Critique de « %(book_title)s » (%(display_rating)s stars) : %(review_title)s" +msgid "" +"Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" +msgid_plural "" +"Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" +msgstr[0] "" +"Critique de « %(book_title)s » (%(display_rating)s star): %(review_title)s" +msgstr[1] "" +"Critique de « %(book_title)s » (%(display_rating)s stars) : %(review_title)s" #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:8 #, python-format @@ -2164,8 +2430,12 @@ msgstr "Critique de « %(book_title)s » : %(review_title)s" #: bookwyrm/templates/snippets/goal_card.html:23 #, python-format -msgid "You can set or change your reading goal any time from your profile page" -msgstr "Vous pouvez définir ou changer votre défi lecture à n’importe quel moment depuis votre profil" +msgid "" +"You can set or change your reading goal any time from your profile page" +msgstr "" +"Vous pouvez définir ou changer votre défi lecture à n’importe quel moment " +"depuis votre profil" #: bookwyrm/templates/snippets/goal_form.html:9 msgid "Reading goal:" @@ -2190,10 +2460,6 @@ msgstr "Publier sur le fil d’actualité" msgid "Set goal" msgstr "Valider ce défi" -#: bookwyrm/templates/snippets/goal_progress.html:5 -msgid "Success!" -msgstr "Bravo !" - #: bookwyrm/templates/snippets/goal_progress.html:7 #, python-format msgid "%(percent)s%% complete!" @@ -2201,13 +2467,20 @@ msgstr "%(percent)s%% terminé !" #: bookwyrm/templates/snippets/goal_progress.html:10 #, python-format -msgid "You've read %(read_count)s of %(goal_count)s books." -msgstr "Vous avez lu %(read_count)s sur %(goal_count)s livres." +msgid "" +"You've read %(read_count)s of %(goal_count)s books." +msgstr "" +"Vous avez lu %(read_count)s sur %(goal_count)s livres." #: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format -msgid "%(username)s has read %(read_count)s of %(goal_count)s books." -msgstr "%(username)s a lu %(read_count)s sur %(goal_count)s livres." +msgid "" +"%(username)s has read %(read_count)s of %(goal_count)s " +"books." +msgstr "" +"%(username)s a lu %(read_count)s sur %(goal_count)s " +"livres." #: bookwyrm/templates/snippets/page_text.html:4 #, python-format @@ -2313,22 +2586,22 @@ msgid "Report" msgstr "Signaler" #: bookwyrm/templates/snippets/rss_title.html:5 -#: bookwyrm/templates/snippets/status/status_header.html:21 +#: bookwyrm/templates/snippets/status/status_header.html:34 msgid "rated" msgstr "a noté" #: bookwyrm/templates/snippets/rss_title.html:7 -#: bookwyrm/templates/snippets/status/status_header.html:23 +#: bookwyrm/templates/snippets/status/status_header.html:36 msgid "reviewed" msgstr "a écrit une critique de" #: bookwyrm/templates/snippets/rss_title.html:9 -#: bookwyrm/templates/snippets/status/status_header.html:25 +#: bookwyrm/templates/snippets/status/status_header.html:38 msgid "commented on" msgstr "a commenté" #: bookwyrm/templates/snippets/rss_title.html:11 -#: bookwyrm/templates/snippets/status/status_header.html:27 +#: bookwyrm/templates/snippets/status/status_header.html:40 msgid "quoted" msgstr "a cité" @@ -2351,7 +2624,7 @@ msgid "Finish \"%(book_title)s\"" msgstr "Terminer « %(book_title)s »" #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5 -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:35 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:34 msgid "Update progress" msgstr "Progression de la mise à jour" @@ -2372,7 +2645,7 @@ msgstr "Terminer la lecture" msgid "Want to read" msgstr "Je veux le lire" -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:48 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45 #, python-format msgid "Remove from %(name)s" msgstr "Retirer de %(name)s" @@ -2387,64 +2660,63 @@ msgstr "Commencer « %(book_title)s »" msgid "Want to Read \"%(book_title)s\"" msgstr "A envie de lire « %(book_title)s »" +#: bookwyrm/templates/snippets/status/content_status.html:67 +#: bookwyrm/templates/snippets/trimmed_text.html:14 +msgid "Show more" +msgstr "Déplier" + +#: bookwyrm/templates/snippets/status/content_status.html:82 +#: bookwyrm/templates/snippets/trimmed_text.html:29 +msgid "Show less" +msgstr "Replier" + +#: bookwyrm/templates/snippets/status/content_status.html:112 +msgid "Open image in new window" +msgstr "Ouvrir l’image dans une nouvelle fenêtre" + +#: bookwyrm/templates/snippets/status/layout.html:22 +#: bookwyrm/templates/snippets/status/status_options.html:17 +msgid "Delete status" +msgstr "Supprimer le statut" + +#: bookwyrm/templates/snippets/status/layout.html:52 +#: bookwyrm/templates/snippets/status/layout.html:53 +msgid "Boost status" +msgstr "Partager le statut" + +#: bookwyrm/templates/snippets/status/layout.html:56 +#: bookwyrm/templates/snippets/status/layout.html:57 +msgid "Like status" +msgstr "Ajouter le statut aux favoris" + #: bookwyrm/templates/snippets/status/status.html:9 msgid "boosted" msgstr "partagé" -#: bookwyrm/templates/snippets/status/status_body.html:27 -#: bookwyrm/templates/snippets/status/status_options.html:18 -msgid "Delete status" -msgstr "Supprimer le statut" - -#: bookwyrm/templates/snippets/status/status_body.html:35 -#: bookwyrm/templates/snippets/status/status_body.html:48 -#: bookwyrm/templates/snippets/status/status_body.html:49 -msgid "Reply" -msgstr "Répondre" - -#: bookwyrm/templates/snippets/status/status_content.html:52 -#: bookwyrm/templates/snippets/trimmed_text.html:15 -msgid "Show more" -msgstr "Déplier" - -#: bookwyrm/templates/snippets/status/status_content.html:67 -#: bookwyrm/templates/snippets/trimmed_text.html:30 -msgid "Show less" -msgstr "Replier" - -#: bookwyrm/templates/snippets/status/status_content.html:97 -msgid "Open image in new window" -msgstr "Ouvrir l’image dans une nouvelle fenêtre" - -#: bookwyrm/templates/snippets/status/status_header.html:32 +#: bookwyrm/templates/snippets/status/status_header.html:44 #, python-format -msgid "replied to %(username)s's review" -msgstr "a répondu à la critique de %(username)s" - -#: bookwyrm/templates/snippets/status/status_header.html:34 -#, python-format -msgid "replied to %(username)s's comment" -msgstr "a répondu au commentaire de %(username)s" - -#: bookwyrm/templates/snippets/status/status_header.html:36 -#, python-format -msgid "replied to %(username)s's quote" -msgstr "a répondu à la citation de %(username)s" - -#: bookwyrm/templates/snippets/status/status_header.html:38 -#, python-format -msgid "replied to %(username)s's status" -msgstr "a répondu au statut de %(username)s" +msgid "" +"replied to %(username)s's status" +msgstr "" +"a répondu au statut de %(username)s" #: bookwyrm/templates/snippets/status/status_options.html:7 #: bookwyrm/templates/snippets/user_options.html:7 msgid "More options" msgstr "Plus d’options" -#: bookwyrm/templates/snippets/status/status_options.html:27 +#: bookwyrm/templates/snippets/status/status_options.html:26 msgid "Delete & re-draft" msgstr "Supprimer & recommencer la rédaction" +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:6 +msgid "Send direct message" +msgstr "Envoyer un message direct" + #: bookwyrm/templates/snippets/switch_edition_button.html:5 msgid "Switch to this edition" msgstr "Changer vers cette édition" @@ -2457,19 +2729,6 @@ msgstr "Trié par ordre croissant" msgid "Sorted descending" msgstr "Trié par ordre décroissant" -#: bookwyrm/templates/snippets/tag.html:14 -msgid "Remove tag" -msgstr "Supprimer le tag" - -#: bookwyrm/templates/snippets/tag.html:18 -msgid "Add tag" -msgstr "Ajouter un tag" - -#: bookwyrm/templates/tag.html:9 -#, python-format -msgid "Books tagged \"%(tag.name)s\"" -msgstr "Livres tagués « %(tag.name)s »" - #: bookwyrm/templates/user/books_header.html:5 #, python-format msgid "%(username)s's books" @@ -2517,7 +2776,7 @@ msgstr "Listes : %(username)s" msgid "Create list" msgstr "Créer une liste" -#: bookwyrm/templates/user/shelf.html:24 bookwyrm/views/shelf.py:56 +#: bookwyrm/templates/user/shelf.html:24 bookwyrm/views/shelf.py:51 msgid "All books" msgstr "Tous les livres" @@ -2529,23 +2788,23 @@ msgstr "Créer l’étagère" msgid "Edit shelf" msgstr "Modifier l’étagère" -#: bookwyrm/templates/user/shelf.html:78 +#: bookwyrm/templates/user/shelf.html:77 bookwyrm/templates/user/shelf.html:99 msgid "Shelved" msgstr "Ajouté à une étagère" -#: bookwyrm/templates/user/shelf.html:79 +#: bookwyrm/templates/user/shelf.html:78 bookwyrm/templates/user/shelf.html:103 msgid "Started" msgstr "Commencé" -#: bookwyrm/templates/user/shelf.html:80 +#: bookwyrm/templates/user/shelf.html:79 bookwyrm/templates/user/shelf.html:106 msgid "Finished" msgstr "Terminé" -#: bookwyrm/templates/user/shelf.html:129 +#: bookwyrm/templates/user/shelf.html:132 msgid "This shelf is empty." msgstr "Cette étagère est vide" -#: bookwyrm/templates/user/shelf.html:135 +#: bookwyrm/templates/user/shelf.html:138 msgid "Delete shelf" msgstr "Supprimer l’étagère" @@ -2608,6 +2867,79 @@ msgstr[1] "%(counter)s abonnements" msgid "%(counter)s following" msgstr "%(counter)s abonnements" +#: bookwyrm/templates/user_admin/user.html:11 +#, fuzzy +#| msgid "Back to reports" +msgid "Back to users" +msgstr "Retour aux signalements" + +#: bookwyrm/templates/user_admin/user_admin.html:7 +#, python-format +msgid "Users: %(server_name)s" +msgstr "Comptes : %(server_name)s" + +#: bookwyrm/templates/user_admin/user_admin.html:22 +#: bookwyrm/templates/user_admin/username_filter.html:5 +msgid "Username" +msgstr "Nom du compte" + +#: bookwyrm/templates/user_admin/user_admin.html:26 +msgid "Date Added" +msgstr "Date d’ajout" + +#: bookwyrm/templates/user_admin/user_admin.html:30 +msgid "Last Active" +msgstr "Dernière activité" + +#: bookwyrm/templates/user_admin/user_admin.html:38 +msgid "Remote server" +msgstr "Serveur distant" + +#: bookwyrm/templates/user_admin/user_admin.html:47 +msgid "Active" +msgstr "Actif" + +#: bookwyrm/templates/user_admin/user_admin.html:47 +msgid "Inactive" +msgstr "Inactif" + +#: bookwyrm/templates/user_admin/user_admin.html:52 +#: bookwyrm/templates/user_admin/user_info.html:49 +msgid "Not set" +msgstr "Non défini" + +#: bookwyrm/templates/user_admin/user_info.html:5 +#, fuzzy +#| msgid "Details" +msgid "User details" +msgstr "Détails" + +#: bookwyrm/templates/user_admin/user_info.html:14 +msgid "View user profile" +msgstr "Voir le profil" + +#: bookwyrm/templates/user_admin/user_info.html:20 +#, fuzzy +#| msgid "Instance Settings" +msgid "Instance details" +msgstr "Paramètres de l’instance" + +#: bookwyrm/templates/user_admin/user_info.html:46 +msgid "View instance" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:11 +msgid "Suspend user" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 +msgid "Un-suspend user" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:21 +msgid "Access level:" +msgstr "" + #: bookwyrm/views/password.py:32 msgid "No user with that email address was found." msgstr "Aucun compte avec cette adresse email n’a été trouvé." @@ -2617,6 +2949,1444 @@ msgstr "Aucun compte avec cette adresse email n’a été trouvé." msgid "A password reset link sent to %s" msgstr "Un lien de réinitialisation a été envoyé à %s." +#: venv3/lib/python3.8/site-packages/_pytest/config/argparsing.py:442 +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/messages/apps.py:7 +#, fuzzy +#| msgid "All messages" +msgid "Messages" +msgstr "Tous les messages" + +#: venv3/lib/python3.8/site-packages/django/contrib/sitemaps/apps.py:7 +msgid "Site Maps" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/staticfiles/apps.py:9 +msgid "Static Files" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/syndication/apps.py:7 +msgid "Syndication" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:45 +msgid "That page number is not an integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:47 +msgid "That page number is less than 1" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:52 +msgid "That page contains no results" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:32 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid value." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:103 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:659 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid URL." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:155 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid integer." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:166 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid email address." +msgstr "Adresse email :" + +#. Translators: "letters" means latin letters: a-z and A-Z. +#: venv3/lib/python3.8/site-packages/django/core/validators.py:240 +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:247 +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:256 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:276 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid IPv4 address." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:261 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:277 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid IPv6 address." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:271 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:275 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:305 +msgid "Enter only digits separated by commas." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:311 +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:343 +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:352 +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:362 +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:377 +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:396 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:291 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:326 +#, fuzzy +#| msgid "Series number:" +msgid "Enter a number." +msgstr "Numéro dans la série :" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:398 +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:403 +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:408 +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:470 +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:522 +msgid "Null characters are not allowed." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/base.py:1181 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:759 +msgid "and" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/base.py:1183 +#, fuzzy, python-format +#| msgid "A user with this email already exists." +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "Cet email est déjà associé à un compte." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:104 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid remote_id" +msgid "Value %(value)r is not a valid choice." +msgstr "%(value)s n’est pas une remote_id valide." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:105 +#, fuzzy +#| msgid "This shelf is empty." +msgid "This field cannot be null." +msgstr "Cette étagère est vide" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:106 +msgid "This field cannot be blank." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:107 +#, fuzzy, python-format +#| msgid "A user with this email already exists." +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "Cet email est déjà associé à un compte." + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:111 +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:130 +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:937 +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:938 +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:940 +msgid "Boolean (Either True or False)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:981 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1045 +#, fuzzy +#| msgid "No active invites" +msgid "Comma-separated integers" +msgstr "Aucune invitation active" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1094 +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1096 +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1239 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1099 +msgid "Date (without time)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1237 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1241 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1245 +msgid "Date (with time)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1393 +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1395 +#, fuzzy +#| msgid "Series number:" +msgid "Decimal number" +msgstr "Numéro dans la série :" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1534 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1537 +#, fuzzy +#| msgid "List curation:" +msgid "Duration" +msgstr "Modération de la liste :" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1587 +#, fuzzy +#| msgid "Email address:" +msgid "Email address" +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1610 +msgid "File path" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1676 +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1678 +msgid "Floating point number" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1716 +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1718 +msgid "Integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1801 +#, fuzzy +#| msgid "No active invites" +msgid "Big (8 byte) integer" +msgstr "Aucune invitation active" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1817 +#, fuzzy +#| msgid "Email address:" +msgid "IPv4 address" +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1848 +#, fuzzy +#| msgid "Email address:" +msgid "IP address" +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1928 +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1929 +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1931 +msgid "Boolean (Either True, False or None)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1966 +#, fuzzy +#| msgid "No active invites" +msgid "Positive integer" +msgstr "Aucune invitation active" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1979 +#, fuzzy +#| msgid "No active invites" +msgid "Positive small integer" +msgstr "Aucune invitation active" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1993 +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2025 +msgid "Small integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2032 +msgid "Text" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2060 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2062 +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2065 +msgid "Time" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2191 +msgid "URL" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2213 +msgid "Raw binary data" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2278 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid username" +msgid "“%(value)s” is not a valid UUID." +msgstr "%(value)s n’est pas un nom de compte valide." + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2280 +msgid "Universally unique identifier" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/files.py:221 +msgid "File" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/files.py:360 +#, fuzzy +#| msgid "Images" +msgid "Image" +msgstr "Images" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:778 +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:780 +msgid "Foreign Key (type determined by related field)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1012 +#, fuzzy +#| msgid "Relationships" +msgid "One-to-one relationship" +msgstr "Relations" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1066 +#, fuzzy, python-format +#| msgid "Relationships" +msgid "%(from)s-%(to)s relationship" +msgstr "Relations" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1067 +#, fuzzy, python-format +#| msgid "Relationships" +msgid "%(from)s-%(to)s relationships" +msgstr "Relations" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1109 +#, fuzzy +#| msgid "Relationships" +msgid "Many-to-many relationship" +msgstr "Relations" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the label +#: venv3/lib/python3.8/site-packages/django/forms/boundfield.py:149 +msgid ":?.!" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:53 +#, fuzzy +#| msgid "This shelf is empty." +msgid "This field is required." +msgstr "Cette étagère est vide" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:246 +#, fuzzy +#| msgid "Series number:" +msgid "Enter a whole number." +msgstr "Numéro dans la série :" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:397 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1127 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid date." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:421 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1128 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid time." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:443 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid date/time." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:472 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid duration." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:473 +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:533 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:534 +msgid "No file was submitted." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:535 +#, fuzzy +#| msgid "This shelf is empty." +msgid "The submitted file is empty." +msgstr "Cette étagère est vide" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:537 +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:540 +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:601 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:763 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:853 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1275 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:854 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:969 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1274 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a list of values." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:970 +msgid "Enter a complete value." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1186 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid UUID." +msgstr "Adresse email :" + +#. Translators: This is the default suffix added to form field labels +#: venv3/lib/python3.8/site-packages/django/forms/forms.py:81 +msgid ":" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/forms.py:207 +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:93 +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:345 +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:352 +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:379 +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:386 +#, fuzzy +#| msgid "Order by" +msgid "Order" +msgstr "Trier par" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:754 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:758 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:764 +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:773 +msgid "Please correct the duplicate values below." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1094 +msgid "The inline value did not match the parent instance." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1161 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1277 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid username" +msgid "“%(pk)s” is not a valid value." +msgstr "%(value)s n’est pas un nom de compte valide." + +#: venv3/lib/python3.8/site-packages/django/forms/utils.py:162 +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:395 +msgid "Clear" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:396 +#, fuzzy +#| msgid "Started reading" +msgid "Currently" +msgstr "Commencer la lecture" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:397 +#, fuzzy +#| msgid "Change shelf" +msgid "Change" +msgstr "Changer d’étagère" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:709 +msgid "Unknown" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:710 +msgid "Yes" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:711 +msgid "No" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:788 +msgid "yes,no,maybe" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:817 +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:834 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:836 +#, python-format +msgid "%s KB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:838 +#, python-format +msgid "%s MB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:840 +#, python-format +msgid "%s GB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:842 +#, python-format +msgid "%s TB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:844 +#, python-format +msgid "%s PB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:62 +msgid "p.m." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:63 +msgid "a.m." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:68 +msgid "PM" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:69 +msgid "AM" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:150 +msgid "midnight" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:152 +msgid "noon" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:295 +msgid "Monday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:296 +msgid "Tuesday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:297 +msgid "Wednesday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:298 +msgid "Thursday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:299 +msgid "Friday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:7 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:300 +msgid "Saturday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:7 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:301 +msgid "Sunday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Mon" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Tue" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Wed" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Thu" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Fri" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:11 +#, fuzzy +#| msgid "Status" +msgid "Sat" +msgstr "Statut" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:11 +msgid "Sun" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:281 +msgid "January" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:282 +msgid "February" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:283 +#, fuzzy +#| msgid "Search" +msgid "March" +msgstr "Chercher" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:284 +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:285 +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:286 +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:287 +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:288 +msgid "August" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:289 +#, fuzzy +#| msgid "Series number:" +msgid "September" +msgstr "Numéro dans la série :" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:290 +msgid "October" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:291 +msgid "November" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:16 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:292 +#, fuzzy +#| msgid "Series number:" +msgid "December" +msgstr "Numéro dans la série :" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "jan" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "feb" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "mar" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "apr" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "may" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "jun" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "jul" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "aug" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "sep" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "oct" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "nov" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "dec" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:23 +msgctxt "abbrev. month" +msgid "Jan." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:24 +msgctxt "abbrev. month" +msgid "Feb." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:25 +#, fuzzy +#| msgid "Search" +msgctxt "abbrev. month" +msgid "March" +msgstr "Chercher" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:26 +msgctxt "abbrev. month" +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:27 +msgctxt "abbrev. month" +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:28 +msgctxt "abbrev. month" +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:29 +msgctxt "abbrev. month" +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:30 +msgctxt "abbrev. month" +msgid "Aug." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:31 +msgctxt "abbrev. month" +msgid "Sept." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:32 +msgctxt "abbrev. month" +msgid "Oct." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:33 +msgctxt "abbrev. month" +msgid "Nov." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:34 +msgctxt "abbrev. month" +msgid "Dec." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:37 +msgctxt "alt. month" +msgid "January" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:38 +msgctxt "alt. month" +msgid "February" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:39 +#, fuzzy +#| msgid "Search" +msgctxt "alt. month" +msgid "March" +msgstr "Chercher" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:40 +msgctxt "alt. month" +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:41 +msgctxt "alt. month" +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:42 +msgctxt "alt. month" +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:43 +msgctxt "alt. month" +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:44 +msgctxt "alt. month" +msgid "August" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:45 +#, fuzzy +#| msgid "Series number:" +msgctxt "alt. month" +msgid "September" +msgstr "Numéro dans la série :" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:46 +msgctxt "alt. month" +msgid "October" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:47 +msgctxt "alt. month" +msgid "November" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:48 +#, fuzzy +#| msgid "Series number:" +msgctxt "alt. month" +msgid "December" +msgstr "Numéro dans la série :" + +#: venv3/lib/python3.8/site-packages/django/utils/ipv6.py:8 +#, fuzzy +#| msgid "Email address:" +msgid "This is not a valid IPv6 address." +msgstr "Adresse email :" + +#: venv3/lib/python3.8/site-packages/django/utils/text.py:69 +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/text.py:235 +msgid "or" +msgstr "" + +#. Translators: This string is used as a separator between list elements +#: venv3/lib/python3.8/site-packages/django/utils/text.py:254 +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:83 +msgid ", " +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:9 +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:10 +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:11 +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:12 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:13 +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:14 +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" +msgstr[1] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:72 +msgid "0 minutes" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:110 +msgid "Forbidden" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:111 +msgid "CSRF verification failed. Request aborted." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:115 +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:120 +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:124 +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:132 +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:137 +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:142 +msgid "More information is available with DEBUG=True." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:41 +msgid "No year specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:61 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:111 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:208 +msgid "Date out of range" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:90 +msgid "No month specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:142 +msgid "No day specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:188 +msgid "No week specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:338 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:367 +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:589 +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:623 +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/detail.py:54 +#, fuzzy, python-format +#| msgid "No books found matching the query \"%(query)s\"" +msgid "No %(verbose_name)s found matching the query" +msgstr "Aucun livre trouvé pour la requête « %(query)s »" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:67 +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:72 +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:154 +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:40 +msgid "Directory indexes are not allowed here." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:42 +#, python-format +msgid "“%(path)s” does not exist" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:80 +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:7 +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:346 +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:368 +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:369 +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:384 +msgid "Django Documentation" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:385 +msgid "Topics, references, & how-to’s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:396 +msgid "Tutorial: A Polling App" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:397 +msgid "Get started with Django" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:408 +#, fuzzy +#| msgid "Community" +msgid "Django Community" +msgstr "Communauté" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:409 +msgid "Connect, get help, or contribute" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1301 +#, python-format +msgid "Attempting to connect to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1306 +#, python-format +msgid "Connected to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1324 +#, python-format +msgid "Unable to connect to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:371 +msgid "1 second ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:377 +msgid "1 minute ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:382 +msgid "1 hour ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:385 +#, python-format +msgid "%(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:387 +msgid "yesterday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:387 +#, python-format +msgid "yesterday at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:389 +#, python-format +msgid "%(weekday)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:389 +#, python-format +msgid "%(weekday)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:392 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:445 +#, python-format +msgid "%(month_name)s %(day)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:394 +#, python-format +msgid "%(month_name)s %(day)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:399 +#, python-format +msgid "%(month_name)s %(day)s, %(year)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:401 +#, python-format +msgid "%(month_name)s %(day)s, %(year)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:439 +#, python-format +msgid "%(weekday)s, %(month_name)s %(day)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:462 +#, python-format +msgid "%(commas)s and %(last)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:68 +msgctxt "law" +msgid "right" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:69 +msgctxt "good" +msgid "right" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:71 +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:74 +msgctxt "organization" +msgid "club" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:76 +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:77 +msgctxt "stick" +msgid "club" +msgstr "" + +#~ msgid "Deactivate user" +#~ msgstr "Désactiver le compte" + +#~ msgid "Reactivate user" +#~ msgstr "Réactiver le compte" + +#, python-format +#~ msgid "%(rating)s star" +#~ msgid_plural "%(rating)s stars" +#~ msgstr[0] "%(rating)s étoile" +#~ msgstr[1] "%(rating)s étoiles" + +#, python-format +#~ msgid "" +#~ "replied to %(username)s's review" +#~ msgstr "" +#~ "a répondu à la critique de %(username)s" + +#, python-format +#~ msgid "" +#~ "replied to %(username)s's comment" +#~ msgstr "" +#~ "a répondu au commentaire de %(username)s" + +#, python-format +#~ msgid "" +#~ "replied to %(username)s's quote" +#~ msgstr "" +#~ "a répondu à la citation de %(username)s" + +#~ msgid "Remove tag" +#~ msgstr "Supprimer le tag" + +#~ msgid "Add tag" +#~ msgstr "Ajouter un tag" + +#, python-format +#~ msgid "Books tagged \"%(tag.name)s\"" +#~ msgstr "Livres tagués « %(tag.name)s »" + #, fuzzy #~| msgid "Started" #~ msgid "Getting Started" @@ -2630,9 +4400,6 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "Tags" #~ msgstr "Tags" -#~ msgid "Your shelves" -#~ msgstr "Vos étagères" - #~ msgid "Your lists" #~ msgstr "Vos listes" @@ -2674,119 +4441,6 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "Send follow request" #~ msgstr "Envoyer une demande d’abonnement" -#, fuzzy -#~| msgid "All messages" -#~ msgid "Messages" -#~ msgstr "Tous les messages" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "Enter a valid email address." -#~ msgstr "Adresse email :" - -#, fuzzy -#~| msgid "Series number:" -#~ msgid "Enter a number." -#~ msgstr "Numéro dans la série :" - -#, fuzzy -#~| msgid "Series number:" -#~ msgid "Decimal number" -#~ msgstr "Numéro dans la série :" - -#, fuzzy -#~| msgid "List curation:" -#~ msgid "Duration" -#~ msgstr "Modération de la liste :" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "Email address" -#~ msgstr "Adresse email :" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "IPv4 address" -#~ msgstr "Adresse email :" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "IP address" -#~ msgstr "Adresse email :" - -#, fuzzy -#~| msgid "No active invites" -#~ msgid "Positive integer" -#~ msgstr "Aucune invitation active" - -#, fuzzy -#~| msgid "Images" -#~ msgid "Image" -#~ msgstr "Images" - -#, fuzzy -#~| msgid "Relationships" -#~ msgid "One-to-one relationship" -#~ msgstr "Relations" - -#, fuzzy -#~| msgid "This shelf is empty." -#~ msgid "This field is required." -#~ msgstr "Cette étagère est vide" - -#, fuzzy -#~| msgid "This shelf is empty." -#~ msgid "The submitted file is empty." -#~ msgstr "Cette étagère est vide" - -#, fuzzy -#~| msgid "Started reading" -#~ msgid "Currently" -#~ msgstr "Commencer la lecture" - -#, fuzzy -#~| msgid "Change shelf" -#~ msgid "Change" -#~ msgstr "Changer d’étagère" - -#, fuzzy -#~| msgid "Status" -#~ msgid "Sat" -#~ msgstr "Statut" - -#, fuzzy -#~| msgid "Search" -#~ msgid "March" -#~ msgstr "Chercher" - -#, fuzzy -#~| msgid "Series number:" -#~ msgid "September" -#~ msgstr "Numéro dans la série :" - -#, fuzzy -#~| msgid "Search" -#~ msgctxt "abbrev. month" -#~ msgid "March" -#~ msgstr "Chercher" - -#, fuzzy -#~| msgid "Search" -#~ msgctxt "alt. month" -#~ msgid "March" -#~ msgstr "Chercher" - -#, fuzzy -#~| msgid "Series number:" -#~ msgctxt "alt. month" -#~ msgid "September" -#~ msgstr "Numéro dans la série :" - -#, fuzzy -#~| msgid "No books found matching the query \"%(query)s\"" -#~ msgid "No %(verbose_name)s found matching the query" -#~ msgstr "Aucun livre trouvé pour la requête « %(query)s »" - #~ msgid "Announcements" #~ msgstr "Annonces" diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po index 66a26636..789960cc 100644 --- a/locale/zh_Hans/LC_MESSAGES/django.po +++ b/locale/zh_Hans/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-04-04 04:17+0000\n" +"POT-Creation-Date: 2021-04-26 09:56-0700\n" "PO-Revision-Date: 2021-03-20 00:56+0000\n" "Last-Translator: Kana \n" "Language-Team: Mouse Reeve \n" @@ -18,35 +18,66 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: bookwyrm/forms.py:226 +#: bookwyrm/forms.py:224 msgid "A user with this email already exists." msgstr "已经存在使用该邮箱的用户。" -#: bookwyrm/forms.py:240 +#: bookwyrm/forms.py:238 msgid "One Day" msgstr "一天" -#: bookwyrm/forms.py:241 +#: bookwyrm/forms.py:239 msgid "One Week" msgstr "一周" -#: bookwyrm/forms.py:242 +#: bookwyrm/forms.py:240 msgid "One Month" msgstr "一个月" -#: bookwyrm/forms.py:243 +#: bookwyrm/forms.py:241 msgid "Does Not Expire" msgstr "永不失效" -#: bookwyrm/forms.py:248 +#: bookwyrm/forms.py:246 #, python-format msgid "%(count)d uses" msgstr "%(count)d 次使用" -#: bookwyrm/forms.py:251 +#: bookwyrm/forms.py:249 msgid "Unlimited" msgstr "不受限" +#: bookwyrm/forms.py:293 +msgid "List Order" +msgstr "" + +#: bookwyrm/forms.py:294 +#, fuzzy +#| msgid "Title" +msgid "Book Title" +msgstr "标题" + +#: bookwyrm/forms.py:295 bookwyrm/templates/snippets/create_status_form.html:31 +#: bookwyrm/templates/user/shelf.html:80 bookwyrm/templates/user/shelf.html:110 +msgid "Rating" +msgstr "评价" + +#: bookwyrm/forms.py:297 bookwyrm/templates/lists/list.html:82 +msgid "Sort By" +msgstr "" + +#: bookwyrm/forms.py:301 +#, fuzzy +#| msgid "Sorted ascending" +msgid "Ascending" +msgstr "升序排序" + +#: bookwyrm/forms.py:302 +#, fuzzy +#| msgid "Sorted ascending" +msgid "Descending" +msgstr "升序排序" + #: bookwyrm/models/fields.py:24 #, python-format msgid "%(value)s is not a valid remote_id" @@ -57,7 +88,7 @@ msgstr "%(value)s 不是有效的 remote_id" msgid "%(value)s is not a valid username" msgstr "%(value)s 不是有效的用户名" -#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:152 +#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:153 msgid "username" msgstr "用户名" @@ -65,23 +96,23 @@ msgstr "用户名" msgid "A user with that username already exists." msgstr "已经存在使用该用户名的用户。" -#: bookwyrm/settings.py:150 +#: bookwyrm/settings.py:152 msgid "English" msgstr "English(英语)" -#: bookwyrm/settings.py:151 +#: bookwyrm/settings.py:153 msgid "German" msgstr "Deutsch(德语)" -#: bookwyrm/settings.py:152 +#: bookwyrm/settings.py:154 msgid "Spanish" msgstr "Español(西班牙语)" -#: bookwyrm/settings.py:153 +#: bookwyrm/settings.py:155 msgid "French" msgstr "Français(法语)" -#: bookwyrm/settings.py:154 +#: bookwyrm/settings.py:156 msgid "Simplified Chinese" msgstr "简体中文" @@ -118,76 +149,66 @@ msgstr "维基百科" msgid "Books by %(name)s" msgstr "%(name)s 所著的书" -#: bookwyrm/templates/book/book.html:21 +#: bookwyrm/templates/book/book.html:33 #: bookwyrm/templates/discover/large-book.html:12 #: bookwyrm/templates/discover/small-book.html:9 msgid "by" msgstr "作者" -#: bookwyrm/templates/book/book.html:29 bookwyrm/templates/book/book.html:30 +#: bookwyrm/templates/book/book.html:41 bookwyrm/templates/book/book.html:42 msgid "Edit Book" msgstr "编辑书目" -#: bookwyrm/templates/book/book.html:49 +#: bookwyrm/templates/book/book.html:61 #: bookwyrm/templates/book/cover_modal.html:5 msgid "Add cover" msgstr "添加封面" -#: bookwyrm/templates/book/book.html:53 +#: bookwyrm/templates/book/book.html:65 msgid "Failed to load cover" msgstr "加载封面失败" -#: bookwyrm/templates/book/book.html:62 -msgid "ISBN:" -msgstr "ISBN:" - -#: bookwyrm/templates/book/book.html:69 -#: bookwyrm/templates/book/edit_book.html:211 -msgid "OCLC Number:" -msgstr "OCLC 号:" - -#: bookwyrm/templates/book/book.html:76 -#: bookwyrm/templates/book/edit_book.html:215 -msgid "ASIN:" -msgstr "ASIN:" - -#: bookwyrm/templates/book/book.html:85 +#: bookwyrm/templates/book/book.html:82 msgid "View on OpenLibrary" msgstr "在 OpenLibrary 查看" -#: bookwyrm/templates/book/book.html:94 +#: bookwyrm/templates/book/book.html:102 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s 则书评)" -#: bookwyrm/templates/book/book.html:100 +#: bookwyrm/templates/book/book.html:114 msgid "Add Description" msgstr "添加描述" -#: bookwyrm/templates/book/book.html:107 -#: bookwyrm/templates/book/edit_book.html:101 +#: bookwyrm/templates/book/book.html:121 +#: bookwyrm/templates/book/edit_book.html:107 #: bookwyrm/templates/lists/form.html:12 msgid "Description:" msgstr "描述:" -#: bookwyrm/templates/book/book.html:111 -#: bookwyrm/templates/book/edit_book.html:225 +#: bookwyrm/templates/book/book.html:125 +#: bookwyrm/templates/book/edit_book.html:240 #: bookwyrm/templates/edit_author.html:78 bookwyrm/templates/lists/form.html:42 #: bookwyrm/templates/preferences/edit_user.html:70 +#: bookwyrm/templates/settings/edit_server.html:68 +#: bookwyrm/templates/settings/federated_server.html:93 #: bookwyrm/templates/settings/site.html:93 #: bookwyrm/templates/snippets/readthrough.html:75 #: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42 #: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:34 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:38 msgid "Save" msgstr "保存" -#: bookwyrm/templates/book/book.html:112 bookwyrm/templates/book/book.html:161 +#: bookwyrm/templates/book/book.html:126 bookwyrm/templates/book/book.html:175 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:226 +#: bookwyrm/templates/book/edit_book.html:241 #: bookwyrm/templates/edit_author.html:79 -#: bookwyrm/templates/moderation/report_modal.html:32 +#: bookwyrm/templates/moderation/report_modal.html:34 +#: bookwyrm/templates/settings/federated_server.html:94 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 #: bookwyrm/templates/snippets/goal_form.html:32 #: bookwyrm/templates/snippets/readthrough.html:76 @@ -198,73 +219,115 @@ msgstr "保存" msgid "Cancel" msgstr "取消" -#: bookwyrm/templates/book/book.html:121 +#: bookwyrm/templates/book/book.html:135 #, python-format msgid "%(count)s editions" msgstr "%(count)s 个版本" -#: bookwyrm/templates/book/book.html:129 +#: bookwyrm/templates/book/book.html:143 #, python-format msgid "This edition is on your %(shelf_name)s shelf." msgstr "此版本在你的 %(shelf_name)s 书架上。" -#: bookwyrm/templates/book/book.html:135 +#: bookwyrm/templates/book/book.html:149 #, python-format -msgid "A different edition of this book is on your %(shelf_name)s shelf." -msgstr "本书的 另一个版本 在你的 %(shelf_name)s 书架上。" +msgid "" +"A different edition of this book is on your %(shelf_name)s shelf." +msgstr "" +"本书的 另一个版本 在你的 %(shelf_name)s 书架上。" -#: bookwyrm/templates/book/book.html:144 +#: bookwyrm/templates/book/book.html:158 msgid "Your reading activity" msgstr "你的阅读活动" -#: bookwyrm/templates/book/book.html:146 +#: bookwyrm/templates/book/book.html:160 msgid "Add read dates" msgstr "添加阅读日期" -#: bookwyrm/templates/book/book.html:151 +#: bookwyrm/templates/book/book.html:165 msgid "You don't have any reading activity for this book." msgstr "你还没有任何这本书的阅读活动。" -#: bookwyrm/templates/book/book.html:158 +#: bookwyrm/templates/book/book.html:172 msgid "Create" msgstr "创建" -#: bookwyrm/templates/book/book.html:180 +#: bookwyrm/templates/book/book.html:194 msgid "Subjects" msgstr "主题" -#: bookwyrm/templates/book/book.html:191 +#: bookwyrm/templates/book/book.html:206 msgid "Places" msgstr "地点" -#: bookwyrm/templates/book/book.html:202 bookwyrm/templates/layout.html:64 +#: bookwyrm/templates/book/book.html:217 bookwyrm/templates/layout.html:65 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search_results.html:91 #: bookwyrm/templates/user/user_layout.html:62 msgid "Lists" msgstr "列表" -#: bookwyrm/templates/book/book.html:213 +#: bookwyrm/templates/book/book.html:228 msgid "Add to list" msgstr "添加到列表" -#: bookwyrm/templates/book/book.html:223 +#: bookwyrm/templates/book/book.html:238 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:90 +#: bookwyrm/templates/lists/list.html:133 msgid "Add" msgstr "添加" -#: bookwyrm/templates/book/book.html:251 +#: bookwyrm/templates/book/book.html:254 +#, fuzzy +#| msgid "Review" +msgid "Reviews" +msgstr "书评" + +#: bookwyrm/templates/book/book.html:259 +#, fuzzy +#| msgid "Your shelves" +msgid "Your reviews" +msgstr "你的书架" + +#: bookwyrm/templates/book/book.html:265 +#, fuzzy +#| msgid "Your Account" +msgid "Your comments" +msgstr "你的帐号" + +#: bookwyrm/templates/book/book.html:271 +#, fuzzy +#| msgid "Your books" +msgid "Your quotes" +msgstr "你的书目" + +#: bookwyrm/templates/book/book.html:305 msgid "rated it" msgstr "评价了" +#: bookwyrm/templates/book/book_identifiers.html:8 +msgid "ISBN:" +msgstr "ISBN:" + +#: bookwyrm/templates/book/book_identifiers.html:15 +#: bookwyrm/templates/book/edit_book.html:226 +msgid "OCLC Number:" +msgstr "OCLC 号:" + +#: bookwyrm/templates/book/book_identifiers.html:22 +#: bookwyrm/templates/book/edit_book.html:230 +msgid "ASIN:" +msgstr "ASIN:" + #: bookwyrm/templates/book/cover_modal.html:17 -#: bookwyrm/templates/book/edit_book.html:163 +#: bookwyrm/templates/book/edit_book.html:178 msgid "Upload cover:" msgstr "上传封面:" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:169 +#: bookwyrm/templates/book/edit_book.html:184 msgid "Load cover from url:" msgstr "从网址加载封面:" @@ -340,86 +403,86 @@ msgstr "返回" msgid "Metadata" msgstr "元数据" -#: bookwyrm/templates/book/edit_book.html:91 +#: bookwyrm/templates/book/edit_book.html:92 msgid "Title:" msgstr "标题:" -#: bookwyrm/templates/book/edit_book.html:96 +#: bookwyrm/templates/book/edit_book.html:100 msgid "Subtitle:" msgstr "副标题:" -#: bookwyrm/templates/book/edit_book.html:106 +#: bookwyrm/templates/book/edit_book.html:113 msgid "Series:" msgstr "系列:" -#: bookwyrm/templates/book/edit_book.html:111 +#: bookwyrm/templates/book/edit_book.html:120 msgid "Series number:" msgstr "系列编号:" -#: bookwyrm/templates/book/edit_book.html:117 +#: bookwyrm/templates/book/edit_book.html:126 msgid "Publisher:" msgstr "出版社:" -#: bookwyrm/templates/book/edit_book.html:119 +#: bookwyrm/templates/book/edit_book.html:128 msgid "Separate multiple publishers with commas." msgstr "请用英文逗号(,)分开多个出版社。" -#: bookwyrm/templates/book/edit_book.html:125 +#: bookwyrm/templates/book/edit_book.html:135 msgid "First published date:" msgstr "初版时间:" -#: bookwyrm/templates/book/edit_book.html:130 +#: bookwyrm/templates/book/edit_book.html:143 msgid "Published date:" msgstr "出版时间:" -#: bookwyrm/templates/book/edit_book.html:137 +#: bookwyrm/templates/book/edit_book.html:152 msgid "Authors" msgstr "作者" -#: bookwyrm/templates/book/edit_book.html:143 +#: bookwyrm/templates/book/edit_book.html:158 #, python-format msgid "Remove %(name)s" msgstr "移除 %(name)s" -#: bookwyrm/templates/book/edit_book.html:148 +#: bookwyrm/templates/book/edit_book.html:163 msgid "Add Authors:" msgstr "添加作者:" -#: bookwyrm/templates/book/edit_book.html:149 +#: bookwyrm/templates/book/edit_book.html:164 msgid "John Doe, Jane Smith" msgstr "张三, 李四" -#: bookwyrm/templates/book/edit_book.html:155 -#: bookwyrm/templates/user/shelf.html:75 +#: bookwyrm/templates/book/edit_book.html:170 +#: bookwyrm/templates/user/shelf.html:74 msgid "Cover" msgstr "封面" -#: bookwyrm/templates/book/edit_book.html:182 +#: bookwyrm/templates/book/edit_book.html:197 msgid "Physical Properties" msgstr "实体性质" -#: bookwyrm/templates/book/edit_book.html:183 +#: bookwyrm/templates/book/edit_book.html:198 #: bookwyrm/templates/book/format_filter.html:5 msgid "Format:" msgstr "格式:" -#: bookwyrm/templates/book/edit_book.html:191 +#: bookwyrm/templates/book/edit_book.html:206 msgid "Pages:" msgstr "页数:" -#: bookwyrm/templates/book/edit_book.html:198 +#: bookwyrm/templates/book/edit_book.html:213 msgid "Book Identifiers" msgstr "书目标识号" -#: bookwyrm/templates/book/edit_book.html:199 +#: bookwyrm/templates/book/edit_book.html:214 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit_book.html:203 +#: bookwyrm/templates/book/edit_book.html:218 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit_book.html:207 +#: bookwyrm/templates/book/edit_book.html:222 #: bookwyrm/templates/edit_author.html:59 msgid "Openlibrary key:" msgstr "Openlibrary key:" @@ -443,44 +506,55 @@ msgstr "所有" msgid "Language:" msgstr "语言:" -#: bookwyrm/templates/book/publisher_info.html:6 +#: bookwyrm/templates/book/publisher_info.html:22 +#, python-format +msgid "%(format)s" +msgstr "" + +#: bookwyrm/templates/book/publisher_info.html:24 #, python-format msgid "%(format)s, %(pages)s pages" msgstr "%(format)s, %(pages)s 页" -#: bookwyrm/templates/book/publisher_info.html:8 +#: bookwyrm/templates/book/publisher_info.html:26 #, python-format msgid "%(pages)s pages" msgstr "%(pages)s 页" -#: bookwyrm/templates/book/publisher_info.html:13 +#: bookwyrm/templates/book/publisher_info.html:38 #, python-format msgid "%(languages)s language" msgstr "%(languages)s 语言" -#: bookwyrm/templates/book/publisher_info.html:18 +#: bookwyrm/templates/book/publisher_info.html:64 #, python-format msgid "Published %(date)s by %(publisher)s." msgstr "在 %(date)s 由 %(publisher)s 出版。" -#: bookwyrm/templates/book/publisher_info.html:20 +#: bookwyrm/templates/book/publisher_info.html:66 #, python-format msgid "Published %(date)s" msgstr "于 %(date)s 出版" -#: bookwyrm/templates/book/publisher_info.html:22 +#: bookwyrm/templates/book/publisher_info.html:68 #, python-format msgid "Published by %(publisher)s." msgstr "由 %(publisher)s 出版。" #: bookwyrm/templates/components/inline_form.html:8 #: bookwyrm/templates/components/modal.html:11 -#: bookwyrm/templates/feed/feed_layout.html:57 +#: bookwyrm/templates/feed/feed_layout.html:70 #: bookwyrm/templates/get_started/layout.html:19 #: bookwyrm/templates/get_started/layout.html:52 msgid "Close" msgstr "关闭" +#: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8 +#, fuzzy +#| msgid "Boost status" +msgid "Compose status" +msgstr "转发状态" + #: bookwyrm/templates/directory/community_filter.html:5 msgid "Community" msgstr "社区" @@ -495,7 +569,7 @@ msgstr "跨站社区" #: bookwyrm/templates/directory/directory.html:6 #: bookwyrm/templates/directory/directory.html:11 -#: bookwyrm/templates/layout.html:92 +#: bookwyrm/templates/layout.html:93 msgid "Directory" msgstr "目录" @@ -505,7 +579,9 @@ msgstr "使你的个人资料可以被其它 BookWyrm 用户发现。" #: bookwyrm/templates/directory/directory.html:26 #, python-format -msgid "You can opt-out at any time in your profile settings." +msgid "" +"You can opt-out at any time in your profile settings." msgstr "你可以在任何时候从你的 个人资料设定 中退出。" #: bookwyrm/templates/directory/directory.html:31 @@ -617,7 +693,7 @@ msgid "Email address:" msgstr "邮箱地址:" #: bookwyrm/templates/discover/landing_layout.html:70 -#: bookwyrm/templates/moderation/report_modal.html:31 +#: bookwyrm/templates/moderation/report_modal.html:33 msgid "Submit" msgstr "提交" @@ -670,8 +746,12 @@ msgstr "你好呀," #: bookwyrm/templates/email/html_layout.html:21 #, python-format -msgid "BookWyrm hosted on %(site_name)s" -msgstr "位于 %(site_name)s 的 BookWyrm" +msgid "" +"BookWyrm hosted on " +"%(site_name)s" +msgstr "" +"位于 %(site_name)s 的 BookWyrm" #: bookwyrm/templates/email/html_layout.html:23 msgid "Email preference" @@ -689,12 +769,17 @@ msgstr "立即加入" #: bookwyrm/templates/email/invite/html_content.html:15 #, python-format -msgid "Learn more about this instance." -msgstr "了解更多 有关本实例的信息。" +msgid "" +"Learn more about this instance." +msgstr "" +"了解更多 有关本实例的信息。" #: bookwyrm/templates/email/invite/text_content.html:4 #, python-format -msgid "You're invited to join %(site_name)s! Click the link below to create an account." +msgid "" +"You're invited to join %(site_name)s! Click the link below to create an " +"account." msgstr "你受邀请加入 %(site_name)s!点击下面的连接来创建帐号。" #: bookwyrm/templates/email/invite/text_content.html:8 @@ -704,8 +789,12 @@ msgstr "了解更多有关本实例的信息:" #: bookwyrm/templates/email/password_reset/html_content.html:6 #: bookwyrm/templates/email/password_reset/text_content.html:4 #, python-format -msgid "You requested to reset your %(site_name)s password. Click the link below to set a new password and log in to your account." -msgstr "你请求重置你在 %(site_name)s 的密码。点击下面的链接来设置新密码并登录你的帐号。" +msgid "" +"You requested to reset your %(site_name)s password. Click the link below to " +"set a new password and log in to your account." +msgstr "" +"你请求重置你在 %(site_name)s 的密码。点击下面的链接来设置新密码并登录你的帐" +"号。" #: bookwyrm/templates/email/password_reset/html_content.html:9 #: bookwyrm/templates/password_reset.html:4 @@ -717,7 +806,8 @@ msgstr "重设密码" #: bookwyrm/templates/email/password_reset/html_content.html:13 #: bookwyrm/templates/email/password_reset/text_content.html:8 -msgid "If you didn't request to reset your password, you can ignore this email." +msgid "" +"If you didn't request to reset your password, you can ignore this email." msgstr "如果你没有请求重设密码,你可以忽略这封邮件。" #: bookwyrm/templates/email/password_reset/subject.html:2 @@ -731,7 +821,7 @@ msgid "Direct Messages with %(username)s" msgstr "与 %(username)s 私信" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:87 +#: bookwyrm/templates/layout.html:88 msgid "Direct Messages" msgstr "私信" @@ -764,6 +854,7 @@ msgid "Local" msgstr "本站" #: bookwyrm/templates/feed/feed.html:25 +#: bookwyrm/templates/settings/edit_server.html:40 msgid "Federated" msgstr "跨站" @@ -773,7 +864,8 @@ msgid "load 0 unread status(es)" msgstr "加载 0 条未读状态" #: bookwyrm/templates/feed/feed.html:48 -msgid "There aren't any activities right now! Try following a user to get started" +msgid "" +"There aren't any activities right now! Try following a user to get started" msgstr "现在还没有任何活动!尝试着从关注一个用户开始吧" #: bookwyrm/templates/feed/feed.html:56 @@ -786,32 +878,33 @@ msgid "Updates" msgstr "更新" #: bookwyrm/templates/feed/feed_layout.html:11 -#: bookwyrm/templates/layout.html:58 +#: bookwyrm/templates/layout.html:59 #: bookwyrm/templates/user/books_header.html:3 msgid "Your books" msgstr "你的书目" #: bookwyrm/templates/feed/feed_layout.html:13 -msgid "There are no books here right now! Try searching for a book to get started" +msgid "" +"There are no books here right now! Try searching for a book to get started" msgstr "现在这里还没有任何书目!尝试着从搜索某本书开始吧" -#: bookwyrm/templates/feed/feed_layout.html:23 +#: bookwyrm/templates/feed/feed_layout.html:24 #: bookwyrm/templates/user/shelf.html:28 msgid "To Read" msgstr "想读" -#: bookwyrm/templates/feed/feed_layout.html:24 +#: bookwyrm/templates/feed/feed_layout.html:25 #: bookwyrm/templates/user/shelf.html:28 msgid "Currently Reading" msgstr "在读" -#: bookwyrm/templates/feed/feed_layout.html:25 +#: bookwyrm/templates/feed/feed_layout.html:26 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:11 #: bookwyrm/templates/user/shelf.html:28 msgid "Read" msgstr "读过" -#: bookwyrm/templates/feed/feed_layout.html:74 bookwyrm/templates/goal.html:26 +#: bookwyrm/templates/feed/feed_layout.html:88 bookwyrm/templates/goal.html:26 #: bookwyrm/templates/snippets/goal_card.html:6 #, python-format msgid "%(year)s Reading Goal" @@ -839,7 +932,7 @@ msgid "What are you reading?" msgstr "你在阅读什么?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:58 +#: bookwyrm/templates/lists/list.html:101 msgid "Search for a book" msgstr "搜索书目" @@ -859,8 +952,8 @@ msgstr "你可以在开始使用 %(site_name)s 后添加书目。" #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38 -#: bookwyrm/templates/lists/list.html:62 +#: bookwyrm/templates/layout.html:38 bookwyrm/templates/layout.html:39 +#: bookwyrm/templates/lists/list.html:105 msgid "Search" msgstr "搜索" @@ -874,7 +967,7 @@ msgid "Popular on %(site_name)s" msgstr "%(site_name)s 上的热门" #: bookwyrm/templates/get_started/books.html:51 -#: bookwyrm/templates/lists/list.html:75 +#: bookwyrm/templates/lists/list.html:118 msgid "No books found" msgstr "没有找到书目" @@ -943,7 +1036,9 @@ msgid "Show this account in suggested users:" msgstr "在推荐的用户中显示此帐号:" #: bookwyrm/templates/get_started/profile.html:52 -msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." +msgid "" +"Your account will show up in the directory, and may be recommended to other " +"BookWyrm users." msgstr "你的帐号会显示在目录中,并且可能会受其它 BookWyrm 用户推荐。" #: bookwyrm/templates/get_started/users.html:11 @@ -968,7 +1063,9 @@ msgstr "编辑目标" #: bookwyrm/templates/goal.html:30 #: bookwyrm/templates/snippets/goal_card.html:13 #, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." +msgid "" +"Set a goal for how many books you'll finish reading in %(year)s, and track " +"your progress throughout the year." msgstr "设定一个 %(year)s 内要读多少书的目标,并记录你全年的进度。" #: bookwyrm/templates/goal.html:39 @@ -987,7 +1084,7 @@ msgid "%(username)s's %(year)s Books" msgstr "%(username)s 在 %(year)s 的书目" #: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9 -#: bookwyrm/templates/layout.html:97 +#: bookwyrm/templates/layout.html:98 msgid "Import Books" msgstr "导入书目" @@ -1008,6 +1105,7 @@ msgid "Privacy setting for imported reviews:" msgstr "导入书评的隐私设定" #: bookwyrm/templates/import.html:48 +#: bookwyrm/templates/settings/server_blocklist.html:64 msgid "Import" msgstr "导入" @@ -1050,7 +1148,9 @@ msgstr "加载失败" #: bookwyrm/templates/import_status.html:44 #, python-format -msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." +msgid "" +"Jump to the bottom of the list to select the %(failed_count)s items which " +"failed to import." msgstr "跳转至列表底部来选取 %(failed_count)s 个导入失败的项目。" #: bookwyrm/templates/import_status.html:79 @@ -1072,12 +1172,12 @@ msgstr "书目" #: bookwyrm/templates/import_status.html:115 #: bookwyrm/templates/snippets/create_status_form.html:10 -#: bookwyrm/templates/user/shelf.html:76 +#: bookwyrm/templates/user/shelf.html:75 bookwyrm/templates/user/shelf.html:93 msgid "Title" msgstr "标题" #: bookwyrm/templates/import_status.html:118 -#: bookwyrm/templates/user/shelf.html:77 +#: bookwyrm/templates/user/shelf.html:76 bookwyrm/templates/user/shelf.html:96 msgid "Author" msgstr "作者" @@ -1114,86 +1214,94 @@ msgstr "\"%(query)s\" 的搜索结果" msgid "Matching Books" msgstr "匹配的书目" -#: bookwyrm/templates/layout.html:33 +#: bookwyrm/templates/layout.html:34 msgid "Search for a book or user" msgstr "搜索书目或用户" -#: bookwyrm/templates/layout.html:47 bookwyrm/templates/layout.html:48 +#: bookwyrm/templates/layout.html:48 bookwyrm/templates/layout.html:49 msgid "Main navigation menu" msgstr "主导航菜单" -#: bookwyrm/templates/layout.html:61 +#: bookwyrm/templates/layout.html:62 msgid "Feed" msgstr "动态" -#: bookwyrm/templates/layout.html:102 +#: bookwyrm/templates/layout.html:103 msgid "Settings" msgstr "设置" -#: bookwyrm/templates/layout.html:111 -#: bookwyrm/templates/settings/admin_layout.html:24 +#: bookwyrm/templates/layout.html:112 +#: bookwyrm/templates/settings/admin_layout.html:31 #: bookwyrm/templates/settings/manage_invite_requests.html:15 #: bookwyrm/templates/settings/manage_invites.html:3 #: bookwyrm/templates/settings/manage_invites.html:15 msgid "Invites" msgstr "邀请" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:119 msgid "Admin" msgstr "管理员" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:126 msgid "Log out" msgstr "登出" -#: bookwyrm/templates/layout.html:133 bookwyrm/templates/layout.html:134 +#: bookwyrm/templates/layout.html:134 bookwyrm/templates/layout.html:135 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:10 msgid "Notifications" msgstr "通知" -#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155 +#: bookwyrm/templates/layout.html:152 bookwyrm/templates/layout.html:156 #: bookwyrm/templates/login.html:17 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "用户名:" -#: bookwyrm/templates/layout.html:156 +#: bookwyrm/templates/layout.html:157 msgid "password" msgstr "密码" -#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36 +#: bookwyrm/templates/layout.html:158 bookwyrm/templates/login.html:36 msgid "Forgot your password?" msgstr "忘记了密码?" -#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10 +#: bookwyrm/templates/layout.html:161 bookwyrm/templates/login.html:10 #: bookwyrm/templates/login.html:33 msgid "Log in" msgstr "登录" -#: bookwyrm/templates/layout.html:168 +#: bookwyrm/templates/layout.html:169 msgid "Join" msgstr "加入" -#: bookwyrm/templates/layout.html:191 +#: bookwyrm/templates/layout.html:195 msgid "About this server" msgstr "关于本服务器" -#: bookwyrm/templates/layout.html:195 +#: bookwyrm/templates/layout.html:199 msgid "Contact site admin" msgstr "联系站点管理员" -#: bookwyrm/templates/layout.html:202 -#, python-format -msgid "Support %(site_name)s on %(support_title)s" -msgstr "在 %(support_title)s 上支持 %(site_name)s" - #: bookwyrm/templates/layout.html:206 -msgid "BookWyrm is open source software. You can contribute or report issues on GitHub." -msgstr "BookWyrm 是开源软件。你可以在 GitHub 贡献或报告问题。" +#, python-format +msgid "" +"Support %(site_name)s on " +"%(support_title)s" +msgstr "" +"在 %(support_title)s 上支" +"持 %(site_name)s" + +#: bookwyrm/templates/layout.html:210 +msgid "" +"BookWyrm is open source software. You can contribute or report issues on GitHub." +msgstr "" +"BookWyrm 是开源软件。你可以在 GitHub 贡献或报告问题。" #: bookwyrm/templates/lists/create_form.html:5 -#: bookwyrm/templates/lists/lists.html:19 +#: bookwyrm/templates/lists/lists.html:20 msgid "Create List" msgstr "创建列表" @@ -1257,7 +1365,7 @@ msgid "Anyone can suggest books, subject to your approval" msgstr "任何人都可以推荐书目、主题让你批准" #: bookwyrm/templates/lists/form.html:31 -#: bookwyrm/templates/moderation/reports.html:24 +#: bookwyrm/templates/moderation/reports.html:25 msgid "Open" msgstr "开放" @@ -1265,45 +1373,83 @@ msgstr "开放" msgid "Anyone can add books to this list" msgstr "任何人都可以向此列表中添加书目" -#: bookwyrm/templates/lists/list.html:17 +#: bookwyrm/templates/lists/list.html:19 +msgid "You successfully suggested a book for this list!" +msgstr "" + +#: bookwyrm/templates/lists/list.html:21 +#, fuzzy +#| msgid "Anyone can add books to this list" +msgid "You successfully added a book to this list!" +msgstr "任何人都可以向此列表中添加书目" + +#: bookwyrm/templates/lists/list.html:27 msgid "This list is currently empty" msgstr "此列表当前是空的" -#: bookwyrm/templates/lists/list.html:35 +#: bookwyrm/templates/lists/list.html:46 #, python-format msgid "Added by %(username)s" msgstr "由 %(username)s 添加" -#: bookwyrm/templates/lists/list.html:41 +#: bookwyrm/templates/lists/list.html:58 +#, fuzzy +#| msgid "Sent" +msgid "Set" +msgstr "已发送" + +#: bookwyrm/templates/lists/list.html:61 +#, fuzzy +#| msgid "List curation:" +msgid "List position" +msgstr "列表策展:" + +#: bookwyrm/templates/lists/list.html:67 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "移除" -#: bookwyrm/templates/lists/list.html:54 +#: bookwyrm/templates/lists/list.html:80 bookwyrm/templates/lists/list.html:92 +#, fuzzy +#| msgid "Your Lists" +msgid "Sort List" +msgstr "你的列表" + +#: bookwyrm/templates/lists/list.html:86 +#, fuzzy +#| msgid "Directory" +msgid "Direction" +msgstr "目录" + +#: bookwyrm/templates/lists/list.html:97 msgid "Add Books" msgstr "添加书目" -#: bookwyrm/templates/lists/list.html:54 +#: bookwyrm/templates/lists/list.html:97 msgid "Suggest Books" msgstr "推荐书目" -#: bookwyrm/templates/lists/list.html:63 +#: bookwyrm/templates/lists/list.html:106 msgid "search" msgstr "搜索" -#: bookwyrm/templates/lists/list.html:69 +#: bookwyrm/templates/lists/list.html:112 msgid "Clear search" msgstr "清除搜索" -#: bookwyrm/templates/lists/list.html:74 +#: bookwyrm/templates/lists/list.html:117 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "没有符合 \"%(query)s\" 请求的书目" -#: bookwyrm/templates/lists/list.html:90 +#: bookwyrm/templates/lists/list.html:133 msgid "Suggest" msgstr "推荐" +#: bookwyrm/templates/lists/lists.html:14 bookwyrm/templates/user/lists.html:9 +msgid "Your Lists" +msgstr "你的列表" + #: bookwyrm/templates/login.html:4 msgid "Login" msgstr "登录" @@ -1321,59 +1467,39 @@ msgstr "联系管理员以取得邀请" msgid "More about this site" msgstr "关于本站点的更多" -#: bookwyrm/templates/moderation/report.html:5 #: bookwyrm/templates/moderation/report.html:6 +#: bookwyrm/templates/moderation/report.html:7 #: bookwyrm/templates/moderation/report_preview.html:6 #, python-format msgid "Report #%(report_id)s: %(username)s" msgstr "报告 #%(report_id)s: %(username)s" -#: bookwyrm/templates/moderation/report.html:10 +#: bookwyrm/templates/moderation/report.html:11 msgid "Back to reports" msgstr "回到报告" -#: bookwyrm/templates/moderation/report.html:18 -msgid "Actions" -msgstr "动作" - -#: bookwyrm/templates/moderation/report.html:19 -msgid "View user profile" -msgstr "查看用户个人资料" - -#: bookwyrm/templates/moderation/report.html:22 -#: bookwyrm/templates/snippets/status/status_options.html:25 -#: bookwyrm/templates/snippets/user_options.html:13 -msgid "Send direct message" -msgstr "发送私信" - -#: bookwyrm/templates/moderation/report.html:27 -msgid "Deactivate user" -msgstr "停用用户" - -#: bookwyrm/templates/moderation/report.html:29 -msgid "Reactivate user" -msgstr "启用用户" - -#: bookwyrm/templates/moderation/report.html:36 +#: bookwyrm/templates/moderation/report.html:23 msgid "Moderator Comments" msgstr "监察员评论" -#: bookwyrm/templates/moderation/report.html:54 -#: bookwyrm/templates/snippets/create_status.html:12 -#: bookwyrm/templates/snippets/create_status_form.html:52 +#: bookwyrm/templates/moderation/report.html:41 +#: bookwyrm/templates/snippets/create_status.html:28 +#: bookwyrm/templates/snippets/create_status_form.html:53 msgid "Comment" msgstr "评论" -#: bookwyrm/templates/moderation/report.html:59 +#: bookwyrm/templates/moderation/report.html:46 msgid "Reported statuses" msgstr "被报告的状态" -#: bookwyrm/templates/moderation/report.html:61 +#: bookwyrm/templates/moderation/report.html:48 msgid "No statuses reported" msgstr "没有被报告的状态" -#: bookwyrm/templates/moderation/report.html:67 -msgid "Statuses has been deleted" +#: bookwyrm/templates/moderation/report.html:54 +#, fuzzy +#| msgid "Statuses has been deleted" +msgid "Status has been deleted" msgstr "状态已被删除" #: bookwyrm/templates/moderation/report_modal.html:6 @@ -1381,12 +1507,12 @@ msgstr "状态已被删除" msgid "Report @%(username)s" msgstr "报告 %(username)s" -#: bookwyrm/templates/moderation/report_modal.html:21 +#: bookwyrm/templates/moderation/report_modal.html:23 #, python-format msgid "This report will be sent to %(site_name)s's moderators for review." msgstr "本报告会被发送至 %(site_name)s 的监察员以复查。" -#: bookwyrm/templates/moderation/report_modal.html:22 +#: bookwyrm/templates/moderation/report_modal.html:24 msgid "More info about this report:" msgstr "关于本报告的更多信息" @@ -1413,21 +1539,21 @@ msgid "Reports: %(server_name)s" msgstr "报告: %(server_name)s" #: bookwyrm/templates/moderation/reports.html:8 -#: bookwyrm/templates/moderation/reports.html:16 -#: bookwyrm/templates/settings/admin_layout.html:28 +#: bookwyrm/templates/moderation/reports.html:17 +#: bookwyrm/templates/settings/admin_layout.html:35 msgid "Reports" msgstr "报告" -#: bookwyrm/templates/moderation/reports.html:13 +#: bookwyrm/templates/moderation/reports.html:14 #, python-format msgid "Reports: %(server_name)s" msgstr "报告: %(server_name)s" -#: bookwyrm/templates/moderation/reports.html:27 +#: bookwyrm/templates/moderation/reports.html:28 msgid "Resolved" msgstr "已解决" -#: bookwyrm/templates/moderation/reports.html:34 +#: bookwyrm/templates/moderation/reports.html:37 msgid "No reports found." msgstr "没有找到报告" @@ -1437,18 +1563,27 @@ msgstr "删除通知" #: bookwyrm/templates/notifications.html:53 #, python-format -msgid "favorited your review of %(book_title)s" -msgstr "喜欢了你 %(book_title)s 的书评" +msgid "" +"favorited your review of %(book_title)s" +msgstr "" +"喜欢了你 %(book_title)s 的书评" #: bookwyrm/templates/notifications.html:55 #, python-format -msgid "favorited your comment on %(book_title)s" -msgstr "喜欢了你 %(book_title)s 的评论" +msgid "" +"favorited your comment on %(book_title)s" +msgstr "" +"喜欢了你 %(book_title)s 的评论" #: bookwyrm/templates/notifications.html:57 #, python-format -msgid "favorited your quote from %(book_title)s" -msgstr "喜欢了你 来自 %(book_title)s 的引用" +msgid "" +"favorited your quote from %(book_title)s" +msgstr "" +"喜欢了你 来自 %(book_title)s 的引用" #: bookwyrm/templates/notifications.html:59 #, python-format @@ -1457,18 +1592,30 @@ msgstr "喜欢了你的 状态" #: bookwyrm/templates/notifications.html:64 #, python-format -msgid "mentioned you in a review of %(book_title)s" -msgstr "在 %(book_title)s 的书评 里提到了你" +msgid "" +"mentioned you in a review of " +"%(book_title)s" +msgstr "" +"在 %(book_title)s 的书评 里提到" +"了你" #: bookwyrm/templates/notifications.html:66 #, python-format -msgid "mentioned you in a comment on %(book_title)s" -msgstr "在 %(book_title)s 的评论 里提到了你" +msgid "" +"mentioned you in a comment on " +"%(book_title)s" +msgstr "" +"在 %(book_title)s 的评论 里提到" +"了你" #: bookwyrm/templates/notifications.html:68 #, python-format -msgid "mentioned you in a quote from %(book_title)s" -msgstr "在 %(book_title)s 的引用 中提到了你" +msgid "" +"mentioned you in a quote from " +"%(book_title)s" +msgstr "" +"在 %(book_title)s 的引用 中提到" +"了你" #: bookwyrm/templates/notifications.html:70 #, python-format @@ -1477,23 +1624,39 @@ msgstr "在 状态 中提到了你" #: bookwyrm/templates/notifications.html:75 #, python-format -msgid "replied to your review of %(book_title)s" -msgstr "回复 了你的 %(book_title)s 的书评" +msgid "" +"replied to your review of %(book_title)s" +msgstr "" +"回复 了你的 对 " +"%(book_title)s 的书评" #: bookwyrm/templates/notifications.html:77 #, python-format -msgid "replied to your comment on %(book_title)s" -msgstr "回复 了你的 %(book_title)s 的评论" +msgid "" +"replied to your comment on %(book_title)s" +msgstr "" +"回复 了你的 对 " +"%(book_title)s 的评论" #: bookwyrm/templates/notifications.html:79 #, python-format -msgid "replied to your quote from %(book_title)s" -msgstr "回复 了你 %(book_title)s 中的引用" +msgid "" +"replied to your quote from %(book_title)s" +msgstr "" +"回复 了你 对 " +"%(book_title)s 中的引用" #: bookwyrm/templates/notifications.html:81 #, python-format -msgid "replied to your status" -msgstr "回复 了你的 状态" +msgid "" +"replied to your status" +msgstr "" +"回复 了你的 状态" +"" #: bookwyrm/templates/notifications.html:85 msgid "followed you" @@ -1505,18 +1668,27 @@ msgstr "向你发送了关注请求" #: bookwyrm/templates/notifications.html:94 #, python-format -msgid "boosted your review of %(book_title)s" -msgstr "转发了你的 %(book_title)s 的书评" +msgid "" +"boosted your review of %(book_title)s" +msgstr "" +"转发了你的 %(book_title)s 的书评" #: bookwyrm/templates/notifications.html:96 #, python-format -msgid "boosted your comment on%(book_title)s" -msgstr "转发了你的 %(book_title)s 的评论" +msgid "" +"boosted your comment on%(book_title)s" +msgstr "" +"转发了你的 %(book_title)s 的评论" #: bookwyrm/templates/notifications.html:98 #, python-format -msgid "boosted your quote from %(book_title)s" -msgstr "转发了你的 %(book_title)s 的引用" +msgid "" +"boosted your quote from %(book_title)s" +msgstr "" +"转发了你的 %(book_title)s 的引用" #: bookwyrm/templates/notifications.html:100 #, python-format @@ -1525,13 +1697,21 @@ msgstr "转发了你的 状态" #: bookwyrm/templates/notifications.html:104 #, python-format -msgid " added %(book_title)s to your list \"%(list_name)s\"" -msgstr " 添加了 %(book_title)s 到你的列表 \"%(list_name)s\"" +msgid "" +" added %(book_title)s to your list " +"\"%(list_name)s\"" +msgstr "" +" 添加了 %(book_title)s 到你的列表 " +"\"%(list_name)s\"" #: bookwyrm/templates/notifications.html:106 #, python-format -msgid " suggested adding %(book_title)s to your list \"%(list_name)s\"" -msgstr " 推荐添加 %(book_title)s 到你的列表 \"%(list_name)s\"" +msgid "" +" suggested adding %(book_title)s to " +"your list \"%(list_name)s\"" +msgstr "" +" 推荐添加 %(book_title)s 到你的列表 " +"\"%(list_name)s\"" #: bookwyrm/templates/notifications.html:110 #, python-format @@ -1592,8 +1772,12 @@ msgstr "在消息流中显示设置阅读目标的提示:" #: bookwyrm/templates/preferences/edit_user.html:62 #, python-format -msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." -msgstr "你的帐号会显示在 目录 中,并可能受其它 BookWyrm 用户推荐。" +msgid "" +"Your account will show up in the directory, and may " +"be recommended to other BookWyrm users." +msgstr "" +"你的帐号会显示在 目录 中,并可能受其它 BookWyrm 用户" +"推荐。" #: bookwyrm/templates/preferences/edit_user.html:65 msgid "Preferred Timezone: " @@ -1636,118 +1820,197 @@ msgstr "没有找到 \"%(query)s\" 的列表" msgid "Administration" msgstr "管理" -#: bookwyrm/templates/settings/admin_layout.html:15 +#: bookwyrm/templates/settings/admin_layout.html:22 msgid "Manage Users" msgstr "管理用户" -#: bookwyrm/templates/settings/admin_layout.html:19 -#: bookwyrm/templates/settings/user_admin.html:3 -#: bookwyrm/templates/settings/user_admin.html:10 +#: bookwyrm/templates/settings/admin_layout.html:26 +#: bookwyrm/templates/user_admin/user_admin.html:3 +#: bookwyrm/templates/user_admin/user_admin.html:10 msgid "Users" msgstr "用户" -#: bookwyrm/templates/settings/admin_layout.html:32 +#: bookwyrm/templates/settings/admin_layout.html:39 #: bookwyrm/templates/settings/federation.html:3 #: bookwyrm/templates/settings/federation.html:5 msgid "Federated Servers" msgstr "互联的服务器" -#: bookwyrm/templates/settings/admin_layout.html:37 +#: bookwyrm/templates/settings/admin_layout.html:44 msgid "Instance Settings" msgstr "实例设置" -#: bookwyrm/templates/settings/admin_layout.html:41 +#: bookwyrm/templates/settings/admin_layout.html:48 #: bookwyrm/templates/settings/site.html:4 #: bookwyrm/templates/settings/site.html:6 msgid "Site Settings" msgstr "站点设置" -#: bookwyrm/templates/settings/admin_layout.html:44 +#: bookwyrm/templates/settings/admin_layout.html:51 #: bookwyrm/templates/settings/site.html:13 msgid "Instance Info" msgstr "实例信息" -#: bookwyrm/templates/settings/admin_layout.html:45 +#: bookwyrm/templates/settings/admin_layout.html:52 #: bookwyrm/templates/settings/site.html:39 msgid "Images" msgstr "图像" -#: bookwyrm/templates/settings/admin_layout.html:46 +#: bookwyrm/templates/settings/admin_layout.html:53 #: bookwyrm/templates/settings/site.html:59 msgid "Footer Content" msgstr "页脚内容" -#: bookwyrm/templates/settings/admin_layout.html:47 +#: bookwyrm/templates/settings/admin_layout.html:54 #: bookwyrm/templates/settings/site.html:77 msgid "Registration" msgstr "注册" -#: bookwyrm/templates/settings/federated_server.html:7 +#: bookwyrm/templates/settings/edit_server.html:3 +#: bookwyrm/templates/settings/edit_server.html:6 +#: bookwyrm/templates/settings/edit_server.html:20 +#: bookwyrm/templates/settings/federation.html:9 +#: bookwyrm/templates/settings/federation.html:10 +#: bookwyrm/templates/settings/server_blocklist.html:3 +#: bookwyrm/templates/settings/server_blocklist.html:20 +#, fuzzy +#| msgid "Add cover" +msgid "Add server" +msgstr "添加封面" + +#: bookwyrm/templates/settings/edit_server.html:7 +#: bookwyrm/templates/settings/federated_server.html:12 +#: bookwyrm/templates/settings/server_blocklist.html:7 msgid "Back to server list" msgstr "回到服务器列表" -#: bookwyrm/templates/settings/federated_server.html:12 -msgid "Details" -msgstr "详细" +#: bookwyrm/templates/settings/edit_server.html:16 +#: bookwyrm/templates/settings/server_blocklist.html:16 +#, fuzzy +#| msgid "Import book" +msgid "Import block list" +msgstr "导入书目" -#: bookwyrm/templates/settings/federated_server.html:15 -msgid "Software:" -msgstr "软件:" +#: bookwyrm/templates/settings/edit_server.html:30 +#, fuzzy +#| msgid "Instance Name:" +msgid "Instance:" +msgstr "实例名称" -#: bookwyrm/templates/settings/federated_server.html:19 -msgid "Version:" -msgstr "版本:" - -#: bookwyrm/templates/settings/federated_server.html:23 +#: bookwyrm/templates/settings/edit_server.html:37 +#: bookwyrm/templates/settings/federated_server.html:29 +#: bookwyrm/templates/user_admin/user_info.html:34 msgid "Status:" msgstr "状态:" -#: bookwyrm/templates/settings/federated_server.html:30 +#: bookwyrm/templates/settings/edit_server.html:41 +#: bookwyrm/templates/settings/federated_server.html:9 +#, fuzzy +#| msgid "Block" +msgid "Blocked" +msgstr "屏蔽" + +#: bookwyrm/templates/settings/edit_server.html:48 +#: bookwyrm/templates/settings/federated_server.html:21 +#: bookwyrm/templates/user_admin/user_info.html:26 +msgid "Software:" +msgstr "软件:" + +#: bookwyrm/templates/settings/edit_server.html:55 +#: bookwyrm/templates/settings/federated_server.html:25 +#: bookwyrm/templates/user_admin/user_info.html:30 +msgid "Version:" +msgstr "版本:" + +#: bookwyrm/templates/settings/edit_server.html:64 +msgid "Notes:" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:18 +msgid "Details" +msgstr "详细" + +#: bookwyrm/templates/settings/federated_server.html:36 #: bookwyrm/templates/user/user_layout.html:50 msgid "Activity" msgstr "活动" -#: bookwyrm/templates/settings/federated_server.html:33 +#: bookwyrm/templates/settings/federated_server.html:39 msgid "Users:" msgstr "用户:" -#: bookwyrm/templates/settings/federated_server.html:36 -#: bookwyrm/templates/settings/federated_server.html:43 +#: bookwyrm/templates/settings/federated_server.html:42 +#: bookwyrm/templates/settings/federated_server.html:49 msgid "View all" msgstr "查看全部" -#: bookwyrm/templates/settings/federated_server.html:40 +#: bookwyrm/templates/settings/federated_server.html:46 msgid "Reports:" msgstr "报告:" -#: bookwyrm/templates/settings/federated_server.html:47 +#: bookwyrm/templates/settings/federated_server.html:53 msgid "Followed by us:" msgstr "我们关注了的:" -#: bookwyrm/templates/settings/federated_server.html:53 +#: bookwyrm/templates/settings/federated_server.html:59 msgid "Followed by them:" msgstr "TA 们关注了的:" -#: bookwyrm/templates/settings/federated_server.html:59 +#: bookwyrm/templates/settings/federated_server.html:65 msgid "Blocked by us:" msgstr "我们所屏蔽的:" -#: bookwyrm/templates/settings/federation.html:13 +#: bookwyrm/templates/settings/federated_server.html:77 +#: bookwyrm/templates/user_admin/user_info.html:39 +msgid "Notes" +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:80 +#, fuzzy +#| msgid "Edit Book" +msgid "Edit" +msgstr "编辑书目" + +#: bookwyrm/templates/settings/federated_server.html:100 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:3 +msgid "Actions" +msgstr "动作" + +#: bookwyrm/templates/settings/federated_server.html:104 +#: bookwyrm/templates/snippets/block_button.html:5 +msgid "Block" +msgstr "屏蔽" + +#: bookwyrm/templates/settings/federated_server.html:105 +msgid "All users from this instance will be deactivated." +msgstr "" + +#: bookwyrm/templates/settings/federated_server.html:110 +#: bookwyrm/templates/snippets/block_button.html:10 +msgid "Un-block" +msgstr "取消屏蔽" + +#: bookwyrm/templates/settings/federated_server.html:111 +msgid "All users from this instance will be re-activated." +msgstr "" + +#: bookwyrm/templates/settings/federation.html:20 +#: bookwyrm/templates/user_admin/server_filter.html:5 msgid "Server name" msgstr "服务器名称" -#: bookwyrm/templates/settings/federation.html:17 +#: bookwyrm/templates/settings/federation.html:24 msgid "Date federated" msgstr "跨站日期" -#: bookwyrm/templates/settings/federation.html:21 +#: bookwyrm/templates/settings/federation.html:28 msgid "Software" msgstr "软件" -#: bookwyrm/templates/settings/federation.html:24 -#: bookwyrm/templates/settings/manage_invite_requests.html:40 +#: bookwyrm/templates/settings/federation.html:31 +#: bookwyrm/templates/settings/manage_invite_requests.html:44 #: bookwyrm/templates/settings/status_filter.html:5 -#: bookwyrm/templates/settings/user_admin.html:32 +#: bookwyrm/templates/user_admin/user_admin.html:34 msgid "Status" msgstr "状态" @@ -1763,57 +2026,65 @@ msgid "Ignored Invite Requests" msgstr "已忽略的邀请请求" #: bookwyrm/templates/settings/manage_invite_requests.html:35 -msgid "Date" -msgstr "日期" +#, fuzzy +#| msgid "Date federated" +msgid "Date requested" +msgstr "跨站日期" -#: bookwyrm/templates/settings/manage_invite_requests.html:38 +#: bookwyrm/templates/settings/manage_invite_requests.html:39 +#, fuzzy +#| msgid "Accepted" +msgid "Date accepted" +msgstr "已接受" + +#: bookwyrm/templates/settings/manage_invite_requests.html:42 msgid "Email" msgstr "邮箱" -#: bookwyrm/templates/settings/manage_invite_requests.html:43 +#: bookwyrm/templates/settings/manage_invite_requests.html:47 msgid "Action" msgstr "动作" -#: bookwyrm/templates/settings/manage_invite_requests.html:46 +#: bookwyrm/templates/settings/manage_invite_requests.html:50 msgid "No requests" msgstr "没有请求" -#: bookwyrm/templates/settings/manage_invite_requests.html:54 +#: bookwyrm/templates/settings/manage_invite_requests.html:59 #: bookwyrm/templates/settings/status_filter.html:16 msgid "Accepted" msgstr "已接受" -#: bookwyrm/templates/settings/manage_invite_requests.html:56 +#: bookwyrm/templates/settings/manage_invite_requests.html:61 #: bookwyrm/templates/settings/status_filter.html:12 msgid "Sent" msgstr "已发送" -#: bookwyrm/templates/settings/manage_invite_requests.html:58 +#: bookwyrm/templates/settings/manage_invite_requests.html:63 #: bookwyrm/templates/settings/status_filter.html:8 msgid "Requested" msgstr "已请求" -#: bookwyrm/templates/settings/manage_invite_requests.html:68 +#: bookwyrm/templates/settings/manage_invite_requests.html:73 msgid "Send invite" msgstr "发送请求" -#: bookwyrm/templates/settings/manage_invite_requests.html:70 +#: bookwyrm/templates/settings/manage_invite_requests.html:75 msgid "Re-send invite" msgstr "重新发送请求" -#: bookwyrm/templates/settings/manage_invite_requests.html:90 +#: bookwyrm/templates/settings/manage_invite_requests.html:95 msgid "Ignore" msgstr "忽略" -#: bookwyrm/templates/settings/manage_invite_requests.html:92 +#: bookwyrm/templates/settings/manage_invite_requests.html:97 msgid "Un-ignore" msgstr "取消忽略" -#: bookwyrm/templates/settings/manage_invite_requests.html:103 +#: bookwyrm/templates/settings/manage_invite_requests.html:108 msgid "Back to pending requests" msgstr "回到待处理的请求" -#: bookwyrm/templates/settings/manage_invite_requests.html:105 +#: bookwyrm/templates/settings/manage_invite_requests.html:110 msgid "View ignored requests" msgstr "查看忽略的请求" @@ -1853,6 +2124,27 @@ msgstr "已使用次数" msgid "No active invites" msgstr "无有效的邀请" +#: bookwyrm/templates/settings/server_blocklist.html:6 +#, fuzzy +#| msgid "Import Books" +msgid "Import Blocklist" +msgstr "导入书目" + +#: bookwyrm/templates/settings/server_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:5 +msgid "Success!" +msgstr "成功!" + +#: bookwyrm/templates/settings/server_blocklist.html:30 +#, fuzzy +#| msgid "Successfully imported" +msgid "Successfully blocked:" +msgstr "成功导入了" + +#: bookwyrm/templates/settings/server_blocklist.html:32 +msgid "Failed:" +msgstr "" + #: bookwyrm/templates/settings/site.html:15 msgid "Instance Name:" msgstr "实例名称" @@ -1909,138 +2201,100 @@ msgstr "允许请求邀请:" msgid "Registration closed text:" msgstr "注册关闭文字:" -#: bookwyrm/templates/settings/user_admin.html:7 -#, python-format -msgid "Users: %(server_name)s" -msgstr "用户: %(server_name)s" +#: bookwyrm/templates/snippets/book_cover.html:20 +#: bookwyrm/templates/snippets/search_result_text.html:10 +msgid "No cover" +msgstr "没有封面" -#: bookwyrm/templates/settings/user_admin.html:20 -msgid "Username" -msgstr "用户名" - -#: bookwyrm/templates/settings/user_admin.html:24 -msgid "Date Added" -msgstr "添加日期:" - -#: bookwyrm/templates/settings/user_admin.html:28 -msgid "Last Active" -msgstr "最后或缺" - -#: bookwyrm/templates/settings/user_admin.html:36 -msgid "Remote server" -msgstr "移除服务器" - -#: bookwyrm/templates/settings/user_admin.html:45 -msgid "Active" -msgstr "活跃" - -#: bookwyrm/templates/settings/user_admin.html:45 -msgid "Inactive" -msgstr "停用" - -#: bookwyrm/templates/settings/user_admin.html:50 -msgid "Not set" -msgstr "未设置" - -#: bookwyrm/templates/snippets/block_button.html:5 -msgid "Block" -msgstr "屏蔽" - -#: bookwyrm/templates/snippets/block_button.html:10 -msgid "Un-block" -msgstr "取消屏蔽" - -#: bookwyrm/templates/snippets/book_titleby.html:3 +#: bookwyrm/templates/snippets/book_titleby.html:4 #, python-format msgid "%(title)s by " msgstr "%(title)s 来自" #: bookwyrm/templates/snippets/boost_button.html:8 #: bookwyrm/templates/snippets/boost_button.html:9 -#: bookwyrm/templates/snippets/status/status_body.html:51 -#: bookwyrm/templates/snippets/status/status_body.html:52 -msgid "Boost status" -msgstr "转发状态" +#, fuzzy +#| msgid "boosted" +msgid "Boost" +msgstr "转发了" +#: bookwyrm/templates/snippets/boost_button.html:15 #: bookwyrm/templates/snippets/boost_button.html:16 -#: bookwyrm/templates/snippets/boost_button.html:17 -msgid "Un-boost status" +#, fuzzy +#| msgid "Un-boost status" +msgid "Un-boost" msgstr "取消转发状态" #: bookwyrm/templates/snippets/content_warning_field.html:3 msgid "Spoiler alert:" msgstr "剧透警告:" -#: bookwyrm/templates/snippets/content_warning_field.html:4 +#: bookwyrm/templates/snippets/content_warning_field.html:10 msgid "Spoilers ahead!" msgstr "前有剧透!" -#: bookwyrm/templates/snippets/create_status.html:9 +#: bookwyrm/templates/snippets/create_status.html:17 msgid "Review" msgstr "书评" -#: bookwyrm/templates/snippets/create_status.html:15 +#: bookwyrm/templates/snippets/create_status.html:39 msgid "Quote" msgstr "引用" -#: bookwyrm/templates/snippets/create_status_form.html:18 +#: bookwyrm/templates/snippets/create_status_form.html:20 msgid "Comment:" msgstr "评论:" -#: bookwyrm/templates/snippets/create_status_form.html:20 +#: bookwyrm/templates/snippets/create_status_form.html:22 msgid "Quote:" msgstr "引用:" -#: bookwyrm/templates/snippets/create_status_form.html:22 +#: bookwyrm/templates/snippets/create_status_form.html:24 msgid "Review:" msgstr "书评:" -#: bookwyrm/templates/snippets/create_status_form.html:29 -#: bookwyrm/templates/user/shelf.html:81 -msgid "Rating" -msgstr "评价" +#: bookwyrm/templates/snippets/create_status_form.html:42 +#: bookwyrm/templates/snippets/status/layout.html:30 +#: bookwyrm/templates/snippets/status/layout.html:48 +#: bookwyrm/templates/snippets/status/layout.html:49 +msgid "Reply" +msgstr "回复" -#: bookwyrm/templates/snippets/create_status_form.html:31 -#: bookwyrm/templates/snippets/rate_action.html:14 -#: bookwyrm/templates/snippets/stars.html:3 -msgid "No rating" -msgstr "没有评价" - -#: bookwyrm/templates/snippets/create_status_form.html:64 +#: bookwyrm/templates/snippets/create_status_form.html:67 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16 msgid "Progress:" msgstr "进度:" -#: bookwyrm/templates/snippets/create_status_form.html:71 +#: bookwyrm/templates/snippets/create_status_form.html:75 #: bookwyrm/templates/snippets/readthrough_form.html:22 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30 msgid "pages" msgstr "页数" -#: bookwyrm/templates/snippets/create_status_form.html:72 +#: bookwyrm/templates/snippets/create_status_form.html:76 #: bookwyrm/templates/snippets/readthrough_form.html:23 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31 msgid "percent" msgstr "百分比" -#: bookwyrm/templates/snippets/create_status_form.html:77 +#: bookwyrm/templates/snippets/create_status_form.html:82 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36 #, python-format msgid "of %(pages)s pages" msgstr "全书 %(pages)s 页" -#: bookwyrm/templates/snippets/create_status_form.html:89 +#: bookwyrm/templates/snippets/create_status_form.html:97 msgid "Include spoiler alert" msgstr "加入剧透警告" -#: bookwyrm/templates/snippets/create_status_form.html:95 +#: bookwyrm/templates/snippets/create_status_form.html:104 #: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy_select.html:19 msgid "Private" msgstr "私密" -#: bookwyrm/templates/snippets/create_status_form.html:102 +#: bookwyrm/templates/snippets/create_status_form.html:115 msgid "Post" msgstr "发布" @@ -2050,24 +2304,27 @@ msgstr "删除这些阅读日期吗?" #: bookwyrm/templates/snippets/delete_readthrough_modal.html:7 #, python-format -msgid "You are deleting this readthrough and its %(count)s associated progress updates." +msgid "" +"You are deleting this readthrough and its %(count)s associated progress " +"updates." msgstr "你正要删除这篇阅读经过以及与之相关的 %(count)s 次进度更新。" #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:13 +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:391 msgid "Delete" msgstr "删除" #: bookwyrm/templates/snippets/fav_button.html:7 -#: bookwyrm/templates/snippets/fav_button.html:8 -#: bookwyrm/templates/snippets/status/status_body.html:55 -#: bookwyrm/templates/snippets/status/status_body.html:56 -msgid "Like status" -msgstr "喜欢状态" +#: bookwyrm/templates/snippets/fav_button.html:9 +msgid "Like" +msgstr "" #: bookwyrm/templates/snippets/fav_button.html:15 #: bookwyrm/templates/snippets/fav_button.html:16 -msgid "Un-like status" +#, fuzzy +#| msgid "Un-like status" +msgid "Un-like" msgstr "取消喜欢状态" #: bookwyrm/templates/snippets/filters_panel/filters_panel.html:7 @@ -2102,6 +2359,11 @@ msgstr "取消关注" msgid "Accept" msgstr "接受" +#: bookwyrm/templates/snippets/form_rate_stars.html:20 +#: bookwyrm/templates/snippets/stars.html:13 +msgid "No rating" +msgstr "没有评价" + #: bookwyrm/templates/snippets/generated_status/goal.html:1 #, python-format msgid "set a goal to read %(counter)s book in %(year)s" @@ -2110,15 +2372,21 @@ msgstr[0] "设定了在 %(year)s 内要读 %(counter)s 本书的目标" #: bookwyrm/templates/snippets/generated_status/rating.html:3 #, python-format -msgid "Rated %(title)s: %(display_rating)s star" -msgid_plural "Rated %(title)s: %(display_rating)s stars" -msgstr[0] "为 %(title)s 打了分: %(display_rating)s 星" +msgid "" +"Rated %(title)s: %(display_rating)s star" +msgid_plural "" +"Rated %(title)s: %(display_rating)s stars" +msgstr[0] "" +"为 %(title)s 打了分: %(display_rating)s 星" #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:4 #, python-format -msgid "Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" -msgid_plural "Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" -msgstr[0] "\"%(book_title)s\" 的书评(%(display_rating)s 星): %(review_title)s" +msgid "" +"Review of \"%(book_title)s\" (%(display_rating)s star): %(review_title)s" +msgid_plural "" +"Review of \"%(book_title)s\" (%(display_rating)s stars): %(review_title)s" +msgstr[0] "" +"\"%(book_title)s\" 的书评(%(display_rating)s 星): %(review_title)s" #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:8 #, python-format @@ -2127,8 +2395,12 @@ msgstr "\"%(book_title)s\" 的书评: %(review_title)s" #: bookwyrm/templates/snippets/goal_card.html:23 #, python-format -msgid "You can set or change your reading goal any time from your profile page" -msgstr "你可以在任何时候从你的个人资料页面 中设置或改变你的阅读目标" +msgid "" +"You can set or change your reading goal any time from your profile page" +msgstr "" +"你可以在任何时候从你的个人资料页面 中设置或改变你的" +"阅读目标" #: bookwyrm/templates/snippets/goal_form.html:9 msgid "Reading goal:" @@ -2153,10 +2425,6 @@ msgstr "发布到消息流中" msgid "Set goal" msgstr "设置目标" -#: bookwyrm/templates/snippets/goal_progress.html:5 -msgid "Success!" -msgstr "成功!" - #: bookwyrm/templates/snippets/goal_progress.html:7 #, python-format msgid "%(percent)s%% complete!" @@ -2164,13 +2432,20 @@ msgstr "完成了 %(percent)s%% !" #: bookwyrm/templates/snippets/goal_progress.html:10 #, python-format -msgid "You've read %(read_count)s of %(goal_count)s books." -msgstr "你已经阅读了 %(goal_count)s 本书中的 %(read_count)s 本。" +msgid "" +"You've read %(read_count)s of %(goal_count)s books." +msgstr "" +"你已经阅读了 %(goal_count)s 本书中的 %(read_count)s 本。" #: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format -msgid "%(username)s has read %(read_count)s of %(goal_count)s books." -msgstr "%(username)s 已经阅读了 %(goal_count)s 本书中的 %(read_count)s 本。" +msgid "" +"%(username)s has read %(read_count)s of %(goal_count)s " +"books." +msgstr "" +"%(username)s 已经阅读了 %(goal_count)s 本书中的 " +"%(read_count)s 本。" #: bookwyrm/templates/snippets/page_text.html:4 #, python-format @@ -2182,11 +2457,11 @@ msgstr "%(total_pages)s 页中的第 %(page)s 页" msgid "page %(page)s" msgstr "第 %(page)s 页" -#: bookwyrm/templates/snippets/pagination.html:5 +#: bookwyrm/templates/snippets/pagination.html:12 msgid "Previous" msgstr "往前" -#: bookwyrm/templates/snippets/pagination.html:9 +#: bookwyrm/templates/snippets/pagination.html:23 msgid "Next" msgstr "往后" @@ -2219,7 +2494,7 @@ msgstr "关注者" msgid "Leave a rating" msgstr "留下评价" -#: bookwyrm/templates/snippets/rate_action.html:29 +#: bookwyrm/templates/snippets/rate_action.html:19 msgid "Rate" msgstr "评价" @@ -2276,29 +2551,25 @@ msgid "Report" msgstr "报告" #: bookwyrm/templates/snippets/rss_title.html:5 -#: bookwyrm/templates/snippets/status/status_header.html:11 +#: bookwyrm/templates/snippets/status/status_header.html:34 msgid "rated" msgstr "评价了" #: bookwyrm/templates/snippets/rss_title.html:7 -#: bookwyrm/templates/snippets/status/status_header.html:13 +#: bookwyrm/templates/snippets/status/status_header.html:36 msgid "reviewed" msgstr "写了书评给" #: bookwyrm/templates/snippets/rss_title.html:9 -#: bookwyrm/templates/snippets/status/status_header.html:15 +#: bookwyrm/templates/snippets/status/status_header.html:38 msgid "commented on" msgstr "评论了" #: bookwyrm/templates/snippets/rss_title.html:11 -#: bookwyrm/templates/snippets/status/status_header.html:17 +#: bookwyrm/templates/snippets/status/status_header.html:40 msgid "quoted" msgstr "引用了" -#: bookwyrm/templates/snippets/search_result_text.html:10 -msgid "No cover" -msgstr "没有封面" - #: bookwyrm/templates/snippets/search_result_text.html:22 #, python-format msgid "by %(author)s" @@ -2318,7 +2589,7 @@ msgid "Finish \"%(book_title)s\"" msgstr "完成 \"%(book_title)s\"" #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5 -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:35 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:34 msgid "Update progress" msgstr "更新进度" @@ -2339,7 +2610,7 @@ msgstr "完成阅读" msgid "Want to read" msgstr "想要阅读" -#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:48 +#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45 #, python-format msgid "Remove from %(name)s" msgstr "从 %(name)s 移除" @@ -2354,60 +2625,65 @@ msgstr "开始 \"%(book_title)s\"" msgid "Want to Read \"%(book_title)s\"" msgstr "想要阅读 \"%(book_title)s\"" +#: bookwyrm/templates/snippets/status/content_status.html:67 +#: bookwyrm/templates/snippets/trimmed_text.html:14 +msgid "Show more" +msgstr "显示更多" + +#: bookwyrm/templates/snippets/status/content_status.html:82 +#: bookwyrm/templates/snippets/trimmed_text.html:29 +msgid "Show less" +msgstr "显示更少" + +#: bookwyrm/templates/snippets/status/content_status.html:112 +msgid "Open image in new window" +msgstr "在新窗口中打开图像" + +#: bookwyrm/templates/snippets/status/layout.html:22 +#: bookwyrm/templates/snippets/status/status_options.html:17 +msgid "Delete status" +msgstr "删除发文" + +#: bookwyrm/templates/snippets/status/layout.html:52 +#: bookwyrm/templates/snippets/status/layout.html:53 +msgid "Boost status" +msgstr "转发状态" + +#: bookwyrm/templates/snippets/status/layout.html:56 +#: bookwyrm/templates/snippets/status/layout.html:57 +msgid "Like status" +msgstr "喜欢状态" + #: bookwyrm/templates/snippets/status/status.html:9 msgid "boosted" msgstr "转发了" -#: bookwyrm/templates/snippets/status/status_body.html:27 -#: bookwyrm/templates/snippets/status/status_options.html:18 -msgid "Delete status" -msgstr "删除发文" - -#: bookwyrm/templates/snippets/status/status_body.html:34 -#: bookwyrm/templates/snippets/status/status_body.html:47 -#: bookwyrm/templates/snippets/status/status_body.html:48 -msgid "Reply" -msgstr "回复" - -#: bookwyrm/templates/snippets/status/status_content.html:18 -#: bookwyrm/templates/snippets/trimmed_text.html:15 -msgid "Show more" -msgstr "显示更多" - -#: bookwyrm/templates/snippets/status/status_content.html:25 -#: bookwyrm/templates/snippets/trimmed_text.html:25 -msgid "Show less" -msgstr "显示更少" - -#: bookwyrm/templates/snippets/status/status_content.html:46 -msgid "Open image in new window" -msgstr "在新窗口中打开图像" - -#: bookwyrm/templates/snippets/status/status_header.html:22 +#: bookwyrm/templates/snippets/status/status_header.html:44 #, python-format -msgid "replied to %(username)s's review" -msgstr "回复了 %(username)s书评" - -#: bookwyrm/templates/snippets/status/status_header.html:24 -#, python-format -msgid "replied to %(username)s's comment" -msgstr "恢复了 %(username)s评论" - -#: bookwyrm/templates/snippets/status/status_header.html:26 -#, python-format -msgid "replied to %(username)s's quote" -msgstr "回复了 %(username)s引用" - -#: bookwyrm/templates/snippets/status/status_header.html:28 -#, python-format -msgid "replied to %(username)s's status" -msgstr "回复了 %(username)s状态" +msgid "" +"replied to %(username)s's status" +msgstr "" +"回复了 %(username)s状态" #: bookwyrm/templates/snippets/status/status_options.html:7 #: bookwyrm/templates/snippets/user_options.html:7 msgid "More options" msgstr "更多选项" +#: bookwyrm/templates/snippets/status/status_options.html:26 +#, fuzzy +#| msgid "Delete these read dates" +msgid "Delete & re-draft" +msgstr "删除这些阅读日期" + +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +#: bookwyrm/templates/user_admin/user_moderation_actions.html:6 +msgid "Send direct message" +msgstr "发送私信" + #: bookwyrm/templates/snippets/switch_edition_button.html:5 msgid "Switch to this edition" msgstr "切换到此版本" @@ -2420,19 +2696,6 @@ msgstr "升序排序" msgid "Sorted descending" msgstr "降序排序" -#: bookwyrm/templates/snippets/tag.html:14 -msgid "Remove tag" -msgstr "移除标签" - -#: bookwyrm/templates/snippets/tag.html:18 -msgid "Add tag" -msgstr "添加标签" - -#: bookwyrm/templates/tag.html:9 -#, python-format -msgid "Books tagged \"%(tag.name)s\"" -msgstr "标有 \"%(tag.name)s\" 标签的书" - #: bookwyrm/templates/user/books_header.html:5 #, python-format msgid "%(username)s's books" @@ -2471,10 +2734,6 @@ msgstr "正在关注" msgid "%(username)s isn't following any users" msgstr "%(username)s 没有关注任何用户" -#: bookwyrm/templates/user/lists.html:9 -msgid "Your Lists" -msgstr "你的列表" - #: bookwyrm/templates/user/lists.html:11 #, python-format msgid "Lists: %(username)s" @@ -2484,7 +2743,7 @@ msgstr "列表: %(username)s" msgid "Create list" msgstr "创建列表" -#: bookwyrm/templates/user/shelf.html:24 bookwyrm/views/shelf.py:56 +#: bookwyrm/templates/user/shelf.html:24 bookwyrm/views/shelf.py:51 msgid "All books" msgstr "所有书目" @@ -2496,23 +2755,23 @@ msgstr "创建书架" msgid "Edit shelf" msgstr "编辑书架" -#: bookwyrm/templates/user/shelf.html:78 +#: bookwyrm/templates/user/shelf.html:77 bookwyrm/templates/user/shelf.html:99 msgid "Shelved" msgstr "上架时间" -#: bookwyrm/templates/user/shelf.html:79 +#: bookwyrm/templates/user/shelf.html:78 bookwyrm/templates/user/shelf.html:103 msgid "Started" msgstr "开始时间" -#: bookwyrm/templates/user/shelf.html:80 +#: bookwyrm/templates/user/shelf.html:79 bookwyrm/templates/user/shelf.html:106 msgid "Finished" msgstr "完成时间" -#: bookwyrm/templates/user/shelf.html:129 +#: bookwyrm/templates/user/shelf.html:132 msgid "This shelf is empty." msgstr "此书架是空的。" -#: bookwyrm/templates/user/shelf.html:135 +#: bookwyrm/templates/user/shelf.html:138 msgid "Delete shelf" msgstr "删除书架" @@ -2574,6 +2833,79 @@ msgstr[0] "%(counter)s 个关注者" msgid "%(counter)s following" msgstr "关注着 %(counter)s 人" +#: bookwyrm/templates/user_admin/user.html:11 +#, fuzzy +#| msgid "Back to reports" +msgid "Back to users" +msgstr "回到报告" + +#: bookwyrm/templates/user_admin/user_admin.html:7 +#, python-format +msgid "Users: %(server_name)s" +msgstr "用户: %(server_name)s" + +#: bookwyrm/templates/user_admin/user_admin.html:22 +#: bookwyrm/templates/user_admin/username_filter.html:5 +msgid "Username" +msgstr "用户名" + +#: bookwyrm/templates/user_admin/user_admin.html:26 +msgid "Date Added" +msgstr "添加日期:" + +#: bookwyrm/templates/user_admin/user_admin.html:30 +msgid "Last Active" +msgstr "最后或缺" + +#: bookwyrm/templates/user_admin/user_admin.html:38 +msgid "Remote server" +msgstr "移除服务器" + +#: bookwyrm/templates/user_admin/user_admin.html:47 +msgid "Active" +msgstr "活跃" + +#: bookwyrm/templates/user_admin/user_admin.html:47 +msgid "Inactive" +msgstr "停用" + +#: bookwyrm/templates/user_admin/user_admin.html:52 +#: bookwyrm/templates/user_admin/user_info.html:49 +msgid "Not set" +msgstr "未设置" + +#: bookwyrm/templates/user_admin/user_info.html:5 +#, fuzzy +#| msgid "Details" +msgid "User details" +msgstr "详细" + +#: bookwyrm/templates/user_admin/user_info.html:14 +msgid "View user profile" +msgstr "查看用户个人资料" + +#: bookwyrm/templates/user_admin/user_info.html:20 +#, fuzzy +#| msgid "Instance Settings" +msgid "Instance details" +msgstr "实例设置" + +#: bookwyrm/templates/user_admin/user_info.html:46 +msgid "View instance" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:11 +msgid "Suspend user" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 +msgid "Un-suspend user" +msgstr "" + +#: bookwyrm/templates/user_admin/user_moderation_actions.html:21 +msgid "Access level:" +msgstr "" + #: bookwyrm/views/password.py:32 msgid "No user with that email address was found." msgstr "没有找到使用该邮箱的用户。" @@ -2583,6 +2915,1426 @@ msgstr "没有找到使用该邮箱的用户。" msgid "A password reset link sent to %s" msgstr "密码重置连接已发送给 %s" +#: venv3/lib/python3.8/site-packages/_pytest/config/argparsing.py:442 +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/messages/apps.py:7 +#, fuzzy +#| msgid "All messages" +msgid "Messages" +msgstr "所有消息" + +#: venv3/lib/python3.8/site-packages/django/contrib/sitemaps/apps.py:7 +msgid "Site Maps" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/staticfiles/apps.py:9 +msgid "Static Files" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/contrib/syndication/apps.py:7 +msgid "Syndication" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:45 +msgid "That page number is not an integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:47 +msgid "That page number is less than 1" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/paginator.py:52 +msgid "That page contains no results" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:32 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid value." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:103 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:659 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid URL." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:155 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid integer." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:166 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid email address." +msgstr "邮箱地址:" + +#. Translators: "letters" means latin letters: a-z and A-Z. +#: venv3/lib/python3.8/site-packages/django/core/validators.py:240 +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:247 +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:256 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:276 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid IPv4 address." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:261 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:277 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid IPv6 address." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:271 +#: venv3/lib/python3.8/site-packages/django/core/validators.py:275 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:305 +msgid "Enter only digits separated by commas." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:311 +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:343 +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:352 +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:362 +#, python-format +msgid "" +"Ensure this value has at least %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at least %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:377 +#, python-format +msgid "" +"Ensure this value has at most %(limit_value)d character (it has " +"%(show_value)d)." +msgid_plural "" +"Ensure this value has at most %(limit_value)d characters (it has " +"%(show_value)d)." +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:396 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:291 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:326 +#, fuzzy +#| msgid "Series number:" +msgid "Enter a number." +msgstr "系列编号:" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:398 +#, python-format +msgid "Ensure that there are no more than %(max)s digit in total." +msgid_plural "Ensure that there are no more than %(max)s digits in total." +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:403 +#, python-format +msgid "Ensure that there are no more than %(max)s decimal place." +msgid_plural "Ensure that there are no more than %(max)s decimal places." +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:408 +#, python-format +msgid "" +"Ensure that there are no more than %(max)s digit before the decimal point." +msgid_plural "" +"Ensure that there are no more than %(max)s digits before the decimal point." +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:470 +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/core/validators.py:522 +msgid "Null characters are not allowed." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/base.py:1181 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:759 +msgid "and" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/base.py:1183 +#, fuzzy, python-format +#| msgid "A user with this email already exists." +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "已经存在使用该邮箱的用户。" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:104 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid remote_id" +msgid "Value %(value)r is not a valid choice." +msgstr "%(value)s 不是有效的 remote_id" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:105 +#, fuzzy +#| msgid "This shelf is empty." +msgid "This field cannot be null." +msgstr "此书架是空的。" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:106 +msgid "This field cannot be blank." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:107 +#, fuzzy, python-format +#| msgid "A user with this email already exists." +msgid "%(model_name)s with this %(field_label)s already exists." +msgstr "已经存在使用该邮箱的用户。" + +#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. +#. Eg: "Title must be unique for pub_date year" +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:111 +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:130 +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:937 +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:938 +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:940 +msgid "Boolean (Either True or False)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:981 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1045 +#, fuzzy +#| msgid "No active invites" +msgid "Comma-separated integers" +msgstr "无有效的邀请" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1094 +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1096 +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1239 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1099 +msgid "Date (without time)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1237 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1241 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ]) but it is an invalid date/time." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1245 +msgid "Date (with time)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1393 +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1395 +#, fuzzy +#| msgid "Series number:" +msgid "Decimal number" +msgstr "系列编号:" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1534 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1537 +#, fuzzy +#| msgid "List curation:" +msgid "Duration" +msgstr "列表策展:" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1587 +#, fuzzy +#| msgid "Email address:" +msgid "Email address" +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1610 +msgid "File path" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1676 +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1678 +msgid "Floating point number" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1716 +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1718 +msgid "Integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1801 +#, fuzzy +#| msgid "No active invites" +msgid "Big (8 byte) integer" +msgstr "无有效的邀请" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1817 +#, fuzzy +#| msgid "Email address:" +msgid "IPv4 address" +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1848 +#, fuzzy +#| msgid "Email address:" +msgid "IP address" +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1928 +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1929 +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1931 +msgid "Boolean (Either True, False or None)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1966 +#, fuzzy +#| msgid "No active invites" +msgid "Positive integer" +msgstr "无有效的邀请" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1979 +#, fuzzy +#| msgid "No active invites" +msgid "Positive small integer" +msgstr "无有效的邀请" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:1993 +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2025 +msgid "Small integer" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2032 +msgid "Text" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2060 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2062 +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2065 +msgid "Time" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2191 +msgid "URL" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2213 +msgid "Raw binary data" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2278 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid username" +msgid "“%(value)s” is not a valid UUID." +msgstr "%(value)s 不是有效的用户名" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/__init__.py:2280 +msgid "Universally unique identifier" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/files.py:221 +msgid "File" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/files.py:360 +#, fuzzy +#| msgid "Images" +msgid "Image" +msgstr "图像" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:778 +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:780 +msgid "Foreign Key (type determined by related field)" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1012 +#, fuzzy +#| msgid "Relationships" +msgid "One-to-one relationship" +msgstr "关系" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1066 +#, fuzzy, python-format +#| msgid "Relationships" +msgid "%(from)s-%(to)s relationship" +msgstr "关系" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1067 +#, fuzzy, python-format +#| msgid "Relationships" +msgid "%(from)s-%(to)s relationships" +msgstr "关系" + +#: venv3/lib/python3.8/site-packages/django/db/models/fields/related.py:1109 +#, fuzzy +#| msgid "Relationships" +msgid "Many-to-many relationship" +msgstr "关系" + +#. Translators: If found as last label character, these punctuation +#. characters will prevent the default label_suffix to be appended to the label +#: venv3/lib/python3.8/site-packages/django/forms/boundfield.py:149 +msgid ":?.!" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:53 +#, fuzzy +#| msgid "This shelf is empty." +msgid "This field is required." +msgstr "此书架是空的。" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:246 +#, fuzzy +#| msgid "Series number:" +msgid "Enter a whole number." +msgstr "系列编号:" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:397 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1127 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid date." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:421 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1128 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid time." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:443 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid date/time." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:472 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid duration." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:473 +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:533 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:534 +msgid "No file was submitted." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:535 +#, fuzzy +#| msgid "This shelf is empty." +msgid "The submitted file is empty." +msgstr "此书架是空的。" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:537 +#, python-format +msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." +msgid_plural "" +"Ensure this filename has at most %(max)d characters (it has %(length)d)." +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:540 +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:601 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:763 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:853 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1275 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:854 +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:969 +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1274 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a list of values." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:970 +msgid "Enter a complete value." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/fields.py:1186 +#, fuzzy +#| msgid "Email address:" +msgid "Enter a valid UUID." +msgstr "邮箱地址:" + +#. Translators: This is the default suffix added to form field labels +#: venv3/lib/python3.8/site-packages/django/forms/forms.py:81 +msgid ":" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/forms.py:207 +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:93 +msgid "ManagementForm data is missing or has been tampered with" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:345 +#, python-format +msgid "Please submit %d or fewer forms." +msgid_plural "Please submit %d or fewer forms." +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:352 +#, python-format +msgid "Please submit %d or more forms." +msgid_plural "Please submit %d or more forms." +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:379 +#: venv3/lib/python3.8/site-packages/django/forms/formsets.py:386 +#, fuzzy +#| msgid "Order by" +msgid "Order" +msgstr "排列顺序" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:754 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:758 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:764 +#, python-format +msgid "" +"Please correct the duplicate data for %(field_name)s which must be unique " +"for the %(lookup)s in %(date_field)s." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:773 +msgid "Please correct the duplicate values below." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1094 +msgid "The inline value did not match the parent instance." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1161 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/models.py:1277 +#, fuzzy, python-format +#| msgid "%(value)s is not a valid username" +msgid "“%(pk)s” is not a valid value." +msgstr "%(value)s 不是有效的用户名" + +#: venv3/lib/python3.8/site-packages/django/forms/utils.py:162 +#, python-format +msgid "" +"%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it " +"may be ambiguous or it may not exist." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:395 +msgid "Clear" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:396 +#, fuzzy +#| msgid "Start reading" +msgid "Currently" +msgstr "开始阅读" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:397 +#, fuzzy +#| msgid "Change shelf" +msgid "Change" +msgstr "改变书架" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:709 +msgid "Unknown" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:710 +msgid "Yes" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/forms/widgets.py:711 +msgid "No" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:788 +msgid "yes,no,maybe" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:817 +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:834 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:836 +#, python-format +msgid "%s KB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:838 +#, python-format +msgid "%s MB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:840 +#, python-format +msgid "%s GB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:842 +#, python-format +msgid "%s TB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/template/defaultfilters.py:844 +#, python-format +msgid "%s PB" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:62 +msgid "p.m." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:63 +msgid "a.m." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:68 +msgid "PM" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:69 +msgid "AM" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:150 +msgid "midnight" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dateformat.py:152 +msgid "noon" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:295 +msgid "Monday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:296 +msgid "Tuesday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:297 +msgid "Wednesday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:298 +msgid "Thursday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:6 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:299 +msgid "Friday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:7 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:300 +msgid "Saturday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:7 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:301 +msgid "Sunday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Mon" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Tue" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Wed" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Thu" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:10 +msgid "Fri" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:11 +#, fuzzy +#| msgid "Status" +msgid "Sat" +msgstr "状态" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:11 +msgid "Sun" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:281 +msgid "January" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:282 +msgid "February" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:283 +#, fuzzy +#| msgid "Search" +msgid "March" +msgstr "搜索" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:284 +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:285 +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:14 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:286 +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:287 +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:288 +msgid "August" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:289 +#, fuzzy +#| msgid "Series number:" +msgid "September" +msgstr "系列编号:" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:290 +msgid "October" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:15 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:291 +msgid "November" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:16 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:292 +#, fuzzy +#| msgid "Series number:" +msgid "December" +msgstr "系列编号:" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "jan" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "feb" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "mar" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "apr" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "may" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:19 +msgid "jun" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "jul" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "aug" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "sep" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "oct" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "nov" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:20 +msgid "dec" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:23 +msgctxt "abbrev. month" +msgid "Jan." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:24 +msgctxt "abbrev. month" +msgid "Feb." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:25 +#, fuzzy +#| msgid "Search" +msgctxt "abbrev. month" +msgid "March" +msgstr "搜索" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:26 +msgctxt "abbrev. month" +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:27 +msgctxt "abbrev. month" +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:28 +msgctxt "abbrev. month" +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:29 +msgctxt "abbrev. month" +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:30 +msgctxt "abbrev. month" +msgid "Aug." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:31 +msgctxt "abbrev. month" +msgid "Sept." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:32 +msgctxt "abbrev. month" +msgid "Oct." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:33 +msgctxt "abbrev. month" +msgid "Nov." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:34 +msgctxt "abbrev. month" +msgid "Dec." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:37 +msgctxt "alt. month" +msgid "January" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:38 +msgctxt "alt. month" +msgid "February" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:39 +#, fuzzy +#| msgid "Search" +msgctxt "alt. month" +msgid "March" +msgstr "搜索" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:40 +msgctxt "alt. month" +msgid "April" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:41 +msgctxt "alt. month" +msgid "May" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:42 +msgctxt "alt. month" +msgid "June" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:43 +msgctxt "alt. month" +msgid "July" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:44 +msgctxt "alt. month" +msgid "August" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:45 +#, fuzzy +#| msgid "Series number:" +msgctxt "alt. month" +msgid "September" +msgstr "系列编号:" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:46 +msgctxt "alt. month" +msgid "October" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:47 +msgctxt "alt. month" +msgid "November" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/dates.py:48 +#, fuzzy +#| msgid "Series number:" +msgctxt "alt. month" +msgid "December" +msgstr "系列编号:" + +#: venv3/lib/python3.8/site-packages/django/utils/ipv6.py:8 +#, fuzzy +#| msgid "Email address:" +msgid "This is not a valid IPv6 address." +msgstr "邮箱地址:" + +#: venv3/lib/python3.8/site-packages/django/utils/text.py:69 +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/text.py:235 +msgid "or" +msgstr "" + +#. Translators: This string is used as a separator between list elements +#: venv3/lib/python3.8/site-packages/django/utils/text.py:254 +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:83 +msgid ", " +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:9 +#, python-format +msgid "%d year" +msgid_plural "%d years" +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:10 +#, python-format +msgid "%d month" +msgid_plural "%d months" +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:11 +#, python-format +msgid "%d week" +msgid_plural "%d weeks" +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:12 +#, python-format +msgid "%d day" +msgid_plural "%d days" +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:13 +#, python-format +msgid "%d hour" +msgid_plural "%d hours" +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:14 +#, python-format +msgid "%d minute" +msgid_plural "%d minutes" +msgstr[0] "" + +#: venv3/lib/python3.8/site-packages/django/utils/timesince.py:72 +msgid "0 minutes" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:110 +msgid "Forbidden" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:111 +msgid "CSRF verification failed. Request aborted." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:115 +msgid "" +"You are seeing this message because this HTTPS site requires a “Referer " +"header” to be sent by your Web browser, but none was sent. This header is " +"required for security reasons, to ensure that your browser is not being " +"hijacked by third parties." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:120 +msgid "" +"If you have configured your browser to disable “Referer” headers, please re-" +"enable them, at least for this site, or for HTTPS connections, or for “same-" +"origin” requests." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:124 +msgid "" +"If you are using the tag or " +"including the “Referrer-Policy: no-referrer” header, please remove them. The " +"CSRF protection requires the “Referer” header to do strict referer checking. " +"If you’re concerned about privacy, use alternatives like for links to third-party sites." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:132 +msgid "" +"You are seeing this message because this site requires a CSRF cookie when " +"submitting forms. This cookie is required for security reasons, to ensure " +"that your browser is not being hijacked by third parties." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:137 +msgid "" +"If you have configured your browser to disable cookies, please re-enable " +"them, at least for this site, or for “same-origin” requests." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/csrf.py:142 +msgid "More information is available with DEBUG=True." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:41 +msgid "No year specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:61 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:111 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:208 +msgid "Date out of range" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:90 +msgid "No month specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:142 +msgid "No day specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:188 +msgid "No week specified" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:338 +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:367 +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:589 +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/dates.py:623 +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/detail.py:54 +#, fuzzy, python-format +#| msgid "No books found matching the query \"%(query)s\"" +msgid "No %(verbose_name)s found matching the query" +msgstr "没有符合 \"%(query)s\" 请求的书目" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:67 +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:72 +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/generic/list.py:154 +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:40 +msgid "Directory indexes are not allowed here." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:42 +#, python-format +msgid "“%(path)s” does not exist" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/static.py:80 +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:7 +msgid "Django: the Web framework for perfectionists with deadlines." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:346 +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:368 +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:369 +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not configured any " +"URLs." +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:384 +msgid "Django Documentation" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:385 +msgid "Topics, references, & how-to’s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:396 +msgid "Tutorial: A Polling App" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:397 +msgid "Get started with Django" +msgstr "" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:408 +#, fuzzy +#| msgid "Community" +msgid "Django Community" +msgstr "社区" + +#: venv3/lib/python3.8/site-packages/django/views/templates/default_urlconf.html:409 +msgid "Connect, get help, or contribute" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1301 +#, python-format +msgid "Attempting to connect to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1306 +#, python-format +msgid "Connected to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/kombu/transport/qpid.py:1324 +#, python-format +msgid "Unable to connect to qpid with SASL mechanism %s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:371 +msgid "1 second ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:377 +msgid "1 minute ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:382 +msgid "1 hour ago" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:385 +#, python-format +msgid "%(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:387 +msgid "yesterday" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:387 +#, python-format +msgid "yesterday at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:389 +#, python-format +msgid "%(weekday)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:389 +#, python-format +msgid "%(weekday)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:392 +#: venv3/lib/python3.8/site-packages/tornado/locale.py:445 +#, python-format +msgid "%(month_name)s %(day)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:394 +#, python-format +msgid "%(month_name)s %(day)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:399 +#, python-format +msgid "%(month_name)s %(day)s, %(year)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:401 +#, python-format +msgid "%(month_name)s %(day)s, %(year)s at %(time)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:439 +#, python-format +msgid "%(weekday)s, %(month_name)s %(day)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/locale.py:462 +#, python-format +msgid "%(commas)s and %(last)s" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:68 +msgctxt "law" +msgid "right" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:69 +msgctxt "good" +msgid "right" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:71 +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:74 +msgctxt "organization" +msgid "club" +msgstr "" + +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:76 +#: venv3/lib/python3.8/site-packages/tornado/test/locale_test.py:77 +msgctxt "stick" +msgid "club" +msgstr "" + +#~ msgid "Deactivate user" +#~ msgstr "停用用户" + +#~ msgid "Reactivate user" +#~ msgstr "启用用户" + +#~ msgid "Date" +#~ msgstr "日期" + +#, python-format +#~ msgid "" +#~ "replied to %(username)s's review" +#~ msgstr "" +#~ "回复了 %(username)s书评" + +#, python-format +#~ msgid "" +#~ "replied to %(username)s's comment" +#~ msgstr "" +#~ "恢复了 %(username)s评论" + +#, python-format +#~ msgid "" +#~ "replied to %(username)s's quote" +#~ msgstr "" +#~ "回复了 %(username)s引用" + +#~ msgid "Remove tag" +#~ msgstr "移除标签" + +#~ msgid "Add tag" +#~ msgstr "添加标签" + +#, python-format +#~ msgid "Books tagged \"%(tag.name)s\"" +#~ msgstr "标有 \"%(tag.name)s\" 标签的书" + #, fuzzy #~| msgid "Started" #~ msgid "Getting Started" @@ -2596,9 +4348,6 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "Tags" #~ msgstr "标签" -#~ msgid "Your shelves" -#~ msgstr "你的书架" - #~ msgid "Your lists" #~ msgstr "你的列表" @@ -2638,119 +4387,6 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "Send follow request" #~ msgstr "发送关注请求" -#, fuzzy -#~| msgid "All messages" -#~ msgid "Messages" -#~ msgstr "所有消息" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "Enter a valid email address." -#~ msgstr "邮箱地址:" - -#, fuzzy -#~| msgid "Series number:" -#~ msgid "Enter a number." -#~ msgstr "系列编号:" - -#, fuzzy -#~| msgid "Series number:" -#~ msgid "Decimal number" -#~ msgstr "系列编号:" - -#, fuzzy -#~| msgid "List curation:" -#~ msgid "Duration" -#~ msgstr "列表策展:" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "Email address" -#~ msgstr "邮箱地址:" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "IPv4 address" -#~ msgstr "邮箱地址:" - -#, fuzzy -#~| msgid "Email address:" -#~ msgid "IP address" -#~ msgstr "邮箱地址:" - -#, fuzzy -#~| msgid "No active invites" -#~ msgid "Positive integer" -#~ msgstr "无有效的邀请" - -#, fuzzy -#~| msgid "Images" -#~ msgid "Image" -#~ msgstr "图像" - -#, fuzzy -#~| msgid "Relationships" -#~ msgid "One-to-one relationship" -#~ msgstr "关系" - -#, fuzzy -#~| msgid "This shelf is empty." -#~ msgid "This field is required." -#~ msgstr "此书架是空的。" - -#, fuzzy -#~| msgid "This shelf is empty." -#~ msgid "The submitted file is empty." -#~ msgstr "此书架是空的。" - -#, fuzzy -#~| msgid "Start reading" -#~ msgid "Currently" -#~ msgstr "开始阅读" - -#, fuzzy -#~| msgid "Change shelf" -#~ msgid "Change" -#~ msgstr "改变书架" - -#, fuzzy -#~| msgid "Status" -#~ msgid "Sat" -#~ msgstr "状态" - -#, fuzzy -#~| msgid "Search" -#~ msgid "March" -#~ msgstr "搜索" - -#, fuzzy -#~| msgid "Series number:" -#~ msgid "September" -#~ msgstr "系列编号:" - -#, fuzzy -#~| msgid "Search" -#~ msgctxt "abbrev. month" -#~ msgid "March" -#~ msgstr "搜索" - -#, fuzzy -#~| msgid "Search" -#~ msgctxt "alt. month" -#~ msgid "March" -#~ msgstr "搜索" - -#, fuzzy -#~| msgid "Series number:" -#~ msgctxt "alt. month" -#~ msgid "September" -#~ msgstr "系列编号:" - -#, fuzzy -#~| msgid "No books found matching the query \"%(query)s\"" -#~ msgid "No %(verbose_name)s found matching the query" -#~ msgstr "没有符合 \"%(query)s\" 请求的书目" - #~ msgid "Announcements" #~ msgstr "公告" From c2ffdb8f03da3e1c6caceaa573efb9d66ec27700 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 10:04:33 -0700 Subject: [PATCH 06/18] Import ratings as ratings, not reviews --- bookwyrm/importers/importer.py | 45 ++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index c1e41897..89c62e73 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -116,24 +116,33 @@ def handle_imported_book(source, user, item, include_reviews, privacy): read.save() if include_reviews and (item.rating or item.review): - review_title = ( - "Review of {!r} on {!r}".format( - item.book.title, - source, - ) - if item.review - else "" - ) - # we don't know the publication date of the review, # but "now" is a bad guess published_date_guess = item.date_read or item.date_added - models.Review.objects.create( - user=user, - book=item.book, - name=review_title, - content=item.review, - rating=item.rating, - published_date=published_date_guess, - privacy=privacy, - ) + if item.review: + review_title = ( + "Review of {!r} on {!r}".format( + item.book.title, + source, + ) + if item.review + else "" + ) + models.Review.objects.create( + user=user, + book=item.book, + name=review_title, + content=item.review, + rating=item.rating, + published_date=published_date_guess, + privacy=privacy, + ) + else: + # just a rating + models.ReviewRating.objects.create( + user=user, + book=item.book, + rating=item.rating, + published_date=published_date_guess, + privacy=privacy, + ) From 99efe6b290dc07a117764904e41f59480d34f4b8 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 10:11:13 -0700 Subject: [PATCH 07/18] Limit how many notifications are loaded --- bookwyrm/views/notifications.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/notifications.py b/bookwyrm/views/notifications.py index e0e2102d..0324f595 100644 --- a/bookwyrm/views/notifications.py +++ b/bookwyrm/views/notifications.py @@ -16,7 +16,7 @@ class Notifications(View): notifications = request.user.notification_set.all().order_by("-created_date") unread = [n.id for n in notifications.filter(read=False)] data = { - "notifications": notifications, + "notifications": notifications[:50], "unread": unread, } notifications.update(read=True) From 786cf4fb977857e8e441fbcbec4ca47f430dc04f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 10:26:27 -0700 Subject: [PATCH 08/18] Paginate followers/following pages --- bookwyrm/templates/user/followers.html | 2 ++ bookwyrm/templates/user/following.html | 2 ++ bookwyrm/views/notifications.py | 2 +- bookwyrm/views/user.py | 6 ++++-- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/bookwyrm/templates/user/followers.html b/bookwyrm/templates/user/followers.html index 45d87a3d..b294db90 100644 --- a/bookwyrm/templates/user/followers.html +++ b/bookwyrm/templates/user/followers.html @@ -29,4 +29,6 @@
{% blocktrans with username=user.display_name %}{{ username }} has no followers{% endblocktrans %}
{% endif %}
+ +{% include 'snippets/pagination.html' with page=followers path=request.path %} {% endblock %} diff --git a/bookwyrm/templates/user/following.html b/bookwyrm/templates/user/following.html index 5904c1bb..38c01ad2 100644 --- a/bookwyrm/templates/user/following.html +++ b/bookwyrm/templates/user/following.html @@ -29,4 +29,6 @@
{% blocktrans with username=user|username %}{{ username }} isn't following any users{% endblocktrans %}
{% endif %}
+ +{% include 'snippets/pagination.html' with page=following path=request.path %} {% endblock %} diff --git a/bookwyrm/views/notifications.py b/bookwyrm/views/notifications.py index 0324f595..3d08cade 100644 --- a/bookwyrm/views/notifications.py +++ b/bookwyrm/views/notifications.py @@ -16,7 +16,7 @@ class Notifications(View): notifications = request.user.notification_set.all().order_by("-created_date") unread = [n.id for n in notifications.filter(read=False)] data = { - "notifications": notifications[:50], + "notifications": notifications[:50], "unread": unread, } notifications.update(read=True) diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index 05fdb606..d394c1d7 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -106,10 +106,11 @@ class Followers(View): if is_api_request(request): return ActivitypubResponse(user.to_followers_activity(**request.GET)) + paginated = Paginator(user.followers.all(), PAGE_LENGTH) data = { "user": user, "is_self": request.user.id == user.id, - "followers": user.followers.all(), + "followers": paginated.page(request.GET.get("page", 1)), } return TemplateResponse(request, "user/followers.html", data) @@ -131,10 +132,11 @@ class Following(View): if is_api_request(request): return ActivitypubResponse(user.to_following_activity(**request.GET)) + paginated = Paginator(user.followers.all(), PAGE_LENGTH) data = { "user": user, "is_self": request.user.id == user.id, - "following": user.following.all(), + "following": paginated.page(request.GET.get("page", 1)), } return TemplateResponse(request, "user/following.html", data) From 141d1a9a17d7f9fd4c0715436e023f96f94b1ed8 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 11:22:08 -0700 Subject: [PATCH 09/18] Adds auto field setting to avoid hella warnings --- bookwyrm/settings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index fb5488e7..57bf2873 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -34,6 +34,8 @@ LOCALE_PATHS = [ os.path.join(BASE_DIR, "locale"), ] +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' + # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ From cd869dde09af75c82f741d8768c21fe4423d67f1 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 11:28:33 -0700 Subject: [PATCH 10/18] Fixes tests of bookwyrm abstract model --- bookwyrm/settings.py | 2 +- bookwyrm/tests/models/test_base_model.py | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 57bf2873..b679e2d4 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -34,7 +34,7 @@ LOCALE_PATHS = [ os.path.join(BASE_DIR, "locale"), ] -DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' +DEFAULT_AUTO_FIELD = "django.db.models.AutoField" # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/2.0/howto/deployment/checklist/ diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py index 5a8350b2..41aff1fc 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -26,20 +26,22 @@ class BaseModel(TestCase): outbox="https://example.com/users/rat/outbox", ) + class TestModel(base_model.BookWyrmModel): + """ just making it not abstract """ + self.test_model = TestModel() + def test_remote_id(self): """these should be generated""" - instance = base_model.BookWyrmModel() - instance.id = 1 - expected = instance.get_remote_id() - self.assertEqual(expected, "https://%s/bookwyrmmodel/1" % DOMAIN) + self.test_model.id = 1 + expected = self.test_model.get_remote_id() + self.assertEqual(expected, "https://%s/testmodel/1" % DOMAIN) def test_remote_id_with_user(self): """format of remote id when there's a user object""" - instance = base_model.BookWyrmModel() - instance.user = self.local_user - instance.id = 1 - expected = instance.get_remote_id() - self.assertEqual(expected, "https://%s/user/mouse/bookwyrmmodel/1" % DOMAIN) + self.test_model.user = self.local_user + self.test_model.id = 1 + expected = self.test_model.get_remote_id() + self.assertEqual(expected, "https://%s/user/mouse/testmodel/1" % DOMAIN) def test_set_remote_id(self): """this function sets remote ids after creation""" From df31ac9742c295f770c00c07e2e34b6c44b0981d Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 11:33:17 -0700 Subject: [PATCH 11/18] Show rating in statuses --- bookwyrm/templates/snippets/status/status_header.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/bookwyrm/templates/snippets/status/status_header.html b/bookwyrm/templates/snippets/status/status_header.html index 3b46b9ce..b9faf64e 100644 --- a/bookwyrm/templates/snippets/status/status_header.html +++ b/bookwyrm/templates/snippets/status/status_header.html @@ -6,7 +6,7 @@
@@ -47,7 +47,7 @@ {% if status.book %} {% if status.status_type == 'GeneratedNote' or status.status_type == 'Rating' %} - {{ status.book|title }}{% if status.status_type == 'Rating' %}: + {{ status.book|title }}{% if status.status_type == 'Rating' %}: {% include 'snippets/stars.html' with rating=status.rating %} - {% include 'snippets/stars.html' with rating=status.rating %} {% endif %} {% else %} {% include 'snippets/book_titleby.html' with book=status.book %} From b16ac91b16b8c2542a50cb7b6e57445225f864ac Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 11:34:04 -0700 Subject: [PATCH 12/18] Python formatting --- bookwyrm/tests/models/test_base_model.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py index 41aff1fc..d500e8ea 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -28,6 +28,7 @@ class BaseModel(TestCase): class TestModel(base_model.BookWyrmModel): """ just making it not abstract """ + self.test_model = TestModel() def test_remote_id(self): From ff8601f329c5b90b28ca7746071cfbb3694fdffb Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 11:37:07 -0700 Subject: [PATCH 13/18] Fixes spacing for new Black release --- 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 d500e8ea..f473085b 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -27,7 +27,7 @@ class BaseModel(TestCase): ) class TestModel(base_model.BookWyrmModel): - """ just making it not abstract """ + """just making it not abstract""" self.test_model = TestModel() From 5bb341ba52efc6621153f7bf65a45924e87245b5 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 11:43:13 -0700 Subject: [PATCH 14/18] Use copy of requests GET params in list redirect --- bookwyrm/views/list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py index 6a241ada..89b936e9 100644 --- a/bookwyrm/views/list.py +++ b/bookwyrm/views/list.py @@ -270,7 +270,7 @@ def add_book(request): pass path = reverse("list", args=[book_list.id]) - params = request.GET + params = request.GET.copy() params["updated"] = True return redirect("{:s}?{:s}".format(path, urlencode(params))) From 7006f30ac8c0e4f6985de079d4834d920f5353c8 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 11:51:17 -0700 Subject: [PATCH 15/18] Uses unique test model name --- bookwyrm/tests/models/test_base_model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py index f473085b..ef2cd900 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -26,10 +26,10 @@ class BaseModel(TestCase): outbox="https://example.com/users/rat/outbox", ) - class TestModel(base_model.BookWyrmModel): + class BookWyrmTestModel(base_model.BookWyrmModel): """just making it not abstract""" - self.test_model = TestModel() + self.test_model = BookWyrmTestModel() def test_remote_id(self): """these should be generated""" From 4deb94714cf411b9383b03a3ba294a7bb1ebb1b0 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 13:48:54 -0700 Subject: [PATCH 16/18] Adds test for import rating --- .../tests/importers/test_goodreads_import.py | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/bookwyrm/tests/importers/test_goodreads_import.py b/bookwyrm/tests/importers/test_goodreads_import.py index 0e39d5ec..655567d0 100644 --- a/bookwyrm/tests/importers/test_goodreads_import.py +++ b/bookwyrm/tests/importers/test_goodreads_import.py @@ -228,6 +228,32 @@ class GoodreadsImport(TestCase): self.assertEqual(review.published_date.day, 8) self.assertEqual(review.privacy, "unlisted") + @patch("bookwyrm.activitystreams.ActivityStream.add_status") + def test_handle_imported_book_rating(self, _): + """goodreads rating import""" + import_job = models.ImportJob.objects.create(user=self.user) + datafile = pathlib.Path(__file__).parent.joinpath( + "../data/goodreads-rating.csv" + ) + csv_file = open(datafile, "r") + entry = list(csv.DictReader(csv_file))[2] + entry = self.importer.parse_fields(entry) + import_item = models.ImportItem.objects.create( + job_id=import_job.id, index=0, data=entry, book=self.book + ) + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + handle_imported_book( + self.importer.service, self.user, import_item, True, "unlisted" + ) + review = models.ReviewRating.objects.get(book=self.book, user=self.user) + self.assertIsInstance(review, models.ReviewRating) + self.assertEqual(review.rating, 2) + self.assertEqual(review.published_date.year, 2019) + self.assertEqual(review.published_date.month, 7) + self.assertEqual(review.published_date.day, 8) + self.assertEqual(review.privacy, "unlisted") + def test_handle_imported_book_reviews_disabled(self): """goodreads review import""" import_job = models.ImportJob.objects.create(user=self.user) From 55eb1c45263b403f0c9b3f06fcc6607b3cca35bf Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 13:50:43 -0700 Subject: [PATCH 17/18] Fixes model name --- bookwyrm/tests/models/test_base_model.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py index ef2cd900..75d0444c 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -35,14 +35,14 @@ class BaseModel(TestCase): """these should be generated""" self.test_model.id = 1 expected = self.test_model.get_remote_id() - self.assertEqual(expected, "https://%s/testmodel/1" % DOMAIN) + self.assertEqual(expected, "https://%s/bookwyrmtestmodel/1" % DOMAIN) def test_remote_id_with_user(self): """format of remote id when there's a user object""" self.test_model.user = self.local_user self.test_model.id = 1 expected = self.test_model.get_remote_id() - self.assertEqual(expected, "https://%s/user/mouse/testmodel/1" % DOMAIN) + self.assertEqual(expected, "https://%s/user/mouse/bookwyrmtestmodel/1" % DOMAIN) def test_set_remote_id(self): """this function sets remote ids after creation""" From 674c4a99dfdd043e99d60f5bddbcba0846fa5f29 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 26 Apr 2021 13:56:09 -0700 Subject: [PATCH 18/18] Adds missing data file --- bookwyrm/tests/data/goodreads-rating.csv | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 bookwyrm/tests/data/goodreads-rating.csv diff --git a/bookwyrm/tests/data/goodreads-rating.csv b/bookwyrm/tests/data/goodreads-rating.csv new file mode 100644 index 00000000..fec0c77d --- /dev/null +++ b/bookwyrm/tests/data/goodreads-rating.csv @@ -0,0 +1,5 @@ +Book Id,Title,Author,Author l-f,Additional Authors,ISBN,ISBN13,My Rating,Average Rating,Publisher,Binding,Number of Pages,Year Published,Original Publication Year,Date Read,Date Added,Bookshelves,Bookshelves with positions,Exclusive Shelf,My Review,Spoiler,Private Notes,Read Count,Recommended For,Recommended By,Owned Copies,Original Purchase Date,Original Purchase Location,Condition,Condition Description,BCID +42036538,Gideon the Ninth (The Locked Tomb #1),Tamsyn Muir,"Muir, Tamsyn",,"=""1250313198""","=""9781250313195""",0,4.20,Tor,Hardcover,448,2019,2019,2020/10/25,2020/10/21,,,read,,,,1,,,0,,,,, +52691223,Subcutanean,Aaron A. Reed,"Reed, Aaron A.",,"=""""","=""""",0,4.45,,Paperback,232,2020,,2020/03/06,2020/03/05,,,read,,,,1,,,0,,,,, +28694510,Patisserie at Home,Mélanie Dupuis,"Dupuis, Mélanie",Anne Cazor,"=""0062445316""","=""9780062445315""",2,4.60,Harper Design,Hardcover,288,2016,,,2019/07/08,,,read,,,,2,,,0,,,,, +