From 94def647fcc64786c533b1428857233ae1e891c5 Mon Sep 17 00:00:00 2001 From: Murdo <109604278+murdo-moj@users.noreply.github.com> Date: Tue, 13 Aug 2024 14:01:47 +0100 Subject: [PATCH] Accounted for errors in parsing search results (#664) * Stash * comma * undo some changes * correction * Changed name to a number * Added test * fixed tests * satisft remote tests * undo * added dc prefix * Used messages file * Applied PR suggestions * Variable name consistency * updated messages * Updated messages --- home/service/search.py | 1 + .../client/graphql_helpers.py | 10 + .../data_platform_catalogue/client/search.py | 87 +- .../data_platform_catalogue/search_types.py | 1 + .../tests/client/datahub/test_search.py | 147 ++ locale/en/LC_MESSAGES/django.po | 1581 ++++++++++++++++- templates/search.html | 3 + 7 files changed, 1776 insertions(+), 54 deletions(-) diff --git a/home/service/search.py b/home/service/search.py index a638344b..c64f699f 100644 --- a/home/service/search.py +++ b/home/service/search.py @@ -166,6 +166,7 @@ def _get_context(self, items_per_page: int) -> dict[str, Any]: context = { "form": self.form, "results": self.results.page_results, + "malformed_result_urns": self.results.malformed_result_urns, "highlighted_results": self.highlighted_results.page_results, "h1_value": _("Search"), "page_obj": self.paginator.get_page(self.page), diff --git a/lib/datahub-client/data_platform_catalogue/client/graphql_helpers.py b/lib/datahub-client/data_platform_catalogue/client/graphql_helpers.py index 617f164c..90757d2f 100644 --- a/lib/datahub-client/data_platform_catalogue/client/graphql_helpers.py +++ b/lib/datahub-client/data_platform_catalogue/client/graphql_helpers.py @@ -1,5 +1,6 @@ from collections import defaultdict from datetime import datetime, timezone +from importlib.resources import files from typing import Any, Tuple from data_platform_catalogue.entities import ( @@ -22,6 +23,15 @@ PROPERTIES_EMPTY_STRING_FIELDS = ("description", "externalUrl") +def get_graphql_query(graphql_query_file_name: str) -> str: + query_text = ( + files("data_platform_catalogue.client.graphql") + .joinpath(f"{graphql_query_file_name}.graphql") + .read_text() + ) + return query_text + + def parse_owner(entity: dict[str, Any]) -> OwnerRef: """ Parse ownership information, if it is set. diff --git a/lib/datahub-client/data_platform_catalogue/client/search.py b/lib/datahub-client/data_platform_catalogue/client/search.py index a8ae0376..48dca99a 100644 --- a/lib/datahub-client/data_platform_catalogue/client/search.py +++ b/lib/datahub-client/data_platform_catalogue/client/search.py @@ -1,13 +1,13 @@ import json import logging -from importlib.resources import files -from typing import Any, Sequence +from typing import Any, Sequence, Tuple from datahub.configuration.common import GraphError # pylint: disable=E0611 from datahub.ingestion.graph.client import DataHubGraph # pylint: disable=E0611 from data_platform_catalogue.client.exceptions import CatalogueError from data_platform_catalogue.client.graphql_helpers import ( + get_graphql_query, parse_created_and_modified, parse_domain, parse_glossary_terms, @@ -35,31 +35,11 @@ class SearchClient: def __init__(self, graph: DataHubGraph): self.graph = graph - self.search_query = ( - files("data_platform_catalogue.client.graphql") - .joinpath("search.graphql") - .read_text() - ) - self.facets_query = ( - files("data_platform_catalogue.client.graphql") - .joinpath("facets.graphql") - .read_text() - ) - self.list_domains_query = ( - files("data_platform_catalogue.client.graphql") - .joinpath("listDomains.graphql") - .read_text() - ) - self.get_glossary_terms_query = ( - files("data_platform_catalogue.client.graphql") - .joinpath("getGlossaryTerms.graphql") - .read_text() - ) - self.get_tags_query = ( - files("data_platform_catalogue.client.graphql") - .joinpath("getTags.graphql") - .read_text() - ) + self.search_query = get_graphql_query("search") + self.facets_query = get_graphql_query("facets") + self.list_domains_query = get_graphql_query("listDomains") + self.get_glossary_terms_query = get_graphql_query("getGlossaryTerms") + self.get_tags_query = get_graphql_query("getTags") def search( self, @@ -114,41 +94,46 @@ def search( logger.debug(json.dumps(response, indent=2)) - page_results = self._parse_search_results(response) + # Should these 2 variables be bound or unbound? + page_results, malformed_result_urns = self._parse_search_results(response) return SearchResponse( total_results=response["total"], page_results=page_results, + malformed_result_urns=malformed_result_urns, facets=self._parse_facets(response.get("facets", [])), ) - def _parse_search_results(self, response): + def _parse_search_results(self, response) -> Tuple[list, list]: page_results = [] + malformed_result_urns = [] for result in response["searchResults"]: entity = result["entity"] entity_type = entity["type"] + entity_urn = entity["urn"] matched_fields = self._get_matched_fields(result=result) - if entity_type == "DATASET": - page_results.append( - self._parse_result(entity, matched_fields, ResultType.TABLE) - ) - elif entity_type == "CHART": - page_results.append( - self._parse_result(entity, matched_fields, ResultType.CHART) - ) - elif entity_type == "CONTAINER": - page_results.append( - self._parse_container(entity, matched_fields, ResultType.DATABASE) - ) - elif entity_type == "DASHBOARD": - page_results.append( - self._parse_container(entity, matched_fields, ResultType.DASHBOARD) - ) - else: - raise ValueError(f"Unexpected entity type: {entity_type}") - - return page_results + try: + if entity_type == "DATASET": + parsed_result = self._parse_dataset(entity, matched_fields, ResultType.TABLE) + page_results.append(parsed_result) + elif entity_type == "CHART": + parsed_result = self._parse_dataset(entity, matched_fields, ResultType.CHART) + page_results.append(parsed_result) + elif entity_type == "CONTAINER": + parsed_result = self._parse_container(entity, matched_fields, ResultType.DATABASE) + page_results.append(parsed_result) + elif entity_type == "DASHBOARD": + parsed_result = self._parse_container(entity, matched_fields, ResultType.DASHBOARD) + page_results.append(parsed_result) + else: + raise Exception + except Exception: + logger.warn(f"Parsing for result {entity_urn} failed") + malformed_result_urns.append(entity_urn) + + + return page_results, malformed_result_urns @staticmethod def _get_matched_fields(result: dict) -> dict: @@ -230,7 +215,7 @@ def _get_data_collection_page_results(self, response, key_for_results: str): matched_fields: dict = {} if entity_type == "DATASET": page_results.append( - self._parse_result(entity, matched_fields, ResultType.TABLE) + self._parse_dataset(entity, matched_fields, ResultType.TABLE) ) else: raise ValueError(f"Unexpected entity type: {entity_type}") @@ -276,7 +261,7 @@ def _parse_list_domains( list_domain_options.append(DomainOption(urn, name, total)) return list_domain_options - def _parse_result( + def _parse_dataset( self, entity: dict[str, Any], matches, result_type: ResultType ) -> SearchResult: """ diff --git a/lib/datahub-client/data_platform_catalogue/search_types.py b/lib/datahub-client/data_platform_catalogue/search_types.py index b5e7dc6d..156032be 100644 --- a/lib/datahub-client/data_platform_catalogue/search_types.py +++ b/lib/datahub-client/data_platform_catalogue/search_types.py @@ -125,4 +125,5 @@ def lookup_label(self, field_name, label) -> FacetOption | None: class SearchResponse: total_results: int page_results: list[SearchResult] + malformed_result_urns: list[str] = field(default_factory=list) facets: SearchFacets = field(default_factory=SearchFacets) diff --git a/lib/datahub-client/tests/client/datahub/test_search.py b/lib/datahub-client/tests/client/datahub/test_search.py index 4d11f6d7..f7b854a9 100644 --- a/lib/datahub-client/tests/client/datahub/test_search.py +++ b/lib/datahub-client/tests/client/datahub/test_search.py @@ -247,6 +247,153 @@ def test_dataset_result(mock_graph, searcher): ) assert response == expected +def test_bad_entity_type(mock_graph, searcher): + datahub_response = { + "searchAcrossEntities": { + "start": 0, + "count": 1, + "total": 1, + "searchResults": [ + { + "insights": [], + "matchedFields": [], + "entity": { + "type": "UNKNOWN", + "urn": "urn:li:dataset:(urn:li:dataPlatform:bigquery,calm-pagoda-323403.jaffle_shop.customers,PROD)", # noqa E501 + "platform": {"name": "bigquery"}, + "container": None, + "ownership": None, + "name": "calm-pagoda-323403.jaffle_shop.customers", + }, + } + ], + } + } + mock_graph.execute_graphql = MagicMock(return_value=datahub_response) + + response = searcher.search() + expected = expected = SearchResponse( + total_results=1, + page_results=[], + malformed_result_urns=["urn:li:dataset:(urn:li:dataPlatform:bigquery,calm-pagoda-323403.jaffle_shop.customers,PROD)"], + facets=SearchFacets(facets={}), + ) + assert response == expected + + +def test_2_dataset_results_with_one_malformed_result(mock_graph, searcher): + datahub_response = { + "searchAcrossEntities": { + "start": 0, + "count": 1, + "total": 1, + "searchResults": [ + { + "insights": [], + "matchedFields": [], + "entity": { + "type": "DATASET", + "urn": "urn:li:dataset:(urn:li:dataPlatform:bigquery,calm-pagoda-323403.jaffle_shop.customers,PROD)", # noqa E501 + "platform": {"name": "bigquery"}, + "container": None, + "ownership": None, + "name": "pagoda", + "properties": { + "name": "customers", + "qualifiedName": "jaffle_shop.customers", + "customProperties": [ + {"key": "StoredAsSubDirectories", "value": "False"}, + { + "key": "CreatedByJob", + "value": "moj-reg-prod-hmpps-assess-risks-and-needs-prod-glue-job", + }, + ], + }, + "domain": { + "domain": { + "urn": "urn:li:domain:3dc18e48-c062-4407-84a9-73e23f768023", + "id": "3dc18e48-c062-4407-84a9-73e23f768023", + "properties": { + "name": "HMPPS", + "description": "HMPPS is an executive agency that ...", + }, + }, + "editableProperties": None, + "tags": None, + "lastIngested": 1705990502353, + }, + }, + }, + { + "insights": [], + "matchedFields": [], + "entity": { + "type": "DATASET", + "urn": "malformed", # noqa E501 + "platform": {"name": "bigquery"}, + "container": None, + "ownership": 1234, + "name": "john", + "properties": { + "name": "customers", + "qualifiedName": "jaffle_shop.customers", + "customProperties": [ + {"key": "StoredAsSubDirectories", "value": "False"}, + { + "key": "CreatedByJob", + "value": "moj-reg-prod-hmpps-assess-risks-and-needs-prod-glue-job", + }, + ], + } + }, + } + ], + } + } + mock_graph.execute_graphql = MagicMock(return_value=datahub_response) + + response = searcher.search() + expected = SearchResponse( + total_results=1, + page_results=[ + SearchResult( + urn="urn:li:dataset:(urn:li:dataPlatform:bigquery,calm-pagoda-323403.jaffle_shop.customers,PROD)", + result_type=ResultType.TABLE, + name="customers", + display_name="customers", + fully_qualified_name="jaffle_shop.customers", + description="", + matches={}, + metadata={ + "owner": "", + "owner_email": "", + "total_parents": 0, + "domain_name": "HMPPS", + "domain_id": "urn:li:domain:3dc18e48-c062-4407-84a9-73e23f768023", + "entity_types": { + "entity_type": "Dataset", + "entity_sub_types": ["Dataset"], + }, + "dpia_required": None, + "dpia_location": "", + "dc_where_to_access_dataset": "", + "source_dataset_name": "", + "s3_location": "", + "dc_access_requirements": "", + "refresh_period": "", + "last_updated": "", + "row_count": "", + }, + tags=[], + last_modified=None, + created=None, + ) + ], + malformed_result_urns=["malformed"], + facets=SearchFacets(facets={}), + ) + assert response == expected + def test_full_page(mock_graph, searcher): datahub_response = { diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 4e478174..bca38153 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Find MoJ data\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-08-12 13:45+0100\n" +"POT-Creation-Date: 2024-08-13 12:31+0100\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,7 +53,7 @@ msgid "Metadata specification" msgstr "Metadata specification" # Page title -#: home/service/search.py:170 templates/base/navigation.html:66 +#: home/service/search.py:171 templates/base/navigation.html:66 #: templates/details_base.html:14 msgid "Search" msgstr "Search" @@ -193,7 +193,8 @@ msgstr "Last updated:" msgid "Domain:" msgstr "Domain:" -#: templates/details_base.html:73 templates/partial/contact_info.html:36 +#: templates/details_base.html:73 templates/partial/contact_info.html:16 +#: templates/partial/contact_info.html:36 #: templates/partial/search_result.html:41 msgid "Not provided" msgstr "Not provided." @@ -552,6 +553,11 @@ msgstr "" "li>
" +# Result malformed +#: templates/search.html:51 +msgid "Some results were malformed and are not shown" +msgstr "Some results were malformed and are not shown" + # User model field #: users/managers.py:16 msgid "The Email must be set" @@ -572,6 +578,1575 @@ msgstr "first name" msgid "last name" msgstr "last name" +#: venv/lib/python3.11/site-packages/_pytest/config/argparsing.py:475 +#, python-format +msgid "ambiguous option: %(option)s could match %(matches)s" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/_termui_impl.py:518 +#, python-brace-format +msgid "{editor}: Editing failed" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/_termui_impl.py:522 +#, python-brace-format +msgid "{editor}: Editing failed: {e}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:1120 +#: venv/lib/python3.11/site-packages/typer/core.py:244 +msgid "Aborted!" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:1309 +#: venv/lib/python3.11/site-packages/click/decorators.py:559 +msgid "Show this message and exit." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:1340 +#: venv/lib/python3.11/site-packages/click/core.py:1370 +#, python-brace-format +msgid "(Deprecated) {text}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:1387 +#: venv/lib/python3.11/site-packages/typer/core.py:575 +#: venv/lib/python3.11/site-packages/typer/rich_utils.py:91 +msgid "Options" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:1413 +#, python-brace-format +msgid "Got unexpected extra argument ({args})" +msgid_plural "Got unexpected extra arguments ({args})" +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/click/core.py:1429 +msgid "DeprecationWarning: The command {name!r} is deprecated." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:1636 +#: venv/lib/python3.11/site-packages/typer/rich_utils.py:92 +msgid "Commands" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:1668 +msgid "Missing command." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:1746 +msgid "No such command {name!r}." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:2310 +msgid "Value must be an iterable." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:2331 +#, python-brace-format +msgid "Takes {nargs} values but 1 was given." +msgid_plural "Takes {nargs} values but {len} were given." +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/click/core.py:2778 +#: venv/lib/python3.11/site-packages/typer/core.py:519 +#, python-brace-format +msgid "env var: {var}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:2808 +#: venv/lib/python3.11/site-packages/typer/core.py:116 +msgid "(dynamic)" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:2821 +#: venv/lib/python3.11/site-packages/typer/core.py:359 +#: venv/lib/python3.11/site-packages/typer/core.py:540 +#, python-brace-format +msgid "default: {default}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/core.py:2834 +#: venv/lib/python3.11/site-packages/typer/core.py:361 +#: venv/lib/python3.11/site-packages/typer/core.py:549 +msgid "required" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/decorators.py:465 +#, python-format +msgid "%(prog)s, version %(version)s" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/decorators.py:528 +msgid "Show the version and exit." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:44 +#: venv/lib/python3.11/site-packages/click/exceptions.py:80 +#, python-brace-format +msgid "Error: {message}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:72 +#, python-brace-format +msgid "Try '{command} {option}' for help." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:121 +#, python-brace-format +msgid "Invalid value: {message}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:123 +#, python-brace-format +msgid "Invalid value for {param_hint}: {message}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:179 +msgid "Missing argument" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:181 +msgid "Missing option" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:183 +msgid "Missing parameter" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:185 +#, python-brace-format +msgid "Missing {param_type}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:192 +#, python-brace-format +msgid "Missing parameter: {param_name}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:212 +#, python-brace-format +msgid "No such option: {name}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:224 +#, python-brace-format +msgid "Did you mean {possibility}?" +msgid_plural "(Possible options: {possibilities})" +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:262 +msgid "unknown error" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/exceptions.py:269 +msgid "Could not open file {filename!r}: {message}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/parser.py:231 +msgid "Argument {name!r} takes {nargs} values." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/parser.py:413 +msgid "Option {name!r} does not take a value." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/parser.py:474 +msgid "Option {name!r} requires an argument." +msgid_plural "Option {name!r} requires {nargs} arguments." +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/click/shell_completion.py:319 +msgid "Shell completion is not supported for Bash versions older than 4.4." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/shell_completion.py:326 +msgid "Couldn't detect Bash version, shell completion is not supported." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/termui.py:158 +msgid "Repeat for confirmation" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/termui.py:174 +msgid "Error: The value you entered was invalid." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/termui.py:176 +#, python-brace-format +msgid "Error: {e.message}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/termui.py:187 +msgid "Error: The two entered values do not match." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/termui.py:243 +msgid "Error: invalid input" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/termui.py:773 +msgid "Press any key to continue..." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:266 +#, python-brace-format +msgid "" +"Choose from:\n" +"\t{choices}" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:298 +msgid "{value!r} is not {choice}." +msgid_plural "{value!r} is not one of {choices}." +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/click/types.py:392 +msgid "{value!r} does not match the format {format}." +msgid_plural "{value!r} does not match the formats {formats}." +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/click/types.py:414 +msgid "{value!r} is not a valid {number_type}." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:470 +#, python-brace-format +msgid "{value} is not in the range {range}." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:611 +msgid "{value!r} is not a valid boolean." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:635 +msgid "{value!r} is not a valid UUID." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:822 +msgid "file" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:824 +msgid "directory" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:826 +msgid "path" +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:877 +msgid "{name} {filename!r} does not exist." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:886 +msgid "{name} {filename!r} is a file." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:894 +#, python-brace-format +msgid "{name} '{filename}' is a directory." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:903 +msgid "{name} {filename!r} is not readable." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:912 +msgid "{name} {filename!r} is not writable." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:921 +msgid "{name} {filename!r} is not executable." +msgstr "" + +#: venv/lib/python3.11/site-packages/click/types.py:988 +#, python-brace-format +msgid "{len_type} values are required, but {len_value} was given." +msgid_plural "{len_type} values are required, but {len_value} were given." +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/django/contrib/messages/apps.py:16 +msgid "Messages" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/contrib/sitemaps/apps.py:8 +msgid "Site Maps" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/contrib/staticfiles/apps.py:9 +msgid "Static Files" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/contrib/syndication/apps.py:7 +msgid "Syndication" +msgstr "" + +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +#: venv/lib/python3.11/site-packages/django/core/paginator.py:30 +msgid "…" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/paginator.py:32 +msgid "That page number is not an integer" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/paginator.py:33 +msgid "That page number is less than 1" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/paginator.py:34 +msgid "That page contains no results" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:22 +msgid "Enter a valid value." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:104 +#: venv/lib/python3.11/site-packages/django/forms/fields.py:760 +msgid "Enter a valid URL." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:165 +msgid "Enter a valid integer." +msgstr "" + +# User model field +#: venv/lib/python3.11/site-packages/django/core/validators.py:176 +#, fuzzy +#| msgid "email address" +msgid "Enter a valid email address." +msgstr "email address" + +#. Translators: "letters" means latin letters: a-z and A-Z. +#: venv/lib/python3.11/site-packages/django/core/validators.py:259 +msgid "" +"Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:267 +msgid "" +"Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " +"hyphens." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:279 +#: venv/lib/python3.11/site-packages/django/core/validators.py:306 +msgid "Enter a valid IPv4 address." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:286 +#: venv/lib/python3.11/site-packages/django/core/validators.py:307 +msgid "Enter a valid IPv6 address." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:298 +#: venv/lib/python3.11/site-packages/django/core/validators.py:305 +msgid "Enter a valid IPv4 or IPv6 address." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:341 +msgid "Enter only digits separated by commas." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:347 +#, python-format +msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:382 +#, python-format +msgid "Ensure this value is less than or equal to %(limit_value)s." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:391 +#, python-format +msgid "Ensure this value is greater than or equal to %(limit_value)s." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:400 +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:407 +#, python-format +msgid "" +"Ensure this value is a multiple of step size %(limit_value)s, starting from " +"%(offset)s, e.g. %(offset)s, %(valid_value1)s, %(valid_value2)s, and so on." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:439 +#, 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] "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:457 +#, 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] "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:480 +#: venv/lib/python3.11/site-packages/django/forms/fields.py:355 +#: venv/lib/python3.11/site-packages/django/forms/fields.py:394 +msgid "Enter a number." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:482 +#, 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] "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:487 +#, 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] "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:492 +#, 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] "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:563 +#, python-format +msgid "" +"File extension “%(extension)s” is not allowed. Allowed extensions are: " +"%(allowed_extensions)s." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/core/validators.py:624 +msgid "Null characters are not allowed." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/base.py:1477 +#: venv/lib/python3.11/site-packages/django/forms/models.py:906 +msgid "and" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/base.py:1479 +#, python-format +msgid "%(model_name)s with this %(field_labels)s already exists." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/constraints.py:20 +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:133 +#, python-format +msgid "Value %(value)r is not a valid choice." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:134 +msgid "This field cannot be null." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:135 +msgid "This field cannot be blank." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:136 +#, 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" +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:140 +#, python-format +msgid "" +"%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:179 +#, python-format +msgid "Field of type: %(field_type)s" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1155 +#, python-format +msgid "“%(value)s” value must be either True or False." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1156 +#, python-format +msgid "“%(value)s” value must be either True, False, or None." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1158 +msgid "Boolean (Either True or False)" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1208 +#, python-format +msgid "String (up to %(max_length)s)" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1210 +msgid "String (unlimited)" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1314 +msgid "Comma-separated integers" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1415 +#, python-format +msgid "" +"“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " +"format." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1419 +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1554 +#, python-format +msgid "" +"“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " +"date." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1423 +msgid "Date (without time)" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1550 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." +"uuuuuu]][TZ] format." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1558 +#, 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 "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1563 +msgid "Date (with time)" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1690 +#, python-format +msgid "“%(value)s” value must be a decimal number." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1692 +msgid "Decimal number" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1853 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." +"uuuuuu] format." +msgstr "" + +# Heading +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1857 +#, fuzzy +#| msgid "Description" +msgid "Duration" +msgstr "Description" + +# User model field +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1909 +#, fuzzy +#| msgid "email address" +msgid "Email address" +msgstr "email address" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:1934 +msgid "File path" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2012 +#, python-format +msgid "“%(value)s” value must be a float." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2014 +msgid "Floating point number" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2054 +#, python-format +msgid "“%(value)s” value must be an integer." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2056 +msgid "Integer" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2152 +msgid "Big (8 byte) integer" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2169 +msgid "Small integer" +msgstr "" + +# User model field +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2177 +#, fuzzy +#| msgid "email address" +msgid "IPv4 address" +msgstr "email address" + +# User model field +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2208 +#, fuzzy +#| msgid "email address" +msgid "IP address" +msgstr "email address" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2301 +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2302 +#, python-format +msgid "“%(value)s” value must be either None, True or False." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2304 +msgid "Boolean (Either True, False or None)" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2355 +msgid "Positive big integer" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2370 +msgid "Positive integer" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2385 +msgid "Positive small integer" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2401 +#, python-format +msgid "Slug (up to %(max_length)s)" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2437 +msgid "Text" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2512 +#, python-format +msgid "" +"“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " +"format." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2516 +#, python-format +msgid "" +"“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " +"invalid time." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2520 +msgid "Time" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2628 +msgid "URL" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2652 +msgid "Raw binary data" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2717 +#, python-format +msgid "“%(value)s” is not a valid UUID." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/__init__.py:2719 +msgid "Universally unique identifier" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/files.py:232 +msgid "File" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/files.py:393 +msgid "Image" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/json.py:26 +msgid "A JSON object" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/json.py:28 +msgid "Value must be valid JSON." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/related.py:939 +#, python-format +msgid "%(model)s instance with %(field)s %(value)r does not exist." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/related.py:941 +msgid "Foreign Key (type determined by related field)" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/related.py:1235 +msgid "One-to-one relationship" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/related.py:1292 +#, python-format +msgid "%(from)s-%(to)s relationship" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/related.py:1294 +#, python-format +msgid "%(from)s-%(to)s relationships" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/db/models/fields/related.py:1342 +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 +#: venv/lib/python3.11/site-packages/django/forms/boundfield.py:185 +msgid ":?.!" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:95 +msgid "This field is required." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:304 +msgid "Enter a whole number." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:475 +#: venv/lib/python3.11/site-packages/django/forms/fields.py:1252 +msgid "Enter a valid date." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:498 +#: venv/lib/python3.11/site-packages/django/forms/fields.py:1253 +msgid "Enter a valid time." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:525 +msgid "Enter a valid date/time." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:559 +msgid "Enter a valid duration." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:560 +#, python-brace-format +msgid "The number of days must be between {min_days} and {max_days}." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:629 +msgid "No file was submitted. Check the encoding type on the form." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:630 +msgid "No file was submitted." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:631 +msgid "The submitted file is empty." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:633 +#, 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] "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:638 +msgid "Please either submit a file or check the clear checkbox, not both." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:702 +msgid "" +"Upload a valid image. The file you uploaded was either not an image or a " +"corrupted image." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:874 +#: venv/lib/python3.11/site-packages/django/forms/fields.py:960 +#: venv/lib/python3.11/site-packages/django/forms/models.py:1585 +#, python-format +msgid "Select a valid choice. %(value)s is not one of the available choices." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:962 +#: venv/lib/python3.11/site-packages/django/forms/fields.py:1081 +#: venv/lib/python3.11/site-packages/django/forms/models.py:1583 +msgid "Enter a list of values." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:1082 +msgid "Enter a complete value." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:1321 +msgid "Enter a valid UUID." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/fields.py:1351 +msgid "Enter a valid JSON." +msgstr "" + +#. Translators: This is the default suffix added to form field labels +#: venv/lib/python3.11/site-packages/django/forms/forms.py:94 +msgid ":" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/forms.py:231 +#, python-format +msgid "(Hidden field %(name)s) %(error)s" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/formsets.py:61 +#, python-format +msgid "" +"ManagementForm data is missing or has been tampered with. Missing fields: " +"%(field_names)s. You may need to file a bug report if the issue persists." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/formsets.py:65 +#, python-format +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/django/forms/formsets.py:70 +#, python-format +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/django/forms/formsets.py:484 +#: venv/lib/python3.11/site-packages/django/forms/formsets.py:491 +msgid "Order" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/formsets.py:499 +msgid "Delete" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/models.py:899 +#, python-format +msgid "Please correct the duplicate data for %(field)s." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/models.py:904 +#, python-format +msgid "Please correct the duplicate data for %(field)s, which must be unique." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/models.py:911 +#, 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 "" + +#: venv/lib/python3.11/site-packages/django/forms/models.py:920 +msgid "Please correct the duplicate values below." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/models.py:1357 +msgid "The inline value did not match the parent instance." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/models.py:1448 +msgid "Select a valid choice. That choice is not one of the available choices." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/models.py:1587 +#, python-format +msgid "“%(pk)s” is not a valid value." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/utils.py:227 +#, 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 "" + +#: venv/lib/python3.11/site-packages/django/forms/widgets.py:461 +msgid "Clear" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/widgets.py:462 +msgid "Currently" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/widgets.py:463 +msgid "Change" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/widgets.py:800 +msgid "Unknown" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/widgets.py:801 +msgid "Yes" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/forms/widgets.py:802 +msgid "No" +msgstr "" + +#. Translators: Please do not add spaces around commas. +#: venv/lib/python3.11/site-packages/django/template/defaultfilters.py:876 +msgid "yes,no,maybe" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/template/defaultfilters.py:906 +#: venv/lib/python3.11/site-packages/django/template/defaultfilters.py:923 +#, python-format +msgid "%(size)d byte" +msgid_plural "%(size)d bytes" +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/django/template/defaultfilters.py:925 +#, python-format +msgid "%s KB" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/template/defaultfilters.py:927 +#, python-format +msgid "%s MB" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/template/defaultfilters.py:929 +#, python-format +msgid "%s GB" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/template/defaultfilters.py:931 +#, python-format +msgid "%s TB" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/template/defaultfilters.py:933 +#, python-format +msgid "%s PB" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dateformat.py:74 +msgid "p.m." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dateformat.py:75 +msgid "a.m." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dateformat.py:80 +msgid "PM" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dateformat.py:81 +msgid "AM" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dateformat.py:153 +msgid "midnight" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dateformat.py:155 +msgid "noon" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:7 +msgid "Monday" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:8 +msgid "Tuesday" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:9 +msgid "Wednesday" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:10 +msgid "Thursday" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:11 +msgid "Friday" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:12 +msgid "Saturday" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:13 +msgid "Sunday" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:16 +msgid "Mon" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:17 +msgid "Tue" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:18 +msgid "Wed" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:19 +msgid "Thu" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:20 +msgid "Fri" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:21 +msgid "Sat" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:22 +msgid "Sun" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:25 +msgid "January" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:26 +msgid "February" +msgstr "" + +# Page title +#: venv/lib/python3.11/site-packages/django/utils/dates.py:27 +#, fuzzy +#| msgid "Search" +msgid "March" +msgstr "Search" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:28 +msgid "April" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:29 +msgid "May" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:30 +msgid "June" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:31 +msgid "July" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:32 +msgid "August" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:33 +msgid "September" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:34 +msgid "October" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:35 +msgid "November" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:36 +msgid "December" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:39 +msgid "jan" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:40 +msgid "feb" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:41 +msgid "mar" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:42 +msgid "apr" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:43 +msgid "may" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:44 +msgid "jun" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:45 +msgid "jul" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:46 +msgid "aug" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:47 +msgid "sep" +msgstr "" + +# Footer link +#: venv/lib/python3.11/site-packages/django/utils/dates.py:48 +#, fuzzy +#| msgid "Contact" +msgid "oct" +msgstr "Contact" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:49 +msgid "nov" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:50 +msgid "dec" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:53 +msgctxt "abbrev. month" +msgid "Jan." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:54 +msgctxt "abbrev. month" +msgid "Feb." +msgstr "" + +# Page title +#: venv/lib/python3.11/site-packages/django/utils/dates.py:55 +#, fuzzy +#| msgid "Search" +msgctxt "abbrev. month" +msgid "March" +msgstr "Search" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:56 +msgctxt "abbrev. month" +msgid "April" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:57 +msgctxt "abbrev. month" +msgid "May" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:58 +msgctxt "abbrev. month" +msgid "June" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:59 +msgctxt "abbrev. month" +msgid "July" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:60 +msgctxt "abbrev. month" +msgid "Aug." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:61 +msgctxt "abbrev. month" +msgid "Sept." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:62 +msgctxt "abbrev. month" +msgid "Oct." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:63 +msgctxt "abbrev. month" +msgid "Nov." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:64 +msgctxt "abbrev. month" +msgid "Dec." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:67 +msgctxt "alt. month" +msgid "January" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:68 +msgctxt "alt. month" +msgid "February" +msgstr "" + +# Page title +#: venv/lib/python3.11/site-packages/django/utils/dates.py:69 +#, fuzzy +#| msgid "Search" +msgctxt "alt. month" +msgid "March" +msgstr "Search" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:70 +msgctxt "alt. month" +msgid "April" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:71 +msgctxt "alt. month" +msgid "May" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:72 +msgctxt "alt. month" +msgid "June" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:73 +msgctxt "alt. month" +msgid "July" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:74 +msgctxt "alt. month" +msgid "August" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:75 +msgctxt "alt. month" +msgid "September" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:76 +msgctxt "alt. month" +msgid "October" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:77 +msgctxt "alt. month" +msgid "November" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/dates.py:78 +msgctxt "alt. month" +msgid "December" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/ipv6.py:8 +msgid "This is not a valid IPv6 address." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/text.py:123 +#, python-format +msgctxt "String to return when truncating text" +msgid "%(truncated_text)s…" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/text.py:323 +msgid "or" +msgstr "" + +#. Translators: This string is used as a separator between list elements +#: venv/lib/python3.11/site-packages/django/utils/text.py:342 +#: venv/lib/python3.11/site-packages/django/utils/timesince.py:135 +msgid ", " +msgstr "" + +#: venv/lib/python3.11/site-packages/django/utils/timesince.py:8 +#, python-format +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/django/utils/timesince.py:9 +#, python-format +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/django/utils/timesince.py:10 +#, python-format +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/django/utils/timesince.py:11 +#, python-format +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/django/utils/timesince.py:12 +#, python-format +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/django/utils/timesince.py:13 +#, python-format +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" + +#: venv/lib/python3.11/site-packages/django/views/csrf.py:29 +msgid "Forbidden" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/csrf.py:30 +msgid "CSRF verification failed. Request aborted." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/csrf.py:34 +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 "" + +#: venv/lib/python3.11/site-packages/django/views/csrf.py:40 +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 "" + +#: venv/lib/python3.11/site-packages/django/views/csrf.py:45 +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 "" + +#: venv/lib/python3.11/site-packages/django/views/csrf.py:54 +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 "" + +#: venv/lib/python3.11/site-packages/django/views/csrf.py:60 +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 "" + +#: venv/lib/python3.11/site-packages/django/views/csrf.py:66 +msgid "More information is available with DEBUG=True." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:44 +msgid "No year specified" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:64 +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:115 +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:214 +msgid "Date out of range" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:94 +msgid "No month specified" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:147 +msgid "No day specified" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:194 +msgid "No week specified" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:349 +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:380 +#, python-format +msgid "No %(verbose_name_plural)s available" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:652 +#, python-format +msgid "" +"Future %(verbose_name_plural)s not available because %(class_name)s." +"allow_future is False." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/dates.py:692 +#, python-format +msgid "Invalid date string “%(datestr)s” given format “%(format)s”" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/detail.py:56 +#, python-format +msgid "No %(verbose_name)s found matching the query" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/list.py:70 +msgid "Page is not “last”, nor can it be converted to an int." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/list.py:77 +#, python-format +msgid "Invalid page (%(page_number)s): %(message)s" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/generic/list.py:169 +#, python-format +msgid "Empty list and “%(class_name)s.allow_empty” is False." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/static.py:49 +msgid "Directory indexes are not allowed here." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/static.py:51 +#, python-format +msgid "“%(path)s” does not exist" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/static.py:68 +#: venv/lib/python3.11/site-packages/django/views/templates/directory_index.html:8 +#: venv/lib/python3.11/site-packages/django/views/templates/directory_index.html:11 +#, python-format +msgid "Index of %(directory)s" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:7 +#: venv/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:220 +msgid "The install worked successfully! Congratulations!" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:206 +#, python-format +msgid "" +"View release notes for Django %(version)s" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:221 +#, python-format +msgid "" +"You are seeing this page because DEBUG=True is in your settings file and you have not " +"configured any URLs." +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:229 +msgid "Django Documentation" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:230 +msgid "Topics, references, & how-to’s" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:238 +msgid "Tutorial: A Polling App" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:239 +msgid "Get started with Django" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:247 +msgid "Django Community" +msgstr "" + +#: venv/lib/python3.11/site-packages/django/views/templates/default_urlconf.html:248 +msgid "Connect, get help, or contribute" +msgstr "" + +#: venv/lib/python3.11/site-packages/isort/main.py:158 +msgid "show this help message and exit" +msgstr "" + +#: venv/lib/python3.11/site-packages/typer/core.py:572 +#: venv/lib/python3.11/site-packages/typer/rich_utils.py:90 +msgid "Arguments" +msgstr "" + +#: venv/lib/python3.11/site-packages/typer/rich_utils.py:84 +msgid "(deprecated) " +msgstr "" + +#: venv/lib/python3.11/site-packages/typer/rich_utils.py:85 +msgid "[default: {}]" +msgstr "" + +#: venv/lib/python3.11/site-packages/typer/rich_utils.py:86 +msgid "[env var: {}]" +msgstr "" + +#: venv/lib/python3.11/site-packages/typer/rich_utils.py:88 +msgid "[required]" +msgstr "" + +#: venv/lib/python3.11/site-packages/typer/rich_utils.py:93 +msgid "Error" +msgstr "" + +#: venv/lib/python3.11/site-packages/typer/rich_utils.py:94 +msgid "Aborted." +msgstr "" + # Heading #~ msgid "Contact email for access requests" #~ msgstr "Contact email for access requests" diff --git a/templates/search.html b/templates/search.html index 86125d7b..75da69b4 100644 --- a/templates/search.html +++ b/templates/search.html @@ -47,6 +47,9 @@