From a2b1b10f8bcde509cfd5dd92eb8ce6ee095dba13 Mon Sep 17 00:00:00 2001 From: Natalia <124304+nessita@users.noreply.github.com> Date: Mon, 4 Dec 2023 10:16:11 -0300 Subject: [PATCH 01/67] [5.0.x] Post-release version bump. --- django/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/__init__.py b/django/__init__.py index 3b96a486eb0..60867ee193c 100644 --- a/django/__init__.py +++ b/django/__init__.py @@ -1,6 +1,6 @@ from django.utils.version import get_version -VERSION = (5, 0, 0, "final", 0) +VERSION = (5, 0, 1, "alpha", 0) __version__ = get_version(VERSION) From cd4beb995c1cde95408176dddbf0052cc291f8ef Mon Sep 17 00:00:00 2001 From: Natalia <124304+nessita@users.noreply.github.com> Date: Mon, 4 Dec 2023 10:21:37 -0300 Subject: [PATCH 02/67] [5.0.x] Added stub release notes for 5.0.1. Backport of 14884b6be89963c8ceb2c9da459ed8421aea3bf8 from main --- docs/releases/5.0.1.txt | 12 ++++++++++++ docs/releases/index.txt | 1 + 2 files changed, 13 insertions(+) create mode 100644 docs/releases/5.0.1.txt diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt new file mode 100644 index 00000000000..963dbff916d --- /dev/null +++ b/docs/releases/5.0.1.txt @@ -0,0 +1,12 @@ +========================== +Django 5.0.1 release notes +========================== + +*Expected January 4, 2024* + +Django 5.0.1 fixes several bugs in 5.0. + +Bugfixes +======== + +* ... diff --git a/docs/releases/index.txt b/docs/releases/index.txt index 63f36464a0a..b39c6190752 100644 --- a/docs/releases/index.txt +++ b/docs/releases/index.txt @@ -25,6 +25,7 @@ versions of the documentation contain the release notes for any later releases. .. toctree:: :maxdepth: 1 + 5.0.1 5.0 4.2 release From a1ddda7ac21efa81f20469ec8c15a4818020df20 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Tue, 5 Dec 2023 06:02:36 +0100 Subject: [PATCH 03/67] [5.0.x] Updated expected release date for 5.0.1. Backport of 689306c745f996cf358196f77748a4e91502987c from main --- docs/releases/5.0.1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt index 963dbff916d..f1b6e0f8bbe 100644 --- a/docs/releases/5.0.1.txt +++ b/docs/releases/5.0.1.txt @@ -2,7 +2,7 @@ Django 5.0.1 release notes ========================== -*Expected January 4, 2024* +*Expected January 2, 2024* Django 5.0.1 fixes several bugs in 5.0. From da2475a21719976815f87408ee404f0e8512fc31 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Tue, 5 Dec 2023 06:07:51 +0100 Subject: [PATCH 04/67] [5.0.x] Added stub release notes for 4.2.9. Backport of 464af0975cac6abc46b3e5c3305194c958fc465b from main --- docs/releases/4.2.9.txt | 12 ++++++++++++ docs/releases/index.txt | 1 + 2 files changed, 13 insertions(+) create mode 100644 docs/releases/4.2.9.txt diff --git a/docs/releases/4.2.9.txt b/docs/releases/4.2.9.txt new file mode 100644 index 00000000000..f98803f5eaf --- /dev/null +++ b/docs/releases/4.2.9.txt @@ -0,0 +1,12 @@ +========================== +Django 4.2.9 release notes +========================== + +*Expected January 2, 2024* + +Django 4.2.9 fixes a bug in 4.2.8. + +Bugfixes +======== + +* ... diff --git a/docs/releases/index.txt b/docs/releases/index.txt index b39c6190752..a822164c96f 100644 --- a/docs/releases/index.txt +++ b/docs/releases/index.txt @@ -34,6 +34,7 @@ versions of the documentation contain the release notes for any later releases. .. toctree:: :maxdepth: 1 + 4.2.9 4.2.8 4.2.7 4.2.6 From 454fd50efb4b6bba54abdbcc01507190c780382f Mon Sep 17 00:00:00 2001 From: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> Date: Wed, 6 Dec 2023 19:03:41 +0100 Subject: [PATCH 05/67] [5.0.x] Fixed #35020 -- Fixed ModelAdmin.lookup_allowed() for non-autofield primary keys. Thanks Joshua Goodwin for the report. Regression in 45ecd9acca9b36093e274f47b6877a5f79108d9e. Backport of f80669d2f5a5f1db9e9b73ca893fefba34f955e7 from main --- django/contrib/admin/options.py | 22 +++++++++++----------- docs/releases/5.0.1.txt | 4 +++- tests/modeladmin/tests.py | 14 ++++++++++++++ 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 33d55408b06..c1734d98c26 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -472,24 +472,24 @@ def lookup_allowed(self, lookup, value, request=None): # Lookups on nonexistent fields are ok, since they're ignored # later. break - if not prev_field or ( - prev_field.is_relation - and field not in model._meta.parents.values() - and field is not model._meta.auto_field - and ( - model._meta.auto_field is None - or part not in getattr(prev_field, "to_fields", []) - ) - ): - relation_parts.append(part) if not getattr(field, "path_infos", None): # This is not a relational field, so further parts # must be transforms. break + if ( + not prev_field + or (field.is_relation and field not in model._meta.parents.values()) + or ( + prev_field.is_relation + and model._meta.auto_field is None + and part not in getattr(prev_field, "to_fields", []) + ) + ): + relation_parts.append(part) prev_field = field model = field.path_infos[-1].to_opts.model - if len(relation_parts) <= 1: + if not relation_parts: # Either a local field filter, or no fields at all. return True valid_lookups = {self.date_hierarchy} diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt index f1b6e0f8bbe..871f55ec6d6 100644 --- a/docs/releases/5.0.1.txt +++ b/docs/releases/5.0.1.txt @@ -9,4 +9,6 @@ Django 5.0.1 fixes several bugs in 5.0. Bugfixes ======== -* ... +* Reallowed, following a regression in Django 5.0, using a foreign key to a + model with a primary key that is not ``AutoField`` in + :attr:`.ModelAdmin.list_filter` (:ticket:`35020`). diff --git a/tests/modeladmin/tests.py b/tests/modeladmin/tests.py index f2763ecc0fb..1a9dbdb7cbc 100644 --- a/tests/modeladmin/tests.py +++ b/tests/modeladmin/tests.py @@ -162,6 +162,20 @@ class EmployeeProfileAdmin(ModelAdmin): True, ) + @isolate_apps("modeladmin") + def test_lookup_allowed_non_autofield_primary_key(self): + class Country(models.Model): + id = models.CharField(max_length=2, primary_key=True) + + class Place(models.Model): + country = models.ForeignKey(Country, models.CASCADE) + + class PlaceAdmin(ModelAdmin): + list_filter = ["country"] + + ma = PlaceAdmin(Place, self.site) + self.assertIs(ma.lookup_allowed("country__id__exact", "DE", request), True) + @isolate_apps("modeladmin") def test_lookup_allowed_foreign_primary(self): class Country(models.Model): From 415a08a5283a0f76408ec23c6f6af4a0002d7651 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Thu, 7 Dec 2023 20:50:18 +0100 Subject: [PATCH 06/67] [5.0.x] Fixed #35024 -- Fixed model instance creation crash on GeneratedField.output_field with backend converters. Regression in d9de74141e8a920940f1b91ed0a3ccb835b55729. This is a long standing issue, however it caused a crash of GeneratedFields for all output fields that have backend-specific converters when the RETURNING clause is not supported (MySQL and SQLite < 3.35). That's why severity was exacerbated. Backport of 5b3b791e9046461901df3898be8544e14d91b931 from main --- django/db/models/sql/compiler.py | 5 ++++- docs/releases/5.0.1.txt | 4 ++++ tests/model_fields/models.py | 12 ++++++++++++ tests/model_fields/test_generatedfield.py | 8 ++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index b28dc925ba3..5d2e7fd85cd 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -1817,6 +1817,7 @@ def execute_sql(self, returning_fields=None): ) opts = self.query.get_meta() self.returning_fields = returning_fields + cols = [] with self.connection.cursor() as cursor: for sql, params in self.as_sql(): cursor.execute(sql, params) @@ -1827,6 +1828,7 @@ def execute_sql(self, returning_fields=None): and len(self.query.objs) > 1 ): rows = self.connection.ops.fetch_returned_insert_rows(cursor) + cols = [field.get_col(opts.db_table) for field in self.returning_fields] elif self.connection.features.can_return_columns_from_insert: assert len(self.query.objs) == 1 rows = [ @@ -1835,7 +1837,9 @@ def execute_sql(self, returning_fields=None): self.returning_params, ) ] + cols = [field.get_col(opts.db_table) for field in self.returning_fields] else: + cols = [opts.pk.get_col(opts.db_table)] rows = [ ( self.connection.ops.last_insert_id( @@ -1845,7 +1849,6 @@ def execute_sql(self, returning_fields=None): ), ) ] - cols = [field.get_col(opts.db_table) for field in self.returning_fields] converters = self.get_converters(cols) if converters: rows = list(self.apply_converters(rows, converters)) diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt index 871f55ec6d6..a8b886c6e2f 100644 --- a/docs/releases/5.0.1.txt +++ b/docs/releases/5.0.1.txt @@ -12,3 +12,7 @@ Bugfixes * Reallowed, following a regression in Django 5.0, using a foreign key to a model with a primary key that is not ``AutoField`` in :attr:`.ModelAdmin.list_filter` (:ticket:`35020`). + +* Fixed a long standing bug in handling the ``RETURNING INTO`` clause that + caused a crash when creating a model instance with a ``GeneratedField`` which + ``output_field`` had backend-specific converters (:ticket:`35024`). diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py index b4b7b5bd4c5..aea02964e2d 100644 --- a/tests/model_fields/models.py +++ b/tests/model_fields/models.py @@ -482,6 +482,18 @@ class UUIDGrandchild(UUIDChild): pass +class GeneratedModelFieldWithConverters(models.Model): + field = models.UUIDField() + field_copy = models.GeneratedField( + expression=F("field"), + output_field=models.UUIDField(), + db_persist=True, + ) + + class Meta: + required_db_features = {"supports_stored_generated_columns"} + + class GeneratedModel(models.Model): a = models.IntegerField() b = models.IntegerField() diff --git a/tests/model_fields/test_generatedfield.py b/tests/model_fields/test_generatedfield.py index 9e5d9d87c36..056a80c2943 100644 --- a/tests/model_fields/test_generatedfield.py +++ b/tests/model_fields/test_generatedfield.py @@ -1,3 +1,5 @@ +import uuid + from django.apps import apps from django.db import IntegrityError, connection from django.db.models import ( @@ -14,6 +16,7 @@ from .models import ( GeneratedModel, + GeneratedModelFieldWithConverters, GeneratedModelNull, GeneratedModelNullVirtual, GeneratedModelOutputFieldDbCollation, @@ -266,6 +269,11 @@ class StoredGeneratedFieldTests(GeneratedFieldTestMixin, TestCase): output_field_db_collation_model = GeneratedModelOutputFieldDbCollation params_model = GeneratedModelParams + def test_create_field_with_db_converters(self): + obj = GeneratedModelFieldWithConverters.objects.create(field=uuid.uuid4()) + obj = self._refresh_if_needed(obj) + self.assertEqual(obj.field, obj.field_copy) + @skipUnlessDBFeature("supports_virtual_generated_columns") class VirtualGeneratedFieldTests(GeneratedFieldTestMixin, TestCase): From 6c992dc0031f9f3134aa50d1bc00b1eee581ae13 Mon Sep 17 00:00:00 2001 From: Yashas <2yashas2@gmail.com> Date: Thu, 7 Dec 2023 02:06:54 +0530 Subject: [PATCH 07/67] [5.0.x] Fixed #35016 -- Doc'd that DATABASES["OPTIONS"] are passed to new PostgreSQL connections. Backport of eeb2119985d9879b1d9ac3730ea0b53c0c019221 from main --- docs/ref/databases.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/ref/databases.txt b/docs/ref/databases.txt index f859f513773..92b1f40898c 100644 --- a/docs/ref/databases.txt +++ b/docs/ref/databases.txt @@ -164,8 +164,14 @@ password from the `password file`_, you must specify them in the localhost:5432:NAME:USER:PASSWORD +The PostgreSQL backend passes the content of :setting:`OPTIONS` as keyword +arguments to the connection constructor, allowing for more advanced control +of driver behavior. All available `parameters`_ are described in detail in the +PostgreSQL documentation. + .. _connection service file: https://www.postgresql.org/docs/current/libpq-pgservice.html .. _password file: https://www.postgresql.org/docs/current/libpq-pgpass.html +.. _parameters: https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS .. warning:: From 03af8fbd0f1cfc08edadda248cf5d3498e8ed2f7 Mon Sep 17 00:00:00 2001 From: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> Date: Wed, 6 Dec 2023 23:19:09 +0100 Subject: [PATCH 08/67] [5.0.x] Fixed #35019 -- Fixed save() on models with both GeneratedFields and ForeignKeys. Thanks Deb Kumar Das for the report. Regression in f333e3513e8bdf5ffeb6eeb63021c230082e6f95. Backport of b287af5dc954628d4b336aefc5027b2edceee64b from main --- django/db/models/base.py | 14 +++++++++++--- docs/releases/5.0.1.txt | 4 ++++ tests/model_fields/models.py | 2 ++ tests/model_fields/test_generatedfield.py | 15 +++++++++++++++ 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/django/db/models/base.py b/django/db/models/base.py index 80503d118af..c3f6b32a5ee 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -781,7 +781,11 @@ def save( if force_insert and (force_update or update_fields): raise ValueError("Cannot force both insert and updating in model saving.") - deferred_fields = self.get_deferred_fields() + deferred_non_generated_fields = { + f.attname + for f in self._meta.concrete_fields + if f.attname not in self.__dict__ and f.generated is False + } if update_fields is not None: # If update_fields is empty, skip the save. We do also check for # no-op saves later on for inheritance cases. This bailout is @@ -802,12 +806,16 @@ def save( # If saving to the same database, and this model is deferred, then # automatically do an "update_fields" save on the loaded fields. - elif not force_insert and deferred_fields and using == self._state.db: + elif ( + not force_insert + and deferred_non_generated_fields + and using == self._state.db + ): field_names = set() for field in self._meta.concrete_fields: if not field.primary_key and not hasattr(field, "through"): field_names.add(field.attname) - loaded_fields = field_names.difference(deferred_fields) + loaded_fields = field_names.difference(deferred_non_generated_fields) if loaded_fields: update_fields = frozenset(loaded_fields) diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt index a8b886c6e2f..6b0b6de66cb 100644 --- a/docs/releases/5.0.1.txt +++ b/docs/releases/5.0.1.txt @@ -16,3 +16,7 @@ Bugfixes * Fixed a long standing bug in handling the ``RETURNING INTO`` clause that caused a crash when creating a model instance with a ``GeneratedField`` which ``output_field`` had backend-specific converters (:ticket:`35024`). + +* Fixed a regression in Django 5.0 that caused a crash of ``Model.save()`` for + models with both ``GeneratedField`` and ``ForeignKey`` fields + (:ticket:`35019`). diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py index aea02964e2d..69b4e26145c 100644 --- a/tests/model_fields/models.py +++ b/tests/model_fields/models.py @@ -502,6 +502,7 @@ class GeneratedModel(models.Model): output_field=models.IntegerField(), db_persist=True, ) + fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True) class Meta: required_db_features = {"supports_stored_generated_columns"} @@ -515,6 +516,7 @@ class GeneratedModelVirtual(models.Model): output_field=models.IntegerField(), db_persist=False, ) + fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True) class Meta: required_db_features = {"supports_virtual_generated_columns"} diff --git a/tests/model_fields/test_generatedfield.py b/tests/model_fields/test_generatedfield.py index 056a80c2943..589f78cbb04 100644 --- a/tests/model_fields/test_generatedfield.py +++ b/tests/model_fields/test_generatedfield.py @@ -1,4 +1,5 @@ import uuid +from decimal import Decimal from django.apps import apps from django.db import IntegrityError, connection @@ -15,6 +16,7 @@ from django.test.utils import isolate_apps from .models import ( + Foo, GeneratedModel, GeneratedModelFieldWithConverters, GeneratedModelNull, @@ -187,6 +189,19 @@ def test_save(self): m.refresh_from_db() self.assertEqual(m.field, 8) + def test_save_model_with_foreign_key(self): + fk_object = Foo.objects.create(a="abc", d=Decimal("12.34")) + m = self.base_model(a=1, b=2, fk=fk_object) + m.save() + m = self._refresh_if_needed(m) + self.assertEqual(m.field, 3) + + def test_generated_fields_can_be_deferred(self): + fk_object = Foo.objects.create(a="abc", d=Decimal("12.34")) + m = self.base_model.objects.create(a=1, b=2, fk=fk_object) + m = self.base_model.objects.defer("field").get(id=m.id) + self.assertEqual(m.get_deferred_fields(), {"field"}) + def test_update(self): m = self.base_model.objects.create(a=1, b=2) self.base_model.objects.update(b=3) From 5f89da0837009debda998af30f280d7075fb1a4d Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Tue, 12 Dec 2023 05:39:11 +0100 Subject: [PATCH 09/67] [5.0.x] Fixed #35018 -- Fixed migrations crash on GeneratedField with BooleanField as output_field on Oracle < 23c. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Thanks Václav Řehák for the report. Regression in f333e3513e8bdf5ffeb6eeb63021c230082e6f95. Backport of fcf95e592774a6ededec35481a2061474d467a2b from main. --- django/db/backends/oracle/base.py | 39 +++++++++++++++++++-------- django/db/backends/oracle/features.py | 8 +++++- django/db/backends/oracle/utils.py | 1 + django/db/models/expressions.py | 11 +++++--- django/db/models/fields/generated.py | 8 +++++- docs/releases/5.0.1.txt | 4 +++ tests/lookup/tests.py | 1 - tests/schema/tests.py | 21 +++++++++++++++ 8 files changed, 75 insertions(+), 18 deletions(-) diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 803c3a5baf0..26341c702fc 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -300,7 +300,7 @@ def init_connection_state(self): @async_unsafe def create_cursor(self, name=None): - return FormatStylePlaceholderCursor(self.connection) + return FormatStylePlaceholderCursor(self.connection, self) def _commit(self): if self.connection is not None: @@ -365,11 +365,15 @@ def __init__(self, param, cursor, strings_only=False): param = Oracle_datetime.from_datetime(param) string_size = 0 - # Oracle doesn't recognize True and False correctly. - if param is True: - param = 1 - elif param is False: - param = 0 + has_boolean_data_type = ( + cursor.database.features.supports_boolean_expr_in_select_clause + ) + if not has_boolean_data_type: + # Oracle < 23c doesn't recognize True and False correctly. + if param is True: + param = 1 + elif param is False: + param = 0 if hasattr(param, "bind_parameter"): self.force_bytes = param.bind_parameter(cursor) elif isinstance(param, (Database.Binary, datetime.timedelta)): @@ -389,6 +393,8 @@ def __init__(self, param, cursor, strings_only=False): self.input_size = Database.CLOB elif isinstance(param, datetime.datetime): self.input_size = Database.TIMESTAMP + elif has_boolean_data_type and isinstance(param, bool): + self.input_size = Database.DB_TYPE_BOOLEAN else: self.input_size = None @@ -426,9 +432,10 @@ class FormatStylePlaceholderCursor: charset = "utf-8" - def __init__(self, connection): + def __init__(self, connection, database): self.cursor = connection.cursor() self.cursor.outputtypehandler = self._output_type_handler + self.database = database @staticmethod def _output_number_converter(value): @@ -528,14 +535,24 @@ def _fix_for_params(self, query, params, unify_by_values=False): # values. It can be used only in single query execute() because # executemany() shares the formatted query with each of the params # list. e.g. for input params = [0.75, 2, 0.75, 'sth', 0.75] - # params_dict = {0.75: ':arg0', 2: ':arg1', 'sth': ':arg2'} + # params_dict = { + # (float, 0.75): ':arg0', + # (int, 2): ':arg1', + # (str, 'sth'): ':arg2', + # } # args = [':arg0', ':arg1', ':arg0', ':arg2', ':arg0'] # params = {':arg0': 0.75, ':arg1': 2, ':arg2': 'sth'} + # The type of parameters in param_types keys is necessary to avoid + # unifying 0/1 with False/True. + param_types = [(type(param), param) for param in params] params_dict = { - param: ":arg%d" % i for i, param in enumerate(dict.fromkeys(params)) + param_type: ":arg%d" % i + for i, param_type in enumerate(dict.fromkeys(param_types)) + } + args = [params_dict[param_type] for param_type in param_types] + params = { + placeholder: param for (_, param), placeholder in params_dict.items() } - args = [params_dict[param] for param in params] - params = {value: key for key, value in params_dict.items()} query %= tuple(args) else: # Handle params as sequence diff --git a/django/db/backends/oracle/features.py b/django/db/backends/oracle/features.py index 8a02e098d68..ee1cfaa0d99 100644 --- a/django/db/backends/oracle/features.py +++ b/django/db/backends/oracle/features.py @@ -76,7 +76,6 @@ class DatabaseFeatures(BaseDatabaseFeatures): supports_slicing_ordering_in_compound = True requires_compound_order_by_subquery = True allows_multiple_constraints_on_same_fields = False - supports_boolean_expr_in_select_clause = False supports_comparing_boolean_expr = False supports_json_field_contains = False supports_collation_on_textfield = False @@ -119,6 +118,9 @@ class DatabaseFeatures(BaseDatabaseFeatures): "Oracle doesn't support comparing NCLOB to NUMBER.": { "generic_relations_regress.tests.GenericRelationTests.test_textlink_filter", }, + "Oracle doesn't support casting filters to NUMBER.": { + "lookup.tests.LookupQueryingTests.test_aggregate_combined_lookup", + }, } django_test_expected_failures = { # A bug in Django/oracledb with respect to string handling (#23843). @@ -166,3 +168,7 @@ def supports_collation_on_charfield(self): @cached_property def supports_primitives_in_json_field(self): return self.connection.oracle_version >= (21,) + + @cached_property + def supports_boolean_expr_in_select_clause(self): + return self.connection.oracle_version >= (23,) diff --git a/django/db/backends/oracle/utils.py b/django/db/backends/oracle/utils.py index 930b8e09186..28be58c73db 100644 --- a/django/db/backends/oracle/utils.py +++ b/django/db/backends/oracle/utils.py @@ -21,6 +21,7 @@ class InsertVar: "PositiveBigIntegerField": int, "PositiveSmallIntegerField": int, "PositiveIntegerField": int, + "BooleanField": int, "FloatField": Database.NATIVE_FLOAT, "DateTimeField": Database.TIMESTAMP, "DateField": Database.Date, diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py index b162da513d9..b3b66f0c210 100644 --- a/django/db/models/expressions.py +++ b/django/db/models/expressions.py @@ -1702,10 +1702,13 @@ def as_sql(self, compiler, connection, template=None, **extra_context): return (template % placeholders).rstrip(), params def as_oracle(self, compiler, connection): - # Oracle doesn't allow ORDER BY EXISTS() or filters unless it's wrapped - # in a CASE WHEN. - if connection.ops.conditional_expression_supported_in_where_clause( - self.expression + # Oracle < 23c doesn't allow ORDER BY EXISTS() or filters unless it's + # wrapped in a CASE WHEN. + if ( + not connection.features.supports_boolean_expr_in_select_clause + and connection.ops.conditional_expression_supported_in_where_clause( + self.expression + ) ): copy = self.copy() copy.expression = Case( diff --git a/django/db/models/fields/generated.py b/django/db/models/fields/generated.py index 95d19582de1..257feeeba26 100644 --- a/django/db/models/fields/generated.py +++ b/django/db/models/fields/generated.py @@ -58,7 +58,13 @@ def generated_sql(self, connection): resolved_expression = self.expression.resolve_expression( self._query, allow_joins=False ) - return compiler.compile(resolved_expression) + sql, params = compiler.compile(resolved_expression) + if ( + getattr(self.expression, "conditional", False) + and not connection.features.supports_boolean_expr_in_select_clause + ): + sql = f"CASE WHEN {sql} THEN 1 ELSE 0 END" + return sql, params def check(self, **kwargs): databases = kwargs.get("databases") or [] diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt index 6b0b6de66cb..2e720e57f09 100644 --- a/docs/releases/5.0.1.txt +++ b/docs/releases/5.0.1.txt @@ -20,3 +20,7 @@ Bugfixes * Fixed a regression in Django 5.0 that caused a crash of ``Model.save()`` for models with both ``GeneratedField`` and ``ForeignKey`` fields (:ticket:`35019`). + +* Fixed a bug in Django 5.0 that caused a migration crash on Oracle < 23c when + adding a ``GeneratedField`` with ``output_field=BooleanField`` + (:ticket:`35018`). diff --git a/tests/lookup/tests.py b/tests/lookup/tests.py index 8af459ccd7c..a198a13b62b 100644 --- a/tests/lookup/tests.py +++ b/tests/lookup/tests.py @@ -1522,7 +1522,6 @@ def test_lookup_in_order_by(self): qs = Season.objects.order_by(LessThan(F("year"), 1910), F("year")) self.assertSequenceEqual(qs, [self.s1, self.s3, self.s2]) - @skipUnlessDBFeature("supports_boolean_expr_in_select_clause") def test_aggregate_combined_lookup(self): expression = Cast(GreaterThan(F("year"), 1900), models.IntegerField()) qs = Season.objects.aggregate(modern=models.Sum(expression)) diff --git a/tests/schema/tests.py b/tests/schema/tests.py index 046097366c2..36c6b5e4bf1 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -852,6 +852,27 @@ class Meta: False, ) + @isolate_apps("schema") + @skipUnlessDBFeature("supports_virtual_generated_columns") + def test_add_generated_boolean_field(self): + class GeneratedBooleanFieldModel(Model): + value = IntegerField(null=True) + has_value = GeneratedField( + expression=Q(value__isnull=False), + output_field=BooleanField(), + db_persist=False, + ) + + class Meta: + app_label = "schema" + + with connection.schema_editor() as editor: + editor.create_model(GeneratedBooleanFieldModel) + obj = GeneratedBooleanFieldModel.objects.create() + self.assertIs(obj.has_value, False) + obj = GeneratedBooleanFieldModel.objects.create(value=1) + self.assertIs(obj.has_value, True) + @isolate_apps("schema") @skipUnlessDBFeature("supports_stored_generated_columns") def test_add_generated_field(self): From 8b0710cfc9e845abb2017b007d3dc7aaca3b7979 Mon Sep 17 00:00:00 2001 From: Tom Carrick Date: Fri, 8 Dec 2023 17:35:37 +0100 Subject: [PATCH 10/67] [5.0.x] Fixed #35012 -- Restored wrapping admin fieldsets with multiple fields per line. Thanks James Gillard for the report. Regression in 729266c6f29c7a0677b24926a86a767ef3078b26. Backport of 4aae864463b149393a36e0b18345cf6ed392634d from main --- django/contrib/admin/static/admin/css/forms.css | 4 ++++ docs/releases/4.2.9.txt | 3 ++- docs/releases/5.0.1.txt | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/django/contrib/admin/static/admin/css/forms.css b/django/contrib/admin/static/admin/css/forms.css index 6cfe9da1194..9a8dad08cce 100644 --- a/django/contrib/admin/static/admin/css/forms.css +++ b/django/contrib/admin/static/admin/css/forms.css @@ -26,6 +26,10 @@ form .form-row p { display: flex; } +.form-multiline { + flex-wrap: wrap; +} + .form-multiline > div { padding-bottom: 10px; } diff --git a/docs/releases/4.2.9.txt b/docs/releases/4.2.9.txt index f98803f5eaf..5202fbb6e77 100644 --- a/docs/releases/4.2.9.txt +++ b/docs/releases/4.2.9.txt @@ -9,4 +9,5 @@ Django 4.2.9 fixes a bug in 4.2.8. Bugfixes ======== -* ... +* Fixed a regression in Django 4.2.8 where admin fields on the same line could + overflow the page and become non-interactive (:ticket:`35012`). diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt index 2e720e57f09..79fbf9a0a18 100644 --- a/docs/releases/5.0.1.txt +++ b/docs/releases/5.0.1.txt @@ -24,3 +24,6 @@ Bugfixes * Fixed a bug in Django 5.0 that caused a migration crash on Oracle < 23c when adding a ``GeneratedField`` with ``output_field=BooleanField`` (:ticket:`35018`). + +* Fixed a regression in Django 5.0 where admin fields on the same line could + overflow the page and become non-interactive (:ticket:`35012`). From 636d701ded62807612df50da37fea3adb88a4bb6 Mon Sep 17 00:00:00 2001 From: Emanuel Andrecut Date: Wed, 13 Dec 2023 17:04:06 +0200 Subject: [PATCH 11/67] [5.0.x] Fixed #35032 -- Corrected Char32UUIDField implementation in 5.0 release notes. This fixes Char32UUIDField implementation in 5.0 release notes causing records with UUIDFields created using pre-Django 5.0 and CHAR(32) not being able to be saved anymore after upgrading and keeping the CHAR(32) columns. Regression in 7cd187a5ba58d7769039f487faeb9a5a2ff05540. Backport of e72b2826ff1eaf2f48ee54a40d2f2988a1fdbb0a from main --- docs/releases/5.0.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/releases/5.0.txt b/docs/releases/5.0.txt index 4c86337b745..746eaae8367 100644 --- a/docs/releases/5.0.txt +++ b/docs/releases/5.0.txt @@ -508,6 +508,12 @@ Django < 5.0 should be replaced with a ``UUIDField`` subclass backed by def db_type(self, connection): return "char(32)" + def get_db_prep_value(self, value, connection, prepared=False): + value = super().get_db_prep_value(value, connection, prepared) + if value is not None: + value = value.hex + return value + For example:: class MyModel(models.Model): @@ -516,8 +522,7 @@ For example:: Should become:: class Char32UUIDField(models.UUIDField): - def db_type(self, connection): - return "char(32)" + ... class MyModel(models.Model): From b73510902f1c42b18d2a410520174bd00bc0e6dc Mon Sep 17 00:00:00 2001 From: Nanami <122419523+matsuo1234567@users.noreply.github.com> Date: Thu, 14 Dec 2023 22:09:34 +0900 Subject: [PATCH 12/67] [5.0.x] Fixed HTML code snippet in Tutorial's part 7 when customizing the admin's site header. Backport of 5b52376d9f55fa7889f39225e6035c6d69168b71 from main --- docs/intro/tutorial07.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/intro/tutorial07.txt b/docs/intro/tutorial07.txt index 7810ad7fad0..f53d0b524c0 100644 --- a/docs/intro/tutorial07.txt +++ b/docs/intro/tutorial07.txt @@ -367,7 +367,7 @@ a section of code like: .. code-block:: html+django {% block branding %} -
Polls Administration
+ {% endblock %} We use this approach to teach you how to override templates. In an actual From 58274bbd37ee6e45b0a9efcd578795dd241989b0 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Fri, 15 Dec 2023 04:35:04 +1100 Subject: [PATCH 13/67] [5.0.x] Added clarifications about the DATABASES.TIME_ZONE setting in docs. These include: - Doc'd which is the default used when DATABASES.TIME_ZONE is None. - Doc'd that the database connection's time zone setting is set for PostgreSQL and clarified that it may be necessary to set it to the same value as TIME_ZONE. Co-authored-by: David Smith <39445562+smithdc1@users.noreply.github.com> Co-authored-by: Natalia Bidart <124304+nessita@users.noreply.github.com> Backport of acfc7e3a735ffa41dcd9ad7f4f8fef97c1a2c3c6 from main --- docs/ref/settings.txt | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index 28d72e356e4..2c3ebb2acfa 100644 --- a/docs/ref/settings.txt +++ b/docs/ref/settings.txt @@ -663,8 +663,10 @@ A string representing the time zone for this database connection or ``None``. This inner option of the :setting:`DATABASES` setting accepts the same values as the general :setting:`TIME_ZONE` setting. -When :setting:`USE_TZ` is ``True`` and this option is set, reading datetimes -from the database returns aware datetimes in this time zone instead of UTC. +When :setting:`USE_TZ` is ``True``, reading datetimes from the database +returns aware datetimes with the timezone set to this option's value if not +``None``, or to UTC otherwise. + When :setting:`USE_TZ` is ``False``, it is an error to set this option. * If the database backend doesn't support time zones (e.g. SQLite, MySQL, @@ -687,13 +689,18 @@ When :setting:`USE_TZ` is ``False``, it is an error to set this option. third-party systems connect to the same database and expect to find datetimes in local time, then you must set this option. -* If the database backend supports time zones (e.g. PostgreSQL), the - ``TIME_ZONE`` option is very rarely needed. It can be changed at any time; - the database takes care of converting datetimes to the desired time zone. +* If the database backend supports time zones (e.g., PostgreSQL), then the + database connection's time zone is set to this value. + + Although setting the ``TIME_ZONE`` option is very rarely needed, there are + situations where it becomes necessary. Specifically, it's recommended to + match the general :setting:`TIME_ZONE` setting when dealing with raw queries + involving date/time functions like PostgreSQL's ``date_trunc()`` or + ``generate_series()``, especially when generating time-based series that + transition daylight savings. - Setting the time zone of the database connection may be useful for running - raw SQL queries involving date/time functions provided by the database, such - as ``date_trunc``, because their results depend on the time zone. + This value can be changed at any time, the database will handle the + conversion of datetimes to the configured time zone. However, this has a downside: receiving all datetimes in local time makes datetime arithmetic more tricky — you must account for possible offset From ae35d5178b4ec33b4615c548d596011160756a89 Mon Sep 17 00:00:00 2001 From: Christian Clauss Date: Fri, 15 Dec 2023 06:16:02 +0100 Subject: [PATCH 14/67] [5.0.x] Updated examples for 2.0+ release numbering in installation FAQ. Backport of 0d5e9a32eb5bd1201437519a3bda1fb4c4d06af9 from main --- docs/faq/install.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/faq/install.txt b/docs/faq/install.txt index 388350b2d8f..01b59213570 100644 --- a/docs/faq/install.txt +++ b/docs/faq/install.txt @@ -63,9 +63,9 @@ download page `_. Typically, we will support a Python version up to and including the first Django LTS release whose security support ends after security support for that -version of Python ends. For example, Python 3.3 security support ended -September 2017 and Django 1.8 LTS security support ended April 2018. Therefore -Django 1.8 is the last version to support Python 3.3. +version of Python ends. For example, Python 3.9 security support ends in +October 2025 and Django 4.2 LTS security support ends in April 2026. Therefore +Django 4.2 is the last version to support Python 3.9. What Python version should I use with Django? ============================================= From 6bf8ca7b1677555e5b446cf56929ceeed19bdb14 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Fri, 15 Dec 2023 11:17:06 +0100 Subject: [PATCH 15/67] [5.0.x] Added missing import in docs/ref/models/expressions.txt. Backport of e28bd6776dfedc1ad4dce4719e4303ca34019a83 from main --- docs/ref/models/expressions.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ref/models/expressions.txt b/docs/ref/models/expressions.txt index a5edfa550a5..d2aeb1dcafd 100644 --- a/docs/ref/models/expressions.txt +++ b/docs/ref/models/expressions.txt @@ -92,7 +92,7 @@ Some examples >>> Company.objects.order_by("name__length") # Boolean expression can be used directly in filters. - >>> from django.db.models import Exists + >>> from django.db.models import Exists, OuterRef >>> Company.objects.filter( ... Exists(Employee.objects.filter(company=OuterRef("pk"), salary__gt=10)) ... ) From d8bff5adda81be20befe68613edc2b603709cad1 Mon Sep 17 00:00:00 2001 From: Amin Shah Gilani Date: Tue, 19 Dec 2023 12:04:04 -0500 Subject: [PATCH 16/67] [5.0.x] Doc'd that users with unusable passwords cannot request a password reset. Backport of 47033bfd486206d6809068c838d45b999e5c1bd2 from main --- docs/ref/contrib/auth.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/ref/contrib/auth.txt b/docs/ref/contrib/auth.txt index 482eed231b4..953c31a6ae5 100644 --- a/docs/ref/contrib/auth.txt +++ b/docs/ref/contrib/auth.txt @@ -188,6 +188,12 @@ Methods You may need this if authentication for your application takes place against an existing external source such as an LDAP directory. + .. admonition:: Password reset restriction + + Users having an unusable password will not able to request a + password reset email via + :class:`~django.contrib.auth.views.PasswordResetView`. + .. method:: has_usable_password() Returns ``False`` if From bc60b1e2925a400aa8188e035782ec2945123e57 Mon Sep 17 00:00:00 2001 From: Nicolas Lupien Date: Wed, 6 Dec 2023 12:58:59 -0500 Subject: [PATCH 17/67] [5.0.x] Fixed #35015 -- Updated MySQL notes in migrations topic. Backport of d4c583682e7afc2b4e953b8c85af17f1c1514ba9 from main --- docs/topics/migrations.txt | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/docs/topics/migrations.txt b/docs/topics/migrations.txt index b7cd7043c2b..74f6fddad6d 100644 --- a/docs/topics/migrations.txt +++ b/docs/topics/migrations.txt @@ -77,16 +77,17 @@ meaning that if a migration fails to apply you will have to manually unpick the changes in order to try again (it's impossible to roll back to an earlier point). -In addition, MySQL will fully rewrite tables for almost every schema operation -and generally takes a time proportional to the number of rows in the table to -add or remove columns. On slower hardware this can be worse than a minute per -million rows - adding a few columns to a table with just a few million rows -could lock your site up for over ten minutes. - -Finally, MySQL has relatively small limits on name lengths for columns, tables -and indexes, as well as a limit on the combined size of all columns an index -covers. This means that indexes that are possible on other backends will -fail to be created under MySQL. +MySQL 8.0 introduced significant performance enhancements for +`DDL operations`_, making them more efficient and reducing the need for full +table rebuilds. However, it cannot guarantee a complete absence of locks or +interruptions. In situations where locks are still necessary, the duration of +these operations will be proportionate to the number of rows involved. + +Finally, MySQL has a relatively small limit on the combined size of all columns +an index covers. This means that indexes that are possible on other backends +will fail to be created under MySQL. + +.. _DDL operations: https://dev.mysql.com/doc/refman/en/innodb-online-ddl-operations.html SQLite ------ From 42c31f867fa75d52bbbb4b39478f982fbe010ae1 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Fri, 22 Dec 2023 09:43:45 +0100 Subject: [PATCH 18/67] [5.0.x] Fixed #35054 -- Fixed crash on Oracle when fetching JSONFields with oracledb 2.0.0. Backport of 6c08dba5176606e8a62dd108bb6c9467d678d2f4 from main --- django/db/backends/oracle/base.py | 6 +++++- docs/releases/5.0.1.txt | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 26341c702fc..8cc0b652484 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -453,7 +453,7 @@ def _get_decimal_converter(precision, scale): def _output_type_handler(cursor, name, defaultType, length, precision, scale): """ Called for each db column fetched from cursors. Return numbers as the - appropriate Python type. + appropriate Python type, and NCLOB with JSON as strings. """ if defaultType == Database.NUMBER: if scale == -127: @@ -483,6 +483,10 @@ def _output_type_handler(cursor, name, defaultType, length, precision, scale): arraysize=cursor.arraysize, outconverter=outconverter, ) + # oracledb 2.0.0+ returns NLOB columns with IS JSON constraints as + # dicts. Use a no-op converter to avoid this. + elif defaultType == Database.DB_TYPE_NCLOB: + return cursor.var(Database.DB_TYPE_NCLOB, arraysize=cursor.arraysize) def _format_params(self, params): try: diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt index 79fbf9a0a18..592454e8934 100644 --- a/docs/releases/5.0.1.txt +++ b/docs/releases/5.0.1.txt @@ -27,3 +27,5 @@ Bugfixes * Fixed a regression in Django 5.0 where admin fields on the same line could overflow the page and become non-interactive (:ticket:`35012`). + +* Added compatibility for ``oracledb`` 2.0.0 (:ticket:`35054`). From 9aad44150fa7632b894c8b1d1cb9c6dde131b577 Mon Sep 17 00:00:00 2001 From: David Wobrock Date: Thu, 21 Dec 2023 23:20:36 +0100 Subject: [PATCH 19/67] [5.0.x] Fixed #35050 -- Fixed prefixing field names in FilteredRelation(). Thanks Mark Zorn for the report. Regression in 59f475470494ce5b8cbff816b1e5dafcbd10a3a3. Backport of 14917c9ae272f47d23401100faa6cefa8e1728bf from main --- django/db/models/sql/query.py | 6 ++++-- docs/releases/5.0.1.txt | 3 +++ tests/filtered_relation/models.py | 2 ++ tests/filtered_relation/tests.py | 36 +++++++++++++++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index f04b1c4cc3a..3320f91fa16 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -94,14 +94,16 @@ def get_child_with_renamed_prefix(prefix, replacement, child): return rename_prefix_from_q(prefix, replacement, child) if isinstance(child, tuple): lhs, rhs = child - lhs = lhs.replace(prefix, replacement, 1) + if lhs.startswith(prefix + LOOKUP_SEP): + lhs = lhs.replace(prefix, replacement, 1) if not isinstance(rhs, F) and hasattr(rhs, "resolve_expression"): rhs = get_child_with_renamed_prefix(prefix, replacement, rhs) return lhs, rhs if isinstance(child, F): child = child.copy() - child.name = child.name.replace(prefix, replacement, 1) + if child.name.startswith(prefix + LOOKUP_SEP): + child.name = child.name.replace(prefix, replacement, 1) elif hasattr(child, "resolve_expression"): child = child.copy() child.set_source_expressions( diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt index 592454e8934..15b735b42ee 100644 --- a/docs/releases/5.0.1.txt +++ b/docs/releases/5.0.1.txt @@ -29,3 +29,6 @@ Bugfixes overflow the page and become non-interactive (:ticket:`35012`). * Added compatibility for ``oracledb`` 2.0.0 (:ticket:`35054`). + +* Fixed a regression in Django 5.0 where querysets referenced incorrect field + names from ``FilteredRelation()`` (:ticket:`35050`). diff --git a/tests/filtered_relation/models.py b/tests/filtered_relation/models.py index d34a86305fc..765d4956e2a 100644 --- a/tests/filtered_relation/models.py +++ b/tests/filtered_relation/models.py @@ -36,6 +36,8 @@ class Book(models.Model): related_query_name="book", ) editor = models.ForeignKey(Editor, models.CASCADE) + number_editor = models.IntegerField(default=-1) + editor_number = models.IntegerField(default=-2) generic_author = GenericRelation(Author) state = models.CharField(max_length=9, choices=STATES, default=AVAILABLE) diff --git a/tests/filtered_relation/tests.py b/tests/filtered_relation/tests.py index 5a21a47f369..19714e84433 100644 --- a/tests/filtered_relation/tests.py +++ b/tests/filtered_relation/tests.py @@ -792,6 +792,42 @@ def test_conditional_expression_with_multiple_fields(self): ).filter(my_books__isnull=True) self.assertSequenceEqual(qs, []) + def test_conditional_expression_rhs_contains_relation_name(self): + qs = Book.objects.annotate( + rel=FilteredRelation( + "editor", + condition=Q(id=1 * F("number_editor")), + ) + ).filter(rel__isnull=True) + self.assertSequenceEqual(qs, []) + + def test_conditional_expression_rhs_startswith_relation_name(self): + qs = Book.objects.annotate( + rel=FilteredRelation( + "editor", + condition=Q(id=1 * F("editor_number")), + ) + ).filter(rel__isnull=True) + self.assertSequenceEqual(qs, []) + + def test_conditional_expression_lhs_startswith_relation_name(self): + qs = Book.objects.annotate( + rel=FilteredRelation( + "editor", + condition=Q(editor_number__gt=1), + ) + ).filter(rel__isnull=True) + self.assertSequenceEqual(qs, []) + + def test_conditional_expression_lhs_contains_relation_name(self): + qs = Book.objects.annotate( + rel=FilteredRelation( + "editor", + condition=Q(number_editor__gt=1), + ) + ).filter(rel__isnull=True) + self.assertSequenceEqual(qs, []) + class FilteredRelationAggregationTests(TestCase): @classmethod From 9a182f3d959d16354e24f34713df602f1bef6556 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Wed, 27 Dec 2023 20:36:22 +0100 Subject: [PATCH 20/67] [5.0.x] Fixed #35056 -- Fixed system check crash on reverse m2m relations with related_name in ModelAdmin.filter_horizontal/vertical. Thanks Thomas Feldmann for the report. Regression in 107865780aa44914e21d27fdf4ca269bc61c7f01. Backport of 751d732a3815a68bdb5b7aceda0e7d5981362c4a from main --- django/contrib/admin/checks.py | 2 +- docs/releases/5.0.1.txt | 4 ++++ tests/modeladmin/test_checks.py | 36 +++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/django/contrib/admin/checks.py b/django/contrib/admin/checks.py index 16650234347..aa43718cd68 100644 --- a/django/contrib/admin/checks.py +++ b/django/contrib/admin/checks.py @@ -532,7 +532,7 @@ def _check_filter_item(self, obj, field_name, label): field=field_name, option=label, obj=obj, id="admin.E019" ) else: - if not field.many_to_many: + if not field.many_to_many or isinstance(field, models.ManyToManyRel): return must_be( "a many-to-many field", option=label, obj=obj, id="admin.E020" ) diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt index 15b735b42ee..4344b0d1818 100644 --- a/docs/releases/5.0.1.txt +++ b/docs/releases/5.0.1.txt @@ -32,3 +32,7 @@ Bugfixes * Fixed a regression in Django 5.0 where querysets referenced incorrect field names from ``FilteredRelation()`` (:ticket:`35050`). + +* Fixed a regression in Django 5.0 that caused a system check crash when + ``ModelAdmin.filter_horizontal`` or ``filter_vertical`` contained a reverse + many-to-many relation with ``related_name`` (:ticket:`35056`). diff --git a/tests/modeladmin/test_checks.py b/tests/modeladmin/test_checks.py index 2ed27f8a3dd..85c175d5812 100644 --- a/tests/modeladmin/test_checks.py +++ b/tests/modeladmin/test_checks.py @@ -322,6 +322,24 @@ class TestModelAdmin(ModelAdmin): "admin.E020", ) + @isolate_apps("modeladmin") + def test_invalid_reverse_m2m_field_with_related_name(self): + class Contact(Model): + pass + + class Customer(Model): + contacts = ManyToManyField("Contact", related_name="customers") + + class TestModelAdmin(ModelAdmin): + filter_vertical = ["customers"] + + self.assertIsInvalid( + TestModelAdmin, + Contact, + "The value of 'filter_vertical[0]' must be a many-to-many field.", + "admin.E020", + ) + @isolate_apps("modeladmin") def test_invalid_m2m_field_with_through(self): class Artist(Model): @@ -384,6 +402,24 @@ class TestModelAdmin(ModelAdmin): "admin.E020", ) + @isolate_apps("modeladmin") + def test_invalid_reverse_m2m_field_with_related_name(self): + class Contact(Model): + pass + + class Customer(Model): + contacts = ManyToManyField("Contact", related_name="customers") + + class TestModelAdmin(ModelAdmin): + filter_horizontal = ["customers"] + + self.assertIsInvalid( + TestModelAdmin, + Contact, + "The value of 'filter_horizontal[0]' must be a many-to-many field.", + "admin.E020", + ) + @isolate_apps("modeladmin") def test_invalid_m2m_field_with_through(self): class Artist(Model): From 7e3ba869a6c3dd80e42460e82db2402218ce805a Mon Sep 17 00:00:00 2001 From: David D Lowe Date: Fri, 15 Dec 2023 09:50:34 +0100 Subject: [PATCH 21/67] [5.0.x] Improved DEFAULT_FROM_EMAIL/SERVER_EMAIL docs. Co-authored-by: nessita <124304+nessita@users.noreply.github.com> Backport of 61aae838f77c2d3f1bb2b50095cdf3d79afffb02 from main --- docs/ref/settings.txt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index 2c3ebb2acfa..c1f04c7f1d7 100644 --- a/docs/ref/settings.txt +++ b/docs/ref/settings.txt @@ -1361,9 +1361,12 @@ specify a particular storage system. See :doc:`/topics/files`. Default: ``'webmaster@localhost'`` -Default email address to use for various automated correspondence from the -site manager(s). This doesn't include error messages sent to :setting:`ADMINS` -and :setting:`MANAGERS`; for that, see :setting:`SERVER_EMAIL`. +Default email address for automated correspondence from the site manager(s). +This address is used in the ``From:`` header of outgoing emails and can take +any format valid in the chosen email sending protocol. + +This doesn't affect error messages sent to :setting:`ADMINS` and +:setting:`MANAGERS`. See :setting:`SERVER_EMAIL` for that. .. setting:: DEFAULT_INDEX_TABLESPACE @@ -2553,7 +2556,9 @@ example, to define a YAML serializer, use:: Default: ``'root@localhost'`` The email address that error messages come from, such as those sent to -:setting:`ADMINS` and :setting:`MANAGERS`. +:setting:`ADMINS` and :setting:`MANAGERS`. This address is used in the +``From:`` header and can take any format valid in the chosen email sending +protocol. .. admonition:: Why are my emails sent from a different address? From 454269b2e124865be49e79e0394e1485043be5f2 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Thu, 28 Dec 2023 09:46:34 +0100 Subject: [PATCH 22/67] [5.0.x] Updated asgiref dependency for 5.0 release series. --- setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.cfg b/setup.cfg index b93d4250c03..057319c6204 100644 --- a/setup.cfg +++ b/setup.cfg @@ -38,7 +38,7 @@ packages = find: include_package_data = true zip_safe = false install_requires = - asgiref >= 3.7.0 + asgiref >= 3.7.0, < 4 sqlparse >= 0.3.1 tzdata; sys_platform == 'win32' From f33eddff8ad166de2677b9ee19835f97e673ab1b Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Thu, 28 Dec 2023 19:52:15 +0100 Subject: [PATCH 23/67] [5.0.x] Corrected code-block directives in docs. Backport of 0be6dde81721e4a61caf45422987c599ebfcfe56 from main --- docs/ref/contrib/gis/tutorial.txt | 15 ++++++++------- docs/ref/models/expressions.txt | 4 +--- docs/ref/request-response.txt | 5 ++--- docs/ref/templates/builtins.txt | 7 +++---- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/docs/ref/contrib/gis/tutorial.txt b/docs/ref/contrib/gis/tutorial.txt index d1c4cdb8e49..eb62df56a86 100644 --- a/docs/ref/contrib/gis/tutorial.txt +++ b/docs/ref/contrib/gis/tutorial.txt @@ -252,7 +252,7 @@ model: This command should produce the following output: -.. console:: +.. code-block:: sql BEGIN; -- @@ -686,12 +686,13 @@ __ https://spatialreference.org/ref/epsg/32140/ .. code-block:: pycon - from django.db import connection - # or if you're querying a non-default database: - from django.db import connections - connection = connections['your_gis_db_alias'] - - City.objects.raw('SELECT id, name, %s as point from myapp_city' % (connection.ops.select % 'point')) + >>> from django.db import connection + >>> # or if you're querying a non-default database: + >>> from django.db import connections + >>> connection = connections["your_gis_db_alias"] + >>> City.objects.raw( + ... "SELECT id, name, %s as point from myapp_city" % (connection.ops.select % "point") + ... ) You should only use raw queries when you know exactly what you're doing. diff --git a/docs/ref/models/expressions.txt b/docs/ref/models/expressions.txt index d2aeb1dcafd..63847a2328e 100644 --- a/docs/ref/models/expressions.txt +++ b/docs/ref/models/expressions.txt @@ -757,9 +757,7 @@ should avoid them if possible. your SQL with user-provided data. You also must not quote placeholders in the SQL string. This example is - vulnerable to SQL injection because of the quotes around ``%s``: - - .. code-block:: pycon + vulnerable to SQL injection because of the quotes around ``%s``:: RawSQL("select col from sometable where othercol = '%s'") # unsafe! diff --git a/docs/ref/request-response.txt b/docs/ref/request-response.txt index 3148f8ace52..49ee126acac 100644 --- a/docs/ref/request-response.txt +++ b/docs/ref/request-response.txt @@ -1090,13 +1090,12 @@ Custom response classes ~~~~~~~~~~~~~~~~~~~~~~~ If you find yourself needing a response class that Django doesn't provide, you -can create it with the help of :py:class:`http.HTTPStatus`. For example: - -.. code-block:: pycon +can create it with the help of :py:class:`http.HTTPStatus`. For example:: from http import HTTPStatus from django.http import HttpResponse + class HttpResponseNoContent(HttpResponse): status_code = HTTPStatus.NO_CONTENT diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt index 536f9259bc9..c95006fb51e 100644 --- a/docs/ref/templates/builtins.txt +++ b/docs/ref/templates/builtins.txt @@ -524,11 +524,10 @@ Use of both ``and`` and ``or`` clauses within the same tag is allowed, with {% if athlete_list and coach_list or cheerleader_list %} -will be interpreted like: +will be interpreted like:: -.. code-block:: pycon - - if (athlete_list and coach_list) or cheerleader_list + if (athlete_list and coach_list) or cheerleader_list: + ... Use of actual parentheses in the :ttag:`if` tag is invalid syntax. If you need them to indicate precedence, you should use nested :ttag:`if` tags. From 8480f2ec3628e077993b58f5ba2b9c56b95e8cc9 Mon Sep 17 00:00:00 2001 From: "virgitl.io" <131317641+virgitlio@users.noreply.github.com> Date: Fri, 29 Dec 2023 01:57:30 -0300 Subject: [PATCH 24/67] [5.0.x] Added backticks around name argument in tutorial 3. Backport of acfdf395061537f131e6116383284690f17aa8d9 from main --- docs/intro/tutorial03.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/intro/tutorial03.txt b/docs/intro/tutorial03.txt index 04bd83ae52f..3b121a025d3 100644 --- a/docs/intro/tutorial03.txt +++ b/docs/intro/tutorial03.txt @@ -401,7 +401,7 @@ template, the link was partially hardcoded like this: The problem with this hardcoded, tightly-coupled approach is that it becomes challenging to change URLs on projects with a lot of templates. However, since -you defined the name argument in the :func:`~django.urls.path` functions in +you defined the ``name`` argument in the :func:`~django.urls.path` functions in the ``polls.urls`` module, you can remove a reliance on specific URL paths defined in your url configurations by using the ``{% url %}`` template tag: From c8274ecfe2164878ffb66e7c92a9e6d23793f1c1 Mon Sep 17 00:00:00 2001 From: Mohammad Yameen <116902680+Mohammad-Yameen@users.noreply.github.com> Date: Fri, 29 Dec 2023 10:31:18 +0530 Subject: [PATCH 25/67] [5.0.x] Corrected method/function wording in tutorial 3. Backport of bb560651c489879c22878cba5003a09b6a9f930a from main --- docs/intro/tutorial03.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/intro/tutorial03.txt b/docs/intro/tutorial03.txt index 3b121a025d3..3d59809a0c1 100644 --- a/docs/intro/tutorial03.txt +++ b/docs/intro/tutorial03.txt @@ -106,7 +106,7 @@ Wire these new views into the ``polls.urls`` module by adding the following ] Take a look in your browser, at "/polls/34/". It'll run the ``detail()`` -method and display whatever ID you provide in the URL. Try +function and display whatever ID you provide in the URL. Try "/polls/34/results/" and "/polls/34/vote/" too -- these will display the placeholder results and voting pages. From c69dbc7c1068a0a059ed77120c30b4cebbcf0e4b Mon Sep 17 00:00:00 2001 From: Salvo Polizzi Date: Sat, 30 Dec 2023 10:00:10 +0100 Subject: [PATCH 26/67] [5.0.x] Fixed #35069 -- Fixed typo in docs/ref/forms/api.txt. Backport of dc26a3d563b1e1d98d40f5d351a6a61c34f12d98 from main --- docs/ref/forms/api.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ref/forms/api.txt b/docs/ref/forms/api.txt index 7bec9b120b9..28cd452c4e8 100644 --- a/docs/ref/forms/api.txt +++ b/docs/ref/forms/api.txt @@ -909,7 +909,7 @@ It's possible to customize that character, or omit it entirely, using the
>>> f = ContactForm(auto_id="id_for_%s", label_suffix=" ->") >>> print(f) -
+
From 031bc4710138e36445322488a8074c1b9e835702 Mon Sep 17 00:00:00 2001 From: Zowie Beha <113861530+1zzowiebeha@users.noreply.github.com> Date: Sat, 30 Dec 2023 16:54:34 -0500 Subject: [PATCH 27/67] [5.0.x] Fixed #35072 -- Corrected Field.choices description in models topic. Backport of 8fcd7b01eec85a509762dd8dbb3a27b7ab521e94 from main --- docs/topics/db/models.txt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/topics/db/models.txt b/docs/topics/db/models.txt index cc6c1f5298d..b419185bbcf 100644 --- a/docs/topics/db/models.txt +++ b/docs/topics/db/models.txt @@ -157,9 +157,12 @@ ones: `, the field will be required. :attr:`~Field.choices` - A :term:`sequence` of 2-tuples to use as choices for this field. If this - is given, the default form widget will be a select box instead of the - standard text field and will limit choices to the choices given. + A :term:`sequence` of 2-value tuples, a :term:`mapping`, an + :ref:`enumeration type `, or a callable (that + expects no arguments and returns any of the previous formats), to use as + choices for this field. If this is given, the default form widget will be a + select box instead of the standard text field and will limit choices to the + choices given. A choices list looks like this:: @@ -216,6 +219,10 @@ ones: Further examples are available in the :ref:`model field reference `. + .. versionchanged:: 5.0 + + Support for mappings and callables was added. + :attr:`~Field.default` The default value for the field. This can be a value or a callable object. If callable it will be called every time a new object is From 01d2f94cfdaa5c6ce8c53bbc230edf48c58a7106 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Tue, 2 Jan 2024 09:57:41 +0100 Subject: [PATCH 28/67] [5.0.x] Added release date for 5.0.1 and 4.2.9. Backport of f82a2c3b3d553f36661cfdce5261bffb669d68a9 from main --- docs/releases/4.2.9.txt | 2 +- docs/releases/5.0.1.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/releases/4.2.9.txt b/docs/releases/4.2.9.txt index 5202fbb6e77..9a1e7dc1985 100644 --- a/docs/releases/4.2.9.txt +++ b/docs/releases/4.2.9.txt @@ -2,7 +2,7 @@ Django 4.2.9 release notes ========================== -*Expected January 2, 2024* +*January 2, 2024* Django 4.2.9 fixes a bug in 4.2.8. diff --git a/docs/releases/5.0.1.txt b/docs/releases/5.0.1.txt index 4344b0d1818..8d2bd6a1873 100644 --- a/docs/releases/5.0.1.txt +++ b/docs/releases/5.0.1.txt @@ -2,7 +2,7 @@ Django 5.0.1 release notes ========================== -*Expected January 2, 2024* +*January 2, 2024* Django 5.0.1 fixes several bugs in 5.0. From 9c436a09b3a641874881706495ae07293aa97c2f Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Tue, 2 Jan 2024 10:07:09 +0100 Subject: [PATCH 29/67] [5.0.x] Bumped version for 5.0.1 release. --- django/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/__init__.py b/django/__init__.py index 60867ee193c..7f1ba15ab22 100644 --- a/django/__init__.py +++ b/django/__init__.py @@ -1,6 +1,6 @@ from django.utils.version import get_version -VERSION = (5, 0, 1, "alpha", 0) +VERSION = (5, 0, 1, "final", 0) __version__ = get_version(VERSION) From 278eeca181ab9afdc4ba1ac16a6a4da1d179fea3 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Tue, 2 Jan 2024 10:09:37 +0100 Subject: [PATCH 30/67] [5.0.x] Post-release version bump. --- django/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/__init__.py b/django/__init__.py index 7f1ba15ab22..fe0cae94b9a 100644 --- a/django/__init__.py +++ b/django/__init__.py @@ -1,6 +1,6 @@ from django.utils.version import get_version -VERSION = (5, 0, 1, "final", 0) +VERSION = (5, 0, 2, "alpha", 0) __version__ = get_version(VERSION) From abb2448f17cfb5403a6eb4fb8a08112f26910a6f Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Tue, 2 Jan 2024 10:28:34 +0100 Subject: [PATCH 31/67] [5.0.x] Added stub release notes for 5.0.2. Backport of f412add786dfc18424eee6281ec8cc97220b04fc from main --- docs/releases/5.0.2.txt | 12 ++++++++++++ docs/releases/index.txt | 1 + 2 files changed, 13 insertions(+) create mode 100644 docs/releases/5.0.2.txt diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt new file mode 100644 index 00000000000..4ba818dcb37 --- /dev/null +++ b/docs/releases/5.0.2.txt @@ -0,0 +1,12 @@ +========================== +Django 5.0.2 release notes +========================== + +*Expected February 5, 2024* + +Django 5.0.2 fixes several bugs in 5.0.1. + +Bugfixes +======== + +* ... diff --git a/docs/releases/index.txt b/docs/releases/index.txt index a822164c96f..032588a178a 100644 --- a/docs/releases/index.txt +++ b/docs/releases/index.txt @@ -25,6 +25,7 @@ versions of the documentation contain the release notes for any later releases. .. toctree:: :maxdepth: 1 + 5.0.2 5.0.1 5.0 From ef8234aef8f8473cb4fb79aec29e5a9445a32114 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 3 Jan 2024 21:17:57 +0000 Subject: [PATCH 32/67] [5.0.x] Refs #33690 -- Updated tutorial for admin dark mode toggle. Backport of c65f49d3cb8709f2f694f78b4849bc7693e90416 from main --- docs/intro/tutorial07.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/intro/tutorial07.txt b/docs/intro/tutorial07.txt index f53d0b524c0..9cdadbe2869 100644 --- a/docs/intro/tutorial07.txt +++ b/docs/intro/tutorial07.txt @@ -368,6 +368,9 @@ a section of code like: {% block branding %} + {% if user.is_anonymous %} + {% include "admin/color_theme_toggle.html" %} + {% endif %} {% endblock %} We use this approach to teach you how to override templates. In an actual From 4818a139f74744b3e628bd097caf7f030108c23d Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 3 Jan 2024 21:21:10 +0000 Subject: [PATCH 33/67] [5.0.x] Fixed #35084 -- Recommended 'django_' prefix for reusable app modules. Backport of 05f124348e72c1dcf1f6e5de72ffc1f67ad9aa77 from main --- docs/intro/reusable-apps.txt | 79 +++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/docs/intro/reusable-apps.txt b/docs/intro/reusable-apps.txt index 19d9063edd2..f40daf4dfbd 100644 --- a/docs/intro/reusable-apps.txt +++ b/docs/intro/reusable-apps.txt @@ -121,16 +121,17 @@ Python *packaging* refers to preparing your app in a specific format that can be easily installed and used. Django itself is packaged very much like this. For a small app like polls, this process isn't too difficult. -#. First, create a parent directory for ``polls``, outside of your Django +#. First, create a parent directory for the package, outside of your Django project. Call this directory ``django-polls``. .. admonition:: Choosing a name for your app - When choosing a name for your package, check resources like PyPI to avoid - naming conflicts with existing packages. It's often useful to prepend - ``django-`` to your module name when creating a package to distribute. - This helps others looking for Django apps identify your app as Django - specific. + When choosing a name for your package, check PyPI to avoid naming + conflicts with existing packages. We recommend using a ``django-`` + prefix for package names, to identify your package as specific to + Django, and a corresponding ``django_`` prefix for your module name. For + example, the ``django-ratelimit`` package contains the + ``django_ratelimit`` module. Application labels (that is, the final part of the dotted path to application packages) *must* be unique in :setting:`INSTALLED_APPS`. @@ -138,19 +139,35 @@ this. For a small app like polls, this process isn't too difficult. `, for example ``auth``, ``admin``, or ``messages``. -#. Move the ``polls`` directory into the ``django-polls`` directory. +#. Move the ``polls`` directory into ``django-polls`` directory, and rename it + to ``django_polls``. + +#. Edit ``django_polls/apps.py`` so that :attr:`~.AppConfig.name` refers to the + new module name and add :attr:`~.AppConfig.label` to give a short name for + the app: + + .. code-block:: python + :caption: ``django-polls/django_polls/apps.py`` + + from django.apps import AppConfig + + + class PollsConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "django_polls" + label = "polls" #. Create a file ``django-polls/README.rst`` with the following contents: .. code-block:: rst :caption: ``django-polls/README.rst`` - ===== - Polls - ===== + ============ + django-polls + ============ - Polls is a Django app to conduct web-based polls. For each question, - visitors can choose between a fixed number of answers. + django-polls is a Django app to conduct web-based polls. For each + question, visitors can choose between a fixed number of answers. Detailed documentation is in the "docs" directory. @@ -161,19 +178,18 @@ this. For a small app like polls, this process isn't too difficult. INSTALLED_APPS = [ ..., - "polls", + "django_polls", ] 2. Include the polls URLconf in your project urls.py like this:: - path("polls/", include("polls.urls")), + path("polls/", include("django_polls.urls")), - 3. Run ``python manage.py migrate`` to create the polls models. + 3. Run ``python manage.py migrate`` to create the models. - 4. Start the development server and visit http://127.0.0.1:8000/admin/ - to create a poll (you'll need the Admin app enabled). + 4. Start the development server and visit the admin to create a poll. - 5. Visit http://127.0.0.1:8000/polls/ to participate in the poll. + 5. Visit the ``/polls/`` URL to participate in the poll. #. Create a ``django-polls/LICENSE`` file. Choosing a license is beyond the scope of this tutorial, but suffice it to say that code released publicly @@ -251,8 +267,8 @@ this. For a small app like polls, this process isn't too difficult. include LICENSE include README.rst - recursive-include polls/static * - recursive-include polls/templates * + recursive-include django_polls/static * + recursive-include django_polls/templates * #. It's optional, but recommended, to include detailed documentation with your app. Create an empty directory ``django-polls/docs`` for future @@ -266,8 +282,8 @@ this. For a small app like polls, this process isn't too difficult. you add some files to it. Many Django apps also provide their documentation online through sites like `readthedocs.org `_. -#. Try building your package with ``python setup.py sdist`` (run from inside - ``django-polls``). This creates a directory called ``dist`` and builds your +#. Try building your package by running ``python setup.py sdist`` inside + ``django-polls``. This creates a directory called ``dist`` and builds your new package, ``django-polls-0.1.tar.gz``. For more information on packaging, see Python's `Tutorial on Packaging and @@ -299,14 +315,21 @@ working. We'll now fix this by installing our new ``django-polls`` package. python -m pip install --user django-polls/dist/django-polls-0.1.tar.gz -#. With luck, your Django project should now work correctly again. Run the - server again to confirm this. +#. Update ``mysite/settings.py`` to point to the new module name:: -#. To uninstall the package, use pip: + INSTALLED_APPS = [ + "django_polls.apps.PollsConfig", + ..., + ] - .. code-block:: shell +#. Update ``mysite/urls.py`` to point to the new module name:: + + urlpatterns = [ + path("polls/", include("django_polls.urls")), + ..., + ] - python -m pip uninstall django-polls +#. Run the development server to confirm the project continues to work. Publishing your app =================== @@ -326,7 +349,7 @@ the world! If this wasn't just an example, you could now: Installing Python packages with a virtual environment ===================================================== -Earlier, we installed the polls app as a user library. This has some +Earlier, we installed ``django-polls`` as a user library. This has some disadvantages: * Modifying the user libraries can affect other Python software on your system. From 4cba6748a640a158a26a0a0d11597b393bdd3883 Mon Sep 17 00:00:00 2001 From: Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> Date: Fri, 5 Jan 2024 14:08:25 +0100 Subject: [PATCH 34/67] [5.0.x] Fixed #35087 -- Reallowed filtering against foreign keys not listed in ModelAdmin.list_filters. Regression in f80669d2f5a5f1db9e9b73ca893fefba34f955e7. Backport of a9094ec1f43dca7f2a649327afcd5e6226b4959c from main --- django/contrib/admin/options.py | 5 +++-- docs/releases/5.0.2.txt | 4 +++- tests/modeladmin/tests.py | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index c1734d98c26..ee8e5695c9c 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -465,7 +465,8 @@ def lookup_allowed(self, lookup, value, request=None): relation_parts = [] prev_field = None - for part in lookup.split(LOOKUP_SEP): + parts = lookup.split(LOOKUP_SEP) + for part in parts: try: field = model._meta.get_field(part) except FieldDoesNotExist: @@ -489,7 +490,7 @@ def lookup_allowed(self, lookup, value, request=None): prev_field = field model = field.path_infos[-1].to_opts.model - if not relation_parts: + if not relation_parts or len(parts) == 1: # Either a local field filter, or no fields at all. return True valid_lookups = {self.date_hierarchy} diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index 4ba818dcb37..facfed26f50 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -9,4 +9,6 @@ Django 5.0.2 fixes several bugs in 5.0.1. Bugfixes ======== -* ... +* Reallowed, following a regression in Django 5.0.1, filtering against local + foreign keys not included in :attr:`.ModelAdmin.list_filter` + (:ticket:`35087`). diff --git a/tests/modeladmin/tests.py b/tests/modeladmin/tests.py index 1a9dbdb7cbc..dce91b23e41 100644 --- a/tests/modeladmin/tests.py +++ b/tests/modeladmin/tests.py @@ -162,6 +162,20 @@ class EmployeeProfileAdmin(ModelAdmin): True, ) + @isolate_apps("modeladmin") + def test_lookup_allowed_for_local_fk_fields(self): + class Country(models.Model): + pass + + class Place(models.Model): + country = models.ForeignKey(Country, models.CASCADE) + + class PlaceAdmin(ModelAdmin): + pass + + ma = PlaceAdmin(Place, self.site) + self.assertIs(ma.lookup_allowed("country", "1", request), True) + @isolate_apps("modeladmin") def test_lookup_allowed_non_autofield_primary_key(self): class Country(models.Model): From d56b2105b6247d0d7816660d24adaf5b603e2a07 Mon Sep 17 00:00:00 2001 From: evananyonga Date: Fri, 5 Jan 2024 12:17:37 +0300 Subject: [PATCH 35/67] [5.0.x] Made management command examples more consistent in docs. Backport of ec7651586d2d94e1ccd8f905c6a3776ad936b62d from main --- docs/topics/testing/tools.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/topics/testing/tools.txt b/docs/topics/testing/tools.txt index a415097c560..c8002a82dc6 100644 --- a/docs/topics/testing/tools.txt +++ b/docs/topics/testing/tools.txt @@ -2160,8 +2160,8 @@ redirected into a ``StringIO`` instance:: class ClosepollTest(TestCase): def test_command_output(self): out = StringIO() - call_command("closepoll", stdout=out) - self.assertIn("Expected output", out.getvalue()) + call_command("closepoll", poll_ids=[1], stdout=out) + self.assertIn('Successfully closed poll "1"', out.getvalue()) .. _skipping-tests: From dd2d76803c040a03342db1caa2b77747b4426549 Mon Sep 17 00:00:00 2001 From: jordanbae Date: Tue, 9 Jan 2024 23:04:31 +0900 Subject: [PATCH 36/67] [5.0.x] Fixed #34949 -- Clarified when UniqueConstraints with include/nulls_distinct are not created. Backport of 4fec1d2ce37241fb8fa001971c441d360ed2a196 from main --- docs/ref/models/constraints.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/ref/models/constraints.txt b/docs/ref/models/constraints.txt index efe63a8ac18..cc308cedf22 100644 --- a/docs/ref/models/constraints.txt +++ b/docs/ref/models/constraints.txt @@ -229,7 +229,8 @@ For example:: will allow filtering on ``room`` and ``date``, also selecting ``full_name``, while fetching data only from the index. -``include`` is supported only on PostgreSQL. +Unique constraints with non-key columns are ignored for databases besides +PostgreSQL. Non-key columns have the same database restrictions as :attr:`Index.include`. @@ -272,7 +273,8 @@ For example:: creates a unique constraint that only allows one row to store a ``NULL`` value in the ``ordering`` column. -``nulls_distinct`` is ignored for databases besides PostgreSQL 15+. +Unique constraints with ``nulls_distinct`` are ignored for databases besides +PostgreSQL 15+. ``violation_error_code`` ------------------------ From a7b35aa7c9e0bc59f227c558bf26488c43c96250 Mon Sep 17 00:00:00 2001 From: Baptiste Mispelon Date: Tue, 16 Jan 2024 20:09:50 +0100 Subject: [PATCH 37/67] [5.0.x] Used more specific link to email backends in EMAIL_BACKEND docs. Backport of 1592f0ac220c1fd37779f6d33efb28ebd60e2e66 from main --- docs/ref/settings.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index c1f04c7f1d7..0be85c04304 100644 --- a/docs/ref/settings.txt +++ b/docs/ref/settings.txt @@ -1408,7 +1408,7 @@ This is only used if ``CommonMiddleware`` is installed (see Default: ``'``:class:`django.core.mail.backends.smtp.EmailBackend`\ ``'`` The backend to use for sending emails. For the list of available backends see -:doc:`/topics/email`. +:ref:`topic-email-backends`. .. setting:: EMAIL_FILE_PATH From 4ed1423de4342e453bf1d80129e84c14be819df3 Mon Sep 17 00:00:00 2001 From: Salvo Polizzi Date: Thu, 18 Jan 2024 10:21:12 +0100 Subject: [PATCH 38/67] [5.0.x] Fixed #35121 -- Corrected color for links in the admin. Thanks Collin Anderson for the report. Regression in 6ad2738a8f32b94cbae742f212080fadf2dee421. Backport of 10c7c7320baf1c655fcb91202169d77725c9c4bd from main --- django/contrib/admin/static/admin/css/base.css | 2 +- docs/releases/5.0.2.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/django/contrib/admin/static/admin/css/base.css b/django/contrib/admin/static/admin/css/base.css index 8a2837a55dd..44f2fc8802e 100644 --- a/django/contrib/admin/static/admin/css/base.css +++ b/django/contrib/admin/static/admin/css/base.css @@ -102,7 +102,7 @@ body { /* LINKS */ a:link, a:visited { - color: var(--body-fg); + color: var(--link-fg); text-decoration: none; transition: color 0.15s, background 0.15s; } diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index facfed26f50..a5e2b6eee40 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -12,3 +12,6 @@ Bugfixes * Reallowed, following a regression in Django 5.0.1, filtering against local foreign keys not included in :attr:`.ModelAdmin.list_filter` (:ticket:`35087`). + +* Fixed a regression in Django 5.0 where links in the admin had an incorrect + color (:ticket:`35121`). From ee78fe390db7cf319f0ddc2de0c9190c783ef925 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Fri, 19 Jan 2024 08:55:50 +0100 Subject: [PATCH 39/67] [5.0.x] Fixed #35127 -- Made Model.full_clean() ignore GeneratedFields. Thanks Claude Paroz for the report. Regression in f333e3513e8bdf5ffeb6eeb63021c230082e6f95. Backport of 4879907223d70ee1a82474d9286ccfa5dae96971 from main --- django/db/models/base.py | 2 +- docs/releases/5.0.2.txt | 3 +++ tests/model_fields/models.py | 4 ++-- tests/model_fields/test_generatedfield.py | 8 ++++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/django/db/models/base.py b/django/db/models/base.py index c3f6b32a5ee..1e47ca7d1df 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -1561,7 +1561,7 @@ def clean_fields(self, exclude=None): errors = {} for f in self._meta.fields: - if f.name in exclude: + if f.name in exclude or f.generated: continue # Skip validation for empty fields with blank=True. The developer # is responsible for making sure they have a valid value. diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index a5e2b6eee40..05f80bb00f9 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -15,3 +15,6 @@ Bugfixes * Fixed a regression in Django 5.0 where links in the admin had an incorrect color (:ticket:`35121`). + +* Fixed a bug in Django 5.0 that caused a crash of ``Model.full_clean()`` on + models with a ``GeneratedField`` (:ticket:`35127`). diff --git a/tests/model_fields/models.py b/tests/model_fields/models.py index 69b4e26145c..e34f3c8947a 100644 --- a/tests/model_fields/models.py +++ b/tests/model_fields/models.py @@ -502,7 +502,7 @@ class GeneratedModel(models.Model): output_field=models.IntegerField(), db_persist=True, ) - fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True) + fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True, blank=True) class Meta: required_db_features = {"supports_stored_generated_columns"} @@ -516,7 +516,7 @@ class GeneratedModelVirtual(models.Model): output_field=models.IntegerField(), db_persist=False, ) - fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True) + fk = models.ForeignKey(Foo, on_delete=models.CASCADE, null=True, blank=True) class Meta: required_db_features = {"supports_virtual_generated_columns"} diff --git a/tests/model_fields/test_generatedfield.py b/tests/model_fields/test_generatedfield.py index 589f78cbb04..a636e984fdb 100644 --- a/tests/model_fields/test_generatedfield.py +++ b/tests/model_fields/test_generatedfield.py @@ -168,6 +168,14 @@ def test_unsaved_error(self): with self.assertRaisesMessage(AttributeError, msg): m.field + def test_full_clean(self): + m = self.base_model(a=1, b=2) + # full_clean() ignores GeneratedFields. + m.full_clean() + m.save() + m = self._refresh_if_needed(m) + self.assertEqual(m.field, 3) + def test_create(self): m = self.base_model.objects.create(a=1, b=2) m = self._refresh_if_needed(m) From c4a6a8d8155d7e69164ed6b44ef74837ed2fe710 Mon Sep 17 00:00:00 2001 From: Emmanuel Katchy Date: Thu, 18 Jan 2024 22:03:20 +0000 Subject: [PATCH 40/67] [5.0.x] Updated "Dive Into Python" links. Backport of 12ffcfc350a19bbfbc203126a9b6c84b5e0d0ba2 from main --- AUTHORS | 2 +- docs/intro/contributing.txt | 8 ++++---- docs/intro/index.txt | 8 +++++--- docs/ref/django-admin.txt | 8 +++----- docs/ref/templates/builtins.txt | 4 ++-- docs/topics/settings.txt | 3 +-- 6 files changed, 16 insertions(+), 17 deletions(-) diff --git a/AUTHORS b/AUTHORS index b1f6c9578bb..e8a7cf19d4a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1082,6 +1082,6 @@ A big THANK YOU goes to: Ian Bicking for convincing Adrian to ditch code generation. - Mark Pilgrim for "Dive Into Python" (https://www.diveinto.org/python3/). + Mark Pilgrim for "Dive Into Python" (https://diveintopython3.net/). Guido van Rossum for creating Python. diff --git a/docs/intro/contributing.txt b/docs/intro/contributing.txt index 652bca0cb25..06230b8ee30 100644 --- a/docs/intro/contributing.txt +++ b/docs/intro/contributing.txt @@ -27,8 +27,8 @@ For this tutorial, we expect that you have at least a basic understanding of how Django works. This means you should be comfortable going through the existing tutorials on :doc:`writing your first Django app`. In addition, you should have a good understanding of Python itself. But if you -don't, `Dive Into Python`__ is a fantastic (and free) online book for -beginning Python programmers. +don't, `Dive Into Python`_ is a fantastic (and free) online book for beginning +Python programmers. Those of you who are unfamiliar with version control systems and Trac will find that this tutorial and its links include just enough information to get started. @@ -45,8 +45,8 @@ so that it can be of use to the widest audience. `#django-dev on irc.libera.chat`__ to chat with other Django users who might be able to help. -__ https://diveinto.org/python3/table-of-contents.html __ https://web.libera.chat/#django-dev +.. _Dive Into Python: https://diveintopython3.net/ .. _Django Forum: https://forum.djangoproject.com/ What does this tutorial cover? @@ -350,7 +350,7 @@ This test checks that the ``make_toast()`` returns ``'toast'``. * After reading those, if you want something a little meatier to sink your teeth into, there's always the Python :mod:`unittest` documentation. -__ https://diveinto.org/python3/unit-testing.html +__ https://diveintopython3.net/unit-testing.html Running your new test --------------------- diff --git a/docs/intro/index.txt b/docs/intro/index.txt index ca4836367f5..a68d4876b70 100644 --- a/docs/intro/index.txt +++ b/docs/intro/index.txt @@ -32,10 +32,12 @@ place: read this material to quickly get up and running. `list of Python resources for non-programmers`_ If you already know a few other languages and want to get up to speed with - Python quickly, we recommend `Dive Into Python`_. If that's not quite your - style, there are many other `books about Python`_. + Python quickly, we recommend referring the official + `Python documentation`_, which provides comprehensive and authoritative + information about the language, as well as links to other resources such as + a list of `books about Python`_. .. _python: https://www.python.org/ .. _list of Python resources for non-programmers: https://wiki.python.org/moin/BeginnersGuide/NonProgrammers - .. _Dive Into Python: https://diveinto.org/python3/table-of-contents.html + .. _Python documentation: https://docs.python.org/3/ .. _books about Python: https://wiki.python.org/moin/PythonBooks diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt index f533aa11dea..59c731113cb 100644 --- a/docs/ref/django-admin.txt +++ b/docs/ref/django-admin.txt @@ -1804,9 +1804,9 @@ allows for the following options by default: .. django-admin-option:: --pythonpath PYTHONPATH -Adds the given filesystem path to the Python `import search path`_. If this -isn't provided, ``django-admin`` will use the :envvar:`PYTHONPATH` environment -variable. +Adds the given filesystem path to the Python :py:data:`sys.path` module +attribute. If this isn't provided, ``django-admin`` will use the +:envvar:`PYTHONPATH` environment variable. This option is unnecessary in ``manage.py``, because it takes care of setting the Python path for you. @@ -1817,8 +1817,6 @@ Example usage: django-admin migrate --pythonpath='/home/djangoprojects/myproject' -.. _import search path: https://diveinto.org/python3/your-first-python-program.html#importsearchpath - .. django-admin-option:: --settings SETTINGS Specifies the settings module to use. The settings module should be in Python diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt index c95006fb51e..8a2b7141353 100644 --- a/docs/ref/templates/builtins.txt +++ b/docs/ref/templates/builtins.txt @@ -2440,8 +2440,8 @@ individual elements of the sequence. Returns a slice of the list. -Uses the same syntax as Python's list slicing. See -https://diveinto.org/python3/native-datatypes.html#slicinglists for an +Uses the same syntax as Python's list slicing. See the `Python documentation +`_ for an introduction. Example: diff --git a/docs/topics/settings.txt b/docs/topics/settings.txt index dc6cd945b39..553f788e61e 100644 --- a/docs/topics/settings.txt +++ b/docs/topics/settings.txt @@ -44,9 +44,8 @@ by using an environment variable, :envvar:`DJANGO_SETTINGS_MODULE`. The value of :envvar:`DJANGO_SETTINGS_MODULE` should be in Python path syntax, e.g. ``mysite.settings``. Note that the settings module should be on the -Python `import search path`_. +Python :py:data:`sys.path`. -.. _import search path: https://diveinto.org/python3/your-first-python-program.html#importsearchpath The ``django-admin`` utility ---------------------------- From 60bc65eb80ed12f6a6afbcb8ce2352e56a25cf34 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Mon, 22 Jan 2024 04:25:28 +0000 Subject: [PATCH 41/67] [5.0.x] Fixed tutorial 'background.gif' reference. Missed in 76fda7729e4cdfec715cd92b2c80d851797b05f7. Backport of a5622f84ab0ba0ebb30c2b85f2b85d8aef75f337 from main --- docs/intro/reusable-apps.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/intro/reusable-apps.txt b/docs/intro/reusable-apps.txt index f40daf4dfbd..0ca63830ea0 100644 --- a/docs/intro/reusable-apps.txt +++ b/docs/intro/reusable-apps.txt @@ -76,7 +76,7 @@ After the previous tutorials, our project should look like this: static/ polls/ images/ - background.gif + background.png style.css templates/ polls/ From d490d009a32cd1fae80363b632f689785f5064b1 Mon Sep 17 00:00:00 2001 From: Adrienne Franke <18449966+adriennefranke@users.noreply.github.com> Date: Mon, 22 Jan 2024 10:43:13 -0600 Subject: [PATCH 42/67] [5.0.x] Fixed typo in docs/topics/auth/default.txt. Backport of 8570e091d025c4aacc6b76597a3322030c2f8162 from main --- docs/topics/auth/default.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topics/auth/default.txt b/docs/topics/auth/default.txt index 4aee26d9cae..1dbab8b2d9d 100644 --- a/docs/topics/auth/default.txt +++ b/docs/topics/auth/default.txt @@ -1608,7 +1608,7 @@ Helper functions Defaults to :setting:`settings.LOGIN_URL ` if not supplied. * ``redirect_field_name``: The name of a ``GET`` field containing the - URL to redirect to after log out. Overrides ``next`` if the given + URL to redirect to after login. Overrides ``next`` if the given ``GET`` parameter is passed. .. _built-in-auth-forms: From b2601a77f97eb84d7574e6ac68a38a636bdc0e1e Mon Sep 17 00:00:00 2001 From: duranbe Date: Sun, 19 Nov 2023 20:32:31 +0100 Subject: [PATCH 43/67] [5.0.x] Fixed #34971 -- Doc'd additional loggers. Co-authored-by: duranbe Co-authored-by: Natalia <124304+nessita@users.noreply.github.com> Backport of 0450c9bdf1773297c61b4e36850ab997ffd5dde2 from main --- docs/ref/logging.txt | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/ref/logging.txt b/docs/ref/logging.txt index b11fb752f79..fa07422cd51 100644 --- a/docs/ref/logging.txt +++ b/docs/ref/logging.txt @@ -204,6 +204,39 @@ all database queries. Support for logging transaction management queries (``BEGIN``, ``COMMIT``, and ``ROLLBACK``) was added. +.. _django-utils-autoreloader-logger: + +``django.utils.autoreload`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Log messages related to automatic code reloading during the execution of the +Django development server. This logger generates an ``INFO`` message upon +detecting a modification in a source code file and may produce ``WARNING`` +messages during filesystem inspection and event subscription processes. + +.. _django-contrib-gis-logger: + +``django.contrib.gis`` +~~~~~~~~~~~~~~~~~~~~~~ + +Log messages related to :doc:`contrib/gis/index` at various points: during the +loading of external GeoSpatial libraries (GEOS, GDAL, etc.) and when reporting +errors. Each ``ERROR`` log record includes the caught exception and relevant +contextual data. + +.. _django-dispatch-logger: + +``django.dispatch`` +~~~~~~~~~~~~~~~~~~~ + +This logger is used in :doc:`signals`, specifically within the +:mod:`~django.dispatch.Signal` class, to report issues when dispatching a +signal to a connected receiver. The ``ERROR`` log record includes the caught +exception as ``exc_info`` and adds the following extra context: + +* ``receiver``: The name of the receiver. +* ``err``: The exception that occurred when calling the receiver. + .. _django-security-logger: ``django.security.*`` From abcd99244fa1ab38e65b6c8a6cefe00baf7b53ea Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Mon, 23 Oct 2023 08:58:30 +0200 Subject: [PATCH 44/67] [5.0.x] Bumped versions in pre-commit and npm configurations. Backport of 7fcf4f2f0f19c353fe3ee9fe2f6c4baeda4f03c8 from main --- .pre-commit-config.yaml | 8 ++++---- package.json | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1a87425e017..6304b41cc9c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,15 +1,15 @@ repos: - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.9.0 + rev: 23.10.0 hooks: - id: black exclude: \.py-tpl$ - repo: https://github.com/adamchainz/blacken-docs - rev: 1.13.0 + rev: 1.16.0 hooks: - id: blacken-docs additional_dependencies: - - black==23.9.0 + - black==23.10.0 - repo: https://github.com/PyCQA/isort rev: 5.12.0 hooks: @@ -19,6 +19,6 @@ repos: hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-eslint - rev: v8.49.0 + rev: v8.52.0 hooks: - id: eslint diff --git a/package.json b/package.json index 510d50ad5b1..e9b3982dc68 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,11 @@ "npm": ">=1.3.0" }, "devDependencies": { - "eslint": "^8.49.0", - "puppeteer": "^21.1.1", + "eslint": "^8.52.0", + "puppeteer": "^21.4.0", "grunt": "^1.6.1", "grunt-cli": "^1.4.3", - "grunt-contrib-qunit": "^7.0.0", - "qunit": "^2.19.4" + "grunt-contrib-qunit": "^8.0.1", + "qunit": "^2.20.0" } } From 45fae65672e7a1133c378416cfeb4c9af285ab88 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Thu, 4 Jan 2024 04:35:46 +0000 Subject: [PATCH 45/67] [5.0.x] Refs #34140 -- Fixed blacken-docs pre-commit configuration. Missed in 6015bab80e28aef2669f6fac53423aa65f70cb08. The default blacken-docs hook definition does not apply to .txt files, which the Django documentation uses. This commit overrides that definition to point blacken-docs at the appropriate files. Backport of d89a465e62ad876cc7f1332d1712700cb81f3995 from main --- .pre-commit-config.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6304b41cc9c..d42a0dd2126 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,6 +10,7 @@ repos: - id: blacken-docs additional_dependencies: - black==23.10.0 + files: 'docs/.*\.txt$' - repo: https://github.com/PyCQA/isort rev: 5.12.0 hooks: From 86dd89e6231a9062aee256bc6d49f1666a1a93b6 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Fri, 5 Jan 2024 08:23:31 +0100 Subject: [PATCH 46/67] [5.0.x] Bumped versions in pre-commit and npm configurations. Backport of 9b056aa5afbd1f037189f5b9250ef68e87a93e19 from main --- .pre-commit-config.yaml | 10 +++++----- package.json | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d42a0dd2126..1c3571406fd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.10.0 + rev: 23.12.1 hooks: - id: black exclude: \.py-tpl$ @@ -9,17 +9,17 @@ repos: hooks: - id: blacken-docs additional_dependencies: - - black==23.10.0 + - black==23.12.1 files: 'docs/.*\.txt$' - repo: https://github.com/PyCQA/isort - rev: 5.12.0 + rev: 5.13.2 hooks: - id: isort - repo: https://github.com/PyCQA/flake8 - rev: 6.1.0 + rev: 7.0.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-eslint - rev: v8.52.0 + rev: v8.56.0 hooks: - id: eslint diff --git a/package.json b/package.json index e9b3982dc68..02589973403 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ "npm": ">=1.3.0" }, "devDependencies": { - "eslint": "^8.52.0", - "puppeteer": "^21.4.0", + "eslint": "^8.56.0", + "puppeteer": "^21.7.0", "grunt": "^1.6.1", "grunt-cli": "^1.4.3", "grunt-contrib-qunit": "^8.0.1", From 0379e7532fdf3212b1fe22a58826109c23009be3 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Fri, 26 Jan 2024 12:45:07 +0100 Subject: [PATCH 47/67] [5.0.x] Applied Black's 2024 stable style. https://github.com/psf/black/releases/tag/24.1.0 Backport of 305757aec19c9d5111e4d76095ae0acd66163e4b from main --- .pre-commit-config.yaml | 4 +- django/__main__.py | 1 + django/contrib/admin/filters.py | 1 + django/contrib/admin/options.py | 14 ++-- .../contrib/admin/templatetags/admin_list.py | 14 ++-- django/contrib/admin/widgets.py | 1 + django/contrib/auth/base_user.py | 1 + django/contrib/auth/management/__init__.py | 1 + .../management/commands/createsuperuser.py | 23 ++++-- .../contrib/gis/db/backends/oracle/models.py | 1 + .../gis/db/backends/oracle/operations.py | 1 + .../gis/db/backends/postgis/adapter.py | 1 + .../contrib/gis/db/backends/postgis/const.py | 1 + .../contrib/gis/db/backends/postgis/models.py | 1 + .../gis/db/backends/spatialite/models.py | 1 + .../gis/db/backends/spatialite/operations.py | 1 + django/contrib/gis/db/models/functions.py | 14 ++-- django/contrib/gis/db/models/proxy.py | 1 + .../contrib/gis/db/models/sql/conversion.py | 1 + django/contrib/gis/gdal/__init__.py | 1 + django/contrib/gis/gdal/datasource.py | 1 + django/contrib/gis/gdal/envelope.py | 1 + django/contrib/gis/gdal/geometries.py | 1 + django/contrib/gis/gdal/prototypes/ds.py | 1 + .../contrib/gis/gdal/prototypes/errcheck.py | 1 + .../contrib/gis/gdal/prototypes/generation.py | 1 + django/contrib/gis/gdal/prototypes/raster.py | 1 + django/contrib/gis/gdal/raster/const.py | 1 + django/contrib/gis/gdal/srs.py | 1 + django/contrib/gis/geoip2/__init__.py | 1 + django/contrib/gis/geos/__init__.py | 1 + django/contrib/gis/geos/collections.py | 1 + django/contrib/gis/geos/coordseq.py | 1 + django/contrib/gis/geos/geometry.py | 1 + django/contrib/gis/geos/io.py | 1 + django/contrib/gis/geos/libgeos.py | 1 + .../contrib/gis/geos/prototypes/errcheck.py | 1 + django/contrib/gis/geos/prototypes/misc.py | 1 + .../contrib/gis/geos/prototypes/predicates.py | 1 + .../contrib/gis/geos/prototypes/topology.py | 1 + django/contrib/gis/utils/__init__.py | 1 + django/contrib/gis/utils/ogrinspect.py | 1 + django/contrib/postgres/search.py | 8 +- django/contrib/sessions/base_session.py | 1 + django/contrib/staticfiles/views.py | 1 + django/core/cache/__init__.py | 1 + django/core/exceptions.py | 1 + django/core/files/images.py | 1 + django/core/files/locks.py | 1 + django/core/files/uploadhandler.py | 1 + django/core/mail/__init__.py | 1 + django/core/mail/backends/console.py | 1 + django/core/mail/backends/smtp.py | 1 + django/core/management/base.py | 23 ++++-- django/core/serializers/base.py | 1 + django/core/serializers/xml_serializer.py | 1 + django/db/backends/base/schema.py | 16 ++-- django/db/backends/ddl_references.py | 1 + django/db/backends/mysql/base.py | 1 + django/db/backends/oracle/base.py | 1 + django/db/backends/oracle/creation.py | 18 ++-- django/db/backends/postgresql/base.py | 8 +- django/db/backends/postgresql/schema.py | 6 +- django/db/backends/sqlite3/_functions.py | 1 + django/db/backends/sqlite3/base.py | 1 + django/db/migrations/autodetector.py | 17 ++-- django/db/migrations/loader.py | 10 +-- django/db/migrations/operations/models.py | 10 +-- django/db/migrations/state.py | 10 +-- django/db/models/aggregates.py | 1 + django/db/models/base.py | 8 +- django/db/models/constants.py | 1 + django/db/models/expressions.py | 42 +++++----- .../db/models/fields/related_descriptors.py | 1 + django/db/models/fields/reverse_related.py | 1 + django/db/models/functions/comparison.py | 1 + django/db/models/functions/datetime.py | 16 ++-- django/db/models/functions/math.py | 8 +- django/db/models/functions/mixins.py | 8 +- django/db/models/indexes.py | 8 +- django/db/models/lookups.py | 8 +- django/db/models/query.py | 20 +++-- django/db/models/query_utils.py | 1 + django/db/models/sql/compiler.py | 6 +- django/db/models/sql/datastructures.py | 1 + django/db/models/sql/query.py | 1 + django/db/models/sql/where.py | 1 + django/forms/models.py | 10 ++- django/forms/widgets.py | 22 +++-- django/http/multipartparser.py | 1 + django/http/request.py | 8 +- django/middleware/csrf.py | 1 + django/shortcuts.py | 1 + django/template/defaultfilters.py | 1 + django/template/defaulttags.py | 1 + django/template/engine.py | 8 +- django/template/smartif.py | 1 + django/test/html.py | 1 + django/urls/conf.py | 1 + django/urls/resolvers.py | 9 +- django/utils/archive.py | 1 + django/utils/cache.py | 1 + django/utils/crypto.py | 1 + django/utils/dateformat.py | 1 + django/utils/deconstruct.py | 8 +- django/utils/feedgenerator.py | 1 + django/utils/jslex.py | 1 + django/utils/regex_helper.py | 1 + django/utils/translation/__init__.py | 1 + django/utils/translation/trans_real.py | 1 + django/views/decorators/http.py | 1 + django/views/static.py | 1 + docs/_ext/djangodocs.py | 1 + docs/howto/csrf.txt | 3 +- docs/howto/custom-file-storage.txt | 3 +- docs/howto/custom-lookups.txt | 3 +- docs/howto/custom-management-commands.txt | 3 +- docs/howto/custom-model-fields.txt | 12 +-- docs/howto/custom-template-tags.txt | 9 +- docs/howto/error-reporting.txt | 9 +- .../writing-code/coding-style.txt | 9 +- .../writing-code/submitting-patches.txt | 6 +- docs/intro/tutorial04.txt | 3 +- docs/intro/tutorial07.txt | 3 +- docs/ref/contrib/admin/index.txt | 9 +- docs/ref/contrib/gis/feeds.txt | 12 +-- docs/ref/settings.txt | 3 +- docs/ref/utils.txt | 12 +-- docs/releases/1.0-porting-guide.txt | 3 +- docs/releases/1.10.txt | 3 +- docs/releases/1.2.txt | 30 +++---- docs/releases/5.0.txt | 3 +- docs/topics/async.txt | 15 ++-- docs/topics/auth/default.txt | 27 ++---- docs/topics/cache.txt | 30 +++---- docs/topics/checks.txt | 6 +- docs/topics/conditional-view-processing.txt | 15 ++-- docs/topics/db/fixtures.txt | 3 +- docs/topics/db/transactions.txt | 3 +- docs/topics/forms/modelforms.txt | 3 +- docs/topics/http/file-uploads.txt | 6 +- docs/topics/signals.txt | 3 +- docs/topics/testing/tools.txt | 21 ++--- tests/admin_changelist/test_date_hierarchy.py | 5 +- tests/admin_inlines/models.py | 1 + tests/admin_scripts/tests.py | 5 +- .../custom_has_permission_admin.py | 1 + tests/admin_views/customadmin.py | 1 + tests/aggregation_regress/tests.py | 5 +- tests/auth_tests/models/custom_permissions.py | 1 + tests/auth_tests/test_forms.py | 11 +-- tests/auth_tests/test_hashers.py | 15 ++-- tests/auth_tests/test_views.py | 6 +- tests/backends/base/test_base.py | 11 ++- tests/backends/test_utils.py | 1 + tests/backends/tests.py | 1 + tests/bash_completion/tests.py | 1 + tests/basic/models.py | 1 + tests/check_framework/test_security.py | 12 ++- tests/contenttypes_tests/test_management.py | 14 ++-- tests/contenttypes_tests/test_models.py | 5 +- tests/contenttypes_tests/test_views.py | 12 +-- tests/context_processors/tests.py | 1 + tests/custom_lookups/tests.py | 9 +- tests/db_functions/comparison/test_nullif.py | 8 +- .../datetime/test_extract_trunc.py | 8 +- tests/db_functions/models.py | 1 + tests/db_functions/text/test_md5.py | 8 +- tests/db_functions/text/test_sha1.py | 8 +- tests/db_functions/text/test_sha224.py | 8 +- tests/db_functions/text/test_sha256.py | 8 +- tests/db_functions/text/test_sha384.py | 10 ++- tests/db_functions/text/test_sha512.py | 10 ++- tests/db_utils/tests.py | 1 + tests/dbshell/test_sqlite.py | 11 ++- tests/distinct_on_fields/tests.py | 8 +- tests/expressions/models.py | 1 + tests/file_uploads/tests.py | 14 ++-- tests/file_uploads/uploadhandler.py | 1 + tests/files/tests.py | 35 ++++---- tests/force_insert_update/models.py | 1 + .../field_tests/test_decimalfield.py | 5 +- .../forms_tests/field_tests/test_filefield.py | 3 +- tests/forms_tests/tests/test_formsets.py | 9 +- tests/gis_tests/gdal_tests/test_raster.py | 5 +- tests/gis_tests/geogapp/tests.py | 1 + tests/gis_tests/test_data.py | 1 + tests/handlers/tests.py | 5 +- tests/httpwrappers/tests.py | 6 +- tests/invalid_models_tests/test_models.py | 82 +++++++++++-------- tests/m2m_and_m2o/models.py | 1 + tests/m2m_intermediary/models.py | 1 + tests/mail/tests.py | 5 +- tests/many_to_many/models.py | 1 + tests/many_to_one/models.py | 1 + tests/middleware/test_security.py | 12 ++- tests/middleware/tests.py | 6 +- tests/migrations/test_commands.py | 16 ++-- tests/migrations/test_executor.py | 6 +- tests/migrations/test_operations.py | 38 +++++---- tests/model_inheritance/models.py | 1 + tests/model_inheritance/tests.py | 8 +- tests/model_inheritance_regress/tests.py | 1 + tests/null_fk_ordering/models.py | 1 + tests/one_to_one/models.py | 1 + tests/order_with_respect_to/base_tests.py | 10 ++- tests/postgres_tests/fields.py | 1 + tests/postgres_tests/test_constraints.py | 5 +- tests/postgres_tests/test_search.py | 1 + tests/prefetch_related/tests.py | 5 +- tests/proxy_models/models.py | 1 + tests/queries/models.py | 1 + tests/requests_tests/test_accept_header.py | 12 +-- tests/save_delete_hooks/models.py | 1 + tests/schema/fields.py | 8 +- tests/schema/tests.py | 22 +++-- tests/serializers/models/base.py | 1 + tests/serializers/models/data.py | 1 + tests/serializers/models/natural.py | 1 + tests/serializers/test_data.py | 1 + tests/servers/tests.py | 1 + tests/sessions_tests/models.py | 1 + tests/signals/models.py | 1 + tests/template_tests/test_parser.py | 1 + tests/test_client/tests.py | 1 + tests/test_client_regress/tests.py | 1 + tests/test_runner/test_discover_runner.py | 7 +- tests/test_runner/tests.py | 80 ++++++++++-------- tests/transactions/models.py | 1 + tests/urlpatterns_reverse/tests.py | 1 + tests/urls.py | 1 - tests/utils_tests/test_datastructures.py | 1 + tests/utils_tests/test_jslex.py | 1 + tests/view_tests/tests/test_debug.py | 21 +++-- 234 files changed, 804 insertions(+), 599 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1c3571406fd..d6ea11e8e06 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/psf/black-pre-commit-mirror - rev: 23.12.1 + rev: 24.1.0 hooks: - id: black exclude: \.py-tpl$ @@ -9,7 +9,7 @@ repos: hooks: - id: blacken-docs additional_dependencies: - - black==23.12.1 + - black==24.1.0 files: 'docs/.*\.txt$' - repo: https://github.com/PyCQA/isort rev: 5.13.2 diff --git a/django/__main__.py b/django/__main__.py index 8b96e91ea85..74151438482 100644 --- a/django/__main__.py +++ b/django/__main__.py @@ -3,6 +3,7 @@ Example: python -m django check """ + from django.core import management if __name__ == "__main__": diff --git a/django/contrib/admin/filters.py b/django/contrib/admin/filters.py index 06dedf87279..675c4a5d499 100644 --- a/django/contrib/admin/filters.py +++ b/django/contrib/admin/filters.py @@ -5,6 +5,7 @@ Each filter subclass knows how to display a filter for a field that passes a certain test -- e.g. being a DateField or ForeignKey. """ + import datetime from django.contrib.admin.exceptions import NotRegistered diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index ee8e5695c9c..6f0bda46380 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -1748,9 +1748,9 @@ def get_inline_formsets(self, request, formsets, inline_instances, obj=None): has_delete_permission = inline.has_delete_permission(request, obj) else: # Disable all edit-permissions, and override formset settings. - has_add_permission = ( - has_change_permission - ) = has_delete_permission = False + has_add_permission = has_change_permission = has_delete_permission = ( + False + ) formset.extra = formset.max_num = 0 has_view_permission = inline.has_view_permission(request, obj) prepopulated = dict(inline.get_prepopulated_fields(request, obj)) @@ -1885,9 +1885,11 @@ def _changeform_view(self, request, object_id, form_url, extra_context): form, list(fieldsets), # Clear prepopulated fields on a view-only form to avoid a crash. - self.get_prepopulated_fields(request, obj) - if add or self.has_change_permission(request, obj) - else {}, + ( + self.get_prepopulated_fields(request, obj) + if add or self.has_change_permission(request, obj) + else {} + ), readonly_fields, model_admin=self, ) diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py index 2dcdf62afb2..0c32290b6ca 100644 --- a/django/contrib/admin/templatetags/admin_list.py +++ b/django/contrib/admin/templatetags/admin_list.py @@ -171,9 +171,9 @@ def make_qs_param(t, n): "url_primary": cl.get_query_string({ORDER_VAR: ".".join(o_list_primary)}), "url_remove": cl.get_query_string({ORDER_VAR: ".".join(o_list_remove)}), "url_toggle": cl.get_query_string({ORDER_VAR: ".".join(o_list_toggle)}), - "class_attrib": format_html(' class="{}"', " ".join(th_classes)) - if th_classes - else "", + "class_attrib": ( + format_html(' class="{}"', " ".join(th_classes)) if th_classes else "" + ), } @@ -270,9 +270,11 @@ def link_in_col(is_first, field_name, cl): link_or_text = format_html( '{}', url, - format_html(' data-popup-opener="{}"', value) - if cl.is_popup - else "", + ( + format_html(' data-popup-opener="{}"', value) + if cl.is_popup + else "" + ), result_repr, ) diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py index fc0cd941d12..ca844cddb39 100644 --- a/django/contrib/admin/widgets.py +++ b/django/contrib/admin/widgets.py @@ -1,6 +1,7 @@ """ Form Widget classes specific to the Django admin site. """ + import copy import json diff --git a/django/contrib/auth/base_user.py b/django/contrib/auth/base_user.py index da0eac731fb..386584b2731 100644 --- a/django/contrib/auth/base_user.py +++ b/django/contrib/auth/base_user.py @@ -2,6 +2,7 @@ This module allows importing AbstractBaseUser even when django.contrib.auth is not in INSTALLED_APPS. """ + import unicodedata import warnings diff --git a/django/contrib/auth/management/__init__.py b/django/contrib/auth/management/__init__.py index ad31a6e68fa..b29a980cb2d 100644 --- a/django/contrib/auth/management/__init__.py +++ b/django/contrib/auth/management/__init__.py @@ -1,6 +1,7 @@ """ Creates permissions for all installed apps that need permissions. """ + import getpass import unicodedata diff --git a/django/contrib/auth/management/commands/createsuperuser.py b/django/contrib/auth/management/commands/createsuperuser.py index 6d650cca67e..75ef68ff681 100644 --- a/django/contrib/auth/management/commands/createsuperuser.py +++ b/django/contrib/auth/management/commands/createsuperuser.py @@ -1,6 +1,7 @@ """ Management utility to create superusers. """ + import getpass import os import sys @@ -271,15 +272,19 @@ def _get_input_message(self, field, default=None): return "%s%s%s: " % ( capfirst(field.verbose_name), " (leave blank to use '%s')" % default if default else "", - " (%s.%s)" - % ( - field.remote_field.model._meta.object_name, - field.m2m_target_field_name() - if field.many_to_many - else field.remote_field.field_name, - ) - if field.remote_field - else "", + ( + " (%s.%s)" + % ( + field.remote_field.model._meta.object_name, + ( + field.m2m_target_field_name() + if field.many_to_many + else field.remote_field.field_name + ), + ) + if field.remote_field + else "" + ), ) @cached_property diff --git a/django/contrib/gis/db/backends/oracle/models.py b/django/contrib/gis/db/backends/oracle/models.py index f06f73148e9..af749c3435c 100644 --- a/django/contrib/gis/db/backends/oracle/models.py +++ b/django/contrib/gis/db/backends/oracle/models.py @@ -7,6 +7,7 @@ For example, the `USER_SDO_GEOM_METADATA` is used for the GeometryColumns model and the `SDO_COORD_REF_SYS` is used for the SpatialRefSys model. """ + from django.contrib.gis.db import models from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin diff --git a/django/contrib/gis/db/backends/oracle/operations.py b/django/contrib/gis/db/backends/oracle/operations.py index ed86985cf8d..eb86dc39dee 100644 --- a/django/contrib/gis/db/backends/oracle/operations.py +++ b/django/contrib/gis/db/backends/oracle/operations.py @@ -7,6 +7,7 @@ support for an internal JVM, and Java libraries are required to use the WKT constructors. """ + import re from django.contrib.gis.db import models diff --git a/django/contrib/gis/db/backends/postgis/adapter.py b/django/contrib/gis/db/backends/postgis/adapter.py index c95f9032538..c9715e17567 100644 --- a/django/contrib/gis/db/backends/postgis/adapter.py +++ b/django/contrib/gis/db/backends/postgis/adapter.py @@ -1,6 +1,7 @@ """ This object provides quoting for GEOS geometries into PostgreSQL/PostGIS. """ + from django.contrib.gis.db.backends.postgis.pgraster import to_pgraster from django.contrib.gis.geos import GEOSGeometry from django.db.backends.postgresql.psycopg_any import sql diff --git a/django/contrib/gis/db/backends/postgis/const.py b/django/contrib/gis/db/backends/postgis/const.py index 2f4393d25e5..8bc16a1abb6 100644 --- a/django/contrib/gis/db/backends/postgis/const.py +++ b/django/contrib/gis/db/backends/postgis/const.py @@ -1,6 +1,7 @@ """ PostGIS to GDAL conversion constant definitions """ + # Lookup to convert pixel type values from GDAL to PostGIS GDAL_TO_POSTGIS = [None, 4, 6, 5, 8, 7, 10, 11, None, None, None, None] diff --git a/django/contrib/gis/db/backends/postgis/models.py b/django/contrib/gis/db/backends/postgis/models.py index b7b568274aa..e35ef75ce98 100644 --- a/django/contrib/gis/db/backends/postgis/models.py +++ b/django/contrib/gis/db/backends/postgis/models.py @@ -1,6 +1,7 @@ """ The GeometryColumns and SpatialRefSys models for the PostGIS backend. """ + from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin from django.db import models diff --git a/django/contrib/gis/db/backends/spatialite/models.py b/django/contrib/gis/db/backends/spatialite/models.py index 7cc98ae1268..0f5f7b55ef0 100644 --- a/django/contrib/gis/db/backends/spatialite/models.py +++ b/django/contrib/gis/db/backends/spatialite/models.py @@ -1,6 +1,7 @@ """ The GeometryColumns and SpatialRefSys models for the SpatiaLite backend. """ + from django.contrib.gis.db.backends.base.models import SpatialRefSysMixin from django.db import models diff --git a/django/contrib/gis/db/backends/spatialite/operations.py b/django/contrib/gis/db/backends/spatialite/operations.py index 0b8b26ab6f8..d39f7a9e0d0 100644 --- a/django/contrib/gis/db/backends/spatialite/operations.py +++ b/django/contrib/gis/db/backends/spatialite/operations.py @@ -2,6 +2,7 @@ SQL functions reference lists: https://www.gaia-gis.it/gaia-sins/spatialite-sql-4.3.0.html """ + from django.contrib.gis.db import models from django.contrib.gis.db.backends.base.operations import BaseSpatialOperations from django.contrib.gis.db.backends.spatialite.adapter import SpatiaLiteAdapter diff --git a/django/contrib/gis/db/models/functions.py b/django/contrib/gis/db/models/functions.py index bd02e3717d8..e0f4a057e50 100644 --- a/django/contrib/gis/db/models/functions.py +++ b/django/contrib/gis/db/models/functions.py @@ -127,9 +127,11 @@ def as_sqlite(self, compiler, connection, **extra_context): copy = self.copy() copy.set_source_expressions( [ - Value(float(expr.value)) - if hasattr(expr, "value") and isinstance(expr.value, Decimal) - else expr + ( + Value(float(expr.value)) + if hasattr(expr, "value") and isinstance(expr.value, Decimal) + else expr + ) for expr in copy.get_source_expressions() ] ) @@ -342,9 +344,9 @@ def as_postgresql(self, compiler, connection, **extra_context): def as_sqlite(self, compiler, connection, **extra_context): if self.geo_field.geodetic(connection): # SpatiaLite returns NULL instead of zero on geodetic coordinates - extra_context[ - "template" - ] = "COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)" + extra_context["template"] = ( + "COALESCE(%(function)s(%(expressions)s, %(spheroid)s), 0)" + ) extra_context["spheroid"] = int(bool(self.spheroid)) return super().as_sql(compiler, connection, **extra_context) diff --git a/django/contrib/gis/db/models/proxy.py b/django/contrib/gis/db/models/proxy.py index 4db365dc16c..b415e147fc6 100644 --- a/django/contrib/gis/db/models/proxy.py +++ b/django/contrib/gis/db/models/proxy.py @@ -5,6 +5,7 @@ Thanks to Robert Coup for providing this functionality (see #4322). """ + from django.db.models.query_utils import DeferredAttribute diff --git a/django/contrib/gis/db/models/sql/conversion.py b/django/contrib/gis/db/models/sql/conversion.py index be712319fb2..7802b2dd1ec 100644 --- a/django/contrib/gis/db/models/sql/conversion.py +++ b/django/contrib/gis/db/models/sql/conversion.py @@ -2,6 +2,7 @@ This module holds simple classes to convert geospatial values from the database. """ + from decimal import Decimal from django.contrib.gis.measure import Area, Distance diff --git a/django/contrib/gis/gdal/__init__.py b/django/contrib/gis/gdal/__init__.py index 9ed6e311568..e63808d39d9 100644 --- a/django/contrib/gis/gdal/__init__.py +++ b/django/contrib/gis/gdal/__init__.py @@ -25,6 +25,7 @@ by setting `GDAL_LIBRARY_PATH` in your settings with the path to the GDAL C library on your system. """ + from django.contrib.gis.gdal.datasource import DataSource from django.contrib.gis.gdal.driver import Driver from django.contrib.gis.gdal.envelope import Envelope diff --git a/django/contrib/gis/gdal/datasource.py b/django/contrib/gis/gdal/datasource.py index dfd043ab0c2..c7ff48b8f1b 100644 --- a/django/contrib/gis/gdal/datasource.py +++ b/django/contrib/gis/gdal/datasource.py @@ -33,6 +33,7 @@ # OFTReal returns floats, all else returns string. val = field.value """ + from ctypes import byref from pathlib import Path diff --git a/django/contrib/gis/gdal/envelope.py b/django/contrib/gis/gdal/envelope.py index 4c2c1e4a1ad..05832bd7cc4 100644 --- a/django/contrib/gis/gdal/envelope.py +++ b/django/contrib/gis/gdal/envelope.py @@ -10,6 +10,7 @@ | | Lower left (min_x, min_y) o----------+ """ + from ctypes import Structure, c_double from django.contrib.gis.gdal.error import GDALException diff --git a/django/contrib/gis/gdal/geometries.py b/django/contrib/gis/gdal/geometries.py index f74dc688b3d..8ea6b5ffc46 100644 --- a/django/contrib/gis/gdal/geometries.py +++ b/django/contrib/gis/gdal/geometries.py @@ -38,6 +38,7 @@ >>> print(gt1 == 3, gt1 == 'Polygon') # Equivalence works w/non-OGRGeomType objects True True """ + import sys from binascii import b2a_hex from ctypes import byref, c_char_p, c_double, c_ubyte, c_void_p, string_at diff --git a/django/contrib/gis/gdal/prototypes/ds.py b/django/contrib/gis/gdal/prototypes/ds.py index bc5250e2db2..b6e9d4a0b81 100644 --- a/django/contrib/gis/gdal/prototypes/ds.py +++ b/django/contrib/gis/gdal/prototypes/ds.py @@ -3,6 +3,7 @@ related data structures. OGR_Dr_*, OGR_DS_*, OGR_L_*, OGR_F_*, OGR_Fld_* routines are relevant here. """ + from ctypes import POINTER, c_char_p, c_double, c_int, c_long, c_void_p from django.contrib.gis.gdal.envelope import OGREnvelope diff --git a/django/contrib/gis/gdal/prototypes/errcheck.py b/django/contrib/gis/gdal/prototypes/errcheck.py index 52bb7cb0830..d37e81cdf66 100644 --- a/django/contrib/gis/gdal/prototypes/errcheck.py +++ b/django/contrib/gis/gdal/prototypes/errcheck.py @@ -2,6 +2,7 @@ This module houses the error-checking routines used by the GDAL ctypes prototypes. """ + from ctypes import c_void_p, string_at from django.contrib.gis.gdal.error import GDALException, SRSException, check_err diff --git a/django/contrib/gis/gdal/prototypes/generation.py b/django/contrib/gis/gdal/prototypes/generation.py index 230e56f6655..4d34a96e70d 100644 --- a/django/contrib/gis/gdal/prototypes/generation.py +++ b/django/contrib/gis/gdal/prototypes/generation.py @@ -2,6 +2,7 @@ This module contains functions that generate ctypes prototypes for the GDAL routines. """ + from ctypes import POINTER, c_bool, c_char_p, c_double, c_int, c_int64, c_void_p from functools import partial diff --git a/django/contrib/gis/gdal/prototypes/raster.py b/django/contrib/gis/gdal/prototypes/raster.py index 59b930cb02d..b7871d19694 100644 --- a/django/contrib/gis/gdal/prototypes/raster.py +++ b/django/contrib/gis/gdal/prototypes/raster.py @@ -2,6 +2,7 @@ This module houses the ctypes function prototypes for GDAL DataSource (raster) related data structures. """ + from ctypes import POINTER, c_bool, c_char_p, c_double, c_int, c_void_p from functools import partial diff --git a/django/contrib/gis/gdal/raster/const.py b/django/contrib/gis/gdal/raster/const.py index dccc9cfab4b..a1ab62f37aa 100644 --- a/django/contrib/gis/gdal/raster/const.py +++ b/django/contrib/gis/gdal/raster/const.py @@ -1,6 +1,7 @@ """ GDAL - Constant definitions """ + from ctypes import ( c_double, c_float, diff --git a/django/contrib/gis/gdal/srs.py b/django/contrib/gis/gdal/srs.py index cd0554eb120..85f9c0a9a4a 100644 --- a/django/contrib/gis/gdal/srs.py +++ b/django/contrib/gis/gdal/srs.py @@ -26,6 +26,7 @@ >>> print(srs.name) NAD83 / Texas South Central """ + from ctypes import byref, c_char_p, c_int from enum import IntEnum from types import NoneType diff --git a/django/contrib/gis/geoip2/__init__.py b/django/contrib/gis/geoip2/__init__.py index 71b71f68dba..0df5827c256 100644 --- a/django/contrib/gis/geoip2/__init__.py +++ b/django/contrib/gis/geoip2/__init__.py @@ -11,6 +11,7 @@ Grab GeoLite2-Country.mmdb.gz and GeoLite2-City.mmdb.gz, and unzip them in the directory corresponding to settings.GEOIP_PATH. """ + __all__ = ["HAS_GEOIP2"] try: diff --git a/django/contrib/gis/geos/__init__.py b/django/contrib/gis/geos/__init__.py index 27de1ca8e69..f50cd198565 100644 --- a/django/contrib/gis/geos/__init__.py +++ b/django/contrib/gis/geos/__init__.py @@ -2,6 +2,7 @@ The GeoDjango GEOS module. Please consult the GeoDjango documentation for more details: https://docs.djangoproject.com/en/dev/ref/contrib/gis/geos/ """ + from .collections import ( # NOQA GeometryCollection, MultiLineString, diff --git a/django/contrib/gis/geos/collections.py b/django/contrib/gis/geos/collections.py index abfec8af3d7..35262a56221 100644 --- a/django/contrib/gis/geos/collections.py +++ b/django/contrib/gis/geos/collections.py @@ -2,6 +2,7 @@ This module houses the Geometry Collection objects: GeometryCollection, MultiPoint, MultiLineString, and MultiPolygon """ + from django.contrib.gis.geos import prototypes as capi from django.contrib.gis.geos.geometry import GEOSGeometry, LinearGeometryMixin from django.contrib.gis.geos.libgeos import GEOM_PTR diff --git a/django/contrib/gis/geos/coordseq.py b/django/contrib/gis/geos/coordseq.py index 0ff4ecb2e54..15400e08fe4 100644 --- a/django/contrib/gis/geos/coordseq.py +++ b/django/contrib/gis/geos/coordseq.py @@ -3,6 +3,7 @@ by GEOSGeometry to house the actual coordinates of the Point, LineString, and LinearRing geometries. """ + from ctypes import byref, c_byte, c_double, c_uint from django.contrib.gis.geos import prototypes as capi diff --git a/django/contrib/gis/geos/geometry.py b/django/contrib/gis/geos/geometry.py index 00b36af0a69..8bbe2c264ad 100644 --- a/django/contrib/gis/geos/geometry.py +++ b/django/contrib/gis/geos/geometry.py @@ -2,6 +2,7 @@ This module contains the 'base' GEOSGeometry object -- all GEOS Geometries inherit from this object. """ + import re from ctypes import addressof, byref, c_double diff --git a/django/contrib/gis/geos/io.py b/django/contrib/gis/geos/io.py index d7898065f08..8dd3f289e65 100644 --- a/django/contrib/gis/geos/io.py +++ b/django/contrib/gis/geos/io.py @@ -3,6 +3,7 @@ objects. Specifically, this has Python implementations of WKB/WKT reader and writer classes. """ + from django.contrib.gis.geos.geometry import GEOSGeometry from django.contrib.gis.geos.prototypes.io import ( WKBWriter, diff --git a/django/contrib/gis/geos/libgeos.py b/django/contrib/gis/geos/libgeos.py index 1121b4f7154..b883c6c0902 100644 --- a/django/contrib/gis/geos/libgeos.py +++ b/django/contrib/gis/geos/libgeos.py @@ -6,6 +6,7 @@ This module also houses GEOS Pointer utilities, including get_pointer_arr(), and GEOM_PTR. """ + import logging import os from ctypes import CDLL, CFUNCTYPE, POINTER, Structure, c_char_p diff --git a/django/contrib/gis/geos/prototypes/errcheck.py b/django/contrib/gis/geos/prototypes/errcheck.py index a527f513a7a..42b24c28913 100644 --- a/django/contrib/gis/geos/prototypes/errcheck.py +++ b/django/contrib/gis/geos/prototypes/errcheck.py @@ -1,6 +1,7 @@ """ Error checking functions for GEOS ctypes prototype functions. """ + from ctypes import c_void_p, string_at from django.contrib.gis.geos.error import GEOSException diff --git a/django/contrib/gis/geos/prototypes/misc.py b/django/contrib/gis/geos/prototypes/misc.py index fccd0ecc9e4..bd5859e79bb 100644 --- a/django/contrib/gis/geos/prototypes/misc.py +++ b/django/contrib/gis/geos/prototypes/misc.py @@ -2,6 +2,7 @@ This module is for the miscellaneous GEOS routines, particularly the ones that return the area, distance, and length. """ + from ctypes import POINTER, c_double, c_int from django.contrib.gis.geos.libgeos import GEOM_PTR, GEOSFuncFactory diff --git a/django/contrib/gis/geos/prototypes/predicates.py b/django/contrib/gis/geos/prototypes/predicates.py index 32b790173a6..dd07cbfb269 100644 --- a/django/contrib/gis/geos/prototypes/predicates.py +++ b/django/contrib/gis/geos/prototypes/predicates.py @@ -2,6 +2,7 @@ This module houses the GEOS ctypes prototype functions for the unary and binary predicate operations on geometries. """ + from ctypes import c_byte, c_char_p, c_double from django.contrib.gis.geos.libgeos import GEOM_PTR, GEOSFuncFactory diff --git a/django/contrib/gis/geos/prototypes/topology.py b/django/contrib/gis/geos/prototypes/topology.py index e61eae964a9..9323bb2d160 100644 --- a/django/contrib/gis/geos/prototypes/topology.py +++ b/django/contrib/gis/geos/prototypes/topology.py @@ -2,6 +2,7 @@ This module houses the GEOS ctypes prototype functions for the topological operations on geometries. """ + from ctypes import c_double, c_int from django.contrib.gis.geos.libgeos import GEOM_PTR, GEOSFuncFactory diff --git a/django/contrib/gis/utils/__init__.py b/django/contrib/gis/utils/__init__.py index 12f032c6658..f42fa90226e 100644 --- a/django/contrib/gis/utils/__init__.py +++ b/django/contrib/gis/utils/__init__.py @@ -1,6 +1,7 @@ """ This module contains useful utilities for GeoDjango. """ + from django.contrib.gis.utils.ogrinfo import ogrinfo from django.contrib.gis.utils.ogrinspect import mapping, ogrinspect from django.contrib.gis.utils.srs import add_srs_entry diff --git a/django/contrib/gis/utils/ogrinspect.py b/django/contrib/gis/utils/ogrinspect.py index 40ca0cb4615..76c8bfbcfab 100644 --- a/django/contrib/gis/utils/ogrinspect.py +++ b/django/contrib/gis/utils/ogrinspect.py @@ -3,6 +3,7 @@ models for GeoDjango and/or mapping dictionaries for use with the `LayerMapping` utility. """ + from django.contrib.gis.gdal import DataSource from django.contrib.gis.gdal.field import ( OFTDate, diff --git a/django/contrib/postgres/search.py b/django/contrib/postgres/search.py index 936709c2f84..4d279857c66 100644 --- a/django/contrib/postgres/search.py +++ b/django/contrib/postgres/search.py @@ -116,9 +116,11 @@ def as_sql(self, compiler, connection, function=None, template=None): clone.set_source_expressions( [ Coalesce( - expression - if isinstance(expression.output_field, (CharField, TextField)) - else Cast(expression, TextField()), + ( + expression + if isinstance(expression.output_field, (CharField, TextField)) + else Cast(expression, TextField()) + ), Value(""), ) for expression in clone.get_source_expressions() diff --git a/django/contrib/sessions/base_session.py b/django/contrib/sessions/base_session.py index 603d2fe12cd..8809dd36f77 100644 --- a/django/contrib/sessions/base_session.py +++ b/django/contrib/sessions/base_session.py @@ -2,6 +2,7 @@ This module allows importing AbstractBaseSession even when django.contrib.sessions is not in INSTALLED_APPS. """ + from django.db import models from django.utils.translation import gettext_lazy as _ diff --git a/django/contrib/staticfiles/views.py b/django/contrib/staticfiles/views.py index 83d04d4cec1..3fb2677322d 100644 --- a/django/contrib/staticfiles/views.py +++ b/django/contrib/staticfiles/views.py @@ -3,6 +3,7 @@ development, and SHOULD NOT be used in a production setting. """ + import os import posixpath diff --git a/django/core/cache/__init__.py b/django/core/cache/__init__.py index eb7fa5b2e99..444d958e688 100644 --- a/django/core/cache/__init__.py +++ b/django/core/cache/__init__.py @@ -12,6 +12,7 @@ See docs/topics/cache.txt for information on the public API. """ + from django.core import signals from django.core.cache.backends.base import ( BaseCache, diff --git a/django/core/exceptions.py b/django/core/exceptions.py index 2a2288ff4dc..31c18ee7e16 100644 --- a/django/core/exceptions.py +++ b/django/core/exceptions.py @@ -1,6 +1,7 @@ """ Global Django exception and warning classes. """ + import operator from django.utils.hashable import make_hashable diff --git a/django/core/files/images.py b/django/core/files/images.py index 6a603f24fca..7c1532ac8fd 100644 --- a/django/core/files/images.py +++ b/django/core/files/images.py @@ -3,6 +3,7 @@ Requires Pillow as you might imagine. """ + import struct import zlib diff --git a/django/core/files/locks.py b/django/core/files/locks.py index c0f471f87da..a7a7a22dce4 100644 --- a/django/core/files/locks.py +++ b/django/core/files/locks.py @@ -16,6 +16,7 @@ ... locks.lock(f, locks.LOCK_EX) ... f.write('Django') """ + import os __all__ = ("LOCK_EX", "LOCK_SH", "LOCK_NB", "lock", "unlock") diff --git a/django/core/files/uploadhandler.py b/django/core/files/uploadhandler.py index b6c185e8fc7..ab86f7fede5 100644 --- a/django/core/files/uploadhandler.py +++ b/django/core/files/uploadhandler.py @@ -1,6 +1,7 @@ """ Base file upload handler classes, and the built-in concrete subclasses """ + import os from io import BytesIO diff --git a/django/core/mail/__init__.py b/django/core/mail/__init__.py index dc63e8702c6..676326697b2 100644 --- a/django/core/mail/__init__.py +++ b/django/core/mail/__init__.py @@ -1,6 +1,7 @@ """ Tools for sending email. """ + from django.conf import settings # Imported for backwards compatibility and for the sake diff --git a/django/core/mail/backends/console.py b/django/core/mail/backends/console.py index ee5dd285043..2d7c778cc15 100644 --- a/django/core/mail/backends/console.py +++ b/django/core/mail/backends/console.py @@ -1,6 +1,7 @@ """ Email backend that writes messages to console instead of sending them. """ + import sys import threading diff --git a/django/core/mail/backends/smtp.py b/django/core/mail/backends/smtp.py index 1ee48269aee..6820148ac12 100644 --- a/django/core/mail/backends/smtp.py +++ b/django/core/mail/backends/smtp.py @@ -1,4 +1,5 @@ """SMTP email backend class.""" + import smtplib import ssl import threading diff --git a/django/core/management/base.py b/django/core/management/base.py index 631c761c004..4c47e1c6e51 100644 --- a/django/core/management/base.py +++ b/django/core/management/base.py @@ -2,6 +2,7 @@ Base classes for writing management commands (named commands which can be executed through ``django-admin`` or ``manage.py``). """ + import argparse import os import sys @@ -528,9 +529,11 @@ def check( if issues: visible_issue_count += len(issues) formatted = ( - self.style.ERROR(str(e)) - if e.is_serious() - else self.style.WARNING(str(e)) + ( + self.style.ERROR(str(e)) + if e.is_serious() + else self.style.WARNING(str(e)) + ) for e in issues ) formatted = "\n".join(sorted(formatted)) @@ -543,11 +546,15 @@ def check( if visible_issue_count: footer += "\n" footer += "System check identified %s (%s silenced)." % ( - "no issues" - if visible_issue_count == 0 - else "1 issue" - if visible_issue_count == 1 - else "%s issues" % visible_issue_count, + ( + "no issues" + if visible_issue_count == 0 + else ( + "1 issue" + if visible_issue_count == 1 + else "%s issues" % visible_issue_count + ) + ), len(all_issues) - visible_issue_count, ) diff --git a/django/core/serializers/base.py b/django/core/serializers/base.py index 20dffac05f7..1fbca9244b0 100644 --- a/django/core/serializers/base.py +++ b/django/core/serializers/base.py @@ -1,6 +1,7 @@ """ Module for abstract serializer/unserializer base classes. """ + from io import StringIO from django.core.exceptions import ObjectDoesNotExist diff --git a/django/core/serializers/xml_serializer.py b/django/core/serializers/xml_serializer.py index 3f9955aa23c..16b69770f6c 100644 --- a/django/core/serializers/xml_serializer.py +++ b/django/core/serializers/xml_serializer.py @@ -1,6 +1,7 @@ """ XML serializer. """ + import json from xml.dom import pulldom from xml.sax import handler diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index 1062e9fecaa..ebd3726e657 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -725,9 +725,9 @@ def add_field(self, model, field): namespace, _ = split_identifier(model._meta.db_table) definition += " " + self.sql_create_column_inline_fk % { "name": self._fk_constraint_name(model, field, constraint_suffix), - "namespace": "%s." % self.quote_name(namespace) - if namespace - else "", + "namespace": ( + "%s." % self.quote_name(namespace) if namespace else "" + ), "column": self.quote_name(field.column), "to_table": self.quote_name(to_table), "to_column": self.quote_name(to_column), @@ -1925,11 +1925,13 @@ def _constraint_names( """Return all constraint names matching the columns and conditions.""" if column_names is not None: column_names = [ - self.connection.introspection.identifier_converter( - truncate_name(name, self.connection.ops.max_name_length()) + ( + self.connection.introspection.identifier_converter( + truncate_name(name, self.connection.ops.max_name_length()) + ) + if self.connection.features.truncates_names + else self.connection.introspection.identifier_converter(name) ) - if self.connection.features.truncates_names - else self.connection.introspection.identifier_converter(name) for name in column_names ] with self.connection.cursor() as cursor: diff --git a/django/db/backends/ddl_references.py b/django/db/backends/ddl_references.py index 412d07a993d..75787ef8ab5 100644 --- a/django/db/backends/ddl_references.py +++ b/django/db/backends/ddl_references.py @@ -2,6 +2,7 @@ Helpers to manipulate deferred DDL statements that might need to be adjusted or discarded within when executing a migration. """ + from copy import deepcopy diff --git a/django/db/backends/mysql/base.py b/django/db/backends/mysql/base.py index e2707a9bfdb..3349497e867 100644 --- a/django/db/backends/mysql/base.py +++ b/django/db/backends/mysql/base.py @@ -3,6 +3,7 @@ Requires mysqlclient: https://pypi.org/project/mysqlclient/ """ + from django.core.exceptions import ImproperlyConfigured from django.db import IntegrityError from django.db.backends import utils as backend_utils diff --git a/django/db/backends/oracle/base.py b/django/db/backends/oracle/base.py index 8cc0b652484..6347d8e3984 100644 --- a/django/db/backends/oracle/base.py +++ b/django/db/backends/oracle/base.py @@ -3,6 +3,7 @@ Requires oracledb: https://oracle.github.io/python-oracledb/ """ + import datetime import decimal import os diff --git a/django/db/backends/oracle/creation.py b/django/db/backends/oracle/creation.py index df773bff8c2..b0a51777286 100644 --- a/django/db/backends/oracle/creation.py +++ b/django/db/backends/oracle/creation.py @@ -133,20 +133,20 @@ def _switch_to_test_user(self, parameters): credentials in the SAVED_USER/SAVED_PASSWORD key in the settings dict. """ real_settings = settings.DATABASES[self.connection.alias] - real_settings["SAVED_USER"] = self.connection.settings_dict[ - "SAVED_USER" - ] = self.connection.settings_dict["USER"] + real_settings["SAVED_USER"] = self.connection.settings_dict["SAVED_USER"] = ( + self.connection.settings_dict["USER"] + ) real_settings["SAVED_PASSWORD"] = self.connection.settings_dict[ "SAVED_PASSWORD" ] = self.connection.settings_dict["PASSWORD"] real_test_settings = real_settings["TEST"] test_settings = self.connection.settings_dict["TEST"] - real_test_settings["USER"] = real_settings["USER"] = test_settings[ - "USER" - ] = self.connection.settings_dict["USER"] = parameters["user"] - real_settings["PASSWORD"] = self.connection.settings_dict[ - "PASSWORD" - ] = parameters["password"] + real_test_settings["USER"] = real_settings["USER"] = test_settings["USER"] = ( + self.connection.settings_dict["USER"] + ) = parameters["user"] + real_settings["PASSWORD"] = self.connection.settings_dict["PASSWORD"] = ( + parameters["password"] + ) def set_as_test_mirror(self, primary_settings_dict): """ diff --git a/django/db/backends/postgresql/base.py b/django/db/backends/postgresql/base.py index d92ad587102..c950a9a616b 100644 --- a/django/db/backends/postgresql/base.py +++ b/django/db/backends/postgresql/base.py @@ -226,9 +226,11 @@ def get_connection_params(self): server_side_binding = conn_params.pop("server_side_binding", None) conn_params.setdefault( "cursor_factory", - ServerBindingCursor - if is_psycopg3 and server_side_binding is True - else Cursor, + ( + ServerBindingCursor + if is_psycopg3 and server_side_binding is True + else Cursor + ), ) if settings_dict["USER"]: conn_params["user"] = settings_dict["USER"] diff --git a/django/db/backends/postgresql/schema.py b/django/db/backends/postgresql/schema.py index 5dc93a27d05..842830be304 100644 --- a/django/db/backends/postgresql/schema.py +++ b/django/db/backends/postgresql/schema.py @@ -267,9 +267,9 @@ def _alter_column_collation_sql( % { "column": self.quote_name(new_field.column), "type": new_type, - "collation": " " + self._collate_sql(new_collation) - if new_collation - else "", + "collation": ( + " " + self._collate_sql(new_collation) if new_collation else "" + ), }, [], ) diff --git a/django/db/backends/sqlite3/_functions.py b/django/db/backends/sqlite3/_functions.py index 7e86950f7df..0171b60f387 100644 --- a/django/db/backends/sqlite3/_functions.py +++ b/django/db/backends/sqlite3/_functions.py @@ -1,6 +1,7 @@ """ Implementations of SQL functions for SQLite. """ + import functools import random import statistics diff --git a/django/db/backends/sqlite3/base.py b/django/db/backends/sqlite3/base.py index 08de0bad5aa..10a296c992c 100644 --- a/django/db/backends/sqlite3/base.py +++ b/django/db/backends/sqlite3/base.py @@ -1,6 +1,7 @@ """ SQLite backend for the sqlite3 module in the standard library. """ + import datetime import decimal import warnings diff --git a/django/db/migrations/autodetector.py b/django/db/migrations/autodetector.py index 3a0ee511ff4..13af3f0c039 100644 --- a/django/db/migrations/autodetector.py +++ b/django/db/migrations/autodetector.py @@ -566,11 +566,12 @@ def generate_renamed_models(self): rem_model_state.app_label, rem_model_state.name_lower, ) - self.renamed_models_rel[ - renamed_models_rel_key - ] = "%s.%s" % ( - model_state.app_label, - model_state.name_lower, + self.renamed_models_rel[renamed_models_rel_key] = ( + "%s.%s" + % ( + model_state.app_label, + model_state.name_lower, + ) ) self.old_model_keys.remove((rem_app_label, rem_model_name)) self.old_model_keys.add((app_label, model_name)) @@ -971,9 +972,9 @@ def create_renamed_fields(self): (rem_app_label, rem_model_name, rem_field_name) ) old_field_keys.add((app_label, model_name, field_name)) - self.renamed_fields[ - app_label, model_name, field_name - ] = rem_field_name + self.renamed_fields[app_label, model_name, field_name] = ( + rem_field_name + ) break def generate_renamed_fields(self): diff --git a/django/db/migrations/loader.py b/django/db/migrations/loader.py index 81dcd06e04d..50445f31014 100644 --- a/django/db/migrations/loader.py +++ b/django/db/migrations/loader.py @@ -131,11 +131,11 @@ def load_disk(self): "Migration %s in app %s has no Migration class" % (migration_name, app_config.label) ) - self.disk_migrations[ - app_config.label, migration_name - ] = migration_module.Migration( - migration_name, - app_config.label, + self.disk_migrations[app_config.label, migration_name] = ( + migration_module.Migration( + migration_name, + app_config.label, + ) ) def get_migration(self, app_label, name_prefix): diff --git a/django/db/migrations/operations/models.py b/django/db/migrations/operations/models.py index b18ef553695..98d563d26a6 100644 --- a/django/db/migrations/operations/models.py +++ b/django/db/migrations/operations/models.py @@ -55,11 +55,11 @@ def __init__(self, name, fields, options=None, bases=None, managers=None): _check_for_duplicates( "bases", ( - base._meta.label_lower - if hasattr(base, "_meta") - else base.lower() - if isinstance(base, str) - else base + ( + base._meta.label_lower + if hasattr(base, "_meta") + else base.lower() if isinstance(base, str) else base + ) for base in self.bases ), ) diff --git a/django/db/migrations/state.py b/django/db/migrations/state.py index ae55967383f..bb2a19edbb5 100644 --- a/django/db/migrations/state.py +++ b/django/db/migrations/state.py @@ -525,11 +525,11 @@ def _get_concrete_models_mapping_and_proxy_models(self): if model_state.options.get("proxy"): proxy_models[model_key] = model_state # Find a concrete model for the proxy. - concrete_models_mapping[ - model_key - ] = self._find_concrete_model_from_proxy( - proxy_models, - model_state, + concrete_models_mapping[model_key] = ( + self._find_concrete_model_from_proxy( + proxy_models, + model_state, + ) ) else: concrete_models_mapping[model_key] = model_key diff --git a/django/db/models/aggregates.py b/django/db/models/aggregates.py index a778cd413b3..0cbffacd1b9 100644 --- a/django/db/models/aggregates.py +++ b/django/db/models/aggregates.py @@ -1,6 +1,7 @@ """ Classes to represent the definitions of aggregate functions. """ + from django.core.exceptions import FieldError, FullResultSet from django.db.models.expressions import Case, Func, Star, Value, When from django.db.models.fields import IntegerField diff --git a/django/db/models/base.py b/django/db/models/base.py index 1e47ca7d1df..3b949c80bf0 100644 --- a/django/db/models/base.py +++ b/django/db/models/base.py @@ -2229,9 +2229,11 @@ def _check_ordering(cls): opts = cls._meta valid_fields = set( chain.from_iterable( - (f.name, f.attname) - if not (f.auto_created and not f.concrete) - else (f.field.related_query_name(),) + ( + (f.name, f.attname) + if not (f.auto_created and not f.concrete) + else (f.field.related_query_name(),) + ) for f in chain(opts.fields, opts.related_objects) ) ) diff --git a/django/db/models/constants.py b/django/db/models/constants.py index a0c99c95fc7..cec1b9b90f7 100644 --- a/django/db/models/constants.py +++ b/django/db/models/constants.py @@ -1,6 +1,7 @@ """ Constants used across the ORM in general. """ + from enum import Enum # Separator used to split filter strings apart. diff --git a/django/db/models/expressions.py b/django/db/models/expressions.py index b3b66f0c210..4c1f570766f 100644 --- a/django/db/models/expressions.py +++ b/django/db/models/expressions.py @@ -203,9 +203,11 @@ def set_source_expressions(self, exprs): def _parse_expressions(self, *expressions): return [ - arg - if hasattr(arg, "resolve_expression") - else (F(arg) if isinstance(arg, str) else Value(arg)) + ( + arg + if hasattr(arg, "resolve_expression") + else (F(arg) if isinstance(arg, str) else Value(arg)) + ) for arg in expressions ] @@ -284,9 +286,11 @@ def resolve_expression( c.is_summary = summarize c.set_source_expressions( [ - expr.resolve_expression(query, allow_joins, reuse, summarize) - if expr - else None + ( + expr.resolve_expression(query, allow_joins, reuse, summarize) + if expr + else None + ) for expr in c.get_source_expressions() ] ) @@ -365,22 +369,16 @@ def convert_value(self): field = self.output_field internal_type = field.get_internal_type() if internal_type == "FloatField": - return ( - lambda value, expression, connection: None - if value is None - else float(value) + return lambda value, expression, connection: ( + None if value is None else float(value) ) elif internal_type.endswith("IntegerField"): - return ( - lambda value, expression, connection: None - if value is None - else int(value) + return lambda value, expression, connection: ( + None if value is None else int(value) ) elif internal_type == "DecimalField": - return ( - lambda value, expression, connection: None - if value is None - else Decimal(value) + return lambda value, expression, connection: ( + None if value is None else Decimal(value) ) return self._convert_value_noop @@ -426,9 +424,11 @@ def prefix_references(self, prefix): clone = self.copy() clone.set_source_expressions( [ - F(f"{prefix}{expr.name}") - if isinstance(expr, F) - else expr.prefix_references(prefix) + ( + F(f"{prefix}{expr.name}") + if isinstance(expr, F) + else expr.prefix_references(prefix) + ) for expr in self.get_source_expressions() ] ) diff --git a/django/db/models/fields/related_descriptors.py b/django/db/models/fields/related_descriptors.py index 46a5823647d..81cb35b35a3 100644 --- a/django/db/models/fields/related_descriptors.py +++ b/django/db/models/fields/related_descriptors.py @@ -62,6 +62,7 @@ class Child(Model): If you're looking for ``ForwardManyToManyDescriptor`` or ``ReverseManyToManyDescriptor``, use ``ManyToManyDescriptor`` instead. """ + import warnings from asgiref.sync import sync_to_async diff --git a/django/db/models/fields/reverse_related.py b/django/db/models/fields/reverse_related.py index c74e92ba89f..144cce6142c 100644 --- a/django/db/models/fields/reverse_related.py +++ b/django/db/models/fields/reverse_related.py @@ -8,6 +8,7 @@ They also act as reverse fields for the purposes of the Meta API because they're the closest concept currently available. """ + import warnings from django.core import exceptions diff --git a/django/db/models/functions/comparison.py b/django/db/models/functions/comparison.py index eec2ab752d1..b3c02da2426 100644 --- a/django/db/models/functions/comparison.py +++ b/django/db/models/functions/comparison.py @@ -1,4 +1,5 @@ """Database functions that do comparisons or type conversions.""" + from django.db import NotSupportedError from django.db.models.expressions import Func, Value from django.db.models.fields import TextField diff --git a/django/db/models/functions/datetime.py b/django/db/models/functions/datetime.py index fca211e065d..9937e79f6ff 100644 --- a/django/db/models/functions/datetime.py +++ b/django/db/models/functions/datetime.py @@ -318,9 +318,11 @@ def resolve_expression( "Cannot truncate DateField '%s' to %s." % ( field.name, - output_field.__class__.__name__ - if has_explicit_output_field - else "DateTimeField", + ( + output_field.__class__.__name__ + if has_explicit_output_field + else "DateTimeField" + ), ) ) elif isinstance(field, TimeField) and ( @@ -331,9 +333,11 @@ def resolve_expression( "Cannot truncate TimeField '%s' to %s." % ( field.name, - output_field.__class__.__name__ - if has_explicit_output_field - else "DateTimeField", + ( + output_field.__class__.__name__ + if has_explicit_output_field + else "DateTimeField" + ), ) ) return copy diff --git a/django/db/models/functions/math.py b/django/db/models/functions/math.py index 460143ba5af..5fa4654a843 100644 --- a/django/db/models/functions/math.py +++ b/django/db/models/functions/math.py @@ -47,9 +47,11 @@ def as_sqlite(self, compiler, connection, **extra_context): clone = self.copy() clone.set_source_expressions( [ - Cast(expression, FloatField()) - if isinstance(expression.output_field, IntegerField) - else expression + ( + Cast(expression, FloatField()) + if isinstance(expression.output_field, IntegerField) + else expression + ) for expression in self.get_source_expressions()[::-1] ] ) diff --git a/django/db/models/functions/mixins.py b/django/db/models/functions/mixins.py index caf20e131d8..d983df7725a 100644 --- a/django/db/models/functions/mixins.py +++ b/django/db/models/functions/mixins.py @@ -14,9 +14,11 @@ def as_postgresql(self, compiler, connection, **extra_context): clone = self.copy() clone.set_source_expressions( [ - Cast(expression, output_field) - if isinstance(expression.output_field, FloatField) - else expression + ( + Cast(expression, output_field) + if isinstance(expression.output_field, FloatField) + else expression + ) for expression in self.get_source_expressions() ] ) diff --git a/django/db/models/indexes.py b/django/db/models/indexes.py index b5451f9e241..0ddfefec387 100644 --- a/django/db/models/indexes.py +++ b/django/db/models/indexes.py @@ -196,9 +196,11 @@ def __repr__(self): "" if not self.fields else " fields=%s" % repr(self.fields), "" if not self.expressions else " expressions=%s" % repr(self.expressions), "" if not self.name else " name=%s" % repr(self.name), - "" - if self.db_tablespace is None - else " db_tablespace=%s" % repr(self.db_tablespace), + ( + "" + if self.db_tablespace is None + else " db_tablespace=%s" % repr(self.db_tablespace) + ), "" if self.condition is None else " condition=%s" % self.condition, "" if not self.include else " include=%s" % repr(self.include), "" if not self.opclasses else " opclasses=%s" % repr(self.opclasses), diff --git a/django/db/models/lookups.py b/django/db/models/lookups.py index a562a3db386..76c2822caba 100644 --- a/django/db/models/lookups.py +++ b/django/db/models/lookups.py @@ -270,9 +270,11 @@ def get_db_prep_lookup(self, value, connection): ) return ( "%s", - [get_db_prep_value(v, connection, prepared=True) for v in value] - if self.get_db_prep_lookup_value_is_iterable - else [get_db_prep_value(value, connection, prepared=True)], + ( + [get_db_prep_value(v, connection, prepared=True) for v in value] + if self.get_db_prep_lookup_value_is_iterable + else [get_db_prep_value(value, connection, prepared=True)] + ), ) diff --git a/django/db/models/query.py b/django/db/models/query.py index de00bba8d75..153fb1193eb 100644 --- a/django/db/models/query.py +++ b/django/db/models/query.py @@ -109,9 +109,11 @@ def __iter__(self): related_objs, operator.attrgetter( *[ - field.attname - if from_field == "self" - else queryset.model._meta.get_field(from_field).attname + ( + field.attname + if from_field == "self" + else queryset.model._meta.get_field(from_field).attname + ) for from_field in field.from_fields ] ), @@ -1391,9 +1393,7 @@ def values_list(self, *fields, flat=False, named=False): clone._iterable_class = ( NamedValuesListIterable if named - else FlatValuesListIterable - if flat - else ValuesListIterable + else FlatValuesListIterable if flat else ValuesListIterable ) return clone @@ -1659,9 +1659,11 @@ def _annotate(self, args, kwargs, select=True): if names is None: names = set( chain.from_iterable( - (field.name, field.attname) - if hasattr(field, "attname") - else (field.name,) + ( + (field.name, field.attname) + if hasattr(field, "attname") + else (field.name,) + ) for field in self.model._meta.get_fields() ) ) diff --git a/django/db/models/query_utils.py b/django/db/models/query_utils.py index 4f3358eb8da..e1041b96537 100644 --- a/django/db/models/query_utils.py +++ b/django/db/models/query_utils.py @@ -5,6 +5,7 @@ large and/or so that they can be used by other modules without getting into circular import difficulties. """ + import functools import inspect import logging diff --git a/django/db/models/sql/compiler.py b/django/db/models/sql/compiler.py index 5d2e7fd85cd..421b880deb9 100644 --- a/django/db/models/sql/compiler.py +++ b/django/db/models/sql/compiler.py @@ -1216,9 +1216,9 @@ def get_related_klass_infos(klass_info, related_klass_infos): "field": f, "reverse": False, "local_setter": f.set_cached_value, - "remote_setter": f.remote_field.set_cached_value - if f.unique - else lambda x, y: None, + "remote_setter": ( + f.remote_field.set_cached_value if f.unique else lambda x, y: None + ), "from_parent": False, } related_klass_infos.append(klass_info) diff --git a/django/db/models/sql/datastructures.py b/django/db/models/sql/datastructures.py index 5eaa8c25f6b..7c0c14a46e8 100644 --- a/django/db/models/sql/datastructures.py +++ b/django/db/models/sql/datastructures.py @@ -2,6 +2,7 @@ Useful auxiliary data structures for query construction. Not useful outside the SQL domain. """ + import warnings from django.core.exceptions import FullResultSet diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index 3320f91fa16..c292af24a3e 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -6,6 +6,7 @@ databases). The abstraction barrier only works one way: this module has to know all about the internals of models in order to get the information it needs. """ + import copy import difflib import functools diff --git a/django/db/models/sql/where.py b/django/db/models/sql/where.py index 2f23a2932ce..9c5740c2cdd 100644 --- a/django/db/models/sql/where.py +++ b/django/db/models/sql/where.py @@ -1,6 +1,7 @@ """ Code to manage the creation and SQL rendering of 'where' constraints. """ + import operator from functools import reduce diff --git a/django/forms/models.py b/django/forms/models.py index ff4b83fe596..90779e18fb7 100644 --- a/django/forms/models.py +++ b/django/forms/models.py @@ -2,6 +2,7 @@ Helper functions for creating Form classes from Django models and database field objects. """ + from itertools import chain from django.core.exceptions import ( @@ -830,9 +831,12 @@ def validate_unique(self): ) # Reduce Model instances to their primary key values row_data = tuple( - d._get_pk_val() if hasattr(d, "_get_pk_val") - # Prevent "unhashable type: list" errors later on. - else tuple(d) if isinstance(d, list) else d + ( + d._get_pk_val() + if hasattr(d, "_get_pk_val") + # Prevent "unhashable type: list" errors later on. + else tuple(d) if isinstance(d, list) else d + ) for d in row_data ) if row_data and None not in row_data: diff --git a/django/forms/widgets.py b/django/forms/widgets.py index 2c734052d5b..4fae110d5ed 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -101,9 +101,11 @@ def render(self): def render_js(self): return [ - path.__html__() - if hasattr(path, "__html__") - else format_html('', self.absolute_path(path)) + ( + path.__html__() + if hasattr(path, "__html__") + else format_html('', self.absolute_path(path)) + ) for path in self._js ] @@ -113,12 +115,14 @@ def render_css(self): media = sorted(self._css) return chain.from_iterable( [ - path.__html__() - if hasattr(path, "__html__") - else format_html( - '', - self.absolute_path(path), - medium, + ( + path.__html__() + if hasattr(path, "__html__") + else format_html( + '', + self.absolute_path(path), + medium, + ) ) for path in self._css[medium] ] diff --git a/django/http/multipartparser.py b/django/http/multipartparser.py index 5ab63455efc..94e5116639b 100644 --- a/django/http/multipartparser.py +++ b/django/http/multipartparser.py @@ -4,6 +4,7 @@ Exposes one class, ``MultiPartParser``, which feeds chunks of uploaded data to file upload handlers for processing. """ + import base64 import binascii import collections diff --git a/django/http/request.py b/django/http/request.py index fe15a173be5..4c27d576ba4 100644 --- a/django/http/request.py +++ b/django/http/request.py @@ -170,9 +170,11 @@ def _get_full_path(self, path, force_append_slash): return "%s%s%s" % ( escape_uri_path(path), "/" if force_append_slash and not path.endswith("/") else "", - ("?" + iri_to_uri(self.META.get("QUERY_STRING", ""))) - if self.META.get("QUERY_STRING", "") - else "", + ( + ("?" + iri_to_uri(self.META.get("QUERY_STRING", ""))) + if self.META.get("QUERY_STRING", "") + else "" + ), ) def get_signed_cookie(self, key, default=RAISE_ERROR, salt="", max_age=None): diff --git a/django/middleware/csrf.py b/django/middleware/csrf.py index 2c0d2cc1206..f7943494ba2 100644 --- a/django/middleware/csrf.py +++ b/django/middleware/csrf.py @@ -4,6 +4,7 @@ This module provides a middleware that implements protection against request forgeries from other sites. """ + import logging import string from collections import defaultdict diff --git a/django/shortcuts.py b/django/shortcuts.py index 822e6107aca..b8b5be1f5f5 100644 --- a/django/shortcuts.py +++ b/django/shortcuts.py @@ -3,6 +3,7 @@ of MVC. In other words, these functions/classes introduce controlled coupling for convenience's sake. """ + from django.http import ( Http404, HttpResponse, diff --git a/django/template/defaultfilters.py b/django/template/defaultfilters.py index 589ca384142..1f1ea4d7a9e 100644 --- a/django/template/defaultfilters.py +++ b/django/template/defaultfilters.py @@ -1,4 +1,5 @@ """Default variable filters.""" + import random as random_module import re import types diff --git a/django/template/defaulttags.py b/django/template/defaulttags.py index 79c10232bbc..deb6b01fb6f 100644 --- a/django/template/defaulttags.py +++ b/django/template/defaulttags.py @@ -1,4 +1,5 @@ """Default tags used by the template system, available to all templates.""" + import re import sys import warnings diff --git a/django/template/engine.py b/django/template/engine.py index f2215c0e4e9..9882d3a16d1 100644 --- a/django/template/engine.py +++ b/django/template/engine.py @@ -70,9 +70,11 @@ def __repr__(self): self.__class__.__qualname__, "" if not self.dirs else " dirs=%s" % repr(self.dirs), self.app_dirs, - "" - if not self.context_processors - else " context_processors=%s" % repr(self.context_processors), + ( + "" + if not self.context_processors + else " context_processors=%s" % repr(self.context_processors) + ), self.debug, repr(self.loaders), repr(self.string_if_invalid), diff --git a/django/template/smartif.py b/django/template/smartif.py index 5b15a5a4765..0a917c2aaa4 100644 --- a/django/template/smartif.py +++ b/django/template/smartif.py @@ -1,6 +1,7 @@ """ Parser and utilities for the smart 'if' tag """ + # Using a simple top down parser, as described here: # http://effbot.org/zone/simple-top-down-parsing.htm. # 'led' = left denotation diff --git a/django/test/html.py b/django/test/html.py index 6da79d6fb24..33d1d4dafb4 100644 --- a/django/test/html.py +++ b/django/test/html.py @@ -1,4 +1,5 @@ """Compare two HTML documents.""" + import html from html.parser import HTMLParser diff --git a/django/urls/conf.py b/django/urls/conf.py index 40708028a38..bb61063d770 100644 --- a/django/urls/conf.py +++ b/django/urls/conf.py @@ -1,4 +1,5 @@ """Functions for use in URLsconfs.""" + from functools import partial from importlib import import_module diff --git a/django/urls/resolvers.py b/django/urls/resolvers.py index 89ae18694cd..3607c84228a 100644 --- a/django/urls/resolvers.py +++ b/django/urls/resolvers.py @@ -5,6 +5,7 @@ a string) and returns a ResolverMatch object which provides access to all attributes of the resolved URL match. """ + import functools import inspect import re @@ -91,9 +92,11 @@ def __repr__(self): self.app_names, self.namespaces, self.route, - f", captured_kwargs={self.captured_kwargs!r}" - if self.captured_kwargs - else "", + ( + f", captured_kwargs={self.captured_kwargs!r}" + if self.captured_kwargs + else "" + ), f", extra_kwargs={self.extra_kwargs!r}" if self.extra_kwargs else "", ) ) diff --git a/django/utils/archive.py b/django/utils/archive.py index 71ec2d00155..56f34c00386 100644 --- a/django/utils/archive.py +++ b/django/utils/archive.py @@ -21,6 +21,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ + import os import shutil import stat diff --git a/django/utils/cache.py b/django/utils/cache.py index cf797d0279a..3b014fbe514 100644 --- a/django/utils/cache.py +++ b/django/utils/cache.py @@ -14,6 +14,7 @@ An example: i18n middleware would need to distinguish caches by the "Accept-language" header. """ + import time from collections import defaultdict from hashlib import md5 diff --git a/django/utils/crypto.py b/django/utils/crypto.py index 1c0e7001c64..5134b854d63 100644 --- a/django/utils/crypto.py +++ b/django/utils/crypto.py @@ -1,6 +1,7 @@ """ Django's standard crypto functions and utilities. """ + import hashlib import hmac import secrets diff --git a/django/utils/dateformat.py b/django/utils/dateformat.py index a6c315e4cf2..a3274b901c3 100644 --- a/django/utils/dateformat.py +++ b/django/utils/dateformat.py @@ -10,6 +10,7 @@ 7th October 2003 11:39 >>> """ + import calendar from datetime import date, datetime, time from email.utils import format_datetime as format_datetime_rfc5322 diff --git a/django/utils/deconstruct.py b/django/utils/deconstruct.py index f8754c19741..2e5463a651d 100644 --- a/django/utils/deconstruct.py +++ b/django/utils/deconstruct.py @@ -42,9 +42,11 @@ def deconstruct(obj): "#serializing-values" % (name, module_name, get_docs_version()) ) return ( - path - if path and type(obj) is klass - else f"{obj.__class__.__module__}.{name}", + ( + path + if path and type(obj) is klass + else f"{obj.__class__.__module__}.{name}" + ), obj._constructor_args[0], obj._constructor_args[1], ) diff --git a/django/utils/feedgenerator.py b/django/utils/feedgenerator.py index 31ca9a2db9a..3bd456ca687 100644 --- a/django/utils/feedgenerator.py +++ b/django/utils/feedgenerator.py @@ -21,6 +21,7 @@ For definitions of the different versions of RSS, see: https://web.archive.org/web/20110718035220/http://diveintomark.org/archives/2004/02/04/incompatible-rss """ + import datetime import email from io import StringIO diff --git a/django/utils/jslex.py b/django/utils/jslex.py index 93a1a2e972f..fc46a686c7d 100644 --- a/django/utils/jslex.py +++ b/django/utils/jslex.py @@ -1,4 +1,5 @@ """JsLex: a lexer for JavaScript""" + # Originally from https://bitbucket.org/ned/jslex import re diff --git a/django/utils/regex_helper.py b/django/utils/regex_helper.py index 9ee82e1a9b7..b71298e3990 100644 --- a/django/utils/regex_helper.py +++ b/django/utils/regex_helper.py @@ -5,6 +5,7 @@ This is not, and is not intended to be, a complete reg-exp decompiler. It should be good enough for a large class of URLS, however. """ + import re from django.utils.functional import SimpleLazyObject diff --git a/django/utils/translation/__init__.py b/django/utils/translation/__init__.py index 0b3f78e4866..0618f021594 100644 --- a/django/utils/translation/__init__.py +++ b/django/utils/translation/__init__.py @@ -1,6 +1,7 @@ """ Internationalization support. """ + from contextlib import ContextDecorator from decimal import ROUND_UP, Decimal diff --git a/django/utils/translation/trans_real.py b/django/utils/translation/trans_real.py index 872c80b00f7..a629528717f 100644 --- a/django/utils/translation/trans_real.py +++ b/django/utils/translation/trans_real.py @@ -1,4 +1,5 @@ """Translation helper functions.""" + import functools import gettext as gettext_module import os diff --git a/django/views/decorators/http.py b/django/views/decorators/http.py index 5d5dcbc7906..a4c1ebc31eb 100644 --- a/django/views/decorators/http.py +++ b/django/views/decorators/http.py @@ -1,6 +1,7 @@ """ Decorators for views based on HTTP headers. """ + import datetime from functools import wraps diff --git a/django/views/static.py b/django/views/static.py index df46c53093e..b24f0e30f9e 100644 --- a/django/views/static.py +++ b/django/views/static.py @@ -2,6 +2,7 @@ Views and functions for serving static files. These are only to be used during development, and SHOULD NOT be used in a production setting. """ + import mimetypes import posixpath from pathlib import Path diff --git a/docs/_ext/djangodocs.py b/docs/_ext/djangodocs.py index 7d55cb03336..77e24ff0eb6 100644 --- a/docs/_ext/djangodocs.py +++ b/docs/_ext/djangodocs.py @@ -1,6 +1,7 @@ """ Sphinx plugins for Django documentation. """ + import json import os import re diff --git a/docs/howto/csrf.txt b/docs/howto/csrf.txt index 07f2e20a1c2..d40f4b4cb40 100644 --- a/docs/howto/csrf.txt +++ b/docs/howto/csrf.txt @@ -208,8 +208,7 @@ will require a CSRF token to be inserted you should use the @cache_page(60 * 15) @csrf_protect - def my_view(request): - ... + def my_view(request): ... If you are using class-based views, you can refer to :ref:`Decorating class-based views`. diff --git a/docs/howto/custom-file-storage.txt b/docs/howto/custom-file-storage.txt index 4e51548bc7b..661a343d045 100644 --- a/docs/howto/custom-file-storage.txt +++ b/docs/howto/custom-file-storage.txt @@ -14,8 +14,7 @@ You'll need to follow these steps: from django.core.files.storage import Storage - class MyStorage(Storage): - ... + class MyStorage(Storage): ... #. Django must be able to instantiate your storage system without any arguments. This means that any settings should be taken from ``django.conf.settings``:: diff --git a/docs/howto/custom-lookups.txt b/docs/howto/custom-lookups.txt index 61ec9295ebe..fc8e9288906 100644 --- a/docs/howto/custom-lookups.txt +++ b/docs/howto/custom-lookups.txt @@ -53,8 +53,7 @@ Lookup registration can also be done using a decorator pattern:: @Field.register_lookup - class NotEqualLookup(Lookup): - ... + class NotEqualLookup(Lookup): ... We can now use ``foo__ne`` for any field ``foo``. You will need to ensure that this registration happens before you try to create any querysets using it. You diff --git a/docs/howto/custom-management-commands.txt b/docs/howto/custom-management-commands.txt index 8bdfb1e38b9..b472f092e93 100644 --- a/docs/howto/custom-management-commands.txt +++ b/docs/howto/custom-management-commands.txt @@ -146,8 +146,7 @@ decorator on your :meth:`~BaseCommand.handle` method:: ... @no_translations - def handle(self, *args, **options): - ... + def handle(self, *args, **options): ... Since translation deactivation requires access to configured settings, the decorator can't be used for commands that work without configured settings. diff --git a/docs/howto/custom-model-fields.txt b/docs/howto/custom-model-fields.txt index 1e7ac4f0bad..b4a15378968 100644 --- a/docs/howto/custom-model-fields.txt +++ b/docs/howto/custom-model-fields.txt @@ -338,24 +338,20 @@ Changing a custom field's base class You can't change the base class of a custom field because Django won't detect the change and make a migration for it. For example, if you start with:: - class CustomCharField(models.CharField): - ... + class CustomCharField(models.CharField): ... and then decide that you want to use ``TextField`` instead, you can't change the subclass like this:: - class CustomCharField(models.TextField): - ... + class CustomCharField(models.TextField): ... Instead, you must create a new custom field class and update your models to reference it:: - class CustomCharField(models.CharField): - ... + class CustomCharField(models.CharField): ... - class CustomTextField(models.TextField): - ... + class CustomTextField(models.TextField): ... As discussed in :ref:`removing fields `, you must retain the original ``CustomCharField`` class as long as you have diff --git a/docs/howto/custom-template-tags.txt b/docs/howto/custom-template-tags.txt index c7909c8a4bb..15bef9b5fbb 100644 --- a/docs/howto/custom-template-tags.txt +++ b/docs/howto/custom-template-tags.txt @@ -561,8 +561,7 @@ template loader, we'd register the tag like this:: # Here, register is a django.template.Library instance, as before @register.inclusion_tag("results.html") - def show_results(poll): - ... + def show_results(poll): ... Alternatively it is possible to register the inclusion tag using a :class:`django.template.Template` instance:: @@ -917,13 +916,11 @@ The ``tag()`` method takes two arguments: As with filter registration, it is also possible to use this as a decorator:: @register.tag(name="current_time") - def do_current_time(parser, token): - ... + def do_current_time(parser, token): ... @register.tag - def shout(parser, token): - ... + def shout(parser, token): ... If you leave off the ``name`` argument, as in the second example above, Django will use the function's name as the tag name. diff --git a/docs/howto/error-reporting.txt b/docs/howto/error-reporting.txt index 4e50c0e3092..50d1e0da386 100644 --- a/docs/howto/error-reporting.txt +++ b/docs/howto/error-reporting.txt @@ -177,8 +177,7 @@ filtered out of error reports in a production environment (that is, where do not provide any argument to the ``sensitive_variables`` decorator:: @sensitive_variables() - def my_function(): - ... + def my_function(): ... .. admonition:: When using multiple decorators @@ -191,8 +190,7 @@ filtered out of error reports in a production environment (that is, where @sensitive_variables("user", "pw", "cc") @some_decorator @another_decorator - def process_info(user): - ... + def process_info(user): ... .. versionchanged:: 5.0 @@ -229,8 +227,7 @@ filtered out of error reports in a production environment (that is, where do not provide any argument to the ``sensitive_post_parameters`` decorator:: @sensitive_post_parameters() - def my_view(request): - ... + def my_view(request): ... All POST parameters are systematically filtered out of error reports for certain :mod:`django.contrib.auth.views` views (``login``, diff --git a/docs/internals/contributing/writing-code/coding-style.txt b/docs/internals/contributing/writing-code/coding-style.txt index 6871d43d7be..49b69bf066f 100644 --- a/docs/internals/contributing/writing-code/coding-style.txt +++ b/docs/internals/contributing/writing-code/coding-style.txt @@ -201,8 +201,7 @@ Imports CONSTANT = "foo" - class Example: - ... + class Example: ... * Use convenience imports whenever available. For example, do this :: @@ -239,13 +238,11 @@ View style Do this:: - def my_view(request, foo): - ... + def my_view(request, foo): ... Don't do this:: - def my_view(req, foo): - ... + def my_view(req, foo): ... Model style =========== diff --git a/docs/internals/contributing/writing-code/submitting-patches.txt b/docs/internals/contributing/writing-code/submitting-patches.txt index be031f1f68c..72c986cfc72 100644 --- a/docs/internals/contributing/writing-code/submitting-patches.txt +++ b/docs/internals/contributing/writing-code/submitting-patches.txt @@ -190,8 +190,7 @@ level: @ignore_warnings(category=RemovedInDjangoXXWarning) - def test_foo(self): - ... + def test_foo(self): ... #) For an entire test case:: @@ -200,8 +199,7 @@ level: @ignore_warnings(category=RemovedInDjangoXXWarning) - class MyDeprecatedTests(unittest.TestCase): - ... + class MyDeprecatedTests(unittest.TestCase): ... You should also add a test for the deprecation warning:: diff --git a/docs/intro/tutorial04.txt b/docs/intro/tutorial04.txt index 13a76188bb9..65dc132a947 100644 --- a/docs/intro/tutorial04.txt +++ b/docs/intro/tutorial04.txt @@ -309,7 +309,8 @@ views and use Django's generic views instead. To do so, open the def vote(request, question_id): - ... # same as above, no changes needed. + # same as above, no changes needed. + ... Each generic view needs to know what model it will be acting upon. This is provided using either the ``model`` attribute (in this example, ``model = diff --git a/docs/intro/tutorial07.txt b/docs/intro/tutorial07.txt index 9cdadbe2869..8cb5dd5d5a2 100644 --- a/docs/intro/tutorial07.txt +++ b/docs/intro/tutorial07.txt @@ -174,8 +174,7 @@ tabular way of displaying inline related objects. To use it, change the .. code-block:: python :caption: ``polls/admin.py`` - class ChoiceInline(admin.TabularInline): - ... + class ChoiceInline(admin.TabularInline): ... With that ``TabularInline`` (instead of ``StackedInline``), the related objects are displayed in a more compact, table-based format: diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt index fef582f2df4..25e98c3b949 100644 --- a/docs/ref/contrib/admin/index.txt +++ b/docs/ref/contrib/admin/index.txt @@ -751,8 +751,7 @@ subclass:: like:: @admin.display(ordering="-first_name") - def colored_first_name(self): - ... + def colored_first_name(self): ... The ``ordering`` argument supports query lookups to sort by values on related models. This example includes an "author first name" column in @@ -3132,8 +3131,7 @@ returns a site instance. from django.contrib import admin - class MyAdminSite(admin.AdminSite): - ... + class MyAdminSite(admin.AdminSite): ... .. code-block:: python :caption: ``myproject/apps.py`` @@ -3471,5 +3469,4 @@ The ``staff_member_required`` decorator @staff_member_required - def my_view(request): - ... + def my_view(request): ... diff --git a/docs/ref/contrib/gis/feeds.txt b/docs/ref/contrib/gis/feeds.txt index 9ae9d4f03a4..3f17a685741 100644 --- a/docs/ref/contrib/gis/feeds.txt +++ b/docs/ref/contrib/gis/feeds.txt @@ -40,18 +40,14 @@ API Reference item_geometry = ... # Also a function with no arguments - def geometry(self): - ... + def geometry(self): ... - def item_geometry(self): - ... + def item_geometry(self): ... # And as a function with a single argument - def geometry(self, obj): - ... + def geometry(self, obj): ... - def item_geometry(self, item): - ... + def item_geometry(self, item): ... .. method:: geometry(obj) diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index 0be85c04304..477c83fca49 100644 --- a/docs/ref/settings.txt +++ b/docs/ref/settings.txt @@ -422,8 +422,7 @@ A dotted path to the view function to be used when an incoming request is rejected by the :doc:`CSRF protection `. The function should have this signature:: - def csrf_failure(request, reason=""): - ... + def csrf_failure(request, reason=""): ... where ``reason`` is a short message (intended for developers or logging, not for end users) indicating the reason the request was rejected. It should return diff --git a/docs/ref/utils.txt b/docs/ref/utils.txt index acbe5d51a62..84e33d5d410 100644 --- a/docs/ref/utils.txt +++ b/docs/ref/utils.txt @@ -469,8 +469,7 @@ https://web.archive.org/web/20110718035220/http://diveintomark.org/archives/2004 class Person(models.Model): @cached_property - def friends(self): - ... + def friends(self): ... Note that as the method is now a property, in Python code it will need to be accessed appropriately:: @@ -552,8 +551,7 @@ https://web.archive.org/web/20110718035220/http://diveintomark.org/archives/2004 # Or more succinctly: @keep_lazy(str) - def fancy_utility_function(s, *args, **kwargs): - ... + def fancy_utility_function(s, *args, **kwargs): ... The ``keep_lazy()`` decorator takes a number of extra arguments (``*args``) specifying the type(s) that the original function can return. A common @@ -578,14 +576,12 @@ https://web.archive.org/web/20110718035220/http://diveintomark.org/archives/2004 # Our previous example was: @keep_lazy(str) - def fancy_utility_function(s, *args, **kwargs): - ... + def fancy_utility_function(s, *args, **kwargs): ... # Which can be rewritten as: @keep_lazy_text - def fancy_utility_function(s, *args, **kwargs): - ... + def fancy_utility_function(s, *args, **kwargs): ... ``django.utils.html`` ===================== diff --git a/docs/releases/1.0-porting-guide.txt b/docs/releases/1.0-porting-guide.txt index f0ed8f41690..145334c2383 100644 --- a/docs/releases/1.0-porting-guide.txt +++ b/docs/releases/1.0-porting-guide.txt @@ -144,8 +144,7 @@ example: Old (0.96):: - class Parent(models.Model): - ... + class Parent(models.Model): ... class Child(models.Model): diff --git a/docs/releases/1.10.txt b/docs/releases/1.10.txt index b5213ee2072..d98fad2c662 100644 --- a/docs/releases/1.10.txt +++ b/docs/releases/1.10.txt @@ -732,8 +732,7 @@ custom lookup for it. For example:: from django.db.models.lookups import Exact - class MyField(Field): - ... + class MyField(Field): ... class MyFieldExact(Exact): diff --git a/docs/releases/1.2.txt b/docs/releases/1.2.txt index de3ed69a70a..526bb1d66e2 100644 --- a/docs/releases/1.2.txt +++ b/docs/releases/1.2.txt @@ -455,17 +455,13 @@ database-compatible values. A custom field might look something like:: class CustomModelField(models.Field): ... - def db_type(self): - ... + def db_type(self): ... - def get_db_prep_save(self, value): - ... + def get_db_prep_save(self, value): ... - def get_db_prep_value(self, value): - ... + def get_db_prep_value(self, value): ... - def get_db_prep_lookup(self, lookup_type, value): - ... + def get_db_prep_lookup(self, lookup_type, value): ... In 1.2, these three methods have undergone a change in prototype, and two extra methods have been introduced:: @@ -473,23 +469,17 @@ two extra methods have been introduced:: class CustomModelField(models.Field): ... - def db_type(self, connection): - ... + def db_type(self, connection): ... - def get_prep_value(self, value): - ... + def get_prep_value(self, value): ... - def get_prep_lookup(self, lookup_type, value): - ... + def get_prep_lookup(self, lookup_type, value): ... - def get_db_prep_save(self, value, connection): - ... + def get_db_prep_save(self, value, connection): ... - def get_db_prep_value(self, value, connection, prepared=False): - ... + def get_db_prep_value(self, value, connection, prepared=False): ... - def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False): - ... + def get_db_prep_lookup(self, lookup_type, value, connection, prepared=False): ... These changes are required to support multiple databases -- ``db_type`` and ``get_db_prep_*`` can no longer make any assumptions diff --git a/docs/releases/5.0.txt b/docs/releases/5.0.txt index 746eaae8367..6b18bace4f4 100644 --- a/docs/releases/5.0.txt +++ b/docs/releases/5.0.txt @@ -521,8 +521,7 @@ For example:: Should become:: - class Char32UUIDField(models.UUIDField): - ... + class Char32UUIDField(models.UUIDField): ... class MyModel(models.Model): diff --git a/docs/topics/async.txt b/docs/topics/async.txt index 944752f3a4b..e27e3e06b6e 100644 --- a/docs/topics/async.txt +++ b/docs/topics/async.txt @@ -111,13 +111,11 @@ For example:: @never_cache - def my_sync_view(request): - ... + def my_sync_view(request): ... @never_cache - async def my_async_view(request): - ... + async def my_async_view(request): ... Queries & the ORM ----------------- @@ -298,16 +296,14 @@ as either a direct wrapper or a decorator:: from asgiref.sync import async_to_sync - async def get_data(): - ... + async def get_data(): ... sync_get_data = async_to_sync(get_data) @async_to_sync - async def get_other_data(): - ... + async def get_other_data(): ... The async function is run in the event loop for the current thread, if one is present. If there is no current event loop, a new event loop is spun up @@ -338,8 +334,7 @@ as either a direct wrapper or a decorator:: @sync_to_async - def sync_function(): - ... + def sync_function(): ... Threadlocals and contextvars values are preserved across the boundary in both directions. diff --git a/docs/topics/auth/default.txt b/docs/topics/auth/default.txt index 1dbab8b2d9d..045710b4204 100644 --- a/docs/topics/auth/default.txt +++ b/docs/topics/auth/default.txt @@ -553,8 +553,7 @@ The ``login_required`` decorator @login_required - def my_view(request): - ... + def my_view(request): ... :func:`~django.contrib.auth.decorators.login_required` does the following: @@ -575,8 +574,7 @@ The ``login_required`` decorator @login_required(redirect_field_name="my_redirect_field") - def my_view(request): - ... + def my_view(request): ... Note that if you provide a value to ``redirect_field_name``, you will most likely need to customize your login template as well, since the template @@ -590,8 +588,7 @@ The ``login_required`` decorator @login_required(login_url="/accounts/login/") - def my_view(request): - ... + def my_view(request): ... Note that if you don't specify the ``login_url`` parameter, you'll need to ensure that the :setting:`settings.LOGIN_URL ` and your login @@ -688,8 +685,7 @@ email in the desired domain and if not, redirects to the login page:: @user_passes_test(email_check) - def my_view(request): - ... + def my_view(request): ... :func:`~django.contrib.auth.decorators.user_passes_test` takes a required argument: a callable that takes a @@ -716,8 +712,7 @@ email in the desired domain and if not, redirects to the login page:: For example:: @user_passes_test(email_check, login_url="/login/") - def my_view(request): - ... + def my_view(request): ... .. currentmodule:: django.contrib.auth.mixins @@ -761,8 +756,7 @@ email in the desired domain and if not, redirects to the login page:: return self.request.user.username.startswith("django") - class MyView(TestMixin1, TestMixin2, View): - ... + class MyView(TestMixin1, TestMixin2, View): ... If ``TestMixin1`` would call ``super()`` and take that result into account, ``TestMixin1`` wouldn't work standalone anymore. @@ -782,8 +776,7 @@ The ``permission_required`` decorator @permission_required("polls.add_choice") - def my_view(request): - ... + def my_view(request): ... Just like the :meth:`~django.contrib.auth.models.User.has_perm` method, permission names take the form ``"."`` @@ -800,8 +793,7 @@ The ``permission_required`` decorator @permission_required("polls.add_choice", login_url="/loginpage/") - def my_view(request): - ... + def my_view(request): ... As in the :func:`~django.contrib.auth.decorators.login_required` decorator, ``login_url`` defaults to :setting:`settings.LOGIN_URL `. @@ -820,8 +812,7 @@ The ``permission_required`` decorator @login_required @permission_required("polls.add_choice", raise_exception=True) - def my_view(request): - ... + def my_view(request): ... This also avoids a redirect loop when :class:`.LoginView`'s ``redirect_authenticated_user=True`` and the logged-in user doesn't have diff --git a/docs/topics/cache.txt b/docs/topics/cache.txt index 5935c3e27f4..a2bdba7ccd5 100644 --- a/docs/topics/cache.txt +++ b/docs/topics/cache.txt @@ -668,8 +668,7 @@ decorator that will automatically cache the view's response for you:: @cache_page(60 * 15) - def my_view(request): - ... + def my_view(request): ... ``cache_page`` takes a single argument: the cache timeout, in seconds. In the above example, the result of the ``my_view()`` view will be cached for 15 @@ -699,8 +698,7 @@ which directs the decorator to use a specific cache (from your want:: @cache_page(60 * 15, cache="special_cache") - def my_view(request): - ... + def my_view(request): ... You can also override the cache prefix on a per-view basis. ``cache_page`` takes an optional keyword argument, ``key_prefix``, @@ -708,8 +706,7 @@ which works in the same way as the :setting:`CACHE_MIDDLEWARE_KEY_PREFIX` setting for the middleware. It can be used like this:: @cache_page(60 * 15, key_prefix="site1") - def my_view(request): - ... + def my_view(request): ... The ``key_prefix`` and ``cache`` arguments may be specified together. The ``key_prefix`` argument and the :setting:`KEY_PREFIX ` @@ -1342,8 +1339,7 @@ To do this in Django, use the convenient @vary_on_headers("User-Agent") - def my_view(request): - ... + def my_view(request): ... In this case, a caching mechanism (such as Django's own cache middleware) will cache a separate version of the page for each unique user-agent. @@ -1357,8 +1353,7 @@ anything that was already in there. You can pass multiple headers to ``vary_on_headers()``:: @vary_on_headers("User-Agent", "Cookie") - def my_view(request): - ... + def my_view(request): ... This tells downstream caches to vary on *both*, which means each combination of user-agent and cookie will get its own cache value. For example, a request with @@ -1371,13 +1366,11 @@ Because varying on cookie is so common, there's a are equivalent:: @vary_on_cookie - def my_view(request): - ... + def my_view(request): ... @vary_on_headers("Cookie") - def my_view(request): - ... + def my_view(request): ... The headers you pass to ``vary_on_headers`` are not case sensitive; ``"User-Agent"`` is the same thing as ``"user-agent"``. @@ -1423,8 +1416,7 @@ decorator. Example:: @cache_control(private=True) - def my_view(request): - ... + def my_view(request): ... This decorator takes care of sending out the appropriate HTTP header behind the scenes. @@ -1463,8 +1455,7 @@ directive:: @cache_control(max_age=3600) - def my_view(request): - ... + def my_view(request): ... (If you *do* use the caching middleware, it already sets the ``max-age`` with the value of the :setting:`CACHE_MIDDLEWARE_SECONDS` setting. In that case, @@ -1494,8 +1485,7 @@ caches. Example:: @never_cache - def myview(request): - ... + def myview(request): ... Order of ``MIDDLEWARE`` ======================= diff --git a/docs/topics/checks.txt b/docs/topics/checks.txt index 9a91ceb4690..3e3bbe19d65 100644 --- a/docs/topics/checks.txt +++ b/docs/topics/checks.txt @@ -113,8 +113,7 @@ You can register "deployment checks" that are only relevant to a production settings file like this:: @register(Tags.security, deploy=True) - def my_check(app_configs, **kwargs): - ... + def my_check(app_configs, **kwargs): ... These checks will only be run if the :option:`check --deploy` option is used. @@ -124,8 +123,7 @@ to ``register``. The code below is equivalent to the code above:: - def my_check(app_configs, **kwargs): - ... + def my_check(app_configs, **kwargs): ... register(my_check, Tags.security, deploy=True) diff --git a/docs/topics/conditional-view-processing.txt b/docs/topics/conditional-view-processing.txt index 2447697de46..dfd36a64ae0 100644 --- a/docs/topics/conditional-view-processing.txt +++ b/docs/topics/conditional-view-processing.txt @@ -72,8 +72,7 @@ Suppose you have this pair of models, representing a small blog system:: from django.db import models - class Blog(models.Model): - ... + class Blog(models.Model): ... class Entry(models.Model): @@ -96,8 +95,7 @@ for your front page view:: @condition(last_modified_func=latest_entry) - def front_page(request, blog_id): - ... + def front_page(request, blog_id): ... .. admonition:: Be careful with the order of decorators @@ -131,13 +129,11 @@ We could write the earlier example, which only uses a last-modified function, using one of these decorators:: @last_modified(latest_entry) - def front_page(request, blog_id): - ... + def front_page(request, blog_id): ... ...or:: - def front_page(request, blog_id): - ... + def front_page(request, blog_id): ... front_page = last_modified(latest_entry)(front_page) @@ -154,8 +150,7 @@ this would lead to incorrect behavior. # Bad code. Don't do this! @etag(etag_func) @last_modified(last_modified_func) - def my_view(request): - ... + def my_view(request): ... # End of bad code. diff --git a/docs/topics/db/fixtures.txt b/docs/topics/db/fixtures.txt index 48c5605ff48..ac5b34dae0d 100644 --- a/docs/topics/db/fixtures.txt +++ b/docs/topics/db/fixtures.txt @@ -161,8 +161,7 @@ You could also write a decorator to encapsulate this logic:: @disable_for_loaddata - def my_handler(**kwargs): - ... + def my_handler(**kwargs): ... Just be aware that this logic will disable the signals whenever fixtures are deserialized, not just during :djadmin:`loaddata`. diff --git a/docs/topics/db/transactions.txt b/docs/topics/db/transactions.txt index 40d40bc7d02..e012d73af48 100644 --- a/docs/topics/db/transactions.txt +++ b/docs/topics/db/transactions.txt @@ -311,8 +311,7 @@ Pass a function, or any callable, to :func:`on_commit`:: from django.db import transaction - def send_welcome_email(): - ... + def send_welcome_email(): ... transaction.on_commit(send_welcome_email) diff --git a/docs/topics/forms/modelforms.txt b/docs/topics/forms/modelforms.txt index fbd5695c17d..3727c4f6f52 100644 --- a/docs/topics/forms/modelforms.txt +++ b/docs/topics/forms/modelforms.txt @@ -708,8 +708,7 @@ using the previous ``ArticleForm`` class: .. code-block:: pycon >>> class EnhancedArticleForm(ArticleForm): - ... def clean_pub_date(self): - ... ... + ... def clean_pub_date(self): ... ... This creates a form that behaves identically to ``ArticleForm``, except there's diff --git a/docs/topics/http/file-uploads.txt b/docs/topics/http/file-uploads.txt index cb0fb5b7fbd..3a1c96846c2 100644 --- a/docs/topics/http/file-uploads.txt +++ b/docs/topics/http/file-uploads.txt @@ -346,7 +346,8 @@ list:: @csrf_protect def _upload_file_view(request): - ... # Process request + # Process request + ... If you are using a class-based view, you will need to use :func:`~django.views.decorators.csrf.csrf_exempt` on its @@ -367,4 +368,5 @@ list:: @method_decorator(csrf_protect) def post(self, request, *args, **kwargs): - ... # Process request + # Process request + ... diff --git a/docs/topics/signals.txt b/docs/topics/signals.txt index a4d973ebb42..6a577dd8ad1 100644 --- a/docs/topics/signals.txt +++ b/docs/topics/signals.txt @@ -200,8 +200,7 @@ signals sent by some model:: @receiver(pre_save, sender=MyModel) - def my_handler(sender, **kwargs): - ... + def my_handler(sender, **kwargs): ... The ``my_handler`` function will only be called when an instance of ``MyModel`` is saved. diff --git a/docs/topics/testing/tools.txt b/docs/topics/testing/tools.txt index c8002a82dc6..ae5b7588126 100644 --- a/docs/topics/testing/tools.txt +++ b/docs/topics/testing/tools.txt @@ -1352,8 +1352,7 @@ For example:: class OtherDBTests(TestCase): databases = {"other"} - def test_other_db_query(self): - ... + def test_other_db_query(self): ... This test will only allow queries against the ``other`` database. Just like for :attr:`SimpleTestCase.databases` and :attr:`TransactionTestCase.databases`, the @@ -1954,22 +1953,18 @@ you might label fast or slow tests:: class SampleTestCase(TestCase): @tag("fast") - def test_fast(self): - ... + def test_fast(self): ... @tag("slow") - def test_slow(self): - ... + def test_slow(self): ... @tag("slow", "core") - def test_slow_but_core(self): - ... + def test_slow_but_core(self): ... You can also tag a test case class:: @tag("slow", "core") - class SampleTestCase(TestCase): - ... + class SampleTestCase(TestCase): ... Subclasses inherit tags from superclasses, and methods inherit tags from their class. Given:: @@ -1977,8 +1972,7 @@ class. Given:: @tag("foo") class SampleTestCaseChild(SampleTestCase): @tag("bar") - def test(self): - ... + def test(self): ... ``SampleTestCaseChild.test`` will be labeled with ``'slow'``, ``'core'``, ``'bar'``, and ``'foo'``. @@ -2078,8 +2072,7 @@ creates. class MyTests(TestCase): @mock.patch(...) @async_to_sync - async def test_my_thing(self): - ... + async def test_my_thing(self): ... .. _topics-testing-email: diff --git a/tests/admin_changelist/test_date_hierarchy.py b/tests/admin_changelist/test_date_hierarchy.py index 03afaa33d91..94a6a8eb6c6 100644 --- a/tests/admin_changelist/test_date_hierarchy.py +++ b/tests/admin_changelist/test_date_hierarchy.py @@ -90,7 +90,8 @@ def test_invalid_params(self): {"year": 2017, "month": 12, "day": 0}, ) for invalid_query in tests: - with self.subTest(query=invalid_query), self.assertRaises( - IncorrectLookupParameters + with ( + self.subTest(query=invalid_query), + self.assertRaises(IncorrectLookupParameters), ): self.assertDateParams(invalid_query, None, None) diff --git a/tests/admin_inlines/models.py b/tests/admin_inlines/models.py index a8d2ee02e13..eca5bae422c 100644 --- a/tests/admin_inlines/models.py +++ b/tests/admin_inlines/models.py @@ -1,6 +1,7 @@ """ Testing of admin inline formsets. """ + import random from django.contrib.contenttypes.fields import GenericForeignKey diff --git a/tests/admin_scripts/tests.py b/tests/admin_scripts/tests.py index 7f39d7fcfc8..50e8d4a3b1e 100644 --- a/tests/admin_scripts/tests.py +++ b/tests/admin_scripts/tests.py @@ -3,6 +3,7 @@ advertised - especially with regards to the handling of the DJANGO_SETTINGS_MODULE and default settings.py files. """ + import os import re import shutil @@ -757,7 +758,9 @@ def test_startapp_unicode_name(self): with open(os.path.join(app_path, "apps.py"), encoding="utf8") as f: content = f.read() self.assertIn("class こんにちはConfig(AppConfig)", content) - self.assertIn('name = "こんにちは"' if HAS_BLACK else "name = 'こんにちは'", content) + self.assertIn( + 'name = "こんにちは"' if HAS_BLACK else "name = 'こんにちは'", content + ) def test_builtin_command(self): """ diff --git a/tests/admin_views/custom_has_permission_admin.py b/tests/admin_views/custom_has_permission_admin.py index 6dc2011b24d..17b6498aab8 100644 --- a/tests/admin_views/custom_has_permission_admin.py +++ b/tests/admin_views/custom_has_permission_admin.py @@ -1,6 +1,7 @@ """ A custom AdminSite for AdminViewPermissionsTest.test_login_has_permission(). """ + from django.contrib import admin from django.contrib.auth import get_permission_codename from django.contrib.auth.forms import AuthenticationForm diff --git a/tests/admin_views/customadmin.py b/tests/admin_views/customadmin.py index e3429ec4bc4..4b30c5c30fd 100644 --- a/tests/admin_views/customadmin.py +++ b/tests/admin_views/customadmin.py @@ -1,6 +1,7 @@ """ A second, custom AdminSite -- see tests.CustomAdminSiteTests. """ + from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import User diff --git a/tests/aggregation_regress/tests.py b/tests/aggregation_regress/tests.py index bfb3919b237..9199bf3eba2 100644 --- a/tests/aggregation_regress/tests.py +++ b/tests/aggregation_regress/tests.py @@ -1564,8 +1564,9 @@ def test_aggregate_unmanaged_model_as_tables(self): "django.db.connection.features.allows_group_by_selected_pks_on_model", return_value=True, ): - with mock.patch.object(Book._meta, "managed", False), mock.patch.object( - Author._meta, "managed", False + with ( + mock.patch.object(Book._meta, "managed", False), + mock.patch.object(Author._meta, "managed", False), ): _, _, grouping = qs.query.get_compiler(using="default").pre_sql_setup() self.assertEqual(len(grouping), 2) diff --git a/tests/auth_tests/models/custom_permissions.py b/tests/auth_tests/models/custom_permissions.py index 52d28bd2762..385de4e8461 100644 --- a/tests/auth_tests/models/custom_permissions.py +++ b/tests/auth_tests/models/custom_permissions.py @@ -3,6 +3,7 @@ Django permissions model. This allows us to check that the PermissionsMixin includes everything that is needed to interact with the ModelBackend. """ + from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin from django.db import models diff --git a/tests/auth_tests/test_forms.py b/tests/auth_tests/test_forms.py index 81c56a428ea..4583c1f344a 100644 --- a/tests/auth_tests/test_forms.py +++ b/tests/auth_tests/test_forms.py @@ -486,8 +486,9 @@ def signal_handler(**kwargs): user_login_failed.disconnect(signal_handler) def test_inactive_user_i18n(self): - with self.settings(USE_I18N=True), translation.override( - "pt-br", deactivate=True + with ( + self.settings(USE_I18N=True), + translation.override("pt-br", deactivate=True), ): # The user is inactive. data = { @@ -906,9 +907,9 @@ def test_bug_14242(self): class MyUserForm(UserChangeForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.fields[ - "groups" - ].help_text = "These groups give users different permissions" + self.fields["groups"].help_text = ( + "These groups give users different permissions" + ) class Meta(UserChangeForm.Meta): fields = ("groups",) diff --git a/tests/auth_tests/test_hashers.py b/tests/auth_tests/test_hashers.py index e10992b25c6..cf2ebafa15c 100644 --- a/tests/auth_tests/test_hashers.py +++ b/tests/auth_tests/test_hashers.py @@ -327,8 +327,9 @@ def test_bcrypt_harden_runtime(self): with mock.patch.object(hasher, "rounds", 4): encoded = make_password("letmein", hasher="bcrypt") - with mock.patch.object(hasher, "rounds", 6), mock.patch.object( - hasher, "encode", side_effect=hasher.encode + with ( + mock.patch.object(hasher, "rounds", 6), + mock.patch.object(hasher, "encode", side_effect=hasher.encode), ): hasher.harden_runtime("wrong_password", encoded) @@ -502,8 +503,9 @@ def test_pbkdf2_harden_runtime(self): with mock.patch.object(hasher, "iterations", 1): encoded = make_password("letmein") - with mock.patch.object(hasher, "iterations", 6), mock.patch.object( - hasher, "encode", side_effect=hasher.encode + with ( + mock.patch.object(hasher, "iterations", 6), + mock.patch.object(hasher, "encode", side_effect=hasher.encode), ): hasher.harden_runtime("wrong_password", encoded) @@ -551,8 +553,9 @@ def test_check_password_calls_harden_runtime(self): hasher = get_hasher("default") encoded = make_password("letmein") - with mock.patch.object(hasher, "harden_runtime"), mock.patch.object( - hasher, "must_update", return_value=True + with ( + mock.patch.object(hasher, "harden_runtime"), + mock.patch.object(hasher, "must_update", return_value=True), ): # Correct password supplied, no hardening needed check_password("letmein", encoded) diff --git a/tests/auth_tests/test_views.py b/tests/auth_tests/test_views.py index d15a166c987..0897046c1f5 100644 --- a/tests/auth_tests/test_views.py +++ b/tests/auth_tests/test_views.py @@ -818,9 +818,9 @@ def get_response(request): # Use POST request to log in SessionMiddleware(get_response).process_request(req) CsrfViewMiddleware(get_response).process_view(req, LoginView.as_view(), (), {}) - req.META[ - "SERVER_NAME" - ] = "testserver" # Required to have redirect work in login view + req.META["SERVER_NAME"] = ( + "testserver" # Required to have redirect work in login view + ) req.META["SERVER_PORT"] = 80 resp = CsrfViewMiddleware(LoginView.as_view())(req) csrf_cookie = resp.cookies.get(settings.CSRF_COOKIE_NAME, None) diff --git a/tests/backends/base/test_base.py b/tests/backends/base/test_base.py index ada2cc33c90..3a0f7f1f1cb 100644 --- a/tests/backends/base/test_base.py +++ b/tests/backends/base/test_base.py @@ -168,8 +168,9 @@ def test_database_queried(self): def test_nested_wrapper_invoked(self): outer_wrapper = self.mock_wrapper() inner_wrapper = self.mock_wrapper() - with connection.execute_wrapper(outer_wrapper), connection.execute_wrapper( - inner_wrapper + with ( + connection.execute_wrapper(outer_wrapper), + connection.execute_wrapper(inner_wrapper), ): self.call_execute(connection) self.assertEqual(inner_wrapper.call_count, 1) @@ -182,8 +183,10 @@ def blocker(*args): wrapper = self.mock_wrapper() c = connection # This alias shortens the next line. - with c.execute_wrapper(wrapper), c.execute_wrapper(blocker), c.execute_wrapper( - wrapper + with ( + c.execute_wrapper(wrapper), + c.execute_wrapper(blocker), + c.execute_wrapper(wrapper), ): with c.cursor() as cursor: cursor.execute("The database never sees this") diff --git a/tests/backends/test_utils.py b/tests/backends/test_utils.py index 03d4b036fdf..704498836e4 100644 --- a/tests/backends/test_utils.py +++ b/tests/backends/test_utils.py @@ -1,4 +1,5 @@ """Tests for django.db.backends.utils""" + from decimal import Decimal, Rounded from django.db import NotSupportedError, connection diff --git a/tests/backends/tests.py b/tests/backends/tests.py index 5c562682f0a..08a21d8dedb 100644 --- a/tests/backends/tests.py +++ b/tests/backends/tests.py @@ -1,4 +1,5 @@ """Tests related to django.db.backends that haven't been organized.""" + import datetime import threading import unittest diff --git a/tests/bash_completion/tests.py b/tests/bash_completion/tests.py index 856e351dfa1..324e9809375 100644 --- a/tests/bash_completion/tests.py +++ b/tests/bash_completion/tests.py @@ -1,6 +1,7 @@ """ A series of tests to establish that the command-line bash completion works. """ + import os import sys import unittest diff --git a/tests/basic/models.py b/tests/basic/models.py index b71b60a2135..cd896431408 100644 --- a/tests/basic/models.py +++ b/tests/basic/models.py @@ -3,6 +3,7 @@ This is a basic model with only two non-primary-key fields. """ + import uuid from django.db import models diff --git a/tests/check_framework/test_security.py b/tests/check_framework/test_security.py index b1839f48c3d..cb035a90a4b 100644 --- a/tests/check_framework/test_security.py +++ b/tests/check_framework/test_security.py @@ -593,8 +593,9 @@ def test_with_referrer_policy(self): ("strict-origin", "origin"), ) for value in tests: - with self.subTest(value=value), override_settings( - SECURE_REFERRER_POLICY=value + with ( + self.subTest(value=value), + override_settings(SECURE_REFERRER_POLICY=value), ): self.assertEqual(base.check_referrer_policy(None), []) @@ -663,8 +664,11 @@ def test_no_coop(self): def test_with_coop(self): tests = ["same-origin", "same-origin-allow-popups", "unsafe-none"] for value in tests: - with self.subTest(value=value), override_settings( - SECURE_CROSS_ORIGIN_OPENER_POLICY=value, + with ( + self.subTest(value=value), + override_settings( + SECURE_CROSS_ORIGIN_OPENER_POLICY=value, + ), ): self.assertEqual(base.check_cross_origin_opener_policy(None), []) diff --git a/tests/contenttypes_tests/test_management.py b/tests/contenttypes_tests/test_management.py index eb472d80cef..14ff4e59521 100644 --- a/tests/contenttypes_tests/test_management.py +++ b/tests/contenttypes_tests/test_management.py @@ -88,9 +88,10 @@ def test_unavailable_content_type_model(self): def test_contenttypes_removed_in_installed_apps_without_models(self): ContentType.objects.create(app_label="empty_models", model="Fake 1") ContentType.objects.create(app_label="no_models", model="Fake 2") - with mock.patch( - "builtins.input", return_value="yes" - ), captured_stdout() as stdout: + with ( + mock.patch("builtins.input", return_value="yes"), + captured_stdout() as stdout, + ): call_command("remove_stale_contenttypes", verbosity=2) self.assertNotIn( "Deleting stale content type 'empty_models | Fake 1'", @@ -106,9 +107,10 @@ def test_contenttypes_removed_in_installed_apps_without_models(self): def test_contenttypes_removed_for_apps_not_in_installed_apps(self): ContentType.objects.create(app_label="empty_models", model="Fake 1") ContentType.objects.create(app_label="no_models", model="Fake 2") - with mock.patch( - "builtins.input", return_value="yes" - ), captured_stdout() as stdout: + with ( + mock.patch("builtins.input", return_value="yes"), + captured_stdout() as stdout, + ): call_command( "remove_stale_contenttypes", include_stale_apps=True, verbosity=2 ) diff --git a/tests/contenttypes_tests/test_models.py b/tests/contenttypes_tests/test_models.py index 36c14cf56f2..1999364dd50 100644 --- a/tests/contenttypes_tests/test_models.py +++ b/tests/contenttypes_tests/test_models.py @@ -325,8 +325,9 @@ def test_multidb(self): db_for_read(). """ ContentType.objects.clear_cache() - with self.assertNumQueries(0, using="default"), self.assertNumQueries( - 1, using="other" + with ( + self.assertNumQueries(0, using="default"), + self.assertNumQueries(1, using="other"), ): ContentType.objects.get_for_model(Author) diff --git a/tests/contenttypes_tests/test_views.py b/tests/contenttypes_tests/test_views.py index 4d85d15065f..75f39a7babc 100644 --- a/tests/contenttypes_tests/test_views.py +++ b/tests/contenttypes_tests/test_views.py @@ -150,10 +150,8 @@ def test_shortcut_view_with_null_site_fk(self, get_model): """ The shortcut view works if a model's ForeignKey to site is None. """ - get_model.side_effect = ( - lambda *args, **kwargs: MockSite - if args[0] == "sites.Site" - else ModelWithNullFKToSite + get_model.side_effect = lambda *args, **kwargs: ( + MockSite if args[0] == "sites.Site" else ModelWithNullFKToSite ) obj = ModelWithNullFKToSite.objects.create(title="title") @@ -172,10 +170,8 @@ def test_shortcut_view_with_site_m2m(self, get_model): site if it's attached to the object or to the domain of the first site found in the m2m relationship. """ - get_model.side_effect = ( - lambda *args, **kwargs: MockSite - if args[0] == "sites.Site" - else ModelWithM2MToSite + get_model.side_effect = lambda *args, **kwargs: ( + MockSite if args[0] == "sites.Site" else ModelWithM2MToSite ) # get_current_site() will lookup a Site object, so these must match the diff --git a/tests/context_processors/tests.py b/tests/context_processors/tests.py index 23f9d591496..ba92ff8b05e 100644 --- a/tests/context_processors/tests.py +++ b/tests/context_processors/tests.py @@ -1,6 +1,7 @@ """ Tests for Django's bundled context processors. """ + from django.test import SimpleTestCase, TestCase, override_settings diff --git a/tests/custom_lookups/tests.py b/tests/custom_lookups/tests.py index a636977b67e..22f443d100f 100644 --- a/tests/custom_lookups/tests.py +++ b/tests/custom_lookups/tests.py @@ -238,10 +238,11 @@ class LookupTests(TestCase): def test_custom_name_lookup(self): a1 = Author.objects.create(name="a1", birthdate=date(1981, 2, 16)) Author.objects.create(name="a2", birthdate=date(2012, 2, 29)) - with register_lookup(models.DateField, YearTransform), register_lookup( - models.DateField, YearTransform, lookup_name="justtheyear" - ), register_lookup(YearTransform, Exactly), register_lookup( - YearTransform, Exactly, lookup_name="isactually" + with ( + register_lookup(models.DateField, YearTransform), + register_lookup(models.DateField, YearTransform, lookup_name="justtheyear"), + register_lookup(YearTransform, Exactly), + register_lookup(YearTransform, Exactly, lookup_name="isactually"), ): qs1 = Author.objects.filter(birthdate__testyear__exactly=1981) qs2 = Author.objects.filter(birthdate__justtheyear__isactually=1981) diff --git a/tests/db_functions/comparison/test_nullif.py b/tests/db_functions/comparison/test_nullif.py index 9839e6b4c51..cdbc3d69604 100644 --- a/tests/db_functions/comparison/test_nullif.py +++ b/tests/db_functions/comparison/test_nullif.py @@ -23,9 +23,11 @@ def test_basic(self): [ ("smithj",), ( - "" - if connection.features.interprets_empty_strings_as_nulls - else None, + ( + "" + if connection.features.interprets_empty_strings_as_nulls + else None + ), ), ], ) diff --git a/tests/db_functions/datetime/test_extract_trunc.py b/tests/db_functions/datetime/test_extract_trunc.py index 29212b6e244..e576e6e4641 100644 --- a/tests/db_functions/datetime/test_extract_trunc.py +++ b/tests/db_functions/datetime/test_extract_trunc.py @@ -113,9 +113,11 @@ def create_model(self, start_datetime, end_datetime): end_date=end_datetime.date() if end_datetime else None, start_time=start_datetime.time() if start_datetime else None, end_time=end_datetime.time() if end_datetime else None, - duration=(end_datetime - start_datetime) - if start_datetime and end_datetime - else None, + duration=( + (end_datetime - start_datetime) + if start_datetime and end_datetime + else None + ), ) def test_extract_year_exact_lookup(self): diff --git a/tests/db_functions/models.py b/tests/db_functions/models.py index d6a06511bcc..c126f1bae1a 100644 --- a/tests/db_functions/models.py +++ b/tests/db_functions/models.py @@ -1,6 +1,7 @@ """ Tests for built in Function expressions. """ + from django.db import models diff --git a/tests/db_functions/text/test_md5.py b/tests/db_functions/text/test_md5.py index fd0aec58f2d..4fd66f0397e 100644 --- a/tests/db_functions/text/test_md5.py +++ b/tests/db_functions/text/test_md5.py @@ -35,9 +35,11 @@ def test_basic(self): "ca6d48f6772000141e66591aee49d56c", "bf2c13bc1154e3d2e7df848cbc8be73d", "d41d8cd98f00b204e9800998ecf8427e", - "d41d8cd98f00b204e9800998ecf8427e" - if connection.features.interprets_empty_strings_as_nulls - else None, + ( + "d41d8cd98f00b204e9800998ecf8427e" + if connection.features.interprets_empty_strings_as_nulls + else None + ), ], ) diff --git a/tests/db_functions/text/test_sha1.py b/tests/db_functions/text/test_sha1.py index 175c5727ffc..ef846d07aa5 100644 --- a/tests/db_functions/text/test_sha1.py +++ b/tests/db_functions/text/test_sha1.py @@ -35,9 +35,11 @@ def test_basic(self): "0781e0745a2503e6ded05ed5bc554c421d781b0c", "198d15ea139de04060caf95bc3e0ec5883cba881", "da39a3ee5e6b4b0d3255bfef95601890afd80709", - "da39a3ee5e6b4b0d3255bfef95601890afd80709" - if connection.features.interprets_empty_strings_as_nulls - else None, + ( + "da39a3ee5e6b4b0d3255bfef95601890afd80709" + if connection.features.interprets_empty_strings_as_nulls + else None + ), ], ) diff --git a/tests/db_functions/text/test_sha224.py b/tests/db_functions/text/test_sha224.py index a6254f43e3d..60d9e378a69 100644 --- a/tests/db_functions/text/test_sha224.py +++ b/tests/db_functions/text/test_sha224.py @@ -37,9 +37,11 @@ def test_basic(self): "2297904883e78183cb118fc3dc21a610d60daada7b6ebdbc85139f4d", "eba942746e5855121d9d8f79e27dfdebed81adc85b6bf41591203080", "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f", - "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f" - if connection.features.interprets_empty_strings_as_nulls - else None, + ( + "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f" + if connection.features.interprets_empty_strings_as_nulls + else None + ), ], ) diff --git a/tests/db_functions/text/test_sha256.py b/tests/db_functions/text/test_sha256.py index b399dbecd32..0cf72783e7c 100644 --- a/tests/db_functions/text/test_sha256.py +++ b/tests/db_functions/text/test_sha256.py @@ -35,9 +35,11 @@ def test_basic(self): "6e4cce20cd83fc7c202f21a8b2452a68509cf24d1c272a045b5e0cfc43f0d94e", "3ad2039e3ec0c88973ae1c0fce5a3dbafdd5a1627da0a92312c54ebfcf43988e", "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - if connection.features.interprets_empty_strings_as_nulls - else None, + ( + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + if connection.features.interprets_empty_strings_as_nulls + else None + ), ], ) diff --git a/tests/db_functions/text/test_sha384.py b/tests/db_functions/text/test_sha384.py index 250cadda4a0..a4d07d32952 100644 --- a/tests/db_functions/text/test_sha384.py +++ b/tests/db_functions/text/test_sha384.py @@ -39,10 +39,12 @@ def test_basic(self): "26676a43c7ba378621175853b0", "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274ede" "bfe76f65fbd51ad2f14898b95b", - "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274ede" - "bfe76f65fbd51ad2f14898b95b" - if connection.features.interprets_empty_strings_as_nulls - else None, + ( + "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da27" + "4edebfe76f65fbd51ad2f14898b95b" + if connection.features.interprets_empty_strings_as_nulls + else None + ), ], ) diff --git a/tests/db_functions/text/test_sha512.py b/tests/db_functions/text/test_sha512.py index f5a7ad4ae54..b4c7a4bbd8a 100644 --- a/tests/db_functions/text/test_sha512.py +++ b/tests/db_functions/text/test_sha512.py @@ -39,10 +39,12 @@ def test_basic(self): "172d88798345a3a7666faf5f35a144c60812d3234dcd35f444624f2faee16857", "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce" "47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e", - "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce" - "47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" - if connection.features.interprets_empty_strings_as_nulls - else None, + ( + "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce" + "47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e" + if connection.features.interprets_empty_strings_as_nulls + else None + ), ], ) diff --git a/tests/db_utils/tests.py b/tests/db_utils/tests.py index a2d9cc7b5e8..4028a8acdf3 100644 --- a/tests/db_utils/tests.py +++ b/tests/db_utils/tests.py @@ -1,4 +1,5 @@ """Tests for django.db.utils.""" + import unittest from django.core.exceptions import ImproperlyConfigured diff --git a/tests/dbshell/test_sqlite.py b/tests/dbshell/test_sqlite.py index faf9882ad91..e795f7619b5 100644 --- a/tests/dbshell/test_sqlite.py +++ b/tests/dbshell/test_sqlite.py @@ -35,8 +35,11 @@ def test_non_zero_exit_status_when_path_to_db_is_path(self): cmd_args = self.settings_to_cmd_args_env(sqlite_with_path)[0] msg = '"sqlite3 test.db.sqlite3" returned non-zero exit status 1.' - with mock.patch( - "django.db.backends.sqlite3.client.DatabaseClient.runshell", - side_effect=subprocess.CalledProcessError(returncode=1, cmd=cmd_args), - ), self.assertRaisesMessage(CommandError, msg): + with ( + mock.patch( + "django.db.backends.sqlite3.client.DatabaseClient.runshell", + side_effect=subprocess.CalledProcessError(returncode=1, cmd=cmd_args), + ), + self.assertRaisesMessage(CommandError, msg), + ): call_command("dbshell") diff --git a/tests/distinct_on_fields/tests.py b/tests/distinct_on_fields/tests.py index b80878bbf25..93b3f27aec0 100644 --- a/tests/distinct_on_fields/tests.py +++ b/tests/distinct_on_fields/tests.py @@ -76,9 +76,11 @@ def test_basic_distinct_on(self): (StaffTag.objects.distinct("staff", "tag"), [self.st1]), ( Tag.objects.order_by("parent__pk", "pk").distinct("parent"), - [self.t2, self.t4, self.t1] - if connection.features.nulls_order_largest - else [self.t1, self.t2, self.t4], + ( + [self.t2, self.t4, self.t1] + if connection.features.nulls_order_largest + else [self.t1, self.t2, self.t4] + ), ), ( StaffTag.objects.select_related("staff") diff --git a/tests/expressions/models.py b/tests/expressions/models.py index 0a8a0a6584d..0cab2756311 100644 --- a/tests/expressions/models.py +++ b/tests/expressions/models.py @@ -1,6 +1,7 @@ """ Tests for F() query expression syntax. """ + import uuid from django.db import models diff --git a/tests/file_uploads/tests.py b/tests/file_uploads/tests.py index 693efc4c62b..833d841361c 100644 --- a/tests/file_uploads/tests.py +++ b/tests/file_uploads/tests.py @@ -451,9 +451,10 @@ def test_filename_overflow(self): def test_file_content(self): file = tempfile.NamedTemporaryFile - with file(suffix=".ctype_extra") as no_content_type, file( - suffix=".ctype_extra" - ) as simple_file: + with ( + file(suffix=".ctype_extra") as no_content_type, + file(suffix=".ctype_extra") as simple_file, + ): no_content_type.write(b"no content") no_content_type.seek(0) @@ -482,9 +483,10 @@ def test_file_content(self): def test_content_type_extra(self): """Uploaded files may have content type parameters available.""" file = tempfile.NamedTemporaryFile - with file(suffix=".ctype_extra") as no_content_type, file( - suffix=".ctype_extra" - ) as simple_file: + with ( + file(suffix=".ctype_extra") as no_content_type, + file(suffix=".ctype_extra") as simple_file, + ): no_content_type.write(b"something") no_content_type.seek(0) diff --git a/tests/file_uploads/uploadhandler.py b/tests/file_uploads/uploadhandler.py index a1e1a5af053..d3c88ac305b 100644 --- a/tests/file_uploads/uploadhandler.py +++ b/tests/file_uploads/uploadhandler.py @@ -1,6 +1,7 @@ """ Upload handlers to test the upload API. """ + import os from tempfile import NamedTemporaryFile diff --git a/tests/files/tests.py b/tests/files/tests.py index 7dc5c04668c..9d3a471cb31 100644 --- a/tests/files/tests.py +++ b/tests/files/tests.py @@ -144,35 +144,40 @@ def test_file_iteration_with_text(self): self.assertEqual(list(f), ["one\n", "two\n", "three"]) def test_readable(self): - with tempfile.TemporaryFile() as temp, File( - temp, name="something.txt" - ) as test_file: + with ( + tempfile.TemporaryFile() as temp, + File(temp, name="something.txt") as test_file, + ): self.assertTrue(test_file.readable()) self.assertFalse(test_file.readable()) def test_writable(self): - with tempfile.TemporaryFile() as temp, File( - temp, name="something.txt" - ) as test_file: + with ( + tempfile.TemporaryFile() as temp, + File(temp, name="something.txt") as test_file, + ): self.assertTrue(test_file.writable()) self.assertFalse(test_file.writable()) - with tempfile.TemporaryFile("rb") as temp, File( - temp, name="something.txt" - ) as test_file: + with ( + tempfile.TemporaryFile("rb") as temp, + File(temp, name="something.txt") as test_file, + ): self.assertFalse(test_file.writable()) def test_seekable(self): - with tempfile.TemporaryFile() as temp, File( - temp, name="something.txt" - ) as test_file: + with ( + tempfile.TemporaryFile() as temp, + File(temp, name="something.txt") as test_file, + ): self.assertTrue(test_file.seekable()) self.assertFalse(test_file.seekable()) def test_io_wrapper(self): content = "vive l'été\n" - with tempfile.TemporaryFile() as temp, File( - temp, name="something.txt" - ) as test_file: + with ( + tempfile.TemporaryFile() as temp, + File(temp, name="something.txt") as test_file, + ): test_file.write(content.encode()) test_file.seek(0) wrapper = TextIOWrapper(test_file, "utf-8", newline="\n") diff --git a/tests/force_insert_update/models.py b/tests/force_insert_update/models.py index b95b197454d..e6fdfbd827d 100644 --- a/tests/force_insert_update/models.py +++ b/tests/force_insert_update/models.py @@ -2,6 +2,7 @@ Tests for forcing insert and update queries (instead of Django's normal automatic behavior). """ + from django.db import models diff --git a/tests/forms_tests/field_tests/test_decimalfield.py b/tests/forms_tests/field_tests/test_decimalfield.py index 9d26bc88b0c..cb13e5b71b0 100644 --- a/tests/forms_tests/field_tests/test_decimalfield.py +++ b/tests/forms_tests/field_tests/test_decimalfield.py @@ -80,8 +80,9 @@ def test_enter_a_number_error(self): "--0.12", ) for value in values: - with self.subTest(value=value), self.assertRaisesMessage( - ValidationError, "'Enter a number.'" + with ( + self.subTest(value=value), + self.assertRaisesMessage(ValidationError, "'Enter a number.'"), ): f.clean(value) diff --git a/tests/forms_tests/field_tests/test_filefield.py b/tests/forms_tests/field_tests/test_filefield.py index 11388bdc09d..9744981471a 100644 --- a/tests/forms_tests/field_tests/test_filefield.py +++ b/tests/forms_tests/field_tests/test_filefield.py @@ -53,7 +53,8 @@ def test_filefield_1(self): self.assertIsInstance( f.clean( SimpleUploadedFile( - "我隻氣墊船裝滿晒鱔.txt", "मेरी मँडराने वाली नाव सर्पमीनों से भरी ह".encode() + "我隻氣墊船裝滿晒鱔.txt", + "मेरी मँडराने वाली नाव सर्पमीनों से भरी ह".encode(), ) ), SimpleUploadedFile, diff --git a/tests/forms_tests/tests/test_formsets.py b/tests/forms_tests/tests/test_formsets.py index 3c260010c25..f80c1dc09e3 100644 --- a/tests/forms_tests/tests/test_formsets.py +++ b/tests/forms_tests/tests/test_formsets.py @@ -217,9 +217,12 @@ def mocked_func(*args, **kwargs): [("Calexico", "100"), ("Any1", "42"), ("Any2", "101")] ) - with mock.patch( - "django.forms.formsets.ManagementForm.is_valid", mocked_is_valid - ), mock.patch("django.forms.forms.BaseForm.full_clean", mocked_full_clean): + with ( + mock.patch( + "django.forms.formsets.ManagementForm.is_valid", mocked_is_valid + ), + mock.patch("django.forms.forms.BaseForm.full_clean", mocked_full_clean), + ): self.assertTrue(formset.is_valid()) self.assertEqual(is_valid_counter.call_count, 1) self.assertEqual(full_clean_counter.call_count, 4) diff --git a/tests/gis_tests/gdal_tests/test_raster.py b/tests/gis_tests/gdal_tests/test_raster.py index 67108cbb329..a5f1edef0bb 100644 --- a/tests/gis_tests/gdal_tests/test_raster.py +++ b/tests/gis_tests/gdal_tests/test_raster.py @@ -102,8 +102,9 @@ def test_geotransform_bad_inputs(self): ] msg = "Geotransform must consist of 6 numeric values." for geotransform in error_geotransforms: - with self.subTest(i=geotransform), self.assertRaisesMessage( - ValueError, msg + with ( + self.subTest(i=geotransform), + self.assertRaisesMessage(ValueError, msg), ): rsmem.geotransform = geotransform diff --git a/tests/gis_tests/geogapp/tests.py b/tests/gis_tests/geogapp/tests.py index 85656089938..cb783b94653 100644 --- a/tests/gis_tests/geogapp/tests.py +++ b/tests/gis_tests/geogapp/tests.py @@ -1,6 +1,7 @@ """ Tests for geography support in PostGIS """ + import os from django.contrib.gis.db import models diff --git a/tests/gis_tests/test_data.py b/tests/gis_tests/test_data.py index 0a949073208..8dd6042175e 100644 --- a/tests/gis_tests/test_data.py +++ b/tests/gis_tests/test_data.py @@ -2,6 +2,7 @@ This module has the mock object definitions used to hold reference geometry for the GEOS and GDAL tests. """ + import json import os diff --git a/tests/handlers/tests.py b/tests/handlers/tests.py index ab3837d25e0..85f873f3da4 100644 --- a/tests/handlers/tests.py +++ b/tests/handlers/tests.py @@ -244,8 +244,9 @@ def test_no_response(self): ("/no_response_cbv/", "handlers.views.NoResponse.__call__"), ) for url, view in tests: - with self.subTest(url=url), self.assertRaisesMessage( - ValueError, msg % view + with ( + self.subTest(url=url), + self.assertRaisesMessage(ValueError, msg % view), ): self.client.get(url) diff --git a/tests/httpwrappers/tests.py b/tests/httpwrappers/tests.py index 0a41ea5ec63..5f3f195c783 100644 --- a/tests/httpwrappers/tests.py +++ b/tests/httpwrappers/tests.py @@ -352,9 +352,9 @@ def test_long_line(self): h.headers["Content-Disposition"] = 'attachment; filename="%s"' % f # This one is triggering https://bugs.python.org/issue20747, that is Python # will itself insert a newline in the header - h.headers[ - "Content-Disposition" - ] = 'attachment; filename="EdelRot_Blu\u0308te (3)-0.JPG"' + h.headers["Content-Disposition"] = ( + 'attachment; filename="EdelRot_Blu\u0308te (3)-0.JPG"' + ) def test_newlines_in_headers(self): # Bug #10188: Do not allow newlines in headers (CR or LF) diff --git a/tests/invalid_models_tests/test_models.py b/tests/invalid_models_tests/test_models.py index dc52f58c443..f8451ea1e58 100644 --- a/tests/invalid_models_tests/test_models.py +++ b/tests/invalid_models_tests/test_models.py @@ -2027,15 +2027,18 @@ class Meta: self.assertEqual( Model.check(databases=self.databases), - [ - Error( - "'constraints' refers to the nonexistent field 'missing_field'.", - obj=Model, - id="models.E012", - ), - ] - if connection.features.supports_table_check_constraints - else [], + ( + [ + Error( + "'constraints' refers to the nonexistent field " + "'missing_field'.", + obj=Model, + id="models.E012", + ), + ] + if connection.features.supports_table_check_constraints + else [] + ), ) @skipUnlessDBFeature("supports_table_check_constraints") @@ -2381,15 +2384,18 @@ class Meta: self.assertEqual( Model.check(databases=self.databases), - [ - Error( - "'constraints' refers to the nonexistent field 'missing_field'.", - obj=Model, - id="models.E012", - ), - ] - if connection.features.supports_partial_indexes - else [], + ( + [ + Error( + "'constraints' refers to the nonexistent field " + "'missing_field'.", + obj=Model, + id="models.E012", + ), + ] + if connection.features.supports_partial_indexes + else [] + ), ) def test_unique_constraint_condition_pointing_to_joined_fields(self): @@ -2409,15 +2415,17 @@ class Meta: self.assertEqual( Model.check(databases=self.databases), - [ - Error( - "'constraints' refers to the joined field 'parent__age__lt'.", - obj=Model, - id="models.E041", - ) - ] - if connection.features.supports_partial_indexes - else [], + ( + [ + Error( + "'constraints' refers to the joined field 'parent__age__lt'.", + obj=Model, + id="models.E041", + ) + ] + if connection.features.supports_partial_indexes + else [] + ), ) def test_unique_constraint_pointing_to_reverse_o2o(self): @@ -2436,15 +2444,17 @@ class Meta: self.assertEqual( Model.check(databases=self.databases), - [ - Error( - "'constraints' refers to the nonexistent field 'model'.", - obj=Model, - id="models.E012", - ), - ] - if connection.features.supports_partial_indexes - else [], + ( + [ + Error( + "'constraints' refers to the nonexistent field 'model'.", + obj=Model, + id="models.E012", + ), + ] + if connection.features.supports_partial_indexes + else [] + ), ) def test_deferrable_unique_constraint(self): diff --git a/tests/m2m_and_m2o/models.py b/tests/m2m_and_m2o/models.py index 6a5b0b29c98..4cbd1eb4e8c 100644 --- a/tests/m2m_and_m2o/models.py +++ b/tests/m2m_and_m2o/models.py @@ -3,6 +3,7 @@ Make sure to set ``related_name`` if you use relationships to the same table. """ + from django.db import models diff --git a/tests/m2m_intermediary/models.py b/tests/m2m_intermediary/models.py index 1333d14b410..f82498651f6 100644 --- a/tests/m2m_intermediary/models.py +++ b/tests/m2m_intermediary/models.py @@ -9,6 +9,7 @@ field, which specifies the ``Reporter``'s position for the given article (e.g. "Staff writer"). """ + from django.db import models diff --git a/tests/mail/tests.py b/tests/mail/tests.py index 848ee32e9f8..8d51c287b32 100644 --- a/tests/mail/tests.py +++ b/tests/mail/tests.py @@ -1394,8 +1394,9 @@ def test_wrong_admins_managers(self): ): msg = "The %s setting must be a list of 2-tuples." % setting for value in tests: - with self.subTest(setting=setting, value=value), self.settings( - **{setting: value} + with ( + self.subTest(setting=setting, value=value), + self.settings(**{setting: value}), ): with self.assertRaisesMessage(ValueError, msg): mail_func("subject", "content") diff --git a/tests/many_to_many/models.py b/tests/many_to_many/models.py index 541928e94d6..42fc4269904 100644 --- a/tests/many_to_many/models.py +++ b/tests/many_to_many/models.py @@ -6,6 +6,7 @@ In this example, an ``Article`` can be published in multiple ``Publication`` objects, and a ``Publication`` has multiple ``Article`` objects. """ + from django.db import models diff --git a/tests/many_to_one/models.py b/tests/many_to_one/models.py index cca7e798179..56e660592ab 100644 --- a/tests/many_to_one/models.py +++ b/tests/many_to_one/models.py @@ -3,6 +3,7 @@ To define a many-to-one relationship, use ``ForeignKey()``. """ + from django.db import models diff --git a/tests/middleware/test_security.py b/tests/middleware/test_security.py index dd220b8f4c3..339b9181c37 100644 --- a/tests/middleware/test_security.py +++ b/tests/middleware/test_security.py @@ -248,8 +248,9 @@ def test_referrer_policy_on(self): (("strict-origin", "origin"), "strict-origin,origin"), ) for value, expected in tests: - with self.subTest(value=value), override_settings( - SECURE_REFERRER_POLICY=value + with ( + self.subTest(value=value), + override_settings(SECURE_REFERRER_POLICY=value), ): self.assertEqual( self.process_response().headers["Referrer-Policy"], @@ -287,8 +288,11 @@ def test_coop_on(self): """ tests = ["same-origin", "same-origin-allow-popups", "unsafe-none"] for value in tests: - with self.subTest(value=value), override_settings( - SECURE_CROSS_ORIGIN_OPENER_POLICY=value, + with ( + self.subTest(value=value), + override_settings( + SECURE_CROSS_ORIGIN_OPENER_POLICY=value, + ), ): self.assertEqual( self.process_response().headers["Cross-Origin-Opener-Policy"], diff --git a/tests/middleware/tests.py b/tests/middleware/tests.py index 2153a0bb5a6..4771bbe49a2 100644 --- a/tests/middleware/tests.py +++ b/tests/middleware/tests.py @@ -851,9 +851,9 @@ class GZipMiddlewareTest(SimpleTestCase): def setUp(self): self.req = self.request_factory.get("/") self.req.META["HTTP_ACCEPT_ENCODING"] = "gzip, deflate" - self.req.META[ - "HTTP_USER_AGENT" - ] = "Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1" + self.req.META["HTTP_USER_AGENT"] = ( + "Mozilla/5.0 (Windows NT 5.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1" + ) self.resp = HttpResponse() self.resp.status_code = 200 self.resp.content = self.compressible_string diff --git a/tests/migrations/test_commands.py b/tests/migrations/test_commands.py index a9c1cdf8938..c3830eccdbd 100644 --- a/tests/migrations/test_commands.py +++ b/tests/migrations/test_commands.py @@ -3102,9 +3102,11 @@ def test_optimization(self): with open(initial_migration_file) as fp: content = fp.read() self.assertIn( - '("bool", models.BooleanField' - if HAS_BLACK - else "('bool', models.BooleanField", + ( + '("bool", models.BooleanField' + if HAS_BLACK + else "('bool', models.BooleanField" + ), content, ) self.assertEqual( @@ -3131,9 +3133,11 @@ def test_optimization_no_verbosity(self): with open(initial_migration_file) as fp: content = fp.read() self.assertIn( - '("bool", models.BooleanField' - if HAS_BLACK - else "('bool', models.BooleanField", + ( + '("bool", models.BooleanField' + if HAS_BLACK + else "('bool', models.BooleanField" + ), content, ) self.assertEqual(out.getvalue(), "") diff --git a/tests/migrations/test_executor.py b/tests/migrations/test_executor.py index 6232b44b986..571cb3e1a26 100644 --- a/tests/migrations/test_executor.py +++ b/tests/migrations/test_executor.py @@ -405,9 +405,9 @@ def test_custom_user(self): migrations_apps = executor.loader.project_state( ("migrations", "0001_initial"), ).apps - global_apps.get_app_config("migrations").models[ - "author" - ] = migrations_apps.get_model("migrations", "author") + global_apps.get_app_config("migrations").models["author"] = ( + migrations_apps.get_model("migrations", "author") + ) try: migration = executor.loader.get_migration("auth", "0001_initial") self.assertIs(executor.detect_soft_applied(None, migration)[0], True) diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index 670e4c0d37b..18121bd4b65 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -3569,15 +3569,17 @@ def test_rename_index(self): operation.state_forwards(app_label, new_state) # Rename index. expected_queries = 1 if connection.features.can_rename_index else 2 - with connection.schema_editor() as editor, self.assertNumQueries( - expected_queries + with ( + connection.schema_editor() as editor, + self.assertNumQueries(expected_queries), ): operation.database_forwards(app_label, editor, project_state, new_state) self.assertIndexNameNotExists(table_name, "pony_pink_idx") self.assertIndexNameExists(table_name, "new_pony_test_idx") # Reversal. - with connection.schema_editor() as editor, self.assertNumQueries( - expected_queries + with ( + connection.schema_editor() as editor, + self.assertNumQueries(expected_queries), ): operation.database_backwards(app_label, editor, new_state, project_state) self.assertIndexNameExists(table_name, "pony_pink_idx") @@ -4343,9 +4345,10 @@ def test_add_deferred_unique_constraint(self): ) Pony = new_state.apps.get_model(app_label, "Pony") self.assertEqual(len(Pony._meta.constraints), 1) - with connection.schema_editor() as editor, CaptureQueriesContext( - connection - ) as ctx: + with ( + connection.schema_editor() as editor, + CaptureQueriesContext(connection) as ctx, + ): operation.database_forwards(app_label, editor, project_state, new_state) Pony.objects.create(pink=1, weight=4.0) if connection.features.supports_deferrable_unique_constraints: @@ -4404,9 +4407,10 @@ def test_remove_deferred_unique_constraint(self): ) Pony = new_state.apps.get_model(app_label, "Pony") self.assertEqual(len(Pony._meta.constraints), 0) - with connection.schema_editor() as editor, CaptureQueriesContext( - connection - ) as ctx: + with ( + connection.schema_editor() as editor, + CaptureQueriesContext(connection) as ctx, + ): operation.database_forwards(app_label, editor, project_state, new_state) # Constraint doesn't work. Pony.objects.create(pink=1, weight=4.0) @@ -4467,9 +4471,10 @@ def test_add_covering_unique_constraint(self): ) Pony = new_state.apps.get_model(app_label, "Pony") self.assertEqual(len(Pony._meta.constraints), 1) - with connection.schema_editor() as editor, CaptureQueriesContext( - connection - ) as ctx: + with ( + connection.schema_editor() as editor, + CaptureQueriesContext(connection) as ctx, + ): operation.database_forwards(app_label, editor, project_state, new_state) Pony.objects.create(pink=1, weight=4.0) if connection.features.supports_covering_indexes: @@ -4515,9 +4520,10 @@ def test_remove_covering_unique_constraint(self): ) Pony = new_state.apps.get_model(app_label, "Pony") self.assertEqual(len(Pony._meta.constraints), 0) - with connection.schema_editor() as editor, CaptureQueriesContext( - connection - ) as ctx: + with ( + connection.schema_editor() as editor, + CaptureQueriesContext(connection) as ctx, + ): operation.database_forwards(app_label, editor, project_state, new_state) # Constraint doesn't work. Pony.objects.create(pink=1, weight=4.0) diff --git a/tests/model_inheritance/models.py b/tests/model_inheritance/models.py index 47aae186e03..ffb9f28cfa6 100644 --- a/tests/model_inheritance/models.py +++ b/tests/model_inheritance/models.py @@ -11,6 +11,7 @@ Both styles are demonstrated here. """ + from django.db import models # diff --git a/tests/model_inheritance/tests.py b/tests/model_inheritance/tests.py index 5bf1ef5db54..6b005fcef0e 100644 --- a/tests/model_inheritance/tests.py +++ b/tests/model_inheritance/tests.py @@ -216,9 +216,11 @@ def b(): GrandChild().save() for i, test in enumerate([a, b]): - with self.subTest(i=i), self.assertNumQueries(4), CaptureQueriesContext( - connection - ) as queries: + with ( + self.subTest(i=i), + self.assertNumQueries(4), + CaptureQueriesContext(connection) as queries, + ): test() for query in queries: sql = query["sql"] diff --git a/tests/model_inheritance_regress/tests.py b/tests/model_inheritance_regress/tests.py index 1a9f953d6f1..ba31048ac2f 100644 --- a/tests/model_inheritance_regress/tests.py +++ b/tests/model_inheritance_regress/tests.py @@ -1,6 +1,7 @@ """ Regression tests for Model inheritance behavior. """ + import datetime from operator import attrgetter from unittest import expectedFailure diff --git a/tests/null_fk_ordering/models.py b/tests/null_fk_ordering/models.py index adfdbf3bea4..d7b6ad82389 100644 --- a/tests/null_fk_ordering/models.py +++ b/tests/null_fk_ordering/models.py @@ -5,6 +5,7 @@ unexpected results """ + from django.db import models diff --git a/tests/one_to_one/models.py b/tests/one_to_one/models.py index ca459e9edfe..20b2eeec7da 100644 --- a/tests/one_to_one/models.py +++ b/tests/one_to_one/models.py @@ -5,6 +5,7 @@ In this example, a ``Place`` optionally can be a ``Restaurant``. """ + from django.db import models diff --git a/tests/order_with_respect_to/base_tests.py b/tests/order_with_respect_to/base_tests.py index ea548ca076e..5170c6d957e 100644 --- a/tests/order_with_respect_to/base_tests.py +++ b/tests/order_with_respect_to/base_tests.py @@ -2,6 +2,7 @@ The tests are shared with contenttypes_tests and so shouldn't import or reference any models directly. Subclasses should inherit django.test.TestCase. """ + from operator import attrgetter @@ -117,8 +118,11 @@ def db_for_write(self, model, **hints): return "other" with self.settings(DATABASE_ROUTERS=[WriteToOtherRouter()]): - with self.assertNumQueries(0, using="default"), self.assertNumQueries( - 1, - using="other", + with ( + self.assertNumQueries(0, using="default"), + self.assertNumQueries( + 1, + using="other", + ), ): self.q1.set_answer_order([3, 1, 2, 4]) diff --git a/tests/postgres_tests/fields.py b/tests/postgres_tests/fields.py index 1565b5ed439..7c93d2039ed 100644 --- a/tests/postgres_tests/fields.py +++ b/tests/postgres_tests/fields.py @@ -2,6 +2,7 @@ Indirection layer for PostgreSQL-specific fields, so the tests don't fail when run with a backend other than PostgreSQL. """ + import enum from django.db import models diff --git a/tests/postgres_tests/test_constraints.py b/tests/postgres_tests/test_constraints.py index bf478337430..e5a8e9dbe9e 100644 --- a/tests/postgres_tests/test_constraints.py +++ b/tests/postgres_tests/test_constraints.py @@ -300,8 +300,9 @@ def test_invalid_expressions(self): def test_empty_expressions(self): msg = "At least one expression is required to define an exclusion constraint." for empty_expressions in (None, []): - with self.subTest(empty_expressions), self.assertRaisesMessage( - ValueError, msg + with ( + self.subTest(empty_expressions), + self.assertRaisesMessage(ValueError, msg), ): ExclusionConstraint( index_type="GIST", diff --git a/tests/postgres_tests/test_search.py b/tests/postgres_tests/test_search.py index 6f6318899c2..472dca6c7b7 100644 --- a/tests/postgres_tests/test_search.py +++ b/tests/postgres_tests/test_search.py @@ -5,6 +5,7 @@ All text copyright Python (Monty) Pictures. Thanks to sacred-texts.com for the transcript. """ + from django.db.models import F, Value from . import PostgreSQLSimpleTestCase, PostgreSQLTestCase diff --git a/tests/prefetch_related/tests.py b/tests/prefetch_related/tests.py index 08f87d55de1..a418beb5a52 100644 --- a/tests/prefetch_related/tests.py +++ b/tests/prefetch_related/tests.py @@ -1620,8 +1620,9 @@ def test_using_is_honored_custom_qs(self): ) # Explicit using on a different db. - with self.assertNumQueries(1, using="default"), self.assertNumQueries( - 1, using="other" + with ( + self.assertNumQueries(1, using="default"), + self.assertNumQueries(1, using="other"), ): prefetch = Prefetch( "first_time_authors", queryset=Author.objects.using("default") diff --git a/tests/proxy_models/models.py b/tests/proxy_models/models.py index 604136b5ac6..c0277e093fb 100644 --- a/tests/proxy_models/models.py +++ b/tests/proxy_models/models.py @@ -4,6 +4,7 @@ than using a new table of their own. This allows them to act as simple proxies, providing a modified interface to the data from the base class. """ + from django.db import models # A couple of managers for testing managing overriding in proxy model cases. diff --git a/tests/queries/models.py b/tests/queries/models.py index 23c41e33742..9f4cf040b62 100644 --- a/tests/queries/models.py +++ b/tests/queries/models.py @@ -1,6 +1,7 @@ """ Various complex queries that have been problematic in the past. """ + import datetime from django.db import models diff --git a/tests/requests_tests/test_accept_header.py b/tests/requests_tests/test_accept_header.py index c6eed0e4793..5afb9e99932 100644 --- a/tests/requests_tests/test_accept_header.py +++ b/tests/requests_tests/test_accept_header.py @@ -68,9 +68,9 @@ def test_no_headers(self): def test_accept_headers(self): request = HttpRequest() - request.META[ - "HTTP_ACCEPT" - ] = "text/html, application/xhtml+xml,application/xml ;q=0.9,*/*;q=0.8" + request.META["HTTP_ACCEPT"] = ( + "text/html, application/xhtml+xml,application/xml ;q=0.9,*/*;q=0.8" + ) self.assertEqual( [str(accepted_type) for accepted_type in request.accepted_types], [ @@ -94,9 +94,9 @@ def test_request_accepts_none(self): def test_request_accepts_some(self): request = HttpRequest() - request.META[ - "HTTP_ACCEPT" - ] = "text/html,application/xhtml+xml,application/xml;q=0.9" + request.META["HTTP_ACCEPT"] = ( + "text/html,application/xhtml+xml,application/xml;q=0.9" + ) self.assertIs(request.accepts("text/html"), True) self.assertIs(request.accepts("application/xhtml+xml"), True) self.assertIs(request.accepts("application/xml"), True) diff --git a/tests/save_delete_hooks/models.py b/tests/save_delete_hooks/models.py index e7c598aeaed..8b9826eb145 100644 --- a/tests/save_delete_hooks/models.py +++ b/tests/save_delete_hooks/models.py @@ -4,6 +4,7 @@ To execute arbitrary code around ``save()`` and ``delete()``, just subclass the methods. """ + from django.db import models diff --git a/tests/schema/fields.py b/tests/schema/fields.py index 998cb28b8cf..24a26b2c2c0 100644 --- a/tests/schema/fields.py +++ b/tests/schema/fields.py @@ -41,9 +41,11 @@ def __init__( related_name=related_name, related_query_name=related_query_name, limit_choices_to=limit_choices_to, - symmetrical=symmetrical - if symmetrical is not None - else (to == RECURSIVE_RELATIONSHIP_CONSTANT), + symmetrical=( + symmetrical + if symmetrical is not None + else (to == RECURSIVE_RELATIONSHIP_CONSTANT) + ), through=through, through_fields=through_fields, db_constraint=db_constraint, diff --git a/tests/schema/tests.py b/tests/schema/tests.py index 36c6b5e4bf1..a16c4a6bfe0 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -646,9 +646,10 @@ def test_add_field(self): # Add the new field new_field = IntegerField(null=True) new_field.set_attributes_from_name("age") - with CaptureQueriesContext( - connection - ) as ctx, connection.schema_editor() as editor: + with ( + CaptureQueriesContext(connection) as ctx, + connection.schema_editor() as editor, + ): editor.add_field(Author, new_field) drop_default_sql = editor.sql_alter_column_no_default % { "column": editor.quote_name(new_field.name), @@ -2486,9 +2487,10 @@ class Meta: with self.assertRaises(DatabaseError): self.column_classes(new_field.remote_field.through) # Add the field - with CaptureQueriesContext( - connection - ) as ctx, connection.schema_editor() as editor: + with ( + CaptureQueriesContext(connection) as ctx, + connection.schema_editor() as editor, + ): editor.add_field(LocalAuthorWithM2M, new_field) # Table is not rebuilt. self.assertEqual( @@ -2966,9 +2968,11 @@ def test_remove_ignored_unique_constraint_not_create_fk_index(self): ) # Redundant foreign key index is not added. self.assertEqual( - len(old_constraints) - 1 - if connection.features.supports_partial_indexes - else len(old_constraints), + ( + len(old_constraints) - 1 + if connection.features.supports_partial_indexes + else len(old_constraints) + ), len(new_constraints), ) diff --git a/tests/serializers/models/base.py b/tests/serializers/models/base.py index c5a4a0f5802..e4fcee366d5 100644 --- a/tests/serializers/models/base.py +++ b/tests/serializers/models/base.py @@ -4,6 +4,7 @@ ``django.core.serializers`` provides interfaces to converting Django ``QuerySet`` objects to and from "flat" data (i.e. strings). """ + from decimal import Decimal from django.db import models diff --git a/tests/serializers/models/data.py b/tests/serializers/models/data.py index 3d863a3fb2b..a0e8751461a 100644 --- a/tests/serializers/models/data.py +++ b/tests/serializers/models/data.py @@ -4,6 +4,7 @@ NULL values, where allowed. The basic idea is to have a model for each Django data type. """ + import uuid from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation diff --git a/tests/serializers/models/natural.py b/tests/serializers/models/natural.py index 1e439b34ebd..cfc57b11278 100644 --- a/tests/serializers/models/natural.py +++ b/tests/serializers/models/natural.py @@ -1,4 +1,5 @@ """Models for test_natural.py""" + import uuid from django.db import models diff --git a/tests/serializers/test_data.py b/tests/serializers/test_data.py index e1cb776d834..6361dc0c05f 100644 --- a/tests/serializers/test_data.py +++ b/tests/serializers/test_data.py @@ -6,6 +6,7 @@ the serializers. This includes all valid data values, plus forward, backwards and self references. """ + import datetime import decimal import uuid diff --git a/tests/servers/tests.py b/tests/servers/tests.py index ea49c11534f..05898009d53 100644 --- a/tests/servers/tests.py +++ b/tests/servers/tests.py @@ -1,6 +1,7 @@ """ Tests for django.core.servers. """ + import errno import os import socket diff --git a/tests/sessions_tests/models.py b/tests/sessions_tests/models.py index 6eda26f22af..93f80b347d6 100644 --- a/tests/sessions_tests/models.py +++ b/tests/sessions_tests/models.py @@ -3,6 +3,7 @@ real-world applications, it gives you the option of querying the database for all active sessions for a particular account. """ + from django.contrib.sessions.backends.db import SessionStore as DBStore from django.contrib.sessions.base_session import AbstractBaseSession from django.db import models diff --git a/tests/signals/models.py b/tests/signals/models.py index b758244749a..5fb9f9f772c 100644 --- a/tests/signals/models.py +++ b/tests/signals/models.py @@ -1,6 +1,7 @@ """ Testing signals before/after saving and deleting. """ + from django.db import models diff --git a/tests/template_tests/test_parser.py b/tests/template_tests/test_parser.py index e40a5611e21..eb3bb491138 100644 --- a/tests/template_tests/test_parser.py +++ b/tests/template_tests/test_parser.py @@ -2,6 +2,7 @@ Testing some internals of the template processing. These are *not* examples to be copied in user code. """ + from django.template import Library, TemplateSyntaxError from django.template.base import ( FilterExpression, diff --git a/tests/test_client/tests.py b/tests/test_client/tests.py index 402f282588d..bfb0bd98ea9 100644 --- a/tests/test_client/tests.py +++ b/tests/test_client/tests.py @@ -19,6 +19,7 @@ rather than the HTML rendered to the end-user. """ + import copy import itertools import tempfile diff --git a/tests/test_client_regress/tests.py b/tests/test_client_regress/tests.py index 726d1dcf8f1..bd5239ce243 100644 --- a/tests/test_client_regress/tests.py +++ b/tests/test_client_regress/tests.py @@ -1,6 +1,7 @@ """ Regression tests for the Test Client, especially the customized assertions. """ + import itertools import os diff --git a/tests/test_runner/test_discover_runner.py b/tests/test_runner/test_discover_runner.py index 5fc35b7bf21..a845f6dd67d 100644 --- a/tests/test_runner/test_discover_runner.py +++ b/tests/test_runner/test_discover_runner.py @@ -658,9 +658,10 @@ def test_faulthandler_already_enabled(self, mocked_enable): @mock.patch("faulthandler.enable") def test_faulthandler_enabled_fileno(self, mocked_enable): # sys.stderr that is not an actual file. - with mock.patch( - "faulthandler.is_enabled", return_value=False - ), captured_stderr(): + with ( + mock.patch("faulthandler.is_enabled", return_value=False), + captured_stderr(), + ): DiscoverRunner(enable_faulthandler=True) mocked_enable.assert_called() diff --git a/tests/test_runner/tests.py b/tests/test_runner/tests.py index 569fd7e8621..b900ff69ea0 100644 --- a/tests/test_runner/tests.py +++ b/tests/test_runner/tests.py @@ -1,6 +1,7 @@ """ Tests for django test runner """ + import collections.abc import multiprocessing import os @@ -992,17 +993,21 @@ def test_run_checks_raises(self): """ Teardown functions are run when run_checks() raises SystemCheckError. """ - with mock.patch( - "django.test.runner.DiscoverRunner.setup_test_environment" - ), mock.patch("django.test.runner.DiscoverRunner.setup_databases"), mock.patch( - "django.test.runner.DiscoverRunner.build_suite" - ), mock.patch( - "django.test.runner.DiscoverRunner.run_checks", side_effect=SystemCheckError - ), mock.patch( - "django.test.runner.DiscoverRunner.teardown_databases" - ) as teardown_databases, mock.patch( - "django.test.runner.DiscoverRunner.teardown_test_environment" - ) as teardown_test_environment: + with ( + mock.patch("django.test.runner.DiscoverRunner.setup_test_environment"), + mock.patch("django.test.runner.DiscoverRunner.setup_databases"), + mock.patch("django.test.runner.DiscoverRunner.build_suite"), + mock.patch( + "django.test.runner.DiscoverRunner.run_checks", + side_effect=SystemCheckError, + ), + mock.patch( + "django.test.runner.DiscoverRunner.teardown_databases" + ) as teardown_databases, + mock.patch( + "django.test.runner.DiscoverRunner.teardown_test_environment" + ) as teardown_test_environment, + ): runner = DiscoverRunner(verbosity=0, interactive=False) with self.assertRaises(SystemCheckError): runner.run_tests( @@ -1016,18 +1021,22 @@ def test_run_checks_raises_and_teardown_raises(self): SystemCheckError is surfaced when run_checks() raises SystemCheckError and teardown databases() raises ValueError. """ - with mock.patch( - "django.test.runner.DiscoverRunner.setup_test_environment" - ), mock.patch("django.test.runner.DiscoverRunner.setup_databases"), mock.patch( - "django.test.runner.DiscoverRunner.build_suite" - ), mock.patch( - "django.test.runner.DiscoverRunner.run_checks", side_effect=SystemCheckError - ), mock.patch( - "django.test.runner.DiscoverRunner.teardown_databases", - side_effect=ValueError, - ) as teardown_databases, mock.patch( - "django.test.runner.DiscoverRunner.teardown_test_environment" - ) as teardown_test_environment: + with ( + mock.patch("django.test.runner.DiscoverRunner.setup_test_environment"), + mock.patch("django.test.runner.DiscoverRunner.setup_databases"), + mock.patch("django.test.runner.DiscoverRunner.build_suite"), + mock.patch( + "django.test.runner.DiscoverRunner.run_checks", + side_effect=SystemCheckError, + ), + mock.patch( + "django.test.runner.DiscoverRunner.teardown_databases", + side_effect=ValueError, + ) as teardown_databases, + mock.patch( + "django.test.runner.DiscoverRunner.teardown_test_environment" + ) as teardown_test_environment, + ): runner = DiscoverRunner(verbosity=0, interactive=False) with self.assertRaises(SystemCheckError): runner.run_tests( @@ -1041,18 +1050,19 @@ def test_run_checks_passes_and_teardown_raises(self): Exceptions on teardown are surfaced if no exceptions happen during run_checks(). """ - with mock.patch( - "django.test.runner.DiscoverRunner.setup_test_environment" - ), mock.patch("django.test.runner.DiscoverRunner.setup_databases"), mock.patch( - "django.test.runner.DiscoverRunner.build_suite" - ), mock.patch( - "django.test.runner.DiscoverRunner.run_checks" - ), mock.patch( - "django.test.runner.DiscoverRunner.teardown_databases", - side_effect=ValueError, - ) as teardown_databases, mock.patch( - "django.test.runner.DiscoverRunner.teardown_test_environment" - ) as teardown_test_environment: + with ( + mock.patch("django.test.runner.DiscoverRunner.setup_test_environment"), + mock.patch("django.test.runner.DiscoverRunner.setup_databases"), + mock.patch("django.test.runner.DiscoverRunner.build_suite"), + mock.patch("django.test.runner.DiscoverRunner.run_checks"), + mock.patch( + "django.test.runner.DiscoverRunner.teardown_databases", + side_effect=ValueError, + ) as teardown_databases, + mock.patch( + "django.test.runner.DiscoverRunner.teardown_test_environment" + ) as teardown_test_environment, + ): runner = DiscoverRunner(verbosity=0, interactive=False) with self.assertRaises(ValueError): # Suppress the output when running TestDjangoTestCase. diff --git a/tests/transactions/models.py b/tests/transactions/models.py index 9506bace351..3d4c7d7e449 100644 --- a/tests/transactions/models.py +++ b/tests/transactions/models.py @@ -6,6 +6,7 @@ commit-on-success behavior. Alternatively, you can manage the transaction manually. """ + from django.db import models diff --git a/tests/urlpatterns_reverse/tests.py b/tests/urlpatterns_reverse/tests.py index 89dfd0deba4..8384f55b3c5 100644 --- a/tests/urlpatterns_reverse/tests.py +++ b/tests/urlpatterns_reverse/tests.py @@ -1,6 +1,7 @@ """ Unit tests for reverse URL lookups. """ + import pickle import sys import threading diff --git a/tests/urls.py b/tests/urls.py index 7d3a3a790ae..67c4d4091b4 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -3,5 +3,4 @@ This helps the tests remain isolated. """ - urlpatterns = [] diff --git a/tests/utils_tests/test_datastructures.py b/tests/utils_tests/test_datastructures.py index 07229f25ed9..d5d90b68fc0 100644 --- a/tests/utils_tests/test_datastructures.py +++ b/tests/utils_tests/test_datastructures.py @@ -1,6 +1,7 @@ """ Tests for stuff in django.utils.datastructures. """ + import collections.abc import copy import pickle diff --git a/tests/utils_tests/test_jslex.py b/tests/utils_tests/test_jslex.py index ee13eb4d64e..59551930c6f 100644 --- a/tests/utils_tests/test_jslex.py +++ b/tests/utils_tests/test_jslex.py @@ -1,4 +1,5 @@ """Tests for jslex.""" + # originally from https://bitbucket.org/ned/jslex from django.test import SimpleTestCase diff --git a/tests/view_tests/tests/test_debug.py b/tests/view_tests/tests/test_debug.py index 65f9db89bfe..e1d7d296545 100644 --- a/tests/view_tests/tests/test_debug.py +++ b/tests/view_tests/tests/test_debug.py @@ -332,14 +332,19 @@ def test_template_loader_postmortem(self): with tempfile.NamedTemporaryFile(prefix=template_name) as tmpfile: tempdir = os.path.dirname(tmpfile.name) template_path = os.path.join(tempdir, template_name) - with override_settings( - TEMPLATES=[ - { - "BACKEND": "django.template.backends.django.DjangoTemplates", - "DIRS": [tempdir], - } - ] - ), self.assertLogs("django.request", "ERROR"): + with ( + override_settings( + TEMPLATES=[ + { + "BACKEND": ( + "django.template.backends.django.DjangoTemplates" + ), + "DIRS": [tempdir], + } + ] + ), + self.assertLogs("django.request", "ERROR"), + ): response = self.client.get( reverse( "raises_template_does_not_exist", kwargs={"path": template_name} From 414dda184fd6f60fd3af5c20c0ed8defee8fbdda Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Fri, 26 Jan 2024 12:59:07 +0100 Subject: [PATCH 48/67] [5.0.x] Ignored 0379e7532fdf3212b1fe22a58826109c23009be3 formatting changes in git blame. --- .git-blame-ignore-revs | 1 + 1 file changed, 1 insertion(+) diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index bf8b701ed23..ade61ab75da 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -1,3 +1,4 @@ +0379e7532fdf3212b1fe22a58826109c23009be3 ca88caa1031c0de545d82de8d90dcae0e03651fb c5cd8783825b5f6384417dac5f3889b4210b7d08 9c19aff7c7561e3a82978a272ecdaad40dda5c00 From 3cc35aafabb1523c39332ee83e769b085ed3d923 Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Sun, 28 Jan 2024 17:11:18 +0100 Subject: [PATCH 49/67] [5.0.x] Updated translations from Transifex. --- django/conf/locale/af/LC_MESSAGES/django.mo | Bin 24608 -> 27068 bytes django/conf/locale/af/LC_MESSAGES/django.po | 25 +- django/conf/locale/ckb/LC_MESSAGES/django.mo | Bin 33473 -> 34047 bytes django/conf/locale/ckb/LC_MESSAGES/django.po | 24 +- django/conf/locale/es/LC_MESSAGES/django.mo | Bin 29266 -> 29242 bytes django/conf/locale/es/LC_MESSAGES/django.po | 14 +- django/conf/locale/hu/LC_MESSAGES/django.mo | Bin 29185 -> 29197 bytes django/conf/locale/hu/LC_MESSAGES/django.po | 15 +- django/conf/locale/mn/LC_MESSAGES/django.mo | Bin 24783 -> 33282 bytes django/conf/locale/mn/LC_MESSAGES/django.po | 247 ++++--- django/conf/locale/mr/LC_MESSAGES/django.mo | Bin 1591 -> 27608 bytes django/conf/locale/mr/LC_MESSAGES/django.po | 656 ++++++++++-------- django/conf/locale/uz/LC_MESSAGES/django.mo | Bin 27466 -> 26443 bytes django/conf/locale/uz/LC_MESSAGES/django.po | 139 ++-- .../conf/locale/zh_Hans/LC_MESSAGES/django.mo | Bin 26598 -> 26927 bytes .../conf/locale/zh_Hans/LC_MESSAGES/django.po | 22 +- .../admin/locale/af/LC_MESSAGES/django.mo | Bin 17249 -> 17407 bytes .../admin/locale/af/LC_MESSAGES/django.po | 3 +- .../admin/locale/ckb/LC_MESSAGES/django.mo | Bin 21719 -> 22877 bytes .../admin/locale/ckb/LC_MESSAGES/django.po | 36 +- .../admin/locale/ckb/LC_MESSAGES/djangojs.mo | Bin 6604 -> 7671 bytes .../admin/locale/ckb/LC_MESSAGES/djangojs.po | 63 +- .../admin/locale/mn/LC_MESSAGES/django.mo | Bin 14812 -> 22236 bytes .../admin/locale/mn/LC_MESSAGES/django.po | 135 +++- .../admin/locale/mr/LC_MESSAGES/django.mo | Bin 468 -> 21488 bytes .../admin/locale/mr/LC_MESSAGES/django.po | 520 +++++++++----- .../admin/locale/sw/LC_MESSAGES/django.mo | Bin 17415 -> 17698 bytes .../admin/locale/sw/LC_MESSAGES/django.po | 17 +- .../admin/locale/uz/LC_MESSAGES/django.mo | Bin 4610 -> 4634 bytes .../admin/locale/uz/LC_MESSAGES/django.po | 74 +- .../locale/zh_Hans/LC_MESSAGES/django.mo | Bin 16506 -> 16917 bytes .../locale/zh_Hans/LC_MESSAGES/django.po | 21 +- .../locale/zh_Hans/LC_MESSAGES/djangojs.mo | Bin 5052 -> 5715 bytes .../locale/zh_Hans/LC_MESSAGES/djangojs.po | 33 +- .../admindocs/locale/af/LC_MESSAGES/django.mo | Bin 2514 -> 3063 bytes .../admindocs/locale/af/LC_MESSAGES/django.po | 11 +- .../admindocs/locale/mn/LC_MESSAGES/django.mo | Bin 7607 -> 7108 bytes .../admindocs/locale/mn/LC_MESSAGES/django.po | 35 +- .../auth/locale/ckb/LC_MESSAGES/django.mo | Bin 9295 -> 9710 bytes .../auth/locale/ckb/LC_MESSAGES/django.po | 10 +- .../auth/locale/mr/LC_MESSAGES/django.mo | Bin 468 -> 10430 bytes .../auth/locale/mr/LC_MESSAGES/django.po | 221 ++++-- .../locale/mr/LC_MESSAGES/django.mo | Bin 468 -> 1004 bytes .../locale/mr/LC_MESSAGES/django.po | 23 +- .../flatpages/locale/af/LC_MESSAGES/django.mo | Bin 2279 -> 2282 bytes .../flatpages/locale/af/LC_MESSAGES/django.po | 6 +- .../flatpages/locale/mr/LC_MESSAGES/django.mo | Bin 468 -> 2040 bytes .../flatpages/locale/mr/LC_MESSAGES/django.po | 42 +- .../gis/locale/mn/LC_MESSAGES/django.mo | Bin 2346 -> 2323 bytes .../gis/locale/mn/LC_MESSAGES/django.po | 16 +- .../gis/locale/mr/LC_MESSAGES/django.mo | Bin 468 -> 510 bytes .../gis/locale/mr/LC_MESSAGES/django.po | 28 +- .../humanize/locale/mn/LC_MESSAGES/django.mo | Bin 6020 -> 4863 bytes .../humanize/locale/mn/LC_MESSAGES/django.po | 193 ++---- .../humanize/locale/mr/LC_MESSAGES/django.mo | Bin 468 -> 1506 bytes .../humanize/locale/mr/LC_MESSAGES/django.po | 307 ++++---- .../postgres/locale/ckb/LC_MESSAGES/django.mo | Bin 2994 -> 3414 bytes .../postgres/locale/ckb/LC_MESSAGES/django.po | 12 +- .../postgres/locale/mr/LC_MESSAGES/django.mo | Bin 0 -> 1132 bytes .../postgres/locale/mr/LC_MESSAGES/django.po | 97 +++ .../redirects/locale/mr/LC_MESSAGES/django.mo | Bin 468 -> 1530 bytes .../redirects/locale/mr/LC_MESSAGES/django.po | 34 +- .../sessions/locale/mr/LC_MESSAGES/django.mo | Bin 468 -> 768 bytes .../sessions/locale/mr/LC_MESSAGES/django.po | 19 +- .../sites/locale/mr/LC_MESSAGES/django.mo | Bin 468 -> 884 bytes .../sites/locale/mr/LC_MESSAGES/django.po | 19 +- docs/releases/5.0.2.txt | 3 +- 67 files changed, 1930 insertions(+), 1190 deletions(-) create mode 100644 django/contrib/postgres/locale/mr/LC_MESSAGES/django.mo create mode 100644 django/contrib/postgres/locale/mr/LC_MESSAGES/django.po diff --git a/django/conf/locale/af/LC_MESSAGES/django.mo b/django/conf/locale/af/LC_MESSAGES/django.mo index efb8b0fd9ec3c08286ea0c031d575e8cf32a5977..8b37fdb3fb67343b1dba75f3c0afa947c22ef8d8 100644 GIT binary patch delta 9471 zcmbW+33ycHy~ptrNCWY0D)jq1=MANO)cf3f9{+sa_dV}9?|R-r zec-vY{fE<1?>9-m%i@}mW?5};M_tQ0NIJi{N-e7=g>meK6L1Hr-f8}5i*@;92zJGR z7{Wog9b4fMyaLZ)JFLeadcGS{p0dXK2`gxBti}u~++%#exXbtp<5SpydV8@3zKitR zI)>@^Cv1Qx%>6I04*9=gZM=wCv~SgJ?>E>AYjL9;HpN_2#X-hV=Kht~gz}kK4;@p! z9GN_8C1&D{*bLVrZCMXsC;YX!e?s?D6nsiT4X4@a5sjjH+6wie9PEbOOnwfk{zBAD zg|IO$MNRoCX3W<^ zxDSWoHMw*Gw_y<;L2bSk46`N9G%iKWbcY~5*pzc z)S6vmZUjv}jCClFVO^}m`goHm-;8SbUR;!BSwF?w$Y1DgS-bJpeE+?J3;dZIfpsaL zhjcJy1xe^LT8g8w0(sVY8r7kbsF8eX{1P>SZ%{Lq!8FLas1aqM>bEfYcBuE{ntXS2 zzc<#^_dl3K11gL)&hllf>4Qw^{??=tR4phe;Ms2>`ru-nPV=toK z^D6R>^|s3O{b%&>H(`C$N!A{jH7f_%_|`PkXXc_d-_599e;;b|9z}hwr;OhkvwHgF z9Z((XgEkID4PYUrwDt}OjdZoSaU-fD>v1q{H03YjIP!;(f2>x$*cUhvS$1n5j=~c- z3A^<6e>38!8F&V@_Rpifn%8LoLG?TbRo)#n)qPC)0L&sk z0>|QX9FJR3Q~f^bxsOpxdzJj4QDd-itHwIh>14`E7P^DK5mtXU)cO>raUk$)6f zPU}tVgAGUe2hk{0hgaiGX_j>ZR+6tZnnMWJU^c#jZSf@XrCI4?{DWx_GO5-oY>E5E zF#k#%qCgLPf^9H!tbf*bG8Uok&&Ld`Fs?GLHQs96h@Gf+Cu&CbA^o-XV>%u{?THss zrov&=E`J-fMt??as!uQjzeastY2*CzI;ea$s(wdfK57s3LoL|^RJ}Q<18AYihp{#J z)N&HdNvubW{6SOU0Jb3ilF1)Keb0YEHF(ze4fZ0RG2S1*0Mz}FsLy#4YIDy)&0rXH zFs;Kb`u-mxp$A?;P0eA{OdLgx{5a|bAEP?-4QhluyRjC2gsbs0yayxftTmW9$^T2~t+g z#xuxjStF+Szm~V4M*bSM!c(ZVPoK(+)4tV=L@xGH0nS79+(j+TEvN_YLrvYUupPdR zdhzF|=Nizuc7Hci{c*;{SVDd!F2X;dX0m8H^WUAs91@!H8!!{soBS43L)%eHu^(gj zJl4kEGyEwXf(^)zKs`Sdd*WQwjIKj{1shF%GwOXmnZf!yB<`m`FHGkYkquB4TA)VM z2KAzW=KgS#pJ4LSjPp@z8$fj=f;G{_>-hdw;u`X2XZcI%&Sw7AQ0qDVl(k2_U?6Hn zMx#EPDabNgS78s_iP}tWq3XSh>i7whKaG0tIpeqHe$Bal$Lga7)GS3p6|+$<=zw~0 zH&dYpYHItVIyS~Q4b|`hV+i#V8&qn4)bLjU~e zkLuWDRQ+kFfy_nk-~ShpP=gL?CYG5B6{rqek6MCt#tqns{ARRq530czk&iV_Ma|GWlTQUm=z*oiWyT6r1FKLkSc4kjZKxM)Mve4dRK5F+4;gnE zA2mL1e9E}TH)TC-3J#!N{5)!xzG})38;_tGe9z?H$8_??QD4tTn2led4yYy$KhZcG zDYD9qZ(xG_fD-+fvHp*dSVBQ|DLWl+LRQ79Nnt-M#eujT^_R)FaTwMM`}v8eU4A`k zCiY?)>RWF{;vv+PuR^XP1RsiZ1^HjozI6w2FYzL=i)h7--=Q{+uKvVu;(wGe7iX6B z-$asFYRam4oP>U+8JG7TrK-!wB4-+=|zhZ6TyRL&2PNhyR z(b7~{ff+s^9<=l$d=&nCCpasL4JAtHo!{R4!q6Fyez5fW@@ zt1Fee6Cax!ok<@vX)%uc0E`n&Nnc5v)(tL~7*4(nyAydt7WuBYpSYR$fOw4fJ<)`F zoscW#{V*uCTYqr1C#F%Mj+gU)!3LApHNd!>bW4-&;@$E860(N$pNSrXu8l-%VuCVU zqkXI|G3uqw`qwiz8sSvpH^f*P=wcd~jyfCCiBdvWPs(=Sb3`WbJn_Ajs%}EEy?5r+8z4IBO1#uhk zUxcn~>NX;BNY5o|lJ?qvnarESvqWR!=R_}VhHy0M+T!E=x0`9CD~a>OJ;Y>Fhotov z;w2@xz9MQ6^N8OPcN4mLQ2%Y5qV_Y%)Fksc(TZq7%p!C>P5g(K^8fh5W$BTo(KgtC z@^{R=>+nWm6fxG6-Dhk}-EpK}G5NY_X8tE}qmaT2#5Kfw#4ySR5xUYb+fQ0E@LFOD zWxa_)LcbG#BXl(->Jw*)pAn~sB4P|-6BhM<0<(!H)&4Jth7^9+HIVW|^b+M>p=XNbl#^X-ZU92({j3pCx zEM8q4jk&h7GMsP=s~*m7lhL?*nOkW`$lHNv$UeU2zAe2bH^0JB@$og=?Qp^#7lr7Q z2{#@tcBxLsow!}R#3?SLUxoHWZ>%f`gJm$qPCV+QLUte+OS&`^t_T!Y<}(dUd4#o! z2HbE3%|*gxOi6$jMl|+ILuZ$N+cXDqgye07LJDsmIdOhMk4Gwi9*Y7)Ls%` zY&2TJQpVWqf_U&u`P zO=~^=v4;YBlea~get#=!vUrqNCD`V6u+m?o6;4nKrOC;+gY1;3KH3!lCZ1~As&vhN zgF0z;X~KdtuQ92p5lU`r{FQ-ERhhdrH+NDk~ zo(z|%dm3)_-1B|@@bTb3mKq6RZkKtW9CJGpHnG-M9@k2dF zb8}fU|8z*i%5_3G)MO3Zc#L;dXtt>DHNmQe96J~Zgc6lDTP759Qc(_%>M5Y9SiDrz zA7lS{$3}opGaSmlG|EfIhqHps6pJOk|M;i~$L&N}po|sdz_l4)$nnk(w%rOw%<4^y zrs!Oh?m9Xdv}Ka&Um(n6lsX|NP^N>5Oqh?VI`c0x#mQ|mJqZS+CPU#D9Tm^`{I4DYCjle)}y7lIxI@O zj{iV6t6rYGujZ^#{=%_5`n;%ajtgb;wdeKil(FEt9V;(o<7oEH$E9OoTa?e)iInmi z7*ValsvD-yt(~GW->*M&eg`#wm$npTq&yJN zVt8M(Iz)GL!)w-_zyfPqdWTDnme-qtgj1G`bC`wQ1ivI~h-fSn<~O)}%k--TX8Hp! KtU541nE7`hRw9G| delta 7223 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 diff --git a/django/conf/locale/af/LC_MESSAGES/django.po b/django/conf/locale/af/LC_MESSAGES/django.po index 405b9f64818..cbd7abfedc4 100644 --- a/django/conf/locale/af/LC_MESSAGES/django.po +++ b/django/conf/locale/af/LC_MESSAGES/django.po @@ -358,15 +358,15 @@ msgstr "Gee ’n geldige e-posadres." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" -"Gee ’n geldige “slak” in wat bestaan ​​uit letters, syfers, onderstreep of " +"Gee ’n geldige “slak” wat bestaan ​​uit letters, syfers, onderstreep of " "koppelteken." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" -"Gee ’n geldige “slak” in wat bestaan ​​uit Unicode-letters, syfers, " -"onderstreep of koppelteken." +"Gee ’n geldige “slak” wat bestaan ​​uit Unicode-letters, syfers, onderstreep " +"of koppelteken." msgid "Enter a valid IPv4 address." msgstr "Gee ’n geldige IPv4-adres." @@ -846,6 +846,8 @@ 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 kon nie in die tydsone %(current_timezone)s vertolk word nie; " +"dit is dalk dubbelsinnig, of bestaan dalk nie." msgid "Clear" msgstr "Maak skoon" @@ -1186,12 +1188,19 @@ msgid "" "required for security reasons, to ensure that your browser is not being " "hijacked by third parties." msgstr "" +"U sien hierdie boodskap omdat dié HTTPS-werf vereis dat u webblaaier ’n " +"“Referer header” moet stuur, maar dit is nie gestuur nie. Hierdie header is " +"vir sekuriteitsredes nodig om te verseker dat u blaaier nie deur derde " +"partye gekaap is nie." 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 "" +"As “Referer headers” in u blaaier gedeaktiveer is, heraktiveer hulle asb. " +"ten minste vir dié werf, of vir HTTPS-verbindings, of vir “same-origin”-" +"versoeke." msgid "" "If you are using the tag or " @@ -1200,6 +1209,11 @@ msgid "" "If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Indien u die -etiket gebruik " +"of die “Referrer-Policy: no-referrer” header gebruik, verwyder hulle asb. " +"Die CSRF-beskerming vereis die “Referer” header om streng kontrole van die " +"verwysende bladsy te doen. Indien u besorg is oor privaatheid, gebruik " +"alternatiewe soos vir skakels na derdepartywebwerwe." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1214,6 +1228,8 @@ 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 "" +"Indien koekies in u blaaier gedeaktiveer is, aktiveerder hulle asb. ten " +"minste vir dié werf, of vir “same-origin”-versoeke." msgid "More information is available with DEBUG=True." msgstr "Meer inligting is beskikbaar met DEBUG=True." @@ -1255,6 +1271,7 @@ msgstr "Geen %(verbose_name)s gevind vir die soektog" msgid "Page is not “last”, nor can it be converted to an int." msgstr "" +"Bladsy is nie “last” nie, en dit kan nie omgeskakel word na ’n heelgetal nie." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1262,7 +1279,7 @@ msgstr "Ongeldige bladsy (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Leë lys en “%(class_name)s.allow_empty” is vals." msgid "Directory indexes are not allowed here." msgstr "Gidsindekse word nie hier toegelaat nie." diff --git a/django/conf/locale/ckb/LC_MESSAGES/django.mo b/django/conf/locale/ckb/LC_MESSAGES/django.mo index ca3d949bce562d31ba9e4788a64cc3c58a20a7e8..cf41a447ecde4122b491f355385323f33f344a87 100644 GIT binary patch delta 7893 zcmaLcd3+Vs-N*5hkc|)$5&~h*HINNMSOdrsWEF@&1cI!}79bRYBmtp_qgDb*X`~=( zi$YaI$%8}YYvq+w4fwLY!-dUq?IlHu*obP_1)O?VT&Z#yAphL-jj|{O>;Gqd&S1&h>=> zcnvPYR#<~=@Cfq1`-l%6ADSGj_gu1{as5yY1sIMc<_hz6^KP>eucF@u48>=Val2q#mI>rZl+o0MzVgh!?CO8mPKMGkq zmyeM+4HIz=YUV4j6W)(%-;aqNnb*na1oaq)XHX+OkLvgxcE(Vqt8y3A(&nI!8;hDi z0mkDrYhR23%H^1bkE14Z40Zl@(bIt+kkN@g!DjdsY6Y&KPS`xfKQI+zDQBbl55#mF zhB|H$YR0Qk7utwA{}$A(co?-eYETpTEQR$iBlCAE?!$QA#DSQ?C~|QoYBO%bBy2D*qE@y^hI4JPEpiFhCxi7@#WX53<6BYp_SaV4 zYCeNn@W)L>Q5mp|JI_?IXic?V6_4ZiiMbv?Z zP%}J=x_4)-{+yLBpayaoqcJqgxfpDUs&9k3a3{Pe#JLQtpuDz=b5CPDqtwJ+L(cEH zBV@FM$51CciyG;9Y=W0@D28=)j%&J+sDYKC`u);9co}bF%J8q2A*g26H!Y& z-Rfte`W4}DT#47=%Q>vSmO8Sxf5Ldwy>5*On2u`ihZ@*0E9ar!8wIHTOHl*zFb3D6 zj=vZ6I6scTTY(x_NFV=v;T{fOLV1{sMVNvW z$ZES?$To0iP;bnHzWxi$%O|6mEJl4#S6~uuM_&JKKWfCMQA_+G>cZzxo9;X|#}>TU z)h`n@p)O{QIS_T;;i!HykcoJ178xz^0@MsjP$$@cQ}6-Q5??@FSUXKC5RO`*7)-+i zY>n5TmVN?i56#0WT#CA|?t`uuhQa4QmW&z_@iMl;qZrROO+CJky6`^MO*4H7b%EpN zS@W{lgl{6XcQCu7jvI!0+9q55LaFC}wRPBl+U46(9iO%O!)62O#D7EW=FmaD38>>z zFcy2FE;t0$e-i2`Dnd>4cJnUuR8ejfm1dQ>(Y(+6y}8wV1hpr2pjN2H>i3w>quvku zt^H-Ie;xId92w-i;5|P#^?!={(BYB%l#Ff|; zkD>O&kC=(6L;W8fLD7l(TOl3b=@Wr%bC#QiiZ=PfY}dyeqmg!iD{Tu&ig zTm$OGm3$q8!G+inpF>^X6za<=cBKCcsUNC58`ZB0Q}7v&OeC2T=6mK@^Gov*>RtZ> zHp0%M{9n7-sHdPCYWMfHaz1J=Ofm~GnQ|HGskj$)3%qS)QpxN>9dO+I0JW*kqedLU zbX#F6s$VXueT$E@}-yeCu@cy@oMdm6jq(dbJ2Y}I( zL$3FYLG9)w)Qqx_yWy@!?UhZ)ljuIj7|a;sAD4qsl&?iS6{9e~_1$zb9jI81dPP2H z9gblO${(Oc{4H`@UBp=bjX4(6DKA8wcq7K*7SzD1aX7w-nn<&8yhHFRJb?}PDA#vS z=ksF#3vS?In9kP!2pdoEe>{GP=P2j0#TR4e0_SGo1E{CrJJdiXGkq=b9jG6tJ8%%b zhAg6MbR)CJao8R=pr-?OlgYr7s1sblEKHs3J03L?4}0K2%*M;u1=FYazkCXC8RgF~ z6K|gC-;xS!L-`EG;`gXq6FrUfPa~7Wv!;8Ti@(KDn1l_erMrj$44dxX`&67uxgY9; z+fcV)H|jil%>#HV<)f&3KAh!J`()H{b7rvqnt2Ho8qpS1$0w}g3)b-vYLA>i4eV=F zznGi+>R2M@A>C!FG5U7vjg5i{s|_ zD^P_R;5IAovhs_l3%qINdMp1GwQ`rNK7!@a@y$^y6+k^jUZyqVqE3{D?Qtr$#1*I$ z-Ge&8A5aHAiEWwT0o0y3UFf%m&GU^%9oGRh)2^6|LofnoBki6mBBKlc5{F_1>Ox0R zoAVUvo`ufmD-@ezZyb+TV+CpxK8v^GM^>J_z<-=Kp!yv^4d5#?wnzix{%4cXb3Zs( z;an+dM&%fRyHEqF#c+HDwW$uF2A0eHT7#qTMtmEqG5r_*m)LQdZGFqbhQC}X_n1-iO0}C(qSEvuBP#%HmUxd+k8)~3ytz3ng>F-b%-iNng?h=0@ zFJKhqBj~jt^A4HT_zAYfkX!rIFqff`uo zQhzTr##qX2Py^3g%KGa9y{OOkNV@|{| zlpjN0e(oY>;^$0yRA}jcL@iB^GJlEtqh>G`2Veo}aovbvSdE%d z4QhZdp$7a0YSW#31T~;_sDW-q&1k39KW`pH9d{gc+(+g=tUYdZ@cf=@M@AjfQ6ue(xbOVE=dAq=45j`gY9jTh>wJtF&?St~^WTKGhGx?^?pxwx;=j`f4*G=3rr3&jko*MeG>Eb;#5{s2o6nuZLZS<81;i!tzajb&B){wX zej#`t8C)>s&{?T~_-iod{{_-O>f?z1)UjuS-Mo9J8@8zq$Hvp<^4EG6{K(? zmAc*`Tz?&fF%)!Af)5cn#5ctK#7o5Q38e`k-2aYbP7{w2%{b^VZY3@fRm6>i9y_H|#2ds6 zVzOQQ*W{J{*C+Tnkk27jPPTrr=6LFR5^abD+JAh@x=u7Uw+=0F0Cn|*QWoVq{cP~_ zJwBHaZLI%I zK82KviM_;J;sl}el~3^VAAD{n^yQ;8%8osve6YsjxJ*1rTtnSp)IVB9WU zp3Dn4h4_s43o)PQL?~_caj#%DeU;79~SuM*I))Hc?94LF^*FC-fud zYvKm_zpVTJCWTaDH_^>b-U4r@+?L2CW)XvkpVBbeCtBe(vlbgu|0q5~j3ZVPa|oq6 zBA|?=tLWP#gtNwzQOd(GKkGVJ-Q$!elJ7-SkY7XOlm9c`Lp)piWV`NRNrlB_C9@U< z@|Km%Eh=3Q$e6ICWL9xeX6;`BE5oN|1xm|im6R0~&kxKiS+Y2gnz3Zwywbw5%+jnt zVfOs&pH-x0ET6TgXztB?E-UP=EFd0kDQ zer-dQG7Xy>);DZEwX}}=Gix^&&kc`iSYP)?6>GmPJsSHjz~|z8 delta 7482 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 diff --git a/django/conf/locale/ckb/LC_MESSAGES/django.po b/django/conf/locale/ckb/LC_MESSAGES/django.po index af7fef26d7f..0d78c77e4b9 100644 --- a/django/conf/locale/ckb/LC_MESSAGES/django.po +++ b/django/conf/locale/ckb/LC_MESSAGES/django.po @@ -5,14 +5,14 @@ # Bawar Jalal, 2020-2021 # Bawar Jalal, 2020 # kosar tofiq , 2020-2021 -# Swara , 2022-2023 +# Swara , 2022-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-25 06:49+0000\n" -"Last-Translator: Swara , 2022-2023\n" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2024-01-12 06:49+0000\n" +"Last-Translator: Swara , 2022-2024\n" "Language-Team: Central Kurdish (http://app.transifex.com/django/django/" "language/ckb/)\n" "MIME-Version: 1.0\n" @@ -55,7 +55,7 @@ msgid "Catalan" msgstr "کاتالانی" msgid "Central Kurdish (Sorani)" -msgstr "" +msgstr "کوردی" msgid "Czech" msgstr "چیکی" @@ -297,6 +297,9 @@ msgstr "تاتاری" msgid "Udmurt" msgstr "ئودمورتی" +msgid "Uyghur" +msgstr "ئۆیغور" + msgid "Ukrainian" msgstr "ئۆکرانی" @@ -393,6 +396,15 @@ msgstr "دڵنیاببە ئەم نرخە گەورەترە یاخود یەکسا msgid "Ensure this value is a multiple of step size %(limit_value)s." msgstr "دڵنیابە کە ئەم بەهایە چەندانێکە لە قەبارەی هەنگاوی%(limit_value)s." +#, 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 "" +"دڵنیابە ئەم بەهایە چەند هێندەیەکی قەبارەی هەنگاوەکانە %(limit_value)s, " +"دەستپێدەکات لە %(offset)s، بۆ نموونە %(offset)s، %(valid_value1)s، " +"%(valid_value2)s، هتد." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -504,7 +516,7 @@ msgid "String (up to %(max_length)s)" msgstr "ڕیزبەند (تا %(max_length)s)" msgid "String (unlimited)" -msgstr "" +msgstr "ڕیز(بێسنوور)" msgid "Comma-separated integers" msgstr "ژمارە تەواوەکان بە کۆما جیاکراونەتەوە" diff --git a/django/conf/locale/es/LC_MESSAGES/django.mo b/django/conf/locale/es/LC_MESSAGES/django.mo index d95011b09bcad99706dce20d37b72b7b21724de1..f84b5336745b47b61617180820b20eaa524e6de4 100644 GIT binary patch delta 2839 zcmXZd3rv+|9LMqJsHjIxyy68xUS+$0GtCX~ z5;o0KE$M~}CwL3G*|glet)=l@*Z_nf`%JAB=@ z|9+eBR-bc^(w$r6oZI|@bK~$a_Q1@s&h^B(I1<-j01xBScnAAoVut5997wzbQ!rxj zNmRcF*dLQJor}VWnJ(N^m|_((%sew6ljvB4&2TG{uPehASb^>FU2ETmt%*N14`4L$ zG1P>ouqB?uu6Qvs>|84f_o(pWzt*AIi_Uc>_G4R&Lk*CMZSYBKjl;1UreiP6MJ2ov zHPJ5Yf)Ug_wb%*kQO}4s{ zBr5SUsKhT@{Wa`B{JR-`NI?U(%km~lL~U7rRE8sP5C%~XF2nA)0hQPuvkJ9iH8>1^ zKqc%O@7zK3;}vYc0~nd$+yEcvpEJ?9cn-DnC02wVOmdDt_f@uYpJDXN&W*yO_#8Hx zBPMe!#H%p@D^WXk1XJ)V>M}N3oI1rzJR4)FFKm+Y-#|eFMNntgfQfhwwUVf*-WHEW zo$)+#9fpYa;578{PvcBSO}renLm#1bqS~xQ^{ZFR{O&S^6?g-+^|NxkGhB$;>ZPcG zw%~BwflZeOn-gC`P4Js}6Z47hT0CvK_xx;Bzxmi17hzbJrIdnv8+BRAP!sILCvYz+ zv1(Kz^{9zY;Bt=a6jl%iXK+k-0rh%r&$YJzyAwxH&mXb+?{hi-wp9E?1^2@Jg1T&d zXL=o{p%TeMCAPrg5{p-wYf&pJH8-OcRAKGAtbQ+Qyeez|a;Clihp12@U!zuh3YF<4 z>v+TB+xRi{|De8*yJvY5*P#+@K&|{ZYN8)eTYVn2W4BQKZleM^B@%A zLJS>ZQJDs?D~>^J;dJbVA=H+wLT&L|=6cl1Hep9BL*1nhF$4d^HaP4x@A)9=h_kR0 z_s_jTK@%6DCR}Z<$5`TbupNG4^|h#-YCwI<&tq@AiAucHJnyXIP>Cg)sTf846l%O@ zuqE@mpfzNn63A8q&anCrY6S(Dgo{ykVH>94Q5=fbQ6H?>eD8}n6%&ZdF%b`79R7?w z@jiw%V03|(aR6Hq55*QZ3j5#~)YcYYb6kb$w+5rI6qVp6?2Fq_{f?me)uS%mag4{) zsJHEI0sH?tg@;yAFyEVa32NY#r~%eu8m`Aw+>hGoi>Qh3;dXq8O1x}=SHA=Gd<2zH zmFj(5R=h%7SIGWfrBF#0dT>pVH}N`DywTiZmYF+H3BG4W%zf7Wg;`_PS^F{bTU25v z!W8@zPGc*)XdSMax6D7x`>4bkQP2H{dd|PlTX9EZfvy*7#qnm6nQW$+{()8qlppF6 z8`fryp+-Ybu$CM%7d7-8R0<)h&&T$}g{V)^D(r)0n2fc^xwv1Eb9NcU{Ayq|Qst6M zy!wg~H`Xnq;t>^m&fMZf-n~A9>BOzy;HAOwI2ucF2!4knuo1Q9p*1JE?j9I7F|;&P zv>=qwFIX5VE+|PDJFlpyWJT(LgutM{;F`+d<7VX>Gvdn+X5^PgXZEfcnHiJzKMpW~ A#sB~S delta 2877 zcmXZedu+~E9LMofdRNp_cS9?sn02bUt%m8CR!2?EC2fbQ;+fvmT>8g6o7jzQsXWLc zC1SHB#h41~GfUXAk&(1>S-YF1riojYVYb92_WtzuP2_oXmp&i7n?zY1LmJ9j1Q z&_A((y0La6ATa3^rprcFuNgI6iGI!Y7H}!xU`9 zRBXc$7@y=VCA()uBHoU=nu04AcNw7>n5$jrrII3-K{rg-W;< zHBJNe#1LwpCiGzo>iO#dYq*0MRNS|QG|r(n@i>gZS*QUDQ3IA>$I;+W;vf#kM%2WY zQHfteC4SfH?_)f1rx!f~2^2J7GHRks)Rs*~WjGs0V-f1X53n!pLiImpo&?%YvK!ZvKhBN&?D+^8_lzcSCcK^$t`Ojd+nz2qGK+)uMOUrfn&ZUSDwN$8vH zIU5HOZ^cABjM}mDn1a_)m(TaI7iXao_u~NE&>`o)i-HCUq0X)qlkh%jB?ISpTRabS z#;=<@u$cH5&c%NGXq+n4#2=z|=xfwYoHCnG{aO?=zq?CeEj~nT{pxw%8NP+e_z`n#G)br=9{`W%8zY7&tsNi0>zfqTM zLXp?80+q-*RAO&h{Eo%7=62K$)R~{47PQ~m8?3$&HQq^U|Dnj<{~xJPB0r;6+>Xlh zj&*!!ari5IgsAU^`a&K>P27x1uoboPOQ?zdL~Zp=)Q-6YUcYcug0TS#&rs-r8YmZg zVLs}Mw;ZS73LJ)qP!qRcBHlu-jq@$E+l>Q=H=z3MLLJ?gsPRvu7S@a-G4P8uL@e?$ z?TT7S5-P(KR3fREg=whvRmdyuYH%!mhp*v1)Dc$lYVfUbyKx8JFyCJ6jhj@`@g)to z;S_q)Asv-zE@}q~P+M4qeXs_V&=%Ade`M}Nt!xkWzGv&8#k&q6(4ggW99 z^l|^(N(!2IBWl8}=1$aBeu{DUjny}y&a@TvEx(C_@ewNV!KL0=XP^?xG_x>*cp7TF znHb6ZuE-inPzm_efYnxCgR#T`9Dl> zr0T=Ctk_1}{3`o@nZjYR(1Y8`yoq<9;@#$6v)(+2O7MsoGEZ3h_vRV1+1f9fzoHUr zn@=Hz!c~mI+t%Tp>B_x{BF#8dVm{P!eNfLOp;kNsS)dymyw-C-Kx=-U8adU>HS^4T zb1rIx0@TQ*R$pnZLXEr@l|hZwug7l08&DtlEtrh;aK^y>HHYT}+%9iK_J33aWn;bcr)$^SHQ2|kB)n1R3Hv*@e#7Mh1jbb46BxnA2+ z)8|zCOUn{xlrHgC6eo^fUF|O~U0j@zmNscwd9lANwWP9q;;6(iqsNSXf}gZe{G>N* hobs?!ur|AU@X?^S;O6Z3;J)mFpfAVQ&^sr2, 2021 # mpachas , 2022 # monobotsoft , 2012 +# Natalia (Django Fellow), 2024 # ntrrgc , 2013 # ntrrgc , 2013 # Pablo, 2015 @@ -46,15 +47,16 @@ msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 06:49+0000\n" -"Last-Translator: Uriel Medina , 2020-2021,2023\n" +"PO-Revision-Date: 2024-01-12 06:49+0000\n" +"Last-Translator: Natalia (Django Fellow), 2024\n" "Language-Team: Spanish (http://app.transifex.com/django/django/language/" "es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? " +"1 : 2;\n" msgid "Afrikaans" msgstr "Africano" @@ -1203,7 +1205,7 @@ msgstr ", " #, python-format msgid "%(num)d year" msgid_plural "%(num)d years" -msgstr[0] "%(num)d años" +msgstr[0] "%(num)d año" msgstr[1] "%(num)d años" msgstr[2] "%(num)d años" @@ -1238,8 +1240,8 @@ msgstr[2] "%(num)d horas" #, python-format msgid "%(num)d minute" msgid_plural "%(num)d minutes" -msgstr[0] "%(num)d minutos" -msgstr[1] "%(num)d minutes" +msgstr[0] "%(num)d minuto" +msgstr[1] "%(num)d minutos" msgstr[2] "%(num)d minutos" msgid "Forbidden" diff --git a/django/conf/locale/hu/LC_MESSAGES/django.mo b/django/conf/locale/hu/LC_MESSAGES/django.mo index 621965a691502672aaf17f9a586671ec2f571282..f55eb626b48eba934ee472ff97e832190233b013 100644 GIT binary patch delta 2943 zcmXZedvwor9LMp`Zta4Z4o+oK zoI0!4PA4fkJEM+{<90^5oLrjI>EJ{q4tDf>?fd@6jW-Li3;ER+??#O~ zX!$c3LVSCi^EWsCv&17aFwGkfhTRz$iGi4moYxJ+U>uBXaG3RHU^wvXm8gmJsFEGWme^?dJE$jqfU(#z-MOKdgz;E}T6i;Rot>yB z{>a>qdh%*)kN(3no}qCTH6io`Z=onuJOumWC{#t3Vmn-q5%?i$!%wjVeub%c81;^u za3cmyaIOZo;9EFmqH~wo-<_t>M4~3cxySg$Bc#!gM>rkzik3CUe&@E+&;kcA9xq}K49;|}C-y;=dMaw- z64a%94_D#0xCK)JpyB7(9o5y}N&`;~{E+z?Zy%VW|Gr z7>*q*j>RD2UbsELxkTJad~~LB-{HJj-oawBJY!K6>w&63I_e-(vv~h1(JT_|?ebBj zJB-@k4(dR6Q3rX5niw?OizCcv)VNL-`z($(lTh;pm?@~rjhapUweUC+y3Lc!S*Vld zp(ZZ0{1V(tT#4;4ZjLuD#T<wW*}*qeAZrr|nli>FZYuVWj$kF7Bx+p`nu!Fr?C^Y^#JJk*3D)CpIh zPPhj3)B7flzzvo^fqG?UaX2Qwl8P~$#Ey~1kb%X0^iqPfVIy?ilh-ZE5$UdJfz zpW8%38&{!9Q)3>)c;b50!Z%SH-9x?8$JQUkx7LGr2$&D z`h9d{(Fnnn*b-NxHr$A+z*f{NIb`|M<~h^>FQT6Gchp9=P!$L-@E)j@*%o8TcScoo zcmeg-B}pTp-+_IojcZW{I)I^g7=8F7_QXF>@33{Dw{bVDB2GYUd;*`qGv;~Jx>qnf zfUg4^iT^61{x@kfyyD&Rx&_|GM^F=fHcwiCWb%_i#)EcWhL zII3dNeoMrdaTrQRk~zpswf?cFjV4(<-ONUnv=CK+a?}BqS-jG$G}oH`H)v?!+vdCG zHggy1K)Ws8kJ_Nxtg-yp7)bu0?Cpb90JwD#}NcmM%{!Eh|V(@Fn+4 z9#Fe^bVEqYwaO3T;uq$WnqO`2OdU1VKd2K~{mrg;M^;NYy=BEY* XWN!I2zad~+ZFRxqh~R6LpSb@4@cEXI delta 2931 zcmXZedu+~E9LMqVXsb6{>9lhzy`x9KMS$@omf+X5&piCXf$UybCq% zJIi0gFye>9T%e)xk0oB1^=4R(b14jr#zxo;*{{pQQ0#%tFx&d`Fp_u_HpU6~CQic$ zEJe**icN84PQdHfNFs{FHq-;EFcuG?9#D;X;1!I(TJty5o8CoLEHu}-cGwm*t{*nX zVW|02Q0vUZa4Zd2#}XVw;v>|=v#64Nk4^B7XMn1*3_UYw3u#Jx}zDaJVb7^83tYQfzYjR&wF22p4H zH&)_vJdW!|IQKdB9_id|)^`_aye6@KlymjCH{ZEJIhtd@m&nVyonxHK!Mn)yaNWjw zrCy53#M@D&K8>k(4ZGpL7N-_?70N>$QAtA_aPA8ldcYCXn_tKF_yRj%;yAC=IjD*A zP?vH8uEL|Z88g_m?!tM@#6K_^BJs@Wy4B*{Jb@FcNc7pIZTH!C9#F=Ay@Y=#dp2J6k3Y2Jq0p`I5=vqT|k!c^1_7ov8! z4E3uwfCKPT%h#Ze>@xPnzQv1C8(NRL6Pr*K+J+jp19gOZkT1_2L5k)=W_tM|)VvZ@h03rg_s^}N zp@p}h&V0Z5HKq}tL_PQpYM}?HGkt3PVSH=tiPKScq7Xx{7@9o}HKE$9vHT^AuUh=0c?-4RZHw=s=07l>SpR<*LH;$W zVvPeOUZSbl62s|8HanS_*54bo&|r&)n+2$nPC->*4r&9%7B4g_%w=X^B@GSy#9U); zFe_0T+G6oe)B;uJKFc4(M&yrL{y6HZI)SNp0d-mb!k!pCpHG|n=LYe!jKncqiz%gE zdP5jlD{f*(Ap;UC#- z7yLbLeR}7CrL)Rvs>&0``^)_0T?iO(d=;DPX4m=_2T#oz9Tl3M Hp6>n!r7ev= diff --git a/django/conf/locale/hu/LC_MESSAGES/django.po b/django/conf/locale/hu/LC_MESSAGES/django.po index 54dd7ef6cad..117789e33e3 100644 --- a/django/conf/locale/hu/LC_MESSAGES/django.po +++ b/django/conf/locale/hu/LC_MESSAGES/django.po @@ -4,6 +4,7 @@ # Akos Zsolt Hochrein , 2018 # András Veres-Szentkirályi, 2016-2021,2023 # Attila Nagy <>, 2012 +# Balázs Meskó , 2024 # Balázs R, 2023 # Dóra Szendrei , 2017 # Istvan Farkas , 2019 @@ -17,8 +18,8 @@ msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 06:49+0000\n" -"Last-Translator: András Veres-Szentkirályi, 2016-2021,2023\n" +"PO-Revision-Date: 2024-01-12 06:49+0000\n" +"Last-Translator: Balázs Meskó , 2024\n" "Language-Team: Hungarian (http://app.transifex.com/django/django/language/" "hu/)\n" "MIME-Version: 1.0\n" @@ -286,13 +287,13 @@ msgid "Telugu" msgstr "Telugu" msgid "Tajik" -msgstr "tadzsik" +msgstr "Tádzsik" msgid "Thai" msgstr "Thai" msgid "Turkmen" -msgstr "türkmén" +msgstr "Türkmén" msgid "Turkish" msgstr "Török" @@ -304,7 +305,7 @@ msgid "Udmurt" msgstr "Udmurt" msgid "Uyghur" -msgstr "ujgur" +msgstr "Ujgur" msgid "Ukrainian" msgstr "Ukrán" @@ -339,7 +340,7 @@ msgstr "Szindikáció" #. Translators: String used to replace omitted page numbers in elided page #. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. msgid "…" -msgstr "..." +msgstr "…" msgid "That page number is not an integer" msgstr "Az oldalszám nem egész szám." @@ -491,7 +492,7 @@ msgstr "Már létezik %(model_name)s ilyennel: %(field_labels)s." #, python-format msgid "Constraint “%(name)s” is violated." -msgstr "\"%(name)s\" kényszer megsértve." +msgstr "„%(name)s” megszorítás megsértve." #, python-format msgid "Value %(value)r is not a valid choice." diff --git a/django/conf/locale/mn/LC_MESSAGES/django.mo b/django/conf/locale/mn/LC_MESSAGES/django.mo index 06071c937ba416e0cf934bda3e4cf20a831e43ac..c35a525c44e3157b5540837dbd84eba58d01520c 100644 GIT binary patch literal 33282 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
f=ae6G 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 K6mg6^68sm(6ElPW delta 7974 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 TS#UzpmMEv+Qi@N_Cr&tG1 diff --git a/django/conf/locale/mn/LC_MESSAGES/django.po b/django/conf/locale/mn/LC_MESSAGES/django.po index d846523da56..47479f8f698 100644 --- a/django/conf/locale/mn/LC_MESSAGES/django.po +++ b/django/conf/locale/mn/LC_MESSAGES/django.po @@ -7,6 +7,7 @@ # Jannis Leidel , 2011 # jargalan , 2011 # Tsolmon , 2011 +# Turmunkh Batkhuyag, 2023 # Zorig, 2013-2014,2016,2018 # Zorig, 2019 # Анхбаяр Анхаа , 2013-2016,2018-2019 @@ -16,10 +17,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-09-27 22:40+0200\n" -"PO-Revision-Date: 2019-11-05 07:28+0000\n" -"Last-Translator: Анхбаяр Анхаа \n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-25 06:49+0000\n" +"Last-Translator: Turmunkh Batkhuyag, 2023\n" +"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" "mn/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,6 +34,9 @@ msgstr "Африк" msgid "Arabic" msgstr "Араб" +msgid "Algerian Arabic" +msgstr "Алжир Араб" + msgid "Asturian" msgstr "Астури" @@ -57,6 +61,9 @@ msgstr "Босни" msgid "Catalan" msgstr "Каталан" +msgid "Central Kurdish (Sorani)" +msgstr "Төв Курд (Сорани)" + msgid "Czech" msgstr "Чех" @@ -156,6 +163,9 @@ msgstr "Interlingua" msgid "Indonesian" msgstr "Индонези" +msgid "Igbo" +msgstr "Игбо" + msgid "Ido" msgstr "Идо" @@ -186,6 +196,9 @@ msgstr "Канад" msgid "Korean" msgstr "Солонгос" +msgid "Kyrgyz" +msgstr "Киргиз" + msgid "Luxembourgish" msgstr "Лүксенбүргиш" @@ -207,6 +220,9 @@ msgstr "Монгол" msgid "Marathi" msgstr "маратхи" +msgid "Malay" +msgstr "Малай" + msgid "Burmese" msgstr "Бирм" @@ -270,9 +286,15 @@ msgstr "Тамил" msgid "Telugu" msgstr "Тэлүгү" +msgid "Tajik" +msgstr "Тажик" + msgid "Thai" msgstr "Тайланд" +msgid "Turkmen" +msgstr "Турк хүн" + msgid "Turkish" msgstr "Турк" @@ -282,6 +304,9 @@ msgstr "Татар" msgid "Udmurt" msgstr "Удмурт" +msgid "Uyghur" +msgstr "Уйгур" + msgid "Ukrainian" msgstr "Украйн" @@ -312,6 +337,11 @@ msgstr "Статик файлууд" 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]. +msgid "…" +msgstr "…" + msgid "That page number is not an integer" msgstr "Хуудасны дугаар бүхэл тоо / Integer / биш байна" @@ -337,11 +367,15 @@ msgstr "Зөв имэйл хаяг оруулна уу" msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" +"Үсэг, тоо, доогуур зураас эсвэл зурааснаас бүрдсэн хүчинтэй \"slug\" оруулна " +"уу." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " "hyphens." msgstr "" +"Юникод үсэг, тоо, доогуур зураас, зурааснаас бүрдсэн хүчинтэй \"slug\" " +"оруулна уу." msgid "Enter a valid IPv4 address." msgstr "Зөв IPv4 хаяг оруулна уу. " @@ -369,6 +403,20 @@ msgstr "Энэ утга %(limit_value)s -с бага эсвэл тэнцүү б msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "Энэ утга %(limit_value)s -с их эсвэл тэнцүү байх нөхцлийг хангана уу." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" +"Утга нь алхамын хэмжээнд %(limit_value)s-ээс олон байхыг " +"баталгаажуулна уу." + +#, 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 "" +"Энэ утга нь алхмын хэмжээнд %(limit_value)s, %(offset)s-с эхлэн %(offset)s, " +"%(valid_value1)s, %(valid_value2)s гэх мэт утга байхыг баталгаажуулна уу." + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -425,6 +473,8 @@ msgid "" "File extension “%(extension)s” is not allowed. Allowed extensions are: " "%(allowed_extensions)s." msgstr "" +"Файлын өргөтгөл “%(extension)s” зөвшөөрөгдөөгүй байна. Боломжит өргөтгөлүүд: " +"%(allowed_extensions)s." msgid "Null characters are not allowed." msgstr "Хоосон тэмдэгт зөвшөөрөгдөхгүй." @@ -436,6 +486,10 @@ msgstr "ба" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(field_labels)s талбар бүхий %(model_name)s аль хэдийн орсон байна." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "“%(name)s” хязгаарлалтыг зөрчсөн." + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "%(value)r буруу сонголт байна." @@ -450,8 +504,8 @@ msgstr "Энэ хэсэг хоосон байж болохгүй." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "%(field_label)s-тэй %(model_name)s-ийг аль хэдийнэ оруулсан байна." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -465,11 +519,11 @@ msgstr "Талбарийн төрөл нь : %(field_type)s" #, python-format msgid "“%(value)s” value must be either True or False." -msgstr "" +msgstr "\"“%(value)s” утга True эсвэл False байх ёстой.\"" #, python-format msgid "“%(value)s” value must be either True, False, or None." -msgstr "" +msgstr "“%(value)s” утга True, False, эсвэл None байх ёстой." msgid "Boolean (Either True or False)" msgstr "Boolean (Үнэн худлын аль нэг нь)" @@ -478,6 +532,9 @@ msgstr "Boolean (Үнэн худлын аль нэг нь)" msgid "String (up to %(max_length)s)" msgstr "Бичвэр (%(max_length)s хүртэл)" +msgid "String (unlimited)" +msgstr "Тэмдэг мөр (хязгааргүй)" + msgid "Comma-separated integers" msgstr "Таслалаар тусгаарлагдсан бүхэл тоо" @@ -486,12 +543,15 @@ msgid "" "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD " "format." msgstr "" +"“%(value)s” утга нь буруу огнооны форматтай байна. Энэ нь YYYY-MM-DD " +"форматтай байх ёстой." #, python-format msgid "" "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid " "date." msgstr "" +"“%(value)s” утга зөв (YYYY-MM-DD) форматтай байна, гэхдээ буруу огноо байна." msgid "Date (without time)" msgstr "Огноо (цаггүй)" @@ -501,19 +561,23 @@ msgid "" "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[." "uuuuuu]][TZ] format." msgstr "" +"“%(value)s” утга буруу форматтай байна. Энэ нь YYYY-MM-DD HH:MM[:ss[.uuuuuu]]" +"[TZ] форматтай байх ёстой." #, 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” утгын формат зөв байна (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) " +"гэхдээ буруу огноо/цаг байна." msgid "Date (with time)" msgstr "Огноо (цагтай)" #, python-format msgid "“%(value)s” value must be a decimal number." -msgstr "" +msgstr "“%(value)s” утга нь бодит тоо байх ёстой." msgid "Decimal number" msgstr "Аравтын бутархайт тоо" @@ -523,6 +587,8 @@ msgid "" "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[." "uuuuuu] format." msgstr "" +"“%(value)s” утга буруу форматтай байна. Энэ нь [DD] [[HH:]MM:]ss[.uuuuuu] " +"форматтай байх ёстой." msgid "Duration" msgstr "Үргэлжлэх хугацаа" @@ -542,7 +608,7 @@ msgstr "Хөвөгч таслалтай тоо" #, python-format msgid "“%(value)s” value must be an integer." -msgstr "" +msgstr "“%(value)s” утга нь бүхэл тоо байх ёстой." msgid "Integer" msgstr "Бүхэл тоо" @@ -550,6 +616,9 @@ msgstr "Бүхэл тоо" msgid "Big (8 byte) integer" msgstr "Том (8 байт) бүхэл тоо" +msgid "Small integer" +msgstr "Бага тоон утна" + msgid "IPv4 address" msgstr "IPv4 хаяг" @@ -558,11 +627,14 @@ msgstr "IP хаяг" #, python-format msgid "“%(value)s” value must be either None, True or False." -msgstr "" +msgstr "\"“%(value)s” утга нь None, True эсвэл False байх ёстой.\"" msgid "Boolean (Either True, False or None)" msgstr "Boolean (Үнэн, худал, эсвэл юу ч биш)" +msgid "Positive big integer" +msgstr "Эерэг том бүхэл тоо" + msgid "Positive integer" msgstr "Бүхэл тоох утга" @@ -573,9 +645,6 @@ msgstr "Бага бүхэл тоон утга" msgid "Slug (up to %(max_length)s)" msgstr "Слаг (ихдээ %(max_length)s )" -msgid "Small integer" -msgstr "Бага тоон утна" - msgid "Text" msgstr "Текст" @@ -584,12 +653,16 @@ msgid "" "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] " "format." msgstr "" +"“%(value)s” утга буруу форматтай байна. Энэ нь HH:MM[:ss[.uuuuuu]] форматтай " +"байх ёстой." #, python-format msgid "" "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an " "invalid time." msgstr "" +"“%(value)s” утга зөв форматтай байна (HH:MM[:ss[.uuuuuu]]) гэхдээ буруу цаг " +"байна." msgid "Time" msgstr "Цаг" @@ -602,7 +675,7 @@ msgstr "Бинари өгөгдөл" #, python-format msgid "“%(value)s” is not a valid UUID." -msgstr "" +msgstr "“%(value)s” нь хүчинтэй UUID биш." msgid "Universally unique identifier" msgstr "UUID" @@ -613,6 +686,12 @@ msgstr "Файл" msgid "Image" msgstr "Зураг" +msgid "A JSON object" +msgstr "JSON объект " + +msgid "Value must be valid JSON." +msgstr "JSON утга байх боломжтой." + #, python-format msgid "%(model)s instance with %(field)s %(value)r does not exist." msgstr "%(field)s %(value)r утгатай %(model)s байхгүй байна." @@ -705,6 +784,9 @@ msgstr "Бүрэн утга оруулна уу." msgid "Enter a valid UUID." msgstr "Зөв UUID оруулна уу." +msgid "Enter a valid JSON." +msgstr "JSON-ийн бүтцээр оруулна уу." + #. Translators: This is the default suffix added to form field labels msgid ":" msgstr ":" @@ -713,20 +795,26 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Нууц талбар%(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "УдирдахФормын мэдээлэл олдсонгүй эсвэл өөрчлөгдсөн байна" +#, 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 "" +"ManagementForm-ын өгөгдөл дутуу эсвэл өөрчилсөн байна. Дутуу талбарууд: " +"%(field_names)s. Хэрэв асуудал хэвээр байвал та алдааны тайлан гаргах " +"шаардлагатай байж магадгүй." #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "%d ихгүй форм илгээн үү" -msgstr[1] "%d ихгүй форм илгээн үү" +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "Та хамгийн ихдээ %(num)d форм илгээнэ үү." +msgstr[1] "Та хамгийн ихдээ %(num)d форм илгээнэ үү." #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "%d эсвэл их форм илгээнэ үү" -msgstr[1] "%d эсвэл их форм илгээнэ үү" +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "Та хамгийн багадаа %(num)d форм илгээнэ үү." +msgstr[1] "Та хамгийн багадаа %(num)d форм илгээнэ үү." msgid "Order" msgstr "Эрэмбэлэх" @@ -763,13 +851,15 @@ msgstr "Зөв сонголт хийнэ үү. Энэ утга сонголто #, python-format msgid "“%(pk)s” is not a valid value." -msgstr "" +msgstr "“%(pk)s” нь шаардлага хангаагүй утга байна." #, 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 нь %(current_timezone)s цагийн бүсэд хөрвүүлэх боломжгүй байна; " +"энэ нь хоёрдмол утгатай эсвэл байхгүй байж болно." msgid "Clear" msgstr "Цэвэрлэх" @@ -789,15 +879,7 @@ msgstr "Тийм" msgid "No" msgstr "Үгүй" -msgid "Year" -msgstr "Жил" - -msgid "Month" -msgstr "Сар" - -msgid "Day" -msgstr "Өдөр" - +#. Translators: Please do not add spaces around commas. msgid "yes,no,maybe" msgstr "тийм,үгүй,магадгүй" @@ -1071,43 +1153,40 @@ msgid ", " msgstr ", " #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d жил" -msgstr[1] "%d жил" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d жил" +msgstr[1] "%(num)d жил" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d сар" -msgstr[1] "%d сар" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d сар" +msgstr[1] "%(num)d сар" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d долоо хоног" -msgstr[1] "%d долоо хоног" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d долоо хоног" +msgstr[1] "%(num)d долоо хоног" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d өдөр" -msgstr[1] "%d өдөр" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d өдөр" +msgstr[1] "%(num)d өдөр" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d цаг" -msgstr[1] "%d цаг" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d цаг" +msgstr[1] "%(num)d цаг" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минут" -msgstr[1] "%d минут" - -msgid "0 minutes" -msgstr "0 минут" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d минут" +msgstr[1] "%(num)d минут" msgid "Forbidden" msgstr "Хориотой" @@ -1117,24 +1196,34 @@ msgstr "CSRF дээр уналаа. Хүсэлт таслагдсан." 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 " +"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 "" +"Та энэ мэдэгдлийг харж байгаа нь таны веб хөтөчөөс 'Referer header'-ийг " +"HTTPS хуудасд илгээх шаардлагатай байгаатай холбоотой. Энэ нь гуравдагч " +"этгээдээс хамгаалахын тулд шаардлагатай." 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 "" +"Хэрвээ та веб хөтөчөө 'Referer' толгойг идэвхигүй болгосон бол энэ хуудас, " +"HTTPS холболт эсвэл '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." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"Хэрвээ та таг ашиглаж " +"байгаа бол эсвэл 'Referrer-Policy: no-referrer' толгойг нэмсэн бол, " +"эдгээрийг устгана уу. CSRF хамгаалалт 'Referer' толгойг чанд шалгалт хийхийг " +"шаарддаг. Хэрвээ та аюулгүй байдлыг чухалчилж байгаа бол гуравдагч сайтыг " +"холбохдоо ашиглана уу." msgid "" "You are seeing this message because this site requires a CSRF cookie when " @@ -1149,6 +1238,8 @@ 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 "" +"Хэрвээ та веб хөтөчийн \"cookies\"-г хаасан бол энэ хуудас эсвэл 'same-" +"origin' хүсэлтэнд зориулж идэвхижүүлнэ үү." msgid "More information is available with DEBUG=True." msgstr "DEBUG=True үед дэлгэрэнгүй мэдээлэл харах боломжтой." @@ -1183,13 +1274,14 @@ msgstr "" #, python-format msgid "Invalid date string “%(datestr)s” given format “%(format)s”" msgstr "" +"Буруу огноо. '%(datestr)s' огноо '%(format)s' хэлбэрт тохирохгүй байна." #, python-format msgid "No %(verbose_name)s found matching the query" msgstr "Шүүлтүүрт таарах %(verbose_name)s олдсонгүй " msgid "Page is not “last”, nor can it be converted to an int." -msgstr "" +msgstr "Хуудас \"сүүлчийн\" биш бөгөөд үүнийг int болгон хувиргах боломжгүй." #, python-format msgid "Invalid page (%(page_number)s): %(message)s" @@ -1197,7 +1289,7 @@ msgstr "Буруу хуудас (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." -msgstr "" +msgstr "Хоосон жагсаалт ба “%(class_name)s.allow_empty” нь False байна." msgid "Directory indexes are not allowed here." msgstr "Файлын жагсаалтыг энд зөвшөөрөөгүй." @@ -1210,8 +1302,8 @@ msgstr "“%(path)s” хуудас байхгүй байна." msgid "Index of %(directory)s" msgstr "%(directory)s ийн жагсаалт" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Джанго: Чанартай бөгөөд хугацаанд нь хийхэд зориулсан Web framework." +msgid "The install worked successfully! Congratulations!" +msgstr "Амжилттай суулгалаа! Баяр хүргэе!" #, python-format msgid "" @@ -1222,26 +1314,23 @@ msgstr "" "%(version)s/releases/\" target=\"_blank\" rel=\"noopener\">тэмдэглэл харах " -msgid "The install worked successfully! Congratulations!" -msgstr "Амжилттай суулгалаа! Баяр хүргэе!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Таний тохиргооны файл дээр DEBUG=TRUE гэж тохируулсан мөн URLs дээр тохиргоо хийгээгүй учраас " -"энэ хуудасыг харж байна." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=TRUE гэж тохируулсан мөн URLs дээр тохиргоо " +"хийгээгүй учраас энэ хуудасыг харж байна." msgid "Django Documentation" msgstr "Джанго баримтжуулалт" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "Сэдэв, лавлахууд болон зааврууд" msgid "Tutorial: A Polling App" msgstr "Хичээл: Санал асуулга App" diff --git a/django/conf/locale/mr/LC_MESSAGES/django.mo b/django/conf/locale/mr/LC_MESSAGES/django.mo index 46c9f342103c63ad23acec72862430d52d00074f..8cf9a708eacb3eb997ddab3c01825a262d3adfa3 100644 GIT binary patch literal 27608 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 F{vXubaRC4T delta 877 zcmYk3&ubGw6vrpFscl+oOk%XD(T!S)gp|ZKwgyB?lzM28+CUL{nTFM@-R_p%K(rt& zf{3Vy4y7OkdzgTrhz9&|kV221L{Ri3<3aEb@ZiCN-?!O<58ixc-hAi1H#6V92Hy58 ze~+}UGT1)&0r+S5A^5!j23Y3~#%S6Fwu9YZ7Z?URzyuftQ(!lk2SeaExD%Z8Sq4cz z3+@IhAo46T*B9IXgV?wQlJKq{e*{v&$9`ObqCB+97f)Gzw8+EoLjCK?MsH1bZ3qmSGi?~hkfy& zYZ=@U!NlRIBCm0iTdcUGSE}qR1a6g`v#yvP-9_EuR?TJ;y0ZY)grn>8tfXHvD%{eh z7hCde&giCF6_MQe<0mt@Tqc{>vf0A$SUL*}O>(!EDI=R}@|x`ww2OSfaBQt)JKWS= z@gS$Q)$4W9%x!kGt{^ss2gH$)De-%xf3R^|$)=K&wg> 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." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" +"तुम्ही जोडणी वापरत असल्यास किंवा \"रेफरर-पॉलिसी: नो-रेफरर\" हेडर समाविष्ट करत " +"असल्यास, कृपया ते काढून टाका. CSRF संरक्षणासाठी \"रेफरर\" हेडर कठोर रेफरर तपासणी करणे " +"आवश्यक आहे. तुम्हाला गोपनीयतेबद्दल काळजी वाटत असल्यास, तृतीय-पक्ष स्थळाच्या दुव्यासाठी सारखे पर्याय वापरा." 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 "" +"तुम्हाला हा संदेश दिसत आहे कारण अर्ज सुपूर्त करताना या स्थळाला CSRF कुकी आवश्यक आहे. तुमचा " +"ब्राउझर तृतीय पक्षांकडून हायजॅक केला जात नाही याची खात्री करण्यासाठी ही कुकी " +"सुरक्षिततेच्या कारणांसाठी आवश्यक आहे." 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 "" +"किमान या साइटसाठी किंवा \"समान-मूळ\" विनंत्यांसाठी, कृपया अक्षम केलेल्या ब्राउझर कुकीज " +"पुन्हा सक्षम करा." msgid "More information is available with DEBUG=True." -msgstr "" +msgstr "अधिक माहिती DEBUG=True सह उपलब्ध आहे." msgid "No year specified" -msgstr "" +msgstr "कोणतेही वर्ष नमूद केलेले नाही" msgid "Date out of range" -msgstr "" +msgstr "पल्ल्याच्या बाहेरची दिनांक" msgid "No month specified" -msgstr "" +msgstr "कोणताही महिना निर्दिष्ट केलेला नाही" msgid "No day specified" -msgstr "" +msgstr "कोणताही दिवस निर्दिष्ट केलेला नाही" msgid "No week specified" -msgstr "" +msgstr "कोणताही आठवडा निर्दिष्ट केलेला नाही" #, python-format msgid "No %(verbose_name_plural)s available" -msgstr "" +msgstr "कोणतेही %(verbose_name_plural)s उपलब्ध नाहीत" #, python-format msgid "" @@ -1149,64 +1214,67 @@ msgstr "" #, python-format msgid "No %(verbose_name)s found matching the query" -msgstr "" +msgstr "क्वेरीसह जुळणारे कोणतेही %(verbose_name)s सापडले नाही" msgid "Page is not “last”, nor can it be converted to an int." msgstr "" #, python-format msgid "Invalid page (%(page_number)s): %(message)s" -msgstr "" +msgstr "अवैध पान (%(page_number)s): %(message)s" #, python-format msgid "Empty list and “%(class_name)s.allow_empty” is False." msgstr "" msgid "Directory indexes are not allowed here." -msgstr "" +msgstr "डिरेक्टरी निर्देशकांना येथे परवानगी नाही." #, python-format msgid "“%(path)s” does not exist" -msgstr "" +msgstr "“%(path)s” अस्तित्वात नाही" #, python-format msgid "Index of %(directory)s" -msgstr "" +msgstr "%(directory)s चे निर्देशांक" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "" +msgid "The install worked successfully! Congratulations!" +msgstr "इंस्टॉलेशनने यशस्वीरित्या कार्य केले! अभिनंदन!" #, python-format msgid "" "View release notes for Django %(version)s" msgstr "" - -msgid "The install worked successfully! Congratulations!" -msgstr "" +"डिजांगो %(version)s साठी प्रदर्शित संदेश पहा" #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" +"तुम्ही हे पान पाहत आहात कारण तुमच्या सेटिंग्ज फाइलमध्ये DEBUG=True आहे आणि तुम्ही कोणतीही URL कॉन्फिगर केलेली नाही." msgid "Django Documentation" -msgstr "" +msgstr "जांगो दस्तऐवजीकरण" msgid "Topics, references, & how-to’s" -msgstr "" +msgstr "विषय, संदर्भ, आणि कसे करावे" msgid "Tutorial: A Polling App" -msgstr "" +msgstr "शिकवणी: मतदान अ‍ॅप" msgid "Get started with Django" -msgstr "" +msgstr "जॅंगो सोबत सुरवात करा" msgid "Django Community" -msgstr "" +msgstr "जॅंगो समुदाय" msgid "Connect, get help, or contribute" -msgstr "" +msgstr "जोडा, मदत मिळवा किंवा हातभार लावा" diff --git a/django/conf/locale/uz/LC_MESSAGES/django.mo b/django/conf/locale/uz/LC_MESSAGES/django.mo index 57f89e8f9306f73df275c9a56b278ec0522a8740..b003df83ef1d6d407d932a793cb838869b54eedf 100644 GIT binary patch delta 7611 zcmY+}3w+P@9>?+THrtrZE-qti=DuNLo9oDBa|yYZ5M?o0Y-1Oq^sAIolC0L{loTpO zViH9qT}3HJcezxKQk{y>h0g2!|9wX1_wd>Cd;5KV-|zSL{rRb$kB^Zkri~N49 zi3c&7=euJh^uRM1hUc&@hBoyZHZq%|>f2!)W@2sZZ{;JA#dBjZ94BKvoQ`zqZo-!M znAN|bdXIwLB-HU?jK*WAk)A^kPVCCZQR>jq2zN)Qvx49Xy4)A(ZuQgORBFI-zFRAJu+5>H(8cOJ9K6 z3v*Bd-+*Pf6)Q2lIqN^0#GB2XTZ%nfIJXM-;1gKFdiBKmt(@zHqfndeUW~^*=C`Po zJBy7msjQb6Q4BKV;K1@s0qG`q3C^L6$h-~8>~ge_o&@`5+m_%E01I+ z>cI{0${@}#E+Rj-9q$)I+WRwm0rh~FP%HQvs=rTA13iMA9?yMGBA0?wNFOdc&A)Lf zs^JW?3^k)0P)m24c_(US_n_KWT7Efd0IMzktho`@ZYxIU{O=$UMZs?K^FRg15NlC> z0vq93)Q$1H2X)*OwGypR14~71!b~gAK@DsGs-L0AKXW0BM07oJJ+(Y~*#$Cwkci9=vk`L9OU#=0WpY)P2WMoA+1q zv`0b@`U{(4LMP{%V>VLcCL)XD?!}96C+fo#)Y+dw67p-*WuxBdWysgn6`}@w4{8M~ zP!E0twYMI}y6C+{LJdDh&FCxhsQDAB<5Q@1b-MU7i9;=IBh&<1pziOB`Z5ket?WwF zgEyd7W;3?NZOEze+}9-ZuFj%1O-xtkmSAJl1D`=X=s8peTde#Q+(Z6#{0x`!*M}Z- zZFhfW#i)K4n3d)lb6Y^({|8oZ1hpi;VJz0-2&jX`W;&|AFKRbmhH5v}%C9pQqwZUQ z+O$>XPSkz-unvBMb#?wvkkAd`?6i8AfSP#+Gt2C1_Aq;!x#mD~h&kLGjoJg3qgH5= zmFJ_U2NjUe2dK~*%(MpOsM9bP^^O;!Hs>nTCVCr3;SV?ld-J^B}QVIxrdX;FUBbR5!KJ17=hu# zS^xSZ;)eSLDX0#!kj>%xpl%#&^<%AmGODAQSQBr+C7iq4a4Y$GBc1yc-$(WH6kjO~ zYy;|fn=u-9kFxXsB?UTuNAWT|jU904X#YX;Q3G3qTDnTq3?4;w{It2w$~U6gZ@2s| z)Ij#527b`$k9(FlgX%Dp@1r(P3~E5lQ6tU5I+%+saTKbfIj8|FK)r%HP%E++>*D=Z zzsAa+Lk;Xj%th}F5_)h=rd?COjPqAE0pkPbpM)CbqGmQ6wIYS60bPe$k(*I7ScsbO-KZ6K z%shhOtNKYyaofWPU`$GAfb1959*z7LJiX*<+?-7KGL`4Q$7=2X-GW}&B<%_pIm-h!?1F4RhFM7`6!*a?3&TTSr) zXZd*47w-W~#m!cJ2=xI=oapz{8?`wnq6VCYdhYaztbZDbnG|T#EVqg()PT02ZrFjE z;d`hR_!KpRpUgkZuq*xgIMn?qI07?Jr{NYZYsPCSXo34s137ICBCq0% zlW&L`@n+N#zl`eWEeyuJ7|sW1A4cLAll;AKEYJUS{xj+N_6K zx<-~yG@F}kFqHcCsLh#ab~pQ&15pDQW{x(!u_OZT2Gv2HISsX&i!m7IpxVtdZ!~W) z7n*mPOUz|vrTH*w>6atV^V~C5vB7)+HPWr9C4R-q-@(8)8+DGq#6&!SNfs*;IGm_U z;&If~PK8|mCO9ar5&2h8AE$p2ZxE}Ac*@_w4+uR!@K;GMJgow|_*l80h*Dyjl~uEj zL?OXM0yC~ImxFB(O8-e{W$IJb9rZ1FifBsySJVlqIGIq-dyT|U3R@EKq;-`Op+pvC z`&GboF)@I=rr%5jb}hyz%D%;(#8M)YNTI94hJ6lKd~R zNqaz75I5ZKC*3D_4bjB%Y-0BZv7OLwxoe48MD=yZ5>F%h)3u?mw!}A9-iq|+mKOcV zcg2}R;Q6F%i z`TE$Mysj?3Uf`TIu);QeUEnX<8%ZA^I#}7=*oYWt`5f~XoMCBE+tM*O)YARvzcukU zdHtUqH((7SU%e$#(1BPs|o&L>_X^ohHJ_z$5gfwnP3bJCX*A=b}Zq(3CK z5wUugPm<_J<<*#Djh2zt)tVSa%praw9wLTV8SW#CV<`_{+a1h25+{4Qy;Tjle63ODM}A(umIFPg#9kj3j<0o*<497ZJHc zGI5T0fEY!rC!Qth&`0%E@n=G$*Oh{b>Jn^Deh-c$t|yw14<&Yyt|Gb-_Yu0z5^Dk} z{<{kvCC(7pw7(UvvNp&oDlbf(k~}4Eu4|QYK3#e~Gp)G1HFTAy?%xN3K^)sa=tq^}97 z+Mk&dRuz+7qvoiLthA1u(lR?IckGhgse8MQToIS#m6oMlT9Q{(IwP;FxFkDy^tAHn zCFL__6enL=UUE%&QSt2Lo~6}geaZ{-3TC92&+FAbIkRJCR>icOq>#LsGpiQm+z~v+ zUzO?QMdv3|TAWvQJ~Jh6R>7>i>TL0ab)1$rwd{O(^4x+Mv?(o^m!CT2>b$vS73-3c ft0wm!8?tfG!%fLuJTm-$cFlO7 delta 8377 zcmbW*d3=;bp2zVDAqfE?Tp=6*9>NjMK*D_`!EhgPpCZsnKS>(W-O$}31V$To#S3K6 z$jso1xC}GGusAxw6OqwT@j@JB8AV|nL~&RTbihH;aX;UFDz9~4uX*hsTd(~3T~$v# z^;FeU&(ld>dn4)9lS%P2ts8GQqxbDdXGMe#KR7V-Ct4{2Ox_5n1 zCyc~gEJmGIiJD<8j=`;{^Ik(;=mhE(oI>r1Pf!!e$uTB|eREjjKmYhOiUfgmh)@v*l+|6Fr5xg`f9g{Z)~~ zv}7h~3HzWrz81BMmtZ@rLABe8n)z;Aj8EV!Y}K1SuoSt5S%+HsUDyQoS$~H-Am&h< zOk*uh;Grc-}CHbob&!PU0@M%0CG!(~avY{ok%U+8DdqZsS&O{~`dum66i z70kz`I2jpe+{`7T$LM-2!3v}gvmZ6EKcQxH+WHY{CZC~J?rZB+)XcOzYM+KGXQ29N zXUo~v?wF?Mzb_e$r~sSeSnD)fzZkU=e$*Q-gdOl9)P!JGuex(e;758$8i)sW$Q2DM9SYGKc*z#m@vkWZD7vf zwU|-BM#ecs29it)SmF6ItZhlf*REG zdkg9o>_!df462{AsP=!geu>)T-=J1FWvFMfxXrXeotTB%)m^OJQ5WisU2!7jU^y}= za|g28<}i-MFHkS60mHlrOvR3r%Tc%ZX5=kwcAy3vKSV}Ldjxgimr=oISwbGH5hUZMOs9>en^dCTHs>||Z-6*@p9CrUXND_U}xNq+N7_b_R^;~2V3#oy#W2_;-Ny;{{}MMicG>duAzJy=i$s^ zV+P_L)Sftjeef!BJ55jCE_w=I3EpPPM(ySt)b8zrjWOSrhhYlkLhE?zRO>A30_#%DrF|(fPIG76 zX11U@-ijJP9qNJ)qFx+(QM>;jYHu9D6nqo4`%j|w#0RK$mr*Y+y{9#S7T69mQG2aF z>b&?EGP>YI)P?3^dt8p$xDK`C+fnU~U>3fPYJU#3DKFY`@+5Bn8ORfCI-<^-V_lA# zXcaQxxLHG{2Nkzsf83Ai_#I5cbEuJiYU{s7Jx+}#drwDO)ElllredM3pMdIT9uC13 zsDW-roxc~y>-m40j2ixc8fmjB-VEF0Fv^2a$189eMsX1yvE}wty-n-KGU`v_MjS=s z1$YRjV{1NU;BxGM2e1p*H%G~6L?5GrSFkU3ptZ{5QMbg!u6PsbUOs@jMUP=Od<(S_ zm#`mZT<1NGqfzY^qmHjd4fJk|YbKY;=$>9Tliz}{99!THY>s!o#S0_%5!* zGk6V7ndQAd7GN{V%dM+Wk82I8-J_U{&(31~)zS0zz)@U5`2_01LuY#(m0(lKGcgmF z*z#&rhZ`^*Z%3VXk3IgNJ-#0`peL~jzJObK{*KLN{hy*@>0CA(w&Sg%j=n$*>>Jbt z|A86UcD{GK2ezb~hy0i#J_h1;)P-I|4eXDol{&A?W;2sNOUsDW-k-NMZ{1n7l{7pNsnU7YyU-ZV#*$6$LbK@EHlkWa@1d6bE6l>=rCz&EsF~)XR%ilhfU{65 zv=}vkW!Q@A8<&ihq{jL*rcwSLHIo#+BK79Vz--Jx-QyzEz-C&n#~zd`Py^e78o*A} zUf7Gd_ylT&|BQ+6|I1`_p>I(4IC+_OVoOxHlP&kQ4z?De1~3IRv-zl*F2P<{hMndkf;)lt?8Z?g_X4R|E#!X>C%H5s*s z)}rb+qXx7M)qV$RLcc_>LA8<%^>)2%J6Z7`Yh+S_tG+h)31dtnL<`e7>OTSr)ntP@cKm|>k`U5L8C zQcT4a)(X_74xuKx7HP--|GbR3(R#CWll2bkUDms;+pRlLw_qox;yzpdi1i?9piiP! z`mn7(ii!XKy+$VSJfk+*SJ(wxRv5h;%|K-TncFao=aE%53oDr=9>xfE4Dbz#cVRKU zkNQsNywcm8GjJm14LB5^M}7a8D`dFE<|E>7#3#f#;yXg=M#52s^eOR=M2@A`Nj43_ zpAhd5SBQZe8%}H@e?L)Z+g6jmlh7Vhiudz0zp;vr9OMyA{JHe!AJzA=`E-uQ$bV+b zdQxUmcN^;e$VwfEUlCfNvqVGEo3bIX+VRAfg(}7px=(MbVABeGm8c?G+K$O4(zOj4 zoN4o2Y@46`=-8t+-D_RdxQQqswDXn56H^GihI`Wf7kG(iNDq)E!}luP~$g>l5q4VBoI`V%+=wb^zM7YU`V9_9m#-)9TrL4wU}@;T`cb|;kHCpuI2 zU-*P7$Ty@qo7rX^j{ibvVLvDMjyEZ^Uxg!yKM{lN`RNVo?@)1=0}bg-GI~$1Bwi;* z5lVLxxrvC>j0Kr`Th=@CRZTp>Iwf@fb0gSV$B9ae@$sRNB^QM@jRN2&#lo~H0J zkxhOoF`N8a;yI!N+B)+7Cf zt=x!fi0woHv5xpXag~@(DBb0e_-sWd6UmJrDu~|_FA)=|{~GfMrBsi^KLVa4e-H7N z>U#F}`|2~Z_axOV?~+~Vcl^Fu(=$O-R)(u14JImrflzhKRh5_XD#M{zWui`*L{*LJ zu2PLmRMfh@L{BnWS6t%M@96S;qtPpUp^ES*Csye?3*AzuJmL$wHQ~rAr#u{SR=bgM zw=5P2hXT=9)Ts%?DjmP;^H&8zZZxlcakq!A8S1NWgKj7`F&qgp_?XWLL>XE%8VFT5 zbW!PxI;E}~a$>$9-MNg2Uh2Oaa3DEe<@%zo6Rj={24W6lrFpqq6LHs62O@6N@i}KV-ap4JXS~dS3A>TA8+SUf zFjH}&%+@Kbb!xdai8U*YglnR1q`y;I9dknAkn7YiX*J7p=2fyBUJqIrdj)@Db)#-s zb)>Fngj;`dc!wq}3I+`rG<-n8P$z%*s6iv@zAwreIIh%RUFG9Ouc{1(oN1N5TE8z6 zUh9mhaZCNaXskL?y}r02=nGWkm4$oV=B-hl`)Rz|D-l!lNSnu}nm-=dB?1NR+ zAwHvFp9+bcgJEs8N?&=*hqZyK`r?vx$t8A21grhr&VW-^=~nn6zAE;KFXZirRk5hI zC8~T8r@E}NI^?WP>>al@xR$+>SO56L`J&v-Y*(2o>CPH1jEt(4x54fT^eSr z0j|&3s(hu+8cHFbKhWRt1%qMkc3GuU%HSHB2051J%#T)b-KZ~8)!4VT(pPuGieO6O P{JJ++WY(Wv9!mRfpQvXb diff --git a/django/conf/locale/uz/LC_MESSAGES/django.po b/django/conf/locale/uz/LC_MESSAGES/django.po index 4e9b6cfa775..ad57ba91b7a 100644 --- a/django/conf/locale/uz/LC_MESSAGES/django.po +++ b/django/conf/locale/uz/LC_MESSAGES/django.po @@ -4,15 +4,16 @@ # Abdulaminkhon Khaydarov , 2020 # Bedilbek Khamidov , 2019 # Claude Paroz , 2020 +# Shukrullo Turgunov , 2023 # Sukhrobbek Ismatov , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-19 20:23+0200\n" -"PO-Revision-Date: 2020-07-25 17:08+0000\n" -"Last-Translator: Abdulaminkhon Khaydarov \n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-25 06:49+0000\n" +"Last-Translator: Shukrullo Turgunov , 2023\n" +"Language-Team: Uzbek (http://app.transifex.com/django/django/language/uz/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -52,6 +53,9 @@ msgstr "Bosniya tili" msgid "Catalan" msgstr "Katalon tili" +msgid "Central Kurdish (Sorani)" +msgstr "" + msgid "Czech" msgstr "Chex tili" @@ -208,6 +212,9 @@ msgstr "Mo'g'ul tili" msgid "Marathi" msgstr "Marati tili" +msgid "Malay" +msgstr "" + msgid "Burmese" msgstr "Birma tili" @@ -289,6 +296,9 @@ msgstr "Tatar tili" msgid "Udmurt" msgstr "Udmurt tili" +msgid "Uyghur" +msgstr "" + msgid "Ukrainian" msgstr "Ukrain tili" @@ -319,6 +329,11 @@ msgstr "Statik fayllar" msgid "Syndication" msgstr "Sindikatsiya" +#. Translators: String used to replace omitted page numbers in elided page +#. range generated by paginators, e.g. [1, 2, '…', 5, 6, 7, '…', 9, 10]. +msgid "…" +msgstr "" + msgid "That page number is not an integer" msgstr "Bu sahifa raqami butun son emas" @@ -344,8 +359,8 @@ msgstr "To'g'ri elektron pochta manzilini kiriting." msgid "" "Enter a valid “slug” consisting of letters, numbers, underscores or hyphens." msgstr "" -"Harflar, raqamlar, pastki chiziqlar yoki chiziqlardan iborat to'g'ri \"slug" -"\" ni kiriting." +"Harflar, raqamlar, pastki chiziqlar yoki chiziqlardan iborat to'g'ri " +"\"slug\" ni kiriting." msgid "" "Enter a valid “slug” consisting of Unicode letters, numbers, underscores, or " @@ -382,6 +397,16 @@ msgid "Ensure this value is greater than or equal to %(limit_value)s." msgstr "" "Ushbu qiymat %(limit_value)s dan katta yoki unga teng ekanligini tekshiring." +#, python-format +msgid "Ensure this value is a multiple of step size %(limit_value)s." +msgstr "" + +#, 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 "" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " @@ -446,6 +471,10 @@ msgstr "va" msgid "%(model_name)s with this %(field_labels)s already exists." msgstr "%(field_labels)s bilan %(model_name)s allaqachon mavjud." +#, python-format +msgid "Constraint “%(name)s” is violated." +msgstr "" + #, python-format msgid "Value %(value)r is not a valid choice." msgstr "%(value)r qiymati to'g'ri tanlov emas." @@ -460,8 +489,8 @@ msgstr "Bu maydon bo‘sh bo‘lishi mumkin emas." msgid "%(model_name)s with this %(field_label)s already exists." msgstr "\"%(field_label)s\" %(model_name)s allaqachon mavjud." -#. Translators: The 'lookup_type' is one of 'date', 'year' or 'month'. -#. Eg: "Title must be unique for pub_date year" +#. Translators: The 'lookup_type' is one of 'date', 'year' or +#. 'month'. Eg: "Title must be unique for pub_date year" #, python-format msgid "" "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." @@ -490,6 +519,9 @@ msgstr "Mantiqiy (Rost yoki Yolg'on)" msgid "String (up to %(max_length)s)" msgstr "Birikma uzunligi (%(max_length)s gacha)" +msgid "String (unlimited)" +msgstr "" + msgid "Comma-separated integers" msgstr "Vergul bilan ajratilgan butun sonlar" @@ -572,6 +604,9 @@ msgstr "Butun son" msgid "Big (8 byte) integer" msgstr "Katta (8 bayt) butun son" +msgid "Small integer" +msgstr "Kichik butun son" + msgid "IPv4 address" msgstr "IPv4 manzili" @@ -598,9 +633,6 @@ msgstr "Musbat kichik butun son" msgid "Slug (up to %(max_length)s)" msgstr "Slug uzunligi (%(max_length)s gacha)" -msgid "Small integer" -msgstr "Kichik butun son" - msgid "Text" msgstr "Matn" @@ -749,18 +781,21 @@ msgstr ":" msgid "(Hidden field %(name)s) %(error)s" msgstr "(Yashirilgan maydon %(name)s) %(error)s" -msgid "ManagementForm data is missing or has been tampered with" -msgstr "ManagementForm ma'lumotlari yo'q yoki o'zgartirilgan" +#, 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 "" #, python-format -msgid "Please submit %d or fewer forms." -msgid_plural "Please submit %d or fewer forms." -msgstr[0] "Iltimos, %d ta yoki kamroq forma topshiring." +msgid "Please submit at most %(num)d form." +msgid_plural "Please submit at most %(num)d forms." +msgstr[0] "" #, python-format -msgid "Please submit %d or more forms." -msgid_plural "Please submit %d or more forms." -msgstr[0] "Iltimos, %d ta yoki ko'proq forma topshiring." +msgid "Please submit at least %(num)d form." +msgid_plural "Please submit at least %(num)d forms." +msgstr[0] "" msgid "Order" msgstr "Buyurtma" @@ -1098,34 +1133,34 @@ msgid ", " msgstr "," #, python-format -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%dyil" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d yil" #, python-format -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%doy" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)doy" #, python-format -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%dhafta" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d hafta" #, python-format -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%dkun" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d kun" #, python-format -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%dsoat" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d soat" #, python-format -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%dminut" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d daqiqa" msgid "Forbidden" msgstr "Taqiqlangan" @@ -1135,15 +1170,10 @@ msgstr "CSRF tekshiruvi amalga oshmadi. So‘rov bekor qilindi." 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 " +"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 "" -"Siz ushbu xabarni ko'rmoqdasiz, chunki bu HTTPS saytida veb-brauzeringiz " -"tomonidan \"Referer header\" yuborilishi talab qilinadi, ammo hech biri " -"yuborilmadi. Ushbu sarlavha xavfsizlik nuqtai nazaridan, brauzeringizni " -"uchinchi shaxslar tomonidan o'g'irlanmasligini ta'minlash uchun talab " -"qilinadi." msgid "" "If you have configured your browser to disable “Referer” headers, please re-" @@ -1159,8 +1189,8 @@ 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." +"If you’re concerned about privacy, use alternatives like for links to third-party sites." msgstr "" "Agar siz yorlig'idan yoki " "\"Referrer-Policy: no-referer\" sarlavhasidan foydalanayotgan bo'lsangiz, " @@ -1249,8 +1279,8 @@ msgstr "\"%(path)s\" mavjud emas" msgid "Index of %(directory)s" msgstr "%(directory)s indeksi" -msgid "Django: the Web framework for perfectionists with deadlines." -msgstr "Django: muddati chegaralangan perfektsionistlar uchun veb freymvork." +msgid "The install worked successfully! Congratulations!" +msgstr "O'rnatish muvaffaqiyatli amalga oshdi! Tabriklaymiz!" #, python-format msgid "" @@ -1261,20 +1291,17 @@ msgstr "" "com/en/%(version)s/releases/\" target=\"_blank\" rel=\"noopener\"> " "nashrlarni ko'rish" -msgid "The install worked successfully! Congratulations!" -msgstr "O'rnatish muvaffaqiyatli amalga oshdi! Tabriklaymiz!" - #, python-format msgid "" "You are seeing this page because DEBUG=True is in your settings file and you have not configured any " -"URLs." +"%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG=True is in your settings file and you have not " +"configured any URLs." msgstr "" "Siz ushbu sahifani ko'rmoqdasiz, chunki DEBUG = True ifodasi sizning sozlamalar faylingizda ko'rsatilgan va " -"siz biron bir URL manzilini to'gri sozlamagansiz." +"com/en/%(version)s/ref/settings/#debug\" target=\"_blank\" " +"rel=\"noopener\">DEBUG = True ifodasi sizning sozlamalar faylingizda " +"ko'rsatilgan va siz biron bir URL manzilini to'gri sozlamagansiz." msgid "Django Documentation" msgstr "Django Hujjatlari" diff --git a/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo b/django/conf/locale/zh_Hans/LC_MESSAGES/django.mo index 39927e8d8feebbe396271c5032a5814c6e1a1ee0..55517ea7b6ef216d6aba49fc926fe16d9ab3d504 100644 GIT binary patch delta 7785 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 delta 7525 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 Ly|dHcD`EcwX{8#> diff --git a/django/conf/locale/zh_Hans/LC_MESSAGES/django.po b/django/conf/locale/zh_Hans/LC_MESSAGES/django.po index c0c6d6065fd..097e77d4b4f 100644 --- a/django/conf/locale/zh_Hans/LC_MESSAGES/django.po +++ b/django/conf/locale/zh_Hans/LC_MESSAGES/django.po @@ -7,6 +7,7 @@ # Fan Xu , 2022 # Ford Guo , 2022 # Huanqun Yang, 2022 +# jack yang, 2023 # jamin M , 2019 # Jannis Leidel , 2011 # Kevin Sze , 2012 @@ -32,17 +33,17 @@ # ced773123cfad7b4e8b79ca80f736af9, 2011-2012 # Ziya Tang , 2018 # 付峥 , 2018 -# Fangjiaqi77 <370358679@qq.com>, 2020 +# LatteFang <370358679@qq.com>, 2020 # Kevin Sze , 2012 # 高乐喆 , 2023 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-25 06:49+0000\n" -"Last-Translator: 高乐喆 , 2023\n" -"Language-Team: Chinese (China) (http://www.transifex.com/django/django/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-25 06:49+0000\n" +"Last-Translator: jack yang, 2023\n" +"Language-Team: Chinese (China) (http://app.transifex.com/django/django/" "language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -326,6 +327,9 @@ msgstr "鞑靼语" msgid "Udmurt" msgstr "乌德穆尔特语" +msgid "Uyghur" +msgstr "维吾尔语" + msgid "Ukrainian" msgstr "乌克兰语" @@ -420,6 +424,14 @@ msgstr "确保该值大于或等于%(limit_value)s。" msgid "Ensure this value is a multiple of step size %(limit_value)s." msgstr "确保该值是步长的倍数%(limit_value)s" +#, 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 "" +"确保此值是步长 %(limit_value)s 的倍数,从 %(offset)s 开始,例如 " +"%(offset)s、%(valid_value1)s、%(valid_value2)s 等等。" + #, python-format msgid "" "Ensure this value has at least %(limit_value)d character (it has " diff --git a/django/contrib/admin/locale/af/LC_MESSAGES/django.mo b/django/contrib/admin/locale/af/LC_MESSAGES/django.mo index 5d9adc95c2c9a180f4cf1c9cdb26f9a172aefbeb..bb91c2e475f5be7edb65780b1e413d8f18344535 100644 GIT binary patch delta 3732 zcmYk-dr*{B7{~Fm2q?;~a#3y>tB99C)QnUtBWf}gr_#wwWx2MSZi$90t(Rcc8q2Qc zE2V{(BFlRr2BZ}_Ia%4goSL#mvp>qLri+-BQ{Nx&sp*|Le9k%hzUMsWoacQxzQXhO zeV*7?squA&>j33EO20&7JRV~Tlhtd?&>qJ0#9`PA$6^lNj5pw7?2kum|6e$kc4mq( z#W)l7{Nu>bW(Ri0ChTNP%+D9=9PoY+lm~Kn~ z`jA*n2@b?^RAAM%zZUiUDjbHJFoF5aNA`x#uq*A8sFj>X1rpD8B%lwq@^sWr zjstKaDxhjSA8YLI^{7CaaUr&0C5~jZv0YTQQMnDLGin3wM?DbCbdRC}wX%EAi*={~ z8&HAm#!_rWO?(y=XeQB3#a!%%QJjbM7>C`m*?&#s%XW_-1GR!YEXM+j$Aze!szD8S z4mH8`WTJBCCe(9b)D~BweqV-t@qX0KZbvPk85O|697g3B%^^B8z!#`9KY=8&X-5Un znM~A*lTk;KgStQ8_76r)e2HzBBafOJQMnbxQoIKvco46}QL)}69+d~M1k>3+O?(Y% z!kMU*%tr-!7wRY;Ku*cjqXOK6q>FhO*)GI%*WNJm9(O^`V-U+9Y-DAZ>R~*p>`z6?+%=T3Md~Nu>>{VDO7-|eT*5TQ!S*T z2dCf|ycs!OvmP(PR@7_x16E@^2U>)SQCqkbC*U7A6tBwT8-P)qh;O5IIJ2Ld1JB@1 zw0B~XvZ^a#DT~vs*{H4eBV(E&)=9`%rWzISI@Fmzjq%uMZMMJfL+#k>sH6G-l{?>} zcJ3D(#r)<^Di33EfA`DvI%?oUxEw#lV!UC1`$b%Zx6|Hy4jhG+S)YifjQU}3sDn}K+?cWLLEf}No=zg z6?lvFfb}qHfk#mDoWO4Qo%M7f`>&+(3^t|;qo^CcM?H83HE{wN*9HB^$IT2vt)L9` z_Dn@3X&4i6DQczn+5T2!PV+u$oWD>zmk=A`o^=imr=tKB=`E<&EM(gYQ32JWR{9WX zqQ~v;>rnwTSob0cZazfa*N#f&bI7O0_=!$|#KurrN@XlA!Z&dfmJKsz4xT^<%P(|y z<``<_r?3Zlh&mZlQ9GB5%9R4V3Wp+jYNDtKH=xct@po_idM1` zCu96b{!!pGyd00BlJ5Lb?m#0@D;TOoAaAOf!RJu9@F14s zS6GMz{9{r7G*k|4$4BtY81`RVv4YQ25Z9nqbQZNUiKXuA(+!pFsi+T59%f@1X5b9e zN~=-#)uMLdQPfeav+a$j`L<#@w#29?yWhc%sdVVig`h(!~^) zx$k)e&Z4~<_55kf!lEnO9laVAP!%fB8jQox3MxA5m8fiAkJ{QTs55OtCCx{u2aluf zJBb?bGq#2*w&OZf(%el6+rHh-<=!;!0ozjCuQ~y5uBXLW<{i+pj`nuSKFXt% z8p$8oTl3&-$lxHY&DbG`Mt#>wezty|LZFGEKo@?sa zWIJhyvleKg UIsA54U|ujVyQt~J=-STz0AT#KI{*Lx delta 3600 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, 2020 # pejar hewrami , 2020 -# Swara , 2022 +# Swara , 2022,2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: Abdulla Dlshad, 2023\n" +"PO-Revision-Date: 2013-04-25 07:05+0000\n" +"Last-Translator: Swara , 2022,2024\n" "Language-Team: Central Kurdish (http://app.transifex.com/django/django/" "language/ckb/)\n" "MIME-Version: 1.0\n" @@ -184,7 +184,7 @@ msgstr "" "دانەیەک زیاتر." msgid "Select this object for an action - {}" -msgstr "" +msgstr "ئەم تەنە هەڵبژێرە بۆ کردارێک - {}" #, python-brace-format msgid "The {name} “{obj}” was added successfully." @@ -351,7 +351,7 @@ msgid "Clear selection" msgstr "پاککردنەوەی هەڵبژاردن" msgid "Breadcrumbs" -msgstr "" +msgstr "وردەنان" #, python-format msgid "Models in the %(name)s application" @@ -389,7 +389,7 @@ msgid "Enter a new password for the user %(username)s." msgstr "تێپەڕەوشەی نوێ بۆ بەکارهێنەری %(username)s بنوسە" msgid "Skip to main content" -msgstr "" +msgstr "تێیپەڕێنە بۆ ناوەڕۆکی سەرەکی" msgid "Welcome," msgstr "بەخێربێیت،" @@ -417,10 +417,10 @@ msgid "Filter" msgstr "پاڵاوتن" msgid "Hide counts" -msgstr "" +msgstr "ژماردن بشارەوە" msgid "Show counts" -msgstr "" +msgstr "ژماردن پیشانبدە" msgid "Clear all filters" msgstr "پاکردنەوەی هەموو پاڵاوتنەکان" @@ -436,13 +436,13 @@ msgid "Toggle sorting" msgstr "ڕیزکردنی پێچەوانە" msgid "Toggle theme (current theme: auto)" -msgstr "" +msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: خۆکار)" msgid "Toggle theme (current theme: light)" -msgstr "" +msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: ڕووناک)" msgid "Toggle theme (current theme: dark)" -msgstr "" +msgstr "گۆڕینی ڕووکار (ڕووکاری ئێستا: تاریک)" msgid "Delete" msgstr "سڕینەوە" @@ -531,13 +531,13 @@ msgid "None available" msgstr "هیچ شتيک بەردەست نییە" msgid "Added:" -msgstr "" +msgstr "زیادکرا:" msgid "Changed:" -msgstr "" +msgstr "گۆڕدرا:" msgid "Deleted:" -msgstr "" +msgstr "سڕایەوە:" msgid "Unknown content" msgstr "ناوەڕۆکی نەزانراو" @@ -566,7 +566,7 @@ msgid "Toggle navigation" msgstr "کردنەوەو داخستنی ڕێنیشاندەر" msgid "Sidebar" -msgstr "" +msgstr "شریتی لاتەنیشت" msgid "Start typing to filter…" msgstr "دەست بکە بە نوسین بۆ پاڵاوتن..." @@ -585,8 +585,8 @@ msgstr "کردار" msgid "entry" msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "تۆمار" +msgstr[1] "تۆمارەکان" msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " @@ -749,7 +749,7 @@ msgid "Reset my password" msgstr "دانانەوەی تێپەڕەوشەکەم" msgid "Select all objects on this page for an action" -msgstr "" +msgstr "هەموو تەنەکان لەم لاپەڕەیە بۆ کردارێک هەڵبژێرە" msgid "All dates" msgstr "هەموو بەروارەکان" diff --git a/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/ckb/LC_MESSAGES/djangojs.mo index f7415be678dd8478146432cceb3b5d2bb2208039..95cbda79074a6d1de7db822114475cc561d4ea89 100644 GIT binary patch delta 2484 zcmZXVZETZO6vt1u?iCnav17sp-DJ!Ot8<&^*cd1}@MSpJ5;Yo=Zfj)OOGmqnu!uFm zO=1Q?9-FX82p@=`sDxC48e_6V6Gt=}5}{oa^~<6-;!Avu@q@q9=XP^?({q3KoO|xQ z|L5NOJpHupkH*MXZf8^|ZCD9*B15EC+gVhUPqIbsg43`WI&ws4$~MCtP*ZmqzXLAC zf71AS41;hP@e#upY)0f5jeI&z!8~{lu7wxjdiW*Gg?}4n;i!NDLl1P~mq1da%=lG? zKBxlgU?yyU{A3GNwnRi)Xy^p3@Nu{scEEFxUrLn@%tM_nunejI4^-hLQ1dDwKdGV8 z`8Gq%+X`QSE%0TSgqq*a;4Idc5gHnJ7U}|Hun``Ho8dHMj5wFrEPyBRi{Wv22@b+G z_Pq#B8OC8T{*T7bW&dx+Ukg{l1{l%6qbAS`b-+Qm3Z5{$1U2sp)CF!BW)|2Jt%4rn zwNS_Hgqq(4SHlBv1)MZ|3u^vU0sF5V*Gymz-h}U1ZZA{>_d7(Yp`Z8}m&kK4uTX@h z9D@90k_t_74(fdGL0$MWsDiFTUC`;a$wey7n>I{9PC>3i&HEkd_?!rjtAQe@36(Gk>)|B43{wkJ z=|ZDW{V^)de--KjoQ2x|5!8i0hdS@qhCjh_cGAK5mBDpf0G>%AEgZNGd;;o(-B6Y7 zg+1_jxEFp8b-+^`tmX%yn~6qY6Fkg5FNc>=qx~~{O!W588s0Gc1?px03-XpkB$IvD zKrYmQg;153KtxM5RAJj8yC!Xr=`j0{#ciQlMs5|ln)YtMG$Tv=AQ{?== zGl4n79}Iss{1x(GsYTaAom@+cjnqw7!CF*kEw%&G3waNw7qA{nms?CjMcu0Jzm`Vq zVQd}d#k4eFYq2{peeJjksZwsJyOp{`#@DB+z|bpeFn!ux*n^lJ#YXHlY$w)=X^H5T z`mjyvnWEqM%CrOZ>&G`nny~vY{hZ#3ZNP5F(q+48Y)c2AzD4@6*=k~sz%7{mr#!@q zm%3DU<8U9O8f(L}=&jaLgXz~VUCL>No#O`rtAs^2du3* zMb?$h?R$dzqEvj=xMg*R;;w1_LRD3#*v^;I-e37_4H+KTF@%CPO&q@79?o}sre;6i#1#P?LR(j B%|rkI delta 1613 zcmX}sTWC~A9LMq5O*Anvrkj|UXkvD)(bh|}Pz}NH1!TMBT6*)$tBav~hcpnYx3hi5^2u;5$5yXYeR4pc4&z57pnFoVxG{ z>b`nTKVU1K#A~>X@!cAFpMZC;37_Lcd}r2GJJ(EkHa6l4b3N+50c^l;Q1_ihwZDOr za0Kh|jakV)seKFPbfMEKmg9KJU!Vs18V>~sj8P7abM6DoVhH!6_Vxs-pL3`IFQF## z5H-+is~=Tcx*jomYFYnQ8myxtf`hmchcStNqdNGUQOUYE(w7@RO=LeO4V*_^|IxgR z%-P*X4)>Uo?t5wVZ!u4~EX4W`lNsi5G*GmzwAU+9<$hF0TTo9nh#JU4b$k}5utL9L z1fMV)cFq0EGU~o^I!Ry%RlghSXg7r2IGkghYsoxjBh}yqFMvA!2WjJiY@|ABLOp3a zYUvkS{b%M{yB-{f15#tooRL)C?j|e@95-;xi)N47uo?@D5 z>V*wkUg&2QCG@llh(!cn>ieWsS*-E9$aGsZ+gN;2+O6D!^NGn;*5|1&ME?n;8N{bV zrwSzfFO(LRaG#+53A2c4g#HV22z?!GM6p8q>b%>dyS?6uM_x#=UWYUA);i?{gT=ms}pRH*RM*Cu! z#6WgeczJwlBAbXM!`)w5t|L{t)VnDaOKk1W zAOC&8d(aT^1C7gq6Gko+@=p&u%NK^+h(B_%kS`p5I#f8~<(iUyx;a_qg<4, 2023 -# Swara , 2022-2023 +# Swara , 2022-2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-03-17 03:19-0500\n" -"PO-Revision-Date: 2023-04-25 07:59+0000\n" -"Last-Translator: Mariusz Felisiak , 2023\n" +"POT-Creation-Date: 2023-09-18 15:04-0300\n" +"PO-Revision-Date: 2024-01-20 07:59+0000\n" +"Last-Translator: Swara , 2022-2024\n" "Language-Team: Central Kurdish (http://app.transifex.com/django/django/" "language/ckb/)\n" "MIME-Version: 1.0\n" @@ -68,7 +68,7 @@ msgstr "" #, javascript-format msgid "Type into this box to filter down the list of selected %s." -msgstr "" +msgstr "لەم بوخچەدا بنووسە بۆ ئەوەی لیستی هەڵبژێردراوەکان بپاڵێویت %s." msgid "Remove all" msgstr "لابردنی هەمووی" @@ -80,8 +80,8 @@ msgstr "کرتە بکە بۆ لابردنی هەموو ئەوانەی هەڵبژ #, javascript-format msgid "%s selected option not visible" msgid_plural "%s selected options not visible" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%sبژاردەی هەڵبژێردراو نابینرێت" +msgstr[1] "%s هەڵبژاردە هەڵبژێردراوەکان نابینرێن" msgid "%(sel)s of %(cnt)s selected" msgid_plural "%(sel)s of %(cnt)s selected" @@ -245,6 +245,55 @@ msgctxt "abbrev. month December" msgid "Dec" msgstr "‎بەفرانبار" +msgid "Sunday" +msgstr "یەکشەممە" + +msgid "Monday" +msgstr "دووشەممە" + +msgid "Tuesday" +msgstr "سێشەممە" + +msgid "Wednesday" +msgstr "چوارشەممە" + +msgid "Thursday" +msgstr "پێنجشەممە" + +msgid "Friday" +msgstr "هەینی" + +msgid "Saturday" +msgstr "شەممە" + +msgctxt "abbrev. day Sunday" +msgid "Sun" +msgstr "یەک" + +msgctxt "abbrev. day Monday" +msgid "Mon" +msgstr "دوو" + +msgctxt "abbrev. day Tuesday" +msgid "Tue" +msgstr "سێ" + +msgctxt "abbrev. day Wednesday" +msgid "Wed" +msgstr "چوار" + +msgctxt "abbrev. day Thursday" +msgid "Thur" +msgstr "پێنج" + +msgctxt "abbrev. day Friday" +msgid "Fri" +msgstr "هەینی" + +msgctxt "abbrev. day Saturday" +msgid "Sat" +msgstr "شەم" + msgctxt "one letter Sunday" msgid "S" msgstr "ی" diff --git a/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo b/django/contrib/admin/locale/mn/LC_MESSAGES/django.mo index 82cb0bbb8e254c85e24c878d66ed16e4dac097ae..cf857e049ec58588d43ab868614a3f7d6cd1baa5 100644 GIT binary patch literal 22236 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 D)a+nX delta 3829 zcmYk;4RDmj9mny#5E3E~@(Kwr;YonJnFK;0L?jT=KtgN@$cwylKoSCZA-R(Xlw1U& zDDQ5Rb{rf59j8z#cv4#hY-t%vYsU-K8EUb`=}@7a$_&z%nTqZAclTt*o&4{!`@HV{ zclR#WPkFBU0)I-1e#uY{6C;U_qmB7J?v3Mva&3??srUyRig$1X#tb%QDQ00dZbuz| z9Vg?@QTP1|V{lNsF|nA8{cr^GsDK$wMHdvHZYV)@q#B1|y?eeB2hi?D{>*+p^q?cC zz8*!LKZ)D%9o&TzhZsX2%)6)oTtdC?I>zyS^A{>f9QcQ;Nic@0Nyc;>gX(!XCSoP# z;$qZwU093CEj(TyOd%PK+ zru`hYp?dveXvccYOg82??nY&zASIH~$;d6H29=2ws19w!Kn0bpR5I{=RBArOvG_Sg zVGQ%42gac~l!Po3GaMJ=Xw-cj$efx^)OCAM8M5yA9;# zKrPN=9;V_k)C)gDz35BS2=Ajh7@ZbLX&Q3Kb@yB4r?$E+fW&K1&8BtWNhXFK82s4 zQeVSKbs(^aidN%l*Lu{5n@|thhDzy9)CjHX_ucbHP#t^&^}x4L9XyBHo|kY3UO{c^ z#~IZIY{YWy|BtC~&LnYGDJpb*2=#zUREMfjFM85FUx#{Oo9j0BcsHt}hp^LQ%*)82 zO)4u~?-`HE>>PYX`@f#bcn;h`{!AJxWEoDuOth#MpGD2(MN|qys44g(YR>PV9vtmN zc8`PnnMyu%T|H_Fx4Q1bxBv%UqoTP#flBo`{0)AHm+&yX;LogJ@8nxO+tQT4kw__*WhYgjkE9jj{8vq>~`J%Ao=g+z+nz3rK1?8 zQd)oyU?pl~wWu3Aa1wT*=K3sZ|M$A*Z=*x|F6xEJg^}yWqNZ>O4#I87cbnNAprRhW ziVmJZvS+Tk?SJE=w9|?r9a)Y_@lIs>n3MQRyp3n@6f1clu43Y~@6RI1G#{b{^iO1# z!@pRXlEBzv(obbJCSWI$MRNc(^7l}?;&asE(#p|;GEmp&pPLCKcE2$`@omhoIRI0zmnb@C`n(HdOiz{$2)=rMN5@TsMVLbXVoFP;O zP9p2gT*M^2g&M$rF<$#WhT(_5AY8|z!v)o-j%>h-=)(#uox(2{cHmm9EMtq|4^fNs zn(Kcsns(Ylkq(VQt(i(!FQ)Q-vz_ zl=hv(Q^aaQ>uMoUM?6L>BLbWGXdrrszT$T)%z$~(t&{a|dbKuGW)sTJCN(IUb8SJD zHeyM*rmt8=?AFCJqS0-q^ZxL!mfBh@eMJjzz1vV~4-p&Ow&qSn8LB6=M)bX|(oDQe zuxU&yv5!#MOK7UTU7n6|sfz5-Ob$%pTW1SXbeHIJaXiv60~W%RE7J z5GwPDp~PV|+)~|FLH$0c1QPks;`(rp=i%UO5Gt{6wt`BGC7H3>;ePffqu6>n#HsQKGk$A$kC5;UBB$a#Y zXUPZc4^j&3jg))#tJGn^?11zJ`{(qrX|r2RmDlI2^ZM&dRin?}+P=k9wKmrU z*NzzN3GN-)J(3zT3lvtHE9UUFPN%=QC_Gm#7@rC_S;pE_*!f!k_cEUZIQ@kK}u6Uov)|6z} zLnZ0Kb0wcd+gHopvn^Ar?B<8Z4Y~T()wg=PP3TCt(iKc7kBhQ}Gj4i%Y;8qKPS6Rx zONX8bou?nYJ9~GUP*3PW=z=;JqF&*(Gyx?6JAI_Ji6~d%m{CCe9mf fSIo, 2013 # Jannis Leidel , 2011 # jargalan , 2011 +# Turmunkh Batkhuyag, 2023 # Zorig, 2016 -# Анхбаяр Анхаа , 2013-2016,2018-2019,2021 +# Анхбаяр Анхаа , 2013-2016,2018-2019,2021,2023 # Баясгалан Цэвлээ , 2011,2017 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-11-16 17:18+0000\n" -"Last-Translator: Анхбаяр Анхаа \n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-25 07:05+0000\n" +"Last-Translator: Turmunkh Batkhuyag, 2023\n" +"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" "mn/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +25,7 @@ msgstr "" #, python-format msgid "Delete selected %(verbose_name_plural)s" -msgstr "Сонгосон %(verbose_name_plural)s-ийг устга" +msgstr "Сонгосон %(verbose_name_plural)s-ийг устгах" #, python-format msgid "Successfully deleted %(count)d %(items)s." @@ -74,10 +75,10 @@ msgid "Has date" msgstr "Огноотой" msgid "Empty" -msgstr "" +msgstr "Хоосон" msgid "Not empty" -msgstr "" +msgstr "Хоосон биш" #, python-format msgid "" @@ -152,7 +153,7 @@ msgstr "Лог бүртгэлийн обект" #, python-brace-format msgid "Added {name} “{object}”." -msgstr "" +msgstr "Нэмсэн {name} “{object}”." msgid "Added." msgstr "Нэмэгдсэн." @@ -162,7 +163,7 @@ msgstr "ба" #, python-brace-format msgid "Changed {fields} for {name} “{object}”." -msgstr "" +msgstr "Changed {fields} for {name} “{object}”." #, python-brace-format msgid "Changed {fields}." @@ -170,7 +171,7 @@ msgstr "Өөрчлөгдсөн {fields}." #, python-brace-format msgid "Deleted {name} “{object}”." -msgstr "" +msgstr "Устгасан {name} “{object}”." msgid "No fields changed." msgstr "Өөрчилсөн талбар алга байна." @@ -180,10 +181,15 @@ msgstr "Хоосон" msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" +"Нэгээс олныг сонгохын тулд \"Control\" эсвэл Mac компьютер дээр \"Command\" " +"товчоо дарна уу." + +msgid "Select this object for an action - {}" +msgstr "Сонголтоо хийхийн тулд энэ объектыг сонгоно уу - {}" #, python-brace-format msgid "The {name} “{obj}” was added successfully." -msgstr "" +msgstr "{name} “{obj}” амжилттай нэмэгдлээ." msgid "You may edit it again below." msgstr "Та дараахийг дахин засах боломжтой" @@ -192,25 +198,30 @@ msgstr "Та дараахийг дахин засах боломжтой" msgid "" "The {name} “{obj}” was added successfully. You may add another {name} below." msgstr "" +"{name} “{obj}” амжилттай нэмэгдлээ. Та доорх {name}-ийг нэмэх боломжтой." #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may edit it again below." msgstr "" +"{name} \"{obj}\" амжилттай өөрчлөгдлөө. Та доорх талбаруудыг дахин засварлах " +"боломжтой." #, python-brace-format msgid "The {name} “{obj}” was added successfully. You may edit it again below." msgstr "" +" {name} \"{obj}\" амжилттай нэмэгдлээ. Та доор дахин шинэчлэх боломжтой." #, python-brace-format msgid "" "The {name} “{obj}” was changed successfully. You may add another {name} " "below." msgstr "" +"\"{name}\" \"{obj}\" амжилттай өөрчлөгдлөө. Доорх {name}-г нэмж оруулна уу." #, python-brace-format msgid "The {name} “{obj}” was changed successfully." -msgstr "" +msgstr "{name} \" {obj} \" амжилттай өөрчлөгдлөө." msgid "" "Items must be selected in order to perform actions on them. No items have " @@ -223,11 +234,11 @@ msgstr "Үйлдэл сонгоогүй." #, python-format msgid "The %(name)s “%(obj)s” was deleted successfully." -msgstr "" +msgstr "%(name)s “%(obj)s” амжилттай устгагдлаа." #, python-format msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" -msgstr "" +msgstr "“%(key)s” ID-тай %(name)sбайхгүй байна. Магадгүй устсан уу?" #, python-format msgid "Add %s" @@ -264,8 +275,9 @@ msgstr "%(cnt)s оос 0 сонгосон" msgid "Change history: %s" msgstr "Өөрчлөлтийн түүх: %s" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "%(instance)s %(class_name)s" @@ -298,7 +310,7 @@ msgid "Page not found" msgstr "Хуудас олдсонгүй." msgid "We’re sorry, but the requested page could not be found." -msgstr "" +msgstr "Уучлаарай, хүссэн хуудас олдсонгүй." msgid "Home" msgstr "Нүүр" @@ -316,6 +328,8 @@ msgid "" "There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" +"Алдаа гарсан байна. И-мэйлээр админуудад мэдэгдэгдсэн бөгөөд тун удахгүй " +"засах болно. Хамтран ажилласанд баярлалаа." msgid "Run the selected action" msgstr "Сонгосон үйлдэлийг ажилуулах" @@ -333,6 +347,9 @@ msgstr "Бүгдийг сонгох %(total_count)s %(module_name)s" msgid "Clear selection" msgstr "Сонгосонг цэвэрлэх" +msgid "Breadcrumbs" +msgstr "Талхны үүрмэг" + #, python-format msgid "Models in the %(name)s application" msgstr "%(name)s хэрэглүүр дэх моделууд." @@ -344,12 +361,14 @@ msgid "View" msgstr "Харах" msgid "You don’t have permission to view or edit anything." -msgstr "" +msgstr "Та ямар ч харах эсвэл засах эрхгүй байна." msgid "" "First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" +"Эхлээд, хэрэглэгчийн нэр болон нууц үгээ оруулна уу. Дараа нь, та бусад " +"хэрэглэгчийн сонголтуудыг засварлах боломжтой болно." msgid "Enter a username and password." msgstr "Хэрэглэгчийн нэр ба нууц үгээ оруулна." @@ -358,15 +377,17 @@ msgid "Change password" msgstr "Нууц үг өөрчлөх" msgid "Please correct the error below." -msgstr "Доорх алдааг засна уу" - -msgid "Please correct the errors below." -msgstr "Доор гарсан алдаануудыг засна уу." +msgid_plural "Please correct the errors below." +msgstr[0] "Та доорх алдаануудыг засна уу." +msgstr[1] "Та доорх алдаануудыг засна уу." #, python-format msgid "Enter a new password for the user %(username)s." msgstr "%(username)s.хэрэглэгчид шинэ нууц үг оруулна уу." +msgid "Skip to main content" +msgstr "Үндсэн агуулга руу шилжих" + msgid "Welcome," msgstr "Тавтай морилно уу" @@ -392,8 +413,14 @@ msgstr "Сайтаас харах" msgid "Filter" msgstr "Шүүлтүүр" +msgid "Hide counts" +msgstr "Тооцоог нуух" + +msgid "Show counts" +msgstr "Тооцоог харуулах" + msgid "Clear all filters" -msgstr "" +msgstr "Бүх шүүлтүүрийг арилгах" msgid "Remove from sorting" msgstr "Эрэмблэлтээс хасах" @@ -405,6 +432,15 @@ msgstr "Эрэмблэх урьтамж: %(priority_number)s" msgid "Toggle sorting" msgstr "Эрэмбэлэлтийг харуул" +msgid "Toggle theme (current theme: auto)" +msgstr "Загварыг сэлгэх (одоогийн загвар: авто)" + +msgid "Toggle theme (current theme: light)" +msgstr "Загварыг сэлгэх (одоогийн загвар: өдрийн)" + +msgid "Toggle theme (current theme: dark)" +msgstr "Загварыг сэлгэх (одоогийн горим: шөнийн)" + msgid "Delete" msgstr "Устгах" @@ -437,7 +473,7 @@ msgid "Objects" msgstr "Бичлэгүүд" msgid "Yes, I’m sure" -msgstr "" +msgstr "Тийм, би итгэлтэй." msgid "No, take me back" msgstr "Үгүй, намайг буцаа" @@ -478,7 +514,7 @@ msgid " By %(filter_title)s " msgstr " %(filter_title)s -ээр" msgid "Summary" -msgstr "Нийт" +msgstr "Хураангуй" msgid "Recent actions" msgstr "Сүүлд хийсэн үйлдлүүд" @@ -489,6 +525,15 @@ msgstr "Миний үйлдлүүд" msgid "None available" msgstr "Үйлдэл алга" +msgid "Added:" +msgstr "Нэмсэн:" + +msgid "Changed:" +msgstr "Өөрчилсөн:" + +msgid "Deleted:" +msgstr "Устгасан:" + msgid "Unknown content" msgstr "Тодорхойгүй агуулга" @@ -497,6 +542,9 @@ msgid "" "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" +"Таны өгөгдлийн санг суулгахад ямар нэг алдаа гарлаа байна. Өгөгдлийн сангийн " +"тохирох хүснэгтүүдийг үүсгэсэн эсэхийг шалгаад, өгөгдлийн санг тохирох " +"хэрэглэгч унших боломжтой эсэхийг шалгаарай." #, python-format msgid "" @@ -510,13 +558,16 @@ msgid "Forgotten your password or username?" msgstr "Таны мартсан нууц үг эсвэл нэрвтэр нэр?" msgid "Toggle navigation" -msgstr "" +msgstr "Жолоодлого солбих" + +msgid "Sidebar" +msgstr "Хажуугийн самбар" msgid "Start typing to filter…" -msgstr "" +msgstr "Шүүхийн тулд бичиж эхлэх..." msgid "Filter navigation items" -msgstr "" +msgstr "Жолоодлогын зүйлсийг шүүх" msgid "Date/time" msgstr "Огноо/цаг" @@ -527,10 +578,17 @@ msgstr "Хэрэглэгч" msgid "Action" msgstr "Үйлдэл" +msgid "entry" +msgid_plural "entries" +msgstr[0] "оролт" +msgstr[1] "оролт" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" +"Энэ объектод өөрчлөлтийн түүх байхгүй байна. Админ сайтаар нэмээгүй байх " +"магадлалтай." msgid "Show all" msgstr "Бүгдийг харуулах" @@ -581,8 +639,12 @@ msgstr "Өөр %(model)s нэмэх" msgid "Delete selected %(model)s" msgstr "Сонгосон %(model)s устгах" +#, python-format +msgid "View selected %(model)s" +msgstr "View selected %(model)s" + msgid "Thanks for spending some quality time with the web site today." -msgstr "" +msgstr "Өнөөдөр вэб сайтад цаг заваа зарцуулсанд баярлалаа." msgid "Log in again" msgstr "Ахин нэвтрэх " @@ -597,6 +659,8 @@ msgid "" "Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" +"Та аюулгүй байдлын үүднээс хуучин нууц үгээ оруулна уу, тэгээд шинэ нууц " +"үгээ хоёр удаа оруулнаар бид бичсэн эсэхийг баталгаажуулах боломжтой." msgid "Change my password" msgstr "Нууц үгээ солих" @@ -634,11 +698,15 @@ msgid "" "We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"Бид таны нууц үг тохируулах зааварчилгааг и-мэйлээр илгээлээ. Хэрэв таны " +"оруулсан и-мэйл дээр акаунт байвал хурдан авах ёстой." msgid "" "If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" +"Хэрэв та имэйл аваагүй бол та бүртгэлтэй хаяг оруулсан эсэхийг шалгана уу, " +"мөн спам хавтасыг шалгана уу." #, python-format msgid "" @@ -652,7 +720,7 @@ msgid "Please go to the following page and choose a new password:" msgstr "Дараах хуудас руу орон шинэ нууц үг сонгоно уу:" msgid "Your username, in case you’ve forgotten:" -msgstr "" +msgstr "Та хэрэглэгчийн нэрээ мартсан бол:" msgid "Thanks for using our site!" msgstr "Манай сайтыг хэрэглэсэнд баярлалаа!" @@ -665,6 +733,8 @@ msgid "" "Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" +"Нууц үгээ мартсан уу? Доор имэйл хаягаа оруулна уу, бид шинэ нууц үг " +"тохируулах зааврыг имэйлээр илгээнэ." msgid "Email address:" msgstr "Имэйл хаяг:" @@ -672,6 +742,9 @@ msgstr "Имэйл хаяг:" msgid "Reset my password" msgstr "Нууц үгээ шинэчлэх" +msgid "Select all objects on this page for an action" +msgstr "Энэ хуудас дээрх бүх объектуудыг үйлдэл хийхийн тулд сонгоно уу" + msgid "All dates" msgstr "Бүх огноо" diff --git a/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo b/django/contrib/admin/locale/mr/LC_MESSAGES/django.mo index d847b48ad67ec0416debfc5c01e7c64ab36f6563..51f8c63d965677ed59b9234e991d50564073a15f 100644 GIT binary patch literal 21488 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 kf=qdNxn2oKUuIfrg\n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2024-01-25 07:05+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,108 +18,142 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #, python-format -msgid "Successfully deleted %(count)d %(items)s." +msgid "Delete selected %(verbose_name_plural)s" msgstr "" +#, python-format +msgid "Successfully deleted %(count)d %(items)s." +msgstr "यशस्वीरीत्या %(count)d %(items)s घालवले गेले आहेत." + #, python-format msgid "Cannot delete %(name)s" -msgstr "" +msgstr "%(name)s घालवू शकत नाही" msgid "Are you sure?" -msgstr "" - -#, python-format -msgid "Delete selected %(verbose_name_plural)s" -msgstr "" +msgstr "तुम्हाला खात्री आहे का?" msgid "Administration" -msgstr "" +msgstr "प्रशासन" msgid "All" -msgstr "" +msgstr "सर्व" msgid "Yes" -msgstr "" +msgstr "होय" msgid "No" -msgstr "" +msgstr "नाही" msgid "Unknown" -msgstr "" +msgstr "अज्ञात" msgid "Any date" -msgstr "" +msgstr "कोणतीही दिनांक" msgid "Today" -msgstr "" +msgstr "आज" msgid "Past 7 days" -msgstr "" +msgstr "मागील 7 दिवस" msgid "This month" -msgstr "" +msgstr "या महिन्यात" msgid "This year" -msgstr "" +msgstr "यावर्षी" + +msgid "No date" +msgstr "दिनांक नाही" + +msgid "Has date" +msgstr "दिनांक आहे" + +msgid "Empty" +msgstr "रिकामी" + +msgid "Not empty" +msgstr "रिकामी नाही" #, python-format msgid "" "Please enter the correct %(username)s and password for a staff account. Note " "that both fields may be case-sensitive." msgstr "" +"कृपया करून %(username)s आणि कर्मचारी खात्यासाठी अचूक गुप्तशब्द नमूद करा. लक्षात घ्या की " +"दोन्ही राखणे संवेदनशील असू शकतात." msgid "Action:" -msgstr "" +msgstr "क्रिया:" + +#, python-format +msgid "Add another %(verbose_name)s" +msgstr "अजून एक %(verbose_name)s जोडा" + +msgid "Remove" +msgstr "काढा" + +msgid "Addition" +msgstr "वाढ" + +msgid "Change" +msgstr "बदला" + +msgid "Deletion" +msgstr "वगळा" msgid "action time" -msgstr "" +msgstr "क्रियाकाळ" + +msgid "user" +msgstr "वापरकर्ता" + +msgid "content type" +msgstr "सामुग्री प्रकार" msgid "object id" msgstr "" +#. Translators: 'repr' means representation +#. (https://docs.python.org/library/functions.html#repr) msgid "object repr" msgstr "" msgid "action flag" -msgstr "" +msgstr "क्रिया झेंडा" msgid "change message" -msgstr "" +msgstr "लिखित बदला" msgid "log entry" -msgstr "" +msgstr "घटक नोंद" msgid "log entries" -msgstr "" +msgstr "घटक नोंदी" #, python-format -msgid "Added \"%(object)s\"." -msgstr "" +msgid "Added “%(object)s”." +msgstr "“%(object)s” जोडले" #, python-format -msgid "Changed \"%(object)s\" - %(changes)s" -msgstr "" +msgid "Changed “%(object)s” — %(changes)s" +msgstr "“%(object)s” — %(changes)s बदलले" #, python-format -msgid "Deleted \"%(object)s.\"" -msgstr "" +msgid "Deleted “%(object)s.”" +msgstr "\"%(object)s\" घालविले" msgid "LogEntry Object" msgstr "" -msgid "None" +#, python-brace-format +msgid "Added {name} “{object}”." msgstr "" -msgid "" -"Hold down \"Control\", or \"Command\" on a Mac, to select more than one." -msgstr "" - -#, python-format -msgid "Changed %s." -msgstr "" +msgid "Added." +msgstr "जोडले." msgid "and" -msgstr "" +msgstr "आणि" #, python-format msgid "Added %(name)s \"%(object)s\"." @@ -133,24 +168,21 @@ msgid "Deleted %(name)s \"%(object)s\"." msgstr "" msgid "No fields changed." -msgstr "" +msgstr "कोणतेही रखाणे बदलले नाहीत." -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below." +msgid "None" msgstr "" -#, python-format -msgid "" -"The %(name)s \"%(obj)s\" was added successfully. You may add another " -"%(name)s below." -msgstr "" +msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." +msgstr "एकापेक्षा जास्त निवडण्यासाठी \"कंट्रोल\" किंवा मॅक वर \"कमांड\" खटका दाबा" -#, python-format -msgid "The %(name)s \"%(obj)s\" was added successfully." +msgid "Select this object for an action - {}" msgstr "" -#, python-format +msgid "You may edit it again below." +msgstr "तुम्ही ते खाली पुन्हा संपादित करू शकता." + +#, python-brace-format msgid "" "The %(name)s \"%(obj)s\" was changed successfully. You may edit it again " "below." @@ -162,36 +194,52 @@ msgid "" "%(name)s below." msgstr "" -#, python-format -msgid "The %(name)s \"%(obj)s\" was changed successfully." -msgstr "" +#, python-brace-format +msgid "The {name} “{obj}” was added successfully. You may edit it again below." +msgstr "{name} \"{obj}\" यशस्वीरीत्या जोडले गेले आहे. तुम्ही त्याचे पुन्हा संपादन करू शकता." + +#, python-brace-format +msgid "" +"The {name} “{obj}” was changed successfully. You may add another {name} " +"below." +msgstr "{name} \"{obj}\" यशस्वीरीत्या जोडले गेले आहे. तुम्ही त्याचे पुन्हा संपादन करू शकता." + +#, python-brace-format +msgid "The {name} “{obj}” was changed successfully." +msgstr "{name} \"{obj}\" यशस्वीरीत्या बदलले गेले आहे." msgid "" "Items must be selected in order to perform actions on them. No items have " "been changed." msgstr "" +"गोष्टींवर क्रिया करण्यासाठी त्या निवडले जाणे आवश्यक आहे. कोणत्याही गोष्टी बदलल्या गेल्या " +"नाहीत." msgid "No action selected." -msgstr "" +msgstr "कोणतीही क्रिया निवडली नाही." #, python-format -msgid "The %(name)s \"%(obj)s\" was deleted successfully." -msgstr "" +msgid "The %(name)s “%(obj)s” was deleted successfully." +msgstr "%(name)s “%(obj)s” यशस्वीरीत्या हटवले गेले आहे." #, python-format -msgid "%(name)s object with primary key %(key)r does not exist." -msgstr "" +msgid "%(name)s with ID “%(key)s” doesn’t exist. Perhaps it was deleted?" +msgstr "%(name)s “%(key)s” ओळखीसह अस्तित्वात नाही. कदाचित ते घालवले असेल ?" #, python-format msgid "Add %s" -msgstr "" +msgstr "जोडा %s" #, python-format msgid "Change %s" -msgstr "" +msgstr "बदला %s" + +#, python-format +msgid "View %s" +msgstr "पहा %s" msgid "Database error" -msgstr "" +msgstr "डेटाबेस त्रुटी" #, python-format msgid "%(count)s %(name)s was changed successfully." @@ -213,8 +261,9 @@ msgstr "" msgid "Change history: %s" msgstr "" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "" @@ -226,111 +275,139 @@ msgid "" msgstr "" msgid "Django site admin" -msgstr "" +msgstr "जॅंगो स्थळ प्रशासक" msgid "Django administration" -msgstr "" +msgstr "जॅंगो प्रशासन " msgid "Site administration" -msgstr "" +msgstr "स्थळ प्रशासन " msgid "Log in" msgstr "" #, python-format msgid "%(app)s administration" -msgstr "" +msgstr "%(app)s प्रशासन" msgid "Page not found" -msgstr "" +msgstr "पान मिळाले नाही" -msgid "We're sorry, but the requested page could not be found." -msgstr "" +msgid "We’re sorry, but the requested page could not be found." +msgstr "आम्ही क्षमस्व आहोत, पण विनंती केलेले पान मिळाले नाही." msgid "Home" -msgstr "" +msgstr "मुख्यपान" msgid "Server error" -msgstr "" +msgstr "वाढप्यात त्रुटी" msgid "Server error (500)" -msgstr "" +msgstr "सर्व्हर त्रुटी (500)" msgid "Server Error (500)" -msgstr "" +msgstr "सर्व्हर त्रुटी (500)" msgid "" -"There's been an error. It's been reported to the site administrators via " +"There’s been an error. It’s been reported to the site administrators via " "email and should be fixed shortly. Thanks for your patience." msgstr "" +"त्रुटी आली आहे व ती विपत्राद्वारे सांकेतिकस्थळ व्यवस्थापकांकडे कळविण्यात आली आहे आणि लवकरच " +"ती सुधारली जाईल. आपल्या सहनशीलतेसाठी धन्यवाद." msgid "Run the selected action" -msgstr "" +msgstr "निवडलेली क्रिया चालवा" msgid "Go" -msgstr "" +msgstr "जा" msgid "Click here to select the objects across all pages" -msgstr "" +msgstr "पानावरील सर्व वस्तूंची निवड करण्यासाठी येथे टिचकी मारा" #, python-format msgid "Select all %(total_count)s %(module_name)s" -msgstr "" +msgstr "सर्व %(total_count)s %(module_name)s निवडा" msgid "Clear selection" +msgstr "निवड काढा" + +msgid "Breadcrumbs" +msgstr "ब्रेडक्रम्ब्स" + +#, python-format +msgid "Models in the %(name)s application" msgstr "" +msgid "Add" +msgstr "जोडा" + +msgid "View" +msgstr "पहा" + +msgid "You don’t have permission to view or edit anything." +msgstr "तुम्हाला काहीही पाहण्याची किंवा संपादित करण्याची परवानगी नाही." + msgid "" -"First, enter a username and password. Then, you'll be able to edit more user " +"First, enter a username and password. Then, you’ll be able to edit more user " "options." msgstr "" +"पहिलं, वापरकर्तानाव आणि गुप्तशब्द नमूद करा. मग, आपण अधिक वापरकर्ता पर्यायांचे संपादन करू " +"शकता." msgid "Enter a username and password." -msgstr "" +msgstr "वापरकर्तानाव आणि गुप्तशब्द नमूद करा." msgid "Change password" -msgstr "" +msgstr "गुप्तशब्द बदला" msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" +msgid_plural "Please correct the errors below." +msgstr[0] "" +msgstr[1] "" #, python-format msgid "Enter a new password for the user %(username)s." -msgstr "" +msgstr "%(username)s वापरकर्त्यासाठी नवीन गुप्तशब्द नमूद करा " + +msgid "Skip to main content" +msgstr "मुख्य सामुग्रीवर जा" msgid "Welcome," -msgstr "" +msgstr "स्वागत आहे," msgid "View site" -msgstr "" +msgstr "संकेतस्थळ पहा" msgid "Documentation" -msgstr "" +msgstr "दस्तऐवज" msgid "Log out" -msgstr "" +msgstr "बाहेर पडा" -msgid "Add" +#, python-format +msgid "Add %(name)s" msgstr "" msgid "History" -msgstr "" +msgstr "इतिहास" msgid "View on site" -msgstr "" - -#, python-format -msgid "Add %(name)s" -msgstr "" +msgstr "संकेतस्थळावर पहा" msgid "Filter" -msgstr "" +msgstr "गाळणी" + +msgid "Hide counts" +msgstr "गणना लपवा" + +msgid "Show counts" +msgstr "गणना दाखवा" + +msgid "Clear all filters" +msgstr "सर्व गाळण्या साफ करा" msgid "Remove from sorting" -msgstr "" +msgstr "सोडवा सोडवा" #, python-format msgid "Sorting priority: %(priority_number)s" @@ -339,8 +416,17 @@ msgstr "" msgid "Toggle sorting" msgstr "" +msgid "Toggle theme (current theme: auto)" +msgstr "थीम खुंटी बदला (सध्याची थीम: स्वयंप्रेरित)" + +msgid "Toggle theme (current theme: light)" +msgstr "थीम खुंटी बदला (सध्याची थीम: उजेड)" + +msgid "Toggle theme (current theme: dark)" +msgstr "थीम खुंटी बदला (सध्याची थीम: काळोख)" + msgid "Delete" -msgstr "" +msgstr "घालवा" #, python-format msgid "" @@ -360,18 +446,20 @@ msgid "" "Are you sure you want to delete the %(object_name)s \"%(escaped_object)s\"? " "All of the following related items will be deleted:" msgstr "" +"\"%(escaped_object)s\" %(object_name)sनावाच्या वस्तू घालवताना त्याच्या संबंधित " +"वस्तूही घालवाव्या लागतील" msgid "Objects" msgstr "" -msgid "Yes, I'm sure" -msgstr "" +msgid "Yes, I’m sure" +msgstr "होय, मला खात्री आहे" msgid "No, take me back" -msgstr "" +msgstr "नको, मला मागे न्या" msgid "Delete multiple objects" -msgstr "" +msgstr "एकाधिक वस्तू घालवा" #, python-format msgid "" @@ -385,95 +473,111 @@ msgid "" "Deleting the selected %(objects_name)s would require deleting the following " "protected related objects:" msgstr "" +"निवडलेले %(objects_name)s घालवण्यासाठी खालील संरक्षित संबंधित वस्तू डिलीट करणे आवश्यक " +"आहे." #, python-format msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" - -msgid "Change" -msgstr "" - -msgid "Remove" -msgstr "" - -#, python-format -msgid "Add another %(verbose_name)s" -msgstr "" +"तुम्हाला खात्री आहे की तुम्ही निवडलेले %(objects_name)s हटवायला याची खात्री आहे का? " +"खात्री आहे की खालील वस्तूंचे आणि त्यांच्या संबंधित घटक हटवले जातील:" msgid "Delete?" -msgstr "" +msgstr "घालवायचं ?" #, python-format msgid " By %(filter_title)s " msgstr "" msgid "Summary" -msgstr "" +msgstr "सारांश" -#, python-format -msgid "Models in the %(name)s application" -msgstr "" +msgid "Recent actions" +msgstr "अलीकडच्या क्रिया" -msgid "You don't have permission to edit anything." -msgstr "" +msgid "My actions" +msgstr "माझ्या क्रिया" -msgid "Recent Actions" -msgstr "" +msgid "None available" +msgstr "काहीही उपलब्ध नाही" -msgid "My Actions" -msgstr "" +msgid "Added:" +msgstr "जोडले गेले:" -msgid "None available" -msgstr "" +msgid "Changed:" +msgstr "बदलले." + +msgid "Deleted:" +msgstr "घालवले." msgid "Unknown content" -msgstr "" +msgstr "अज्ञात सामुग्री" msgid "" -"Something's wrong with your database installation. Make sure the appropriate " +"Something’s wrong with your database installation. Make sure the appropriate " "database tables have been created, and make sure the database is readable by " "the appropriate user." msgstr "" +"तुमच्या माहितीगठ्ठा स्थापनेत काहीतरी चुक आहे. खात्री करा की योग्य डेटाबेस तक्ते तयार केलेले " +"आहेत आणि खात्री करा की योग्य वापरकर्त्या माहितीगठ्ठा वाचू शकतो." + +#, python-format +msgid "" +"You are authenticated as %(username)s, but are not authorized to access this " +"page. Would you like to login to a different account?" +msgstr "" +"तुम्ही %(username)s म्हणून प्रमाणित केले आहे, परंतु हे पानात शिरकाव करण्यास अधिकृत नाही. " +"तुम्हाला वेगळ्या खात्यात प्रवेश करायला आवडेल का?" msgid "Forgotten your password or username?" +msgstr "तुमचा गुप्तशब्द किंवा वापरकर्तानाव विसरलात का?" + +msgid "Toggle navigation" +msgstr "टॉगल नेविगेशन" + +msgid "Sidebar" +msgstr "बाजूभिंत" + +msgid "Start typing to filter…" +msgstr "प्रविष्ट करण्यासाठी टाइप करण्याची सुरुवात करा ..." + +msgid "Filter navigation items" msgstr "" msgid "Date/time" -msgstr "" +msgstr "दिनांक/वेळ" msgid "User" -msgstr "" +msgstr "वापरकर्ता" msgid "Action" -msgstr "" +msgstr "क्रिया" + +msgid "entry" +msgid_plural "entries" +msgstr[0] "" +msgstr[1] "" msgid "" -"This object doesn't have a change history. It probably wasn't added via this " +"This object doesn’t have a change history. It probably wasn’t added via this " "admin site." msgstr "" +"या वस्तूचा कोणताही बदलाचा इतिहास नाही. कदाचित तो व्यवस्थापक मार्गे नव्हता जोडला गेला " +"असावा." msgid "Show all" -msgstr "" +msgstr "सर्व दाखवा" msgid "Save" -msgstr "" +msgstr "साठवा" -#, python-format -msgid "Change selected %(model)s" -msgstr "" - -#, python-format -msgid "Add another %(model)s" -msgstr "" - -#, python-format -msgid "Delete selected %(model)s" -msgstr "" +msgid "Popup closing…" +msgstr "पॉपअप बंद होत आहे..." msgid "Search" -msgstr "" +msgstr "शोधा" #, python-format msgid "%(counter)s result" @@ -486,124 +590,164 @@ msgid "%(full_result_count)s total" msgstr "" msgid "Save as new" -msgstr "" +msgstr "नवीन म्हणून साठवा" msgid "Save and add another" -msgstr "" +msgstr "साठवा आणि आणखी एक जोडा" msgid "Save and continue editing" -msgstr "" +msgstr "साठवा आणि संपादन सुरू ठेवा" -msgid "Thanks for spending some quality time with the Web site today." -msgstr "" +msgid "Save and view" +msgstr "साठवा आणि पहा" + +msgid "Close" +msgstr "बंद" + +#, python-format +msgid "Change selected %(model)s" +msgstr "निवडलेले %(model)s बदला" + +#, python-format +msgid "Add another %(model)s" +msgstr "अजून एक %(model)s जोडा" + +#, python-format +msgid "Delete selected %(model)s" +msgstr "निवडलेले %(model)s घालवा" + +#, python-format +msgid "View selected %(model)s" +msgstr "निवडलेले %(model)s पहा" + +msgid "Thanks for spending some quality time with the web site today." +msgstr "आज संकेतस्थळावर अमुल्य वेळ घालवल्याबद्दल धन्यवाद." msgid "Log in again" -msgstr "" +msgstr "पुन्हा प्रवेश करा" msgid "Password change" -msgstr "" +msgstr "गुप्तशब्द बदला" msgid "Your password was changed." -msgstr "" +msgstr "तुमचा गुप्तशब्द बदलला गेला आहे." msgid "" -"Please enter your old password, for security's sake, and then enter your new " +"Please enter your old password, for security’s sake, and then enter your new " "password twice so we can verify you typed it in correctly." msgstr "" +"सुरक्षेसाठी कृपया आपला जुना गुप्तशब्द नमूद करा, आणि नंतर आपला नवीन गुप्तशब्द दोनदा नमूद " +"करा जेणेकरून तुम्ही गुप्तशब्द अचूक नमूद केला आहे की नाही ह्याची आम्ही पडताळणी करू." msgid "Change my password" -msgstr "" +msgstr "माझा गुप्तशब्द बदला" msgid "Password reset" -msgstr "" +msgstr "गुप्तशब्द पुन्हस्थापना" msgid "Your password has been set. You may go ahead and log in now." -msgstr "" +msgstr "तुमचा गुप्तशब्द जोडला आहे. आपण आता प्रवेश करू शकता." msgid "Password reset confirmation" -msgstr "" +msgstr "गुप्तशब्द पुन्हस्थापना निश्चित" msgid "" "Please enter your new password twice so we can verify you typed it in " "correctly." msgstr "" +"कृपया आपला नवीन गुप्तशब्द दोनदा नमूद करा, जेणेकरून तुम्ही तो योग्य नमूद केला आहे का याची " +"आम्ही पडताळणी करू." msgid "New password:" -msgstr "" +msgstr "नवीन गुप्तशब्द:" msgid "Confirm password:" -msgstr "" +msgstr "निश्चित गुप्तशब्द:" msgid "" "The password reset link was invalid, possibly because it has already been " "used. Please request a new password reset." msgstr "" +"गुप्तशब्द पुन्हस्थापना दुवा अवैध आहे, कदाचित तो आधीच वापरला गेलेला आहे. कृपया नवीन गुप्तशब्द " +"पुन्हस्थापनेची विनंती करा." msgid "" -"We've emailed you instructions for setting your password, if an account " +"We’ve emailed you instructions for setting your password, if an account " "exists with the email you entered. You should receive them shortly." msgstr "" +"आपल्याला आपला गुप्तशब्द पुन्हस्थापीत करण्याच्या सूचना विपत्र केल्या आहेत, जर नमूद केलेल्या " +"विपत्रासह खाते उपलब्ध असेल तर आपल्याला ते लवकरच मिळायला पाहीजे." msgid "" -"If you don't receive an email, please make sure you've entered the address " +"If you don’t receive an email, please make sure you’ve entered the address " "you registered with, and check your spam folder." msgstr "" +"जर तुम्हाला विपत्र मिळत नसेल तर कृपया खाते नोंदवलेला विपत्र तुम्ही योग्य नमूद केलाय का " +"याची खात्री करा आणि तुमचा स्पॅम फोल्डर तपासा." #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" +"तुम्हाला हा विपत्र मिळत आहे कारण तुम्ही %(site_name)s या संकेतस्थळावरील तुमच्या " +"वापरकर्ता खात्यासाठी गुप्तशब्द पुन्हस्थापनेची विनंती केली होती." msgid "Please go to the following page and choose a new password:" -msgstr "" +msgstr "कृपया खालील पानावर जा आणि नवीन गुप्तशब्द निवडा." -msgid "Your username, in case you've forgotten:" -msgstr "" +msgid "Your username, in case you’ve forgotten:" +msgstr "तुमचे वापरकर्तानाव, जर तुम्ही विसरला असाल तर:" msgid "Thanks for using our site!" -msgstr "" +msgstr "आमच्या संकेतस्थळाचा वापर केल्याबद्दल आभार!" #, python-format msgid "The %(site_name)s team" -msgstr "" +msgstr "%(site_name)s संघ" msgid "" -"Forgotten your password? Enter your email address below, and we'll email " +"Forgotten your password? Enter your email address below, and we’ll email " "instructions for setting a new one." msgstr "" +"तुमचा गुप्तशब्द विसरलात का? तुमचा विपत्रपत्ता खाली नमूद करा. नवीन गुप्तशब्द " +"ठरवण्यासाठीच्या सूचना आम्ही तुम्हाला विपत्र करू." msgid "Email address:" -msgstr "" +msgstr "विपत्र पत्ता:" msgid "Reset my password" -msgstr "" +msgstr "माझा गुप्तशब्द पुन्हस्थापन करा" -msgid "All dates" -msgstr "" +msgid "Select all objects on this page for an action" +msgstr "क्रिया करण्यासाठी या पानावरील सर्व घटक निवडा." -msgid "(None)" -msgstr "" +msgid "All dates" +msgstr "सर्व दिनांक" #, python-format msgid "Select %s" -msgstr "" +msgstr "%s निवडा" #, python-format msgid "Select %s to change" -msgstr "" +msgstr "बदलण्यासाठी %s निवडा" + +#, python-format +msgid "Select %s to view" +msgstr "पाहण्यासाठी %s निवडा" msgid "Date:" -msgstr "" +msgstr "दिनांक:" msgid "Time:" -msgstr "" +msgstr "वेळ:" msgid "Lookup" -msgstr "" +msgstr "शोध" msgid "Currently:" -msgstr "" +msgstr "सध्या:" msgid "Change:" -msgstr "" +msgstr "बदला:" diff --git a/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo b/django/contrib/admin/locale/sw/LC_MESSAGES/django.mo index a66e246dcd8308bd50c6b04b61afc9e64115b0fa..9aa7f311c2d81d020da08b9ad7486c4c305d61a6 100644 GIT binary patch delta 4480 zcmZYBc~Di?0mt!!EFyveE(jud8Zj(Nia??e0YzM@7*vYI4WIf5o4oh{0joYWRHJn* znrITL)l?H>5)^9EW~s($YbVuAWB$lCVQigg9Xr$1WlZYS_WOJHkp9s#`SCgTzW2_4 zui5@=(6OCC{;y&~4jRful1Q?{jOia_%-l%bHKsb+m|<9h!_ki;@i|83J}8y8SByo`a7q8hk~{Knk1h7UDnFxMk7 z9@9}XD#mmyLFQuGFa>{t8eosT{~qf1A7Li_n_eoR7{fa0hjAEzsi+xcqXtrh`d$fY zfD2J8vKTcGA3lP+Py_10Bz)I?{sn3vcd->8pnolu7N-3M-oPq6M61W~Kd2uZAK`4t zY19Bez$p9#HNZck2KG-Z#CxcYCow7wbP;Nx%W)B|!?AcJp7n2_a+@3daAktip$D}k z4XBx{$GNx_L+~Ti%6)=ru#6L_j!vV_Qa9>%=TS?2$$tJRj^Vl&wZi=pX+<-M;-qN+ zBav-3NvH-UqV_%)Iq0SYHGt))nXf`^jSuzx4fcLJs^boOeH`i2oJCFS3Krt$ekx5= zMvmfBVJuADO(VNO$i0aXi;ArnCMf-wR0W&<4x2AZjWdE^@VS^p_zwF;N)X0>apC9 zkr>8FQv*X#hcE#(kWAF)dG`J+YbENjU56UrcGQ55;8Z+??3VevpGqc`p^rKZ%|Laq z5C>r`@}Ftrk5=YY)S-M6HGm7K8GnfC;IF8G-a^grTjXtQ9-vk%jz>c)H38M0zm$rL zN;#^b7F5F>xC=W`E0M-1U&bTo!RZr?Ie@27OIncS3~VNm);Q3LA0Nq7hu zh~NB)ibiq=^``n4F2$id^t@}#T3nC&QQwQqakebhnuOupPs7=mWv@4)ezy(hVbEjF z?@LiDRgNKg{@qk~+nOp=L+z*~+KoCBU8p^NAGNd}q8_`C?dShMy{P_;+L{rMJKsyg z;aq2;R$>;a{Zbr;6&S7O-%CZ0&1O``9jJ!R;Vis_K8#`ADzP0q@H+C5Y2~Fc6uWQ; z{uZ@TpP@SHMGfRGYT%K%&VW+UuZ}XQXwQmJ4OOD~{OgYgV#vRua6=?~`*o@%T4<9*0eH_WE_y-gjdY{vI>&30|+Gu>sw<4><`{d_D`==#SVRg+)GL9S~`-w^w*-K{Vg3?YlksZ3AXr)TX zk947;{&$mybU~RiB8=tv@WyGvIY(s^*!WKvdG?l8ym@3@(R)U=_}7s8BMm6pOTGaB2jsZ ztPa%ZKZnXB;v#wk8^{IHSN2hPgXnbkkds8En`|Y?x}b!Ur${0B8F`s#c6wUQkSr2I z4v?cnZ&5RDM7z?2XfSg3PhkeJt&(V3Vz1#4_Tu*Uk8_t*^JfZ#{@JZQXy4 zivBs=OgGE8Z`$KB|0{om(}_6yxx68{n&Zpv#s zEw1Fo?#krY;3!W+ldsL_Z;hw12p|tG=eH+1=!>_hy(fca?i}wY$E?^}p||aR(T&D)*$c-w&CCC%Oj kPo2BLYrd;#6bA}pf@5nMo~l{zHEZ18RXWZW#gm!;1-g{&W&i*H delta 4210 zcmYk;2~bs40LJlyAS#=Ph9aSW3Zi16lDmR|8wq5#2%4ahqNte)E$VdvA;lG`2uagi zQX}(;X=*y7(`MyJ>5OSkW1~6KR8D0!lcW8=cMnZx`uLrD-h1bs?Oxly+NZq2$GIBj zS8XUK$%CYwzcD^O#smea)tJywV;;aZ7>@B6iNi1lb1)7YZ2J`)#r5Bqj45s0-xniY zn@VhfRp@JsV`{1BUR&)K_M>j-K@I40>kVwrwQrc)QKU5%Thg9@A=n4$*rZ}BOt+tB z;S#Q&!BV`4!Q9{EwlyY@hCU+0Q1N;ZIBF$JX4WuK+ zV?We@CSfO>Za-g%8b}?!h`Z34Po*={uE&k|9H!9g4&06UK}H96OD3RZFbjimF=~LT zQ3I>N6x@os@einh-bW48pHV)Iov4bIToe_btWoN6WoQm@gY<{r%(fTKBb}#&!alL zjy>=WCSq)7cjVcqr7c3O$V;fRQHkof8nps%qxyRnHINhd0XAYcERA*twigq$i)X0l zhri-5{0rGmlN`e=F&p(*mf<4Yg1s?}jnvAeVg_!)hw&`?R^aDH21^Fn2pTA)Z6xN zu@~33@KKEF>HZs$kIlKRu&(RL`uo$cnFcLkEovb9P&aHqE#X^$_au zJc}CO71V(K#8kYG?21X{q$Xh@s-Id^|9db5PdZc{qVhFrY3`v8pC64HKsai~(Wn~? zK@D^iYKED}+toaQTCpP3O07Wkw-cjrAF7`(QT^V;N_2jwqNQ+ncHY51u>flr_GY|~ zTGGvZ+<|RDbySaP{{nU6M$~|A;sE>wHITTz?m)(%UPxJ}$FC51B{=32DlgM;12y7& z9(wKR4C?}H$+d%Hu)(e_q#m z{-dZ&!3|i2w~+r#DeKq{k7HXrk6NMYs2lu@;poHLL<8=C8b~tg218L>m4)hOwryXA zn!qOXKL0gTB52rwt?>kM49r)^@i6z0y)wNAxiiW{-FOP>R2N%UqJF;tHGplXfgQve zJcsJHaIibDHwUx-@iZK!L8tO6@&K5ds2jE);{GpGf7FcgundclC(PW%iP(eJVHTF6 z2K+7Nq96aDjK@4&gC5jMVVRTKbFF3%_@$yiO&6w}$q1J8G}@;6gl(NtiT(*Dg-O zd@MtD#r%X37{hxu4hN$S-Bi>K7hp47Zre*y6RO6J=(Y2ORC7T>3?TPmBL8AT3 zBe6u!wTez{HQ7r(BJ0Ug@-|sRRPsrhx8|O$bn2b#b*l9l97~)%{PEaEJ&OM?5nQ}u z8x~^^vfW;bZvU&#qQ08EMOKg$(o}M&>>~S{8gMvyS@YLpFo--wHj`DPsk~+@&*CC7 zgd8N>h(A$zg^VNRq&HF7M7DZs#(a!D$s43INg$=(7NRX)2FUnMZiTnvtZ8 zgb|ggq?RP>g3_I=BMqbtQTfot`}alu_9yR=QQj6FYwSYa*ZwCGJ(DUc$-5*|7nCDp z2brS_Tk3E!nLs*_fn)*6A}UXkXtIo`6uNl-RUB&TCD@fDPUFuQ+ZcpNw!Y6g!rB&R zdI~}p2YF(nF1Pdq#0C3SbxYXNJ~Mw|eo, 2023 +# DOREEN WANYAMA, 2023 # Machaku, 2013-2014 # Machaku, 2016 # Millicent Atieno Obwanda , 2023 @@ -11,8 +12,8 @@ msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: Natalia (Django Fellow), 2023\n" +"PO-Revision-Date: 2023-12-25 07:05+0000\n" +"Last-Translator: DOREEN WANYAMA, 2023\n" "Language-Team: Swahili (http://app.transifex.com/django/django/language/" "sw/)\n" "MIME-Version: 1.0\n" @@ -250,7 +251,7 @@ msgstr "Badilisha %s" #, python-format msgid "View %s" -msgstr "" +msgstr "Muonekano %s" msgid "Database error" msgstr "Hitilafu katika hifadhidata" @@ -358,7 +359,7 @@ msgid "Add" msgstr "Ongeza" msgid "View" -msgstr "" +msgstr "Muonekano" msgid "You don’t have permission to view or edit anything." msgstr "Huna ruhusa ya kutazama au kuhariri kitu chochote" @@ -378,8 +379,8 @@ msgstr "Badilisha nywila" msgid "Please correct the error below." msgid_plural "Please correct the errors below." -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Tafadhali sahihisha kosa lifuatalo." +msgstr[1] "Tafadhali sahihisha makosa yafuatayo" #, python-format msgid "Enter a new password for the user %(username)s." @@ -582,8 +583,8 @@ msgstr "Tendo" msgid "entry" msgid_plural "entries" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "ingizo" +msgstr[1] "maingizo" msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " diff --git a/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo b/django/contrib/admin/locale/uz/LC_MESSAGES/django.mo index 67c6d07e41c1907ecf3954af2808ed41927634f3..253820c477e6e4d92329ec4d38250ee7cc6b9797 100644 GIT binary patch delta 788 zcmXxiK}Zx~6u|Mfi@TcZuDNDPhD^(fhP&;$DbW@YUV^AD>OrJnv}I>;)n%O#5pqBf zI*6CRphE`{OzI#^CkY}7>QaYpL8lIRtH4u-sQ=TiWtrbM@B6+t-+MEw=_l#E^|0@T zM9#-VnndJj%dtCnlKVYmO5R`!KVm2T!V}mO7iq;L>i!faZ~$2%MeM*Ecn0s9_!72p zzZMr?PBC~)fWN%pGJyN23BO}6{=^7&kX;|#jeXdQOv!ER!bvml8dp&FJ;bxPftvR@ zHsi~LFVe{1HGwF;$9DXL4fqYU0|%&y4pBG$My;@c@;9*!wW4RJ2i!;P)H@UZifQhD zpgymi_UiMxeFmB+g*})<*2o>y*4@J_x~Lnrupf6ZgP&0=`in=egj482lg2L8*7u;U zyNr5(5!6Ebn+zyM#*O!l3m7K8isY6x)K+hr_%`aR+d=KnE7Wx#P}hAyE#Lq({~r@? zNs92v9sM{+&=_%|iNTB6{7|+qY~?Q%^TUrG#5zYu9dD-YRjc#Xm{%`*bMuSV)rJ4D z>)xzgsb27wuVt)4zA%{KGSqy_o-2EHxs)9%*|SA!e0i!gWA!_(TPx;rcC8k?ja>;v dM(p~u6NKZZL&3SkN+{Yl?NsWOV7GN5{14V^Vq5?K delta 740 zcmXZaPe_w-9LMqRrcT}5qmj0VkR^-K9Qf=oq!8&62_1wkMICwuqQ%kuE!%H|E#qZ-eo}Z*G zux+WD4AEP!b<8@rcLHvxW=nz%;5h~G>NZqd1Cs6CIpb{8B6%rH} zki3mV-iv&MapF&rv#gA&Y(9$DQLkLD&yStCthU7N>y)iy8P_<+D@vssaC6nhpAh!=DS|G99~Ob hh_%mp72m5&dX;d*nU5v?=~8yqo0;;xu+jN2ehOFfRgC}u diff --git a/django/contrib/admin/locale/uz/LC_MESSAGES/django.po b/django/contrib/admin/locale/uz/LC_MESSAGES/django.po index 80dd7971a64..8b4f8fd6b8e 100644 --- a/django/contrib/admin/locale/uz/LC_MESSAGES/django.po +++ b/django/contrib/admin/locale/uz/LC_MESSAGES/django.po @@ -6,17 +6,17 @@ # Bedilbek Khamidov , 2019 # Claude Paroz , 2019 # Nuriddin Islamov, 2021 -# Shukrullo Turgunov , 2021 +# Shukrullo Turgunov , 2021,2024 # Sukhrobbek Ismatov , 2019 # Yet Sum , 2019 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-21 10:22+0200\n" -"PO-Revision-Date: 2021-12-16 12:06+0000\n" -"Last-Translator: Alex Ibragimov\n" -"Language-Team: Uzbek (http://www.transifex.com/django/django/language/uz/)\n" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2024-01-25 07:05+0000\n" +"Last-Translator: Shukrullo Turgunov , 2021,2024\n" +"Language-Team: Uzbek (http://app.transifex.com/django/django/language/uz/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -25,7 +25,7 @@ msgstr "" #, python-format msgid "Delete selected %(verbose_name_plural)s" -msgstr "%(verbose_name_plural)s tanlanganlarni o'chirish" +msgstr "%(verbose_name_plural)s larni o'chirish" #, python-format msgid "Successfully deleted %(count)d %(items)s." @@ -42,7 +42,7 @@ msgid "Administration" msgstr "Administratsiya" msgid "All" -msgstr "Hammasi" +msgstr "Barchasi" msgid "Yes" msgstr "Ha" @@ -96,7 +96,7 @@ msgid "Add another %(verbose_name)s" msgstr "Boshqa %(verbose_name)s qo‘shish" msgid "Remove" -msgstr "Olib tashlash" +msgstr "O'chirish" msgid "Addition" msgstr " Qo'shish" @@ -182,6 +182,9 @@ msgstr "Bo'sh" msgid "Hold down “Control”, or “Command” on a Mac, to select more than one." msgstr "" +msgid "Select this object for an action - {}" +msgstr "" + #, python-brace-format msgid "The {name} “{obj}” was added successfully." msgstr "" @@ -262,8 +265,9 @@ msgstr "" msgid "Change history: %s" msgstr "" -#. Translators: Model verbose name and instance representation, -#. suitable to be an item in a list. +#. Translators: Model verbose name and instance +#. representation, suitable to be an item in a +#. list. #, python-format msgid "%(class_name)s %(instance)s" msgstr "" @@ -329,6 +333,9 @@ msgstr "" msgid "Clear selection" msgstr "" +msgid "Breadcrumbs" +msgstr "" + #, python-format msgid "Models in the %(name)s application" msgstr "" @@ -354,15 +361,16 @@ msgid "Change password" msgstr "Parolni o'zgartirish" msgid "Please correct the error below." -msgstr "" - -msgid "Please correct the errors below." -msgstr "" +msgid_plural "Please correct the errors below." +msgstr[0] "" #, python-format msgid "Enter a new password for the user %(username)s." msgstr "" +msgid "Skip to main content" +msgstr "" + msgid "Welcome," msgstr "Xush kelibsiz," @@ -388,6 +396,12 @@ msgstr "Saytda ko'rish" msgid "Filter" msgstr "Saralash" +msgid "Hide counts" +msgstr "" + +msgid "Show counts" +msgstr "" + msgid "Clear all filters" msgstr "" @@ -401,6 +415,15 @@ msgstr "" msgid "Toggle sorting" msgstr "" +msgid "Toggle theme (current theme: auto)" +msgstr "" + +msgid "Toggle theme (current theme: light)" +msgstr "" + +msgid "Toggle theme (current theme: dark)" +msgstr "" + msgid "Delete" msgstr "O'chirish" @@ -473,6 +496,15 @@ msgstr "Mening harakatlarim" msgid "None available" msgstr "" +msgid "Added:" +msgstr "" + +msgid "Changed:" +msgstr "" + +msgid "Deleted:" +msgstr "" + msgid "Unknown content" msgstr "" @@ -494,6 +526,9 @@ msgstr "" msgid "Toggle navigation" msgstr "Navigatsiyani almashtirish" +msgid "Sidebar" +msgstr "" + msgid "Start typing to filter…" msgstr "" @@ -509,6 +544,10 @@ msgstr "" msgid "Action" msgstr "" +msgid "entry" +msgid_plural "entries" +msgstr[0] "" + msgid "" "This object doesn’t have a change history. It probably wasn’t added via this " "admin site." @@ -562,6 +601,10 @@ msgstr "" msgid "Delete selected %(model)s" msgstr "" +#, python-format +msgid "View selected %(model)s" +msgstr "" + msgid "Thanks for spending some quality time with the web site today." msgstr "" @@ -647,6 +690,9 @@ msgstr "" msgid "Reset my password" msgstr "Parolimni tiklash" +msgid "Select all objects on this page for an action" +msgstr "" + msgid "All dates" msgstr "Barcha sanalar" diff --git a/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo b/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/django.mo index af501d2aa8600f340f958e1a82e5907835ad83b1..4bee1a8d452993fb78acf6e4eddd0f14eb427b17 100644 GIT binary patch delta 4609 zcmZYB3s9C-9>?+XauHEbM92#wueK=$sF;+ftCX(SGB4RpFb zvL>m4T3+)0mS};wUZx$}w)Wc2>_$@y2)Sl8+fM4Xv)|wQ9GcnLGxL8x=bYy}=k}cE zfjetmRU2Hs#^{hLL%KrrAx3vFCd_5b+z8bgQygVXEUv_Ra2v+q8~7|#gP3k@61g zg4IaJ<_L!4aeKWES5v--8*of_VS~%*!rEQfe+ZS9~skJLM^NjGw@3vnIbYt z@y1NY8Z5(aa3q$nj~e(aYQXnVEB!NSqMxE3$v3Di4o+|;7>67y<3@Jdq@fo2IBEi! zsD6Bl$!G-ys18@5I^2r)V-2R@2Y4UeMy({l?QHcZ)DBHTJ-Rul0T!TkqyW`#F=|3v z@HEyU{rSwSe$EV6;vg zcpPV9BR+e4z!ER(MbJ+R;(zp2vHSy>H z&a>~0IxF{EhoG(xM;+49*n{!SWHK7qgWAHSn2tqQfhRB+M-Oy5&cIU2(=iSIfE*(e zp2)WV2jEX}2Wsa&LOseaQI95;ZI=Der;by|Xl1FWnPp%kK89*I2g7lZb(yU%L9K8T zdR#nP)OX@5MpJ(wNzPg6jwzIfAfF18iJI^WN$mebGL=+t;LTrAGro--FeceC&e|XK zS`ET*Oh=vWap=ZOY3q(kkP zWwukHj`!LNhfphd3w7AuN1cJmBb|wQQKxqkYGNmm%`j(C1Kz|$j2Pt%n1)%Dr=a?I z6CcNqN3s9fO802z!eZ2gt*H7&EWv?%Pc_g1oQg+n`Cq7s|6t2uoIEY43u?u2sEH<7 zXIV=y(4UWtZa8Wy>Z}(~9bZN5#77v1U!dCm$6oI|*7>%_;(qEgP>1vHsQa$t3cQ0_ zc|nHr$EynGQ}&%B^D{DW4?A1yK{Z^38t66aF;vIrZMngE4YiU_Y`M{T13Oaxy)C;Q zaoTl37xhXk&}aB=1X6!~Um~>q^~9q@7Qy!>kn;IGMR17CL1GYbf;d2oCpHp{WtI_7 z6FrDrLW_HnP||mxJ^hNzyL$h(kU4E@k6Bk*_3V`9IRt*E@VlSrO!NxW@P8uCCk7C^ ziI)kbg~WDZf(oQx5Nn8X6-Yf9Kk#3P4q1EJN+!V;W*{G~z~Aqq_$*OI=#P_9DDiXR zc_N!(yoR0nd-XV^ntuj)Qq_YQKljW39wVnXj_d+K8|v#gm`y%86QSBO|*8!?1< zicmUF6cRc=M~En*J?$dXkJwC9603<}dj3l1hy{V1^B>I!@@`@#;Uz8+?P&*@lSFso zZQ?MY^cJz6xK9OAM`96?LA*x1PH41b;tcTs(M>f~WNHbe0-}cKK=dVYh_1vqVl1JQ zMCfCqq*qdDorAf6i8lWN`UyS_=2c=7F^W(cNlYdpHKQ@aG(suZA@IA0-`T`7w(d9{ zBBt7MJ9FDJSY-28@CjnMEw8|PZGM&YJ=FN-m&8P6NOgq%=&U6!6N`!I#0KIl@dlAi zq!SUuU?PuDYH$erPxvPJy|&!j`l5A-HB4u7r!7QV=iqbxn_YVb1?Man>32n^1%>5$ zyo*#A9y7)jsLhKl3<+P549-*+p(oUY=oBv|_DDx9Ghj&=w z$zJMS>HjwI!=Q-fx-%_x?>3j$+^VmxypYr!bZ)Ev_2i*0U1)mmM9a?eT=4%f;J#zEacQfGb37F Qxp4j9J9ZG)h?O1x3%RB|82|tP delta 4200 zcmYk$I(ER2NMkxSF8(x8dMRv3@^ zJQ){b7OucO7>?P|+(Z9n2nEe-G^*k0s0PZBYs~`d8e|d7MvTRssF^fkDjrA1WSTG; z!(!a?9MpY2%)&|70@vts`Zwz-w8pKdne0Rj;2`S4BdCELMXkUo)Bvtv5_(xK4I~ZY zF&p*yI9!Ocu@ZmA-S_~roq-`V=HE`Cf`XPRs*}6)ol!H%LM>GRYG7kg11iCMoPp}_ z9n=6DQ3E`NlkhV3#DR>a0;ggSo<#L`CYJTr$j?zR5-+0{`^IT!7}Fos(0)`05$rte zl@6%;dZ3mz74`Yun21AAD>@xDfw`!Tmmp8aEJNL2-iDKTZ^=%jXxgJ*oGi@8fmn@8a17qSHCWh{HwTaVDX8OCtfM-NL(L=w zHPTGfqbNiz?L^c7E0D);s*pu9t5GxEh8jQvs+~iq34Doa?-;7Ri`X0eHz;W2@!i~| z9e`R9AL6~AZ=K)x zD9oo~3Z~;3)KUfWAV=VM%)~8NgeP$n_Uz#<3g#wM|Wa0P1VzCb;*bEsz=n(P{bYB&Kkv!1Ad^+WB6 zeAM-$Q3EWtPD8&wsGy)3)?lfJO60r3T;f5h!M{*@B$VF!U{B=LHbtlb&q5!rM)tEg zfg12NY>BN>T_dd>Q7apt%KB?W=~QSJ--QWSglq#-h3cRlHKTo~20yblT94V!&sZHIXJ+z4Z^J9d zQ!%?x_n$@G_bc|pKT-Xpu){U;OjJAhep@jd!>K5?AC#ePn1^ccNz^Z?T2x2dQ4JhL zt<+i6O5MWg7?Z&U#2Q?N-{Ux(%&Rm9_n_MMcgu1+?uF_g8}-2m)Djh;Hdh%IU^!|f z8c+lH3N^sfI23~zj~{zoY2!c+EwZ%`dwvR=U` z&ad0gy*X}2?NIgc*c!7?4d-DQPC!lMQ!K%dJKa4~hPv-14Ac9+gMvEzNELY4Uhp-x z=lq=g{06FnCR-of-N#&%;n7jzw*zG}JTRjh*l`YExcC4IqZEJ;rD{qdF?WWUNH>^BR`mo?M>48j9q1 z;r*C{TC$a>`s23#hOIBS+n7bv*P=QK&2xW8M4-+mqXs_Jo|mI0RE3)8Qq(}7w;sr2 z{Z(;+3a3H7Z*@Zi>b#4!2dd%TsFlb@eIxo%*O%JQ=OSNvrUtj+Td2J?l&!A&M&f*Y z1U134ehU0TGfg-ZyACquUR;V=+D6oc=TRMb^IhAa8jiQ;iPj9%!1L^RfprXqQva|$ zpMkp0Uq!(~p_DvB-X~9yIYc+;*h?NK<8;FDfQuQ8e6cxyR!^{XLAZfbl1XGSd75Za z3y7DrAaP`r-hX{h_a!=btj^JfpKD14(SFcdpd*&7CXbQ?(tPOA=%^xF$VVif=ty^Q zHr_7E&yhFDK{A{E|2yg_y=>348P}1I$z!%|H}d7?{4rvyoc}ec+_t#_BS{xB`G0jP z21o~T2hrXMCl9Ir?j(fhC?U_2cgTM7ELlW0l2t^>wvls;=ckXn zMH-wM_rGbj=%D@O-)w81#2T{6o(pZf=3@qhmE={jgbXCj$3zNS$&Tg<%p*?_y$yUV zIDfjW$7Q7XDAV)TQB3BMT(XC}PP98;APdQGvYe!m14PGbF6I!XkUA1ilF3psl?)@z zhu)UvBb!1wxl{cYP^cwQM8_2J66vQCjwG^%>?7@njt^X%pL(Bj$a|#FsWIjgOe8x= zDv2OEG~Kt!2%T_zsERkpOtPKmc!fMj#*mJrKbcEL5*=enH>c$Om~P9haeysXV-NBO zxzE;xVTLWgYYiVnVH=4i(*pA&I|T(cL}dj9j>qJA0?{32djqv`gIm;fPbdsjCah`| zI<9n1b#=n<#{>VQ91E)ZHtnaN!>, 2018 # Fulong Sun , 2016 # Huanqun Yang, 2022 +# jack yang, 2023 # Jannis Leidel , 2011 # Kevin Sze , 2012 # Lele Long , 2011,2015 @@ -34,8 +35,8 @@ msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 07:05+0000\n" -"Last-Translator: Scott Jiang, 2023\n" +"PO-Revision-Date: 2023-12-25 07:05+0000\n" +"Last-Translator: jack yang, 2023\n" "Language-Team: Chinese (China) (http://app.transifex.com/django/django/" "language/zh_CN/)\n" "MIME-Version: 1.0\n" @@ -203,7 +204,7 @@ msgid "Hold down “Control”, or “Command” on a Mac, to select more than o msgstr "按住 Control 键或 Mac 上的 Command 键来选择多项。" msgid "Select this object for an action - {}" -msgstr "" +msgstr "选择此对象执行操作 - {}" #, python-brace-format msgid "The {name} “{obj}” was added successfully." @@ -421,10 +422,10 @@ msgid "Filter" msgstr "过滤器" msgid "Hide counts" -msgstr "" +msgstr "隐藏计数" msgid "Show counts" -msgstr "" +msgstr "显示计数" msgid "Clear all filters" msgstr "清除所有筛选" @@ -507,7 +508,7 @@ msgid "" "Are you sure you want to delete the selected %(objects_name)s? All of the " "following objects and their related items will be deleted:" msgstr "" -"请确认要删除选中的 %(objects_name)s 吗?以下所有对象和余它们相关的条目将都会" +"请确认要删除选中的 %(objects_name)s 吗?以下所有对象和与它们相关的条目将都会" "被删除:" msgid "Delete?" @@ -530,13 +531,13 @@ msgid "None available" msgstr "无可选的" msgid "Added:" -msgstr "" +msgstr "已添加:" msgid "Changed:" -msgstr "" +msgstr "已修改:" msgid "Deleted:" -msgstr "" +msgstr "已删除:" msgid "Unknown content" msgstr "未知内容" @@ -734,7 +735,7 @@ msgid "Reset my password" msgstr "重设我的密码" msgid "Select all objects on this page for an action" -msgstr "" +msgstr "选择此页面上的所有对象执行操作" msgid "All dates" msgstr "所有日期" diff --git a/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo b/django/contrib/admin/locale/zh_Hans/LC_MESSAGES/djangojs.mo index 255ea4a11b444c58b3b6d1dff76f8b767a99fc9e..c78566a8767c6520393cbf86d5b9c5cd857ea527 100644 GIT binary patch delta 2261 zcmY+_e@xV69KiAC;CsMH9D+e)$gfgD1w|-A^G79zL?Cu-xz(13Twx53E)M6aom=H>?HAF#FAU$t7jKi}`?*zOshdp*zRdA`r{ z?EB+krt-%6==wWxVKn}_V3Q#s)j54kg`7;~&k@+^G zjN6VU(T5-6?Fvo}x z-;WRB+qeQxsTWYj&w9E4(s5H03wS?mSFW>AAqHH=RAVLi50*O%P9ZnN{H)$Wxz+RP zBFY{6Q``TlR-Q5W88@mLwPu%7lkwUXUQ|4S$fzoPc3gD4w*6J^|p=1-`nG=CNk(*Grn zU&aio4fwa_*YbR1d_4}~7JLuC#a?XW!OFzv)vwh{>Q(i+ zW7OQ##2u807u0*2|4ZBHym`{UOwCh^)KYZ~$_A>n-JotmUM16{Hrw+2TQt$CwyC?- zJt|McK9JatU3{v%>AYWdkw>wKXeRhb%u|GX5%ol}JggPoY4fOj|5D_8e~x&BC?lja z5~V~f!5-`{15AbdP~;2XgR##HX>)R$)r7pTC4?M8?ZmT$+&OuiYl&S%8zCjiV>LCz zV1=e&Gw$s(s8XN-B0*h$E7`WUf}kar_lp3%yVWCB|V`I5G4ZZ~cv8i-a7Tl@2S zf`ZfYjL!tiIcxGX&Hgk4WU@#Jvq(3+?80_l`hK;``bkO)CGBo~QW|ga?ClY=`hIEFU z-@Z^d%#hAVP|~s2JsV=(o)*sw!R~%L6aUIH@lTdX^$4Q_{-TfX`a^t`+Lg{1^Qo&f1Kk^ z^CU(m5@Qo{mruq%&8^FF8q4i7xW)@aArOl8_wJ3wd>PI==_|{*uMPLac{oQ)wHy}PCGY!SZlKI V(o)GBt0b>DnygJ9iTPI?_#f52TL1t6 delta 1603 zcmXxkSx6O89LMo<&E2l%)?V78wrGp3R+jaU50L~}v_Tn3-WIN1Gp(0P6d_SYT#KLu zji7`S>xQ<`QxSyFgF#fZQCYMg^$;x&_5EG{{+a)L&N(x4X6DQ})02NUFZe1g`jjJ< zk)z4{DCgGWqG)zRbBuHIumu<6GmORI>|_=@nq02c^KmfsSynGGOVLYvnYpRopxZ$q zkpuOZfQK*(k7F*jVLU!DUm~09Wv6HShH?1A>VM3Cs0WMY;2=yy^^=UcZWyj}LEf4| zISsXT!XwlLJ;>&svZF8e8ug&Ps0aOy>gX>vp?W_Fr%*S}<0Rd%02kt1Tz~;&b8YM{ zaDUfD;S8>&_iF6JVYnrUVa9qKi6_mgID+~^9ExwvU#RO+82?PnLtR&lI)5FG!T_dY zBL-EtNI@5L+JSDXzrhUJf1+-b#0RYKI5!^is2@)5zu{HX$lNy{qekqx`4;uYpRE4F z{GH7Br*XigxQOXyE~nQKrFxXJ21vl{DYufqoHv-bMb{(gd(Px}!Src(&pfp@r% z`e!_X6%5Z#{DgXda=w?`h#G;dR^MgTmWl( z^QL**20@RAoWFAjWB6&YIm-*+$QkX$bB$*ekgw&5nqr!xagyx85 zvLc6EL{26(DHZwz1EC+8LK9L^Ku#ewf5wpmp?Ne%>z^N95;SzElnMEqJ%(Rm9Ur^{9FC{gn6#Ob8G1Z)@q0sl7Mrujv+Z2*or`e=J zOVEWM#IEv$M#oPHt&D$>Sy{cea`)ECfLmSVuXE*9zM5=bO{hI_WO#c*oX6|mR, 2018 # Fan Xu , 2022 +# jack yang, 2023 # Jannis Leidel , 2011 # Kaiqi Zhu, 2023 # Kewei Ma , 2016 @@ -21,8 +22,8 @@ msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 15:04-0300\n" -"PO-Revision-Date: 2023-12-04 07:59+0000\n" -"Last-Translator: Kaiqi Zhu, 2023\n" +"PO-Revision-Date: 2023-12-25 07:59+0000\n" +"Last-Translator: jack yang, 2023\n" "Language-Team: Chinese (China) (http://app.transifex.com/django/django/" "language/zh_CN/)\n" "MIME-Version: 1.0\n" @@ -248,53 +249,53 @@ msgid "Dec" msgstr "十二月" msgid "Sunday" -msgstr "" +msgstr "星期日" msgid "Monday" -msgstr "" +msgstr "星期一" msgid "Tuesday" -msgstr "" +msgstr "星期二" msgid "Wednesday" -msgstr "" +msgstr "星期三" msgid "Thursday" -msgstr "" +msgstr "星期四" msgid "Friday" -msgstr "" +msgstr "星期五" msgid "Saturday" -msgstr "" +msgstr "星期六" msgctxt "abbrev. day Sunday" msgid "Sun" -msgstr "" +msgstr "星期日" msgctxt "abbrev. day Monday" msgid "Mon" -msgstr "" +msgstr "星期一" msgctxt "abbrev. day Tuesday" msgid "Tue" -msgstr "" +msgstr "星期二" msgctxt "abbrev. day Wednesday" msgid "Wed" -msgstr "" +msgstr "星期三" msgctxt "abbrev. day Thursday" msgid "Thur" -msgstr "" +msgstr "星期四" msgctxt "abbrev. day Friday" msgid "Fri" -msgstr "" +msgstr "星期五" msgctxt "abbrev. day Saturday" msgid "Sat" -msgstr "" +msgstr "星期六" msgctxt "one letter Sunday" msgid "S" diff --git a/django/contrib/admindocs/locale/af/LC_MESSAGES/django.mo b/django/contrib/admindocs/locale/af/LC_MESSAGES/django.mo index 43410e7ab73e295ae358b6eea0a6e4667ec0aac9..30b84dab60fb281412ee37c1654925f011088454 100644 GIT binary patch delta 1144 zcmZ|NziSjh7{>9rGl@|z{UE62!djxh=q-aX+#Vne&0P)IxzRy*`0l7p4ofT`?J6KvDmSu zXv6el^g>RlQT&b49^{oei0dfNH*g4F;~;*;eb}{2sU9q%JlFULC$JMgVHbYE-S`bV zlxnIUTugIg8_(htcYE;;7H|y@;6s!G8@P_o@G{O)y&oSVx72ei;tL$Wcen?)a2B^w z=FL#7$oguQ3n?7&bCc9{lq6ehQxg9{Ni@{mPJ9mcGQNhg!FiNVC)Ozt5aa;GQ~4=YG~?GM`r+p|iIvrTkB%NrArXs(mW*$qv&c zz)q9TveV>*_tRy=>_6Kmn?8~Kx#YOzh$XcgnKVhrUqY#S7xPnvOD3r5G}bfDHd?py zPjbyGaoL6!^vLPR)auwT^xBGFK82nI;~h8mzHdhdhMcY=vRGe zYuZF*8M;Ip@8iIk)Ry&vvtikf=}8k*bWK*&72~zh;d$p%DcYW)8x_Zlz(l%awFv_2 zJ+CvB(#s*W^omKGDTTH*(vi;`k&w93*1l_4=hPlB3Fb)_Ei>I&&B>B6erNyoEO zkq%cWBoB3C+@#b`tgDucNn|xrt=NR~vPtNwHake(@k_*u<7lk)w7V}iC;>=VZ71~3 LD$d{P5wHFNN%hwE delta 619 zcmYk(zb^w}9LMqR^~X6qKdMDh5|K2GfuVna4iMnL zE*1mQj+jk$28o2l`*S+@=DyGC`Ej}D`QG!Dc}h24Q?XMcCdp~?jm(iZ4h^vsF-u|* zwO+z3?xT-KIEc;O{3W&+-(egpQ8O2Ju@7q)!#b{+HLO9Wz{E4A(Pec2r*H-Hn86zI z*da{{k5Pxdz<#{NGCm-W&9S>S&SRZo7EuSiVp4^)G0Xn;LMOq*2WsP=-U}Yb?J&-v zKKPER=o5MDo5sTk%?A3ofIFxIHc{WZMk=*7&Y;g}>DoM|*xw3tRLOF0VH4LGZ=*K8 zM{U?e-3o;BBRE8AZIskE`0F-C{tx|CRj#16@KE7^rl`tw8pSZlEreB$Yl2WE3f;A? qK{4@1*d|ZTBddWMJ#$*+xD)KT9VaMxk514{q#bXoTCL3H4(t~%Lo?C< diff --git a/django/contrib/admindocs/locale/af/LC_MESSAGES/django.po b/django/contrib/admindocs/locale/af/LC_MESSAGES/django.po index 6074aa0551f..4053b8b9fac 100644 --- a/django/contrib/admindocs/locale/af/LC_MESSAGES/django.po +++ b/django/contrib/admindocs/locale/af/LC_MESSAGES/django.po @@ -64,13 +64,16 @@ msgid "" msgstr "" msgid "Models" -msgstr "" +msgstr "Modelle" msgid "" "Models are descriptions of all the objects in the system and their " "associated fields. Each model has a list of fields which can be accessed as " "template variables" msgstr "" +"Modelle is beskrywings van al die objekte in die stelsel met hulle velde. " +"Elke model het 'n lys velde wat bereikbaar is as veranderlikes in 'n " +"sjabloon." msgid "Views" msgstr "" @@ -107,7 +110,7 @@ msgstr "" #, python-format msgid "Model: %(name)s" -msgstr "" +msgstr "Model: %(name)s" msgid "Fields" msgstr "Velde" @@ -202,10 +205,10 @@ msgid "Templates:" msgstr "" msgid "Back to View documentation" -msgstr "" +msgstr "Terug na Sien dokumentasie" msgid "View documentation" -msgstr "" +msgstr "Sien dokumentasie" msgid "Jump to namespace" msgstr "" diff --git a/django/contrib/admindocs/locale/mn/LC_MESSAGES/django.mo b/django/contrib/admindocs/locale/mn/LC_MESSAGES/django.mo index 7d0ec6a16ac954962e7d953934097a746b312b3c..4b9b343ae12798fa864c97c95caf17ba756689f1 100644 GIT binary patch delta 1544 zcmZA0Z%oxy9LMqRg?mA~{J$xXHtyIIF)m*2r4SIIRXtof*Ubl7oBIC1bt@0|{9fn${+x5Z z-*Y(AGTS(OrPP1aDDBjxs##_mrJoCBBw)4y_hKzx#$r9lnSZ|om(Z=lJnXbz--uNXe{8yMGWF^^AGGA>ccc@f?%%Mr&x_ecmY|9{f@k1SCOCn z#pP8@qhffT!AtN3dO(7IWiojAMW>LfC{_aVKiR*H9B}#S{1@c3^0s zSsA{Lns7HhhI>$v9zzB4B@(gyh^2TL^O)cMq`}Y9T&D0})D}#V4y`!IDq3+9YJxG; z0H0tXPN6a}i{*G8m9gun1>ZwuCWqP8FGOzHBISP-jVc-%xC^7$gBox@_WH~YVGsRV z%%+8`CmoOA0j$O2_yqop%48N{D+3i+hm9HEKrQ?zR^#WziHjC6h)H}O*;TuZVf3-DIzv^s4$p>YETch;~LzP=}#l;nfq81uBL{m4b)t!iXvCh!Zc|+wawY<4@Kg% zI28XY+K?uy;#XlsbEVGt!CzM2n&}CxqbAc=a-vin@CY@VsxxO!USLV!aT<+IO`!5+ zWm!A$By|;4F)1P1g|*Zcs!EL7JlEnFAz{w#m~QDz>saZ3LS=lpN>_Kb_b$ z&^Po}VoNPgV{yk_vw+g3X6%N@IP`qJsth7ZL1XghC9uq0aD zBq3XvTW-`yd~i{>7+<=TZ4y{8>Vw%5y$+@-C!BuHJ-7Fq z-|u&B`L5$ySMqj+?R`ZXq}R}Qu2bq&9J292OBE=!7cb#<%r8``96c!CAHZrnjKw&G zPvE<``8nLk^;LWvGbqpB#!{t{>Q4rbG4U^!U|~`AhN?h$P@`M0t@2Ep4M-jj)xSYG5 zAS%h^N9@68SWPzcqpWij%P@gbp&8tOXHY765hamtF)1axk(;=MlJN?*;Lj)vyI9SG z)hG)N;ki7eUcm!guTdTeq?bCgG{C%O;tGD;#Z z@>`X_hfykMAg_~3&N8TH@DbMG*C;RHDpFiq$H)EgfUeup z5b=it+hTP-bHX09KfE??*&ADe0qq|Rha!43Ix-OsMB@HqhRM2r=*5qNzfWCUV* zPa+Vj+|RM2Pq%u!9d3`;?d{awcHhp< zCXd(SF_%kSeN1;gnD#VzX!aq0EbbmQ{E-;pMh%}n6g5J}boZ3-T3~9lKj9BXqs=4H zaIfhotIMC9oJ_Zuoys$BuD?;SD;gaO`;D>jK-`@*N33%AB^Y zn`4gJ^nS-@d6j3ad27k~%DS#IvzcjYF*9o|UUo+ETOL+OXHGD?WG!d!E^x&P+PY?? ztR>AeDQh7!ZH8T+JX+Peu0E&r$l}v1|BjV52g;qqRn~Zajg)njy%$+nqF&4{Hm`Ga m*4$bkR*G$wxT>nBb!LXmQkl1jd67|?@d??!Io(|~WBU)4HdVR+ diff --git a/django/contrib/admindocs/locale/mn/LC_MESSAGES/django.po b/django/contrib/admindocs/locale/mn/LC_MESSAGES/django.po index e4e4b0caf8a..54de5cfc683 100644 --- a/django/contrib/admindocs/locale/mn/LC_MESSAGES/django.po +++ b/django/contrib/admindocs/locale/mn/LC_MESSAGES/django.po @@ -4,17 +4,18 @@ # Bayarkhuu Bataa, 2014 # Claude Paroz , 2014 # Jannis Leidel , 2011 -# Zorig , 2013-2014,2016-2017 +# Turmunkh Batkhuyag, 2023 +# Zorig, 2013-2014,2016-2017 # Анхбаяр Анхаа , 2014-2015 # Баясгалан Цэвлээ , 2015 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2017-01-19 16:49+0100\n" -"PO-Revision-Date: 2017-09-19 16:40+0000\n" -"Last-Translator: Zorig \n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2023-12-24 20:19+0000\n" +"Last-Translator: Turmunkh Batkhuyag, 2023\n" +"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" "mn/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,19 +24,19 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Administrative Documentation" -msgstr "Удирдлагын баримт" +msgstr "Удирдлагын баримт бичиг" msgid "Home" -msgstr "Админ эхлэл" +msgstr "Нүүр" msgid "Documentation" -msgstr "Баримтжуулалт" +msgstr "Баримт бичиг" msgid "Bookmarklets" -msgstr "Bookmarklet-ууд" +msgstr "Хавчуурга" msgid "Documentation bookmarklets" -msgstr "Мookmarklet-уудын баримтжуулалт" +msgstr "Баримт бичгийн хавчуурга" msgid "" "To install bookmarklets, drag the link to your bookmarks toolbar, or right-" @@ -102,11 +103,9 @@ msgstr "docutils ийг суулгана уу" #, python-format msgid "" -"The admin documentation system requires Python's docutils library." +"The admin documentation system requires Python’s docutils library." msgstr "" -"Админ хэсгийн баримтжуулалтын ажиллуулхад Python ийн docutils санг суулгах шаардлагатай." #, python-format msgid "" @@ -157,13 +156,13 @@ msgid "Template: %(name)s" msgstr "Загвар: %(name)s" #, python-format -msgid "Template: \"%(name)s\"" -msgstr "Загвар: \"%(name)s\"" +msgid "Template: %(name)s" +msgstr "" #. Translators: Search is not a verb here, it qualifies path (a search path) #, python-format -msgid "Search path for template \"%(name)s\":" -msgstr "\"%(name)s\" тэмплэйтын зам хайх" +msgid "Search path for template %(name)s:" +msgstr "" msgid "(does not exist)" msgstr "(Оршдоггүй)" diff --git a/django/contrib/auth/locale/ckb/LC_MESSAGES/django.mo b/django/contrib/auth/locale/ckb/LC_MESSAGES/django.mo index 588aaa840f2a84333f38f5f43b3a5a39c063a8da..9814f3295a7eb663b120c0543174f633352855c6 100644 GIT binary patch delta 2024 zcmXxke@s@-=REhE=XuU^ zzR#I%|GgvnbD=M8l-)!Laej$eKUU{(pxnqcdlYA}0$1K;=3px>#}IbnAU5I;7(!p3 znY!r1UJT=VID>`w^4(^e&7w9y<$fB@VFM=c9{d&W!+CrNvuG^9RjBrAq%Ujq+FMZl zbm2-2Vky3bMR*4DF@X=@cUZ>wmZqX7`5RYZ{=H`Wtdhf0+=4yWiXY-RY{Ld-u?CM~ z06#;X$d+)^2Hc98crQMJgQyigjc0KRn;GBsFs*t#g_U>}+wo64ip@M0t8bT)#jx*@ zx!N>p1=5~3Q7bct%+dZr#;_cgP1i3+y^>N?e`_)7qf+HvQ0KV~HBcL>qfXRyd%g1j zYT$lU$8UJ;$57XOfSSlj!G+v7hT08huo{2z+Ov7l%IY%IyRJv|^CCWm5!{BC(2sMd3714k)vZ)o z@JSp(<-!#1z&Ye+bz~;@SO-pF2rF2TGBPT}`L2h}p2Z2A#ecB_ud@Z3u!`9zDfi=c z{0M6?dX36WD%pv$Wxuxqv1Q#gi0cn811J|0i+yqwh66K_Hm$=Z-rw;m+#?4Z|v z9QCB9kfH2b)O9zIexf!{MIHTzyk09@yRd|7P&c%pZg>qf&=4wnPonPo#PbW!E2tIw z5p~^fxD4k}E0D`<)L$*G(Ee|svXO>vWYz3l_Ya;NHNe-XC!R*#n8qxmKWio02tDx@ zLZylzE!@KDyJbDc3Zlt9;~RmRoW^%McXUG01eysA^bDa7ii$oQyaBh6%x+NvYFo7s zn&|U{a;Tipu29)cJWb>fTFpj6MalRaq4C{P$B_qfvsDdR5tU7Z63?d-inb>y;4ZN; zxq(huyZ7l&b^ft>&dIFj0^;V z!O+0r&^~AXfg_=V!N8%A6Q~(-0t5S;NI2}ZG}pY8ct5W@FQ>Y`u6}dumxA)_KscOO zx@_DR>ntpdtuE?{W=5Rkc=|+YI5nKU;GSego#dCvvE*cOEH#{otLH2pvqiSDh&?iscFMhe4r$1)VkSPoG1!a4@h7IDkH#}_ zERMwx4psj(R7P>30SDnBOu;DD;(2UA{aFqta6G=mI{brrqYaFD61JiSeh0^44{B!n z@hqm(co}x$O!~JUR00@am=zeteRvj`bsNR&@e(!;8H?qkW+3ERinMLZkg?c0)C+7v z-M<~R6njza9Y7Br#)xh>Mn#@Rb<~Dx=nCq_+wS>2RL4(I_jkM3-=gmOh#JTj)RO&1 zwU@$){?9;NAI(ASO!YDU8d)J1$QLViU5pyQ3fvh-@?Z_;&;4ebaRQkXz-F9)H}C?! zLM>H<%>01hsw#|Dg4FzmHdZs1b%W}EH7 zYP^eGsI_j+iM??v@^aRW+W+^FWwvhjdLQadf1ze1hw0IMWvF(-sF~Y{tZKw|P~m3> zIp~3Q)B}%D9rdEJ_ABbapROtFL7iu#W^5MfzLiLtSQs?}TT$&DN7BIBa0cGOEbae~ z?jPRVSc6%pkrtpHEW$WcNg%Y>RT#a~k?P6`<;@gAJ777XGLKNFDq43fH7j8&h-yOp z+kB#wC?Vnr6%Al9p*JWX{x6y(l>x*erxx2ST862FhbSfjgkC^pGBMYw#SY3974`2F z^3cgtosdgT;rrv{ggz#D#2kWUwS|PHyo_KqoSmVi(zGTLg+w`_q9tL1oucJZSwiU3 zOj%>u9JLiz63Yl?+g1@3gfd(o5EXqeNLnY0XQ7fTNU$-SJq^y5vyL}O{c#<2$+_O> d5&z_b#>U2uPX9$uv^^&+`fNmU$F__}>OX?)op=BM diff --git a/django/contrib/auth/locale/ckb/LC_MESSAGES/django.po b/django/contrib/auth/locale/ckb/LC_MESSAGES/django.po index 1fc0bb34537..30e02c1819f 100644 --- a/django/contrib/auth/locale/ckb/LC_MESSAGES/django.po +++ b/django/contrib/auth/locale/ckb/LC_MESSAGES/django.po @@ -1,15 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Swara , 2022 +# Swara , 2022,2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-03-17 03:19-0500\n" -"PO-Revision-Date: 2023-04-25 08:09+0000\n" -"Last-Translator: Swara , 2022\n" -"Language-Team: Central Kurdish (http://www.transifex.com/django/django/" +"PO-Revision-Date: 2024-01-25 08:09+0000\n" +"Last-Translator: Swara , 2022,2024\n" +"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" "language/ckb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -271,6 +271,8 @@ msgid "" "Enter a valid username. This value may contain only unaccented lowercase a-z " "and uppercase A-Z letters, numbers, and @/./+/-/_ characters." msgstr "" +"ناوی بەکارهێنەرێکی دروست بنوسە. ئەم بەهایە لەوانەیە تەنها پیتی بچووکی بێ " +"زاراوەی تێدابێت a-z و پیتی گەورە A-Z، ژمارەکان، و هێماکانی @/./+/-/_." msgid "" "Enter a valid username. This value may contain only letters, numbers, and " diff --git a/django/contrib/auth/locale/mr/LC_MESSAGES/django.mo b/django/contrib/auth/locale/mr/LC_MESSAGES/django.mo index f33dd236cb23b6d243cbe474d0e76ecd70c47c57..84eef503a354942b36d2d1060359ebf1e15e881b 100644 GIT binary patch literal 10430 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 delta 215 zcmdlNc!k;Go)F7a1|VPrVi_P-0b*t#)&XJ=umIv&KuJp=4N?OGlePIxJwtSzi&7Iy zGV}9vT@p)DtrUz53{7BfVp~^d1?7}lUML7$ds3t>y;EG<`rkArB>)A=jZAd S6y;~7CYKcJ7fgP@zY+j-eKqv} diff --git a/django/contrib/auth/locale/mr/LC_MESSAGES/django.po b/django/contrib/auth/locale/mr/LC_MESSAGES/django.po index 16b3e278b4b..fa7b7f7b640 100644 --- a/django/contrib/auth/locale/mr/LC_MESSAGES/django.po +++ b/django/contrib/auth/locale/mr/LC_MESSAGES/django.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Omkar Parab, 2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 10:30+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"POT-Creation-Date: 2023-03-17 03:19-0500\n" +"PO-Revision-Date: 2024-01-25 08:09+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,84 +18,93 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Personal info" -msgstr "" +msgstr "वैयक्तिक माहिती" msgid "Permissions" -msgstr "" +msgstr "परवानगी" msgid "Important dates" -msgstr "" +msgstr "महत्वाच्या दिनांक" #, python-format msgid "%(name)s object with primary key %(key)r does not exist." msgstr "" msgid "Password changed successfully." -msgstr "" +msgstr "गुप्तशब्द यशस्वीरीत्या बदलला." #, python-format msgid "Change password: %s" -msgstr "" +msgstr "गुप्तशब्द बदला: %s" msgid "Authentication and Authorization" -msgstr "" +msgstr "प्रमाणीकरण आणि अधिकृतता" + +msgid "password" +msgstr "गुप्तशब्द" + +msgid "last login" +msgstr "शेवटचा प्रवेश" msgid "No password set." -msgstr "" +msgstr "कोणताही गुप्तशब्द सेट केलेला नाही." msgid "Invalid password format or unknown hashing algorithm." -msgstr "" +msgstr "अयोग्य गुप्तशब्द स्वरूप किंवा अज्ञात हॅशिंग अलगोरीथम." -msgid "The two password fields didn't match." -msgstr "" +msgid "The two password fields didn’t match." +msgstr "दोन गुप्तशब्द क्षेत्र जुळत नाहीत." msgid "Password" -msgstr "" +msgstr "गुप्तशब्द" msgid "Password confirmation" -msgstr "" +msgstr "गुप्तशब्द निच्छितीकरण" -msgid "Enter the same password as above, for verification." -msgstr "" +msgid "Enter the same password as before, for verification." +msgstr "पडताळणीसाठी आधीच्या गुप्तशब्दासारखा समान गुप्तशब्द नमूद करा." msgid "" -"Raw passwords are not stored, so there is no way to see this user's " -"password, but you can change the password using this " -"form." +"Raw passwords are not stored, so there is no way to see this user’s " +"password, but you can change the password using this form." msgstr "" +"कच्चे गुप्तशब्द साठवले जात नाहीत, त्यामुळे या वापरकर्त्याचा गुप्तशब्द पाहण्याचा कोणताही " +"मार्ग नाही, परंतु तुम्ही हा फॉर्म वापरून गुप्तशब्द बदलू शकता. " #, python-format msgid "" "Please enter a correct %(username)s and password. Note that both fields may " "be case-sensitive." msgstr "" +"कृपया करून एक योग्य %(username)s आणि गुप्तशब्द नमूद करा. लक्षात घ्या की दोन्ही रखाणे " +"संवेदनशील असू शकतात." msgid "This account is inactive." -msgstr "" +msgstr "हे खाते निष्क्रिय आहे." msgid "Email" -msgstr "" +msgstr "विपत्र" msgid "New password" -msgstr "" +msgstr "नवीन गुप्तशब्द" msgid "New password confirmation" -msgstr "" +msgstr "नवीन गुप्तशब्द निच्छितीकरण" msgid "Your old password was entered incorrectly. Please enter it again." -msgstr "" +msgstr "तुम्ही जुना गुप्तशब्द चुकीचा टाकला होता. कृपया तो पुन्हा नमूद करा." msgid "Old password" -msgstr "" +msgstr "जुना गुप्तशब्द" msgid "Password (again)" -msgstr "" +msgstr "गुप्तशब्द (पुन्हा)" msgid "algorithm" -msgstr "" +msgstr "अल्गोरिदम" msgid "iterations" -msgstr "" +msgstr "पुनरावृत्ती" msgid "salt" msgstr "" @@ -102,125 +112,188 @@ msgstr "" msgid "hash" msgstr "" +msgid "variety" +msgstr "निरनिराळ्या" + +msgid "version" +msgstr "आवृत्ती" + +msgid "memory cost" +msgstr "स्मरणशक्ती खर्च" + +msgid "time cost" +msgstr "वेळ खर्च" + +msgid "parallelism" +msgstr "समांतरता" + msgid "work factor" -msgstr "" +msgstr "कामाचा घटक" msgid "checksum" -msgstr "" +msgstr "चेकसम" + +msgid "block size" +msgstr "ब्लॉक आकार" msgid "name" -msgstr "" +msgstr "नाव" + +msgid "content type" +msgstr "सामुग्री प्रकार" msgid "codename" -msgstr "" +msgstr "सांकेतिक नाव" msgid "permission" -msgstr "" +msgstr "परवानगी" msgid "permissions" -msgstr "" +msgstr "परवानग्या" msgid "group" -msgstr "" +msgstr "समूह" msgid "groups" -msgstr "" - -msgid "password" -msgstr "" - -msgid "last login" -msgstr "" +msgstr "समूहं" msgid "superuser status" -msgstr "" +msgstr "सुपरयूजर स्थिती" msgid "" "Designates that this user has all permissions without explicitly assigning " "them." -msgstr "" +msgstr "या वापरकर्त्याकडे स्पष्टपणे नियुक्त केल्याशिवाय सर्व परवानग्या आहेत असे नियुक्त करते." msgid "" "The groups this user belongs to. A user will get all permissions granted to " "each of their groups." msgstr "" +"हा वापरकर्ता त्या गटांचा आहे. वापरकर्त्याला त्यांच्या प्रत्येक गटासाठी सर्व परवानग्या " +"मिळतील." msgid "user permissions" -msgstr "" +msgstr "वापरकर्ता परवानग्या" msgid "Specific permissions for this user." -msgstr "" +msgstr "या वापरकर्त्यासाठी विशिष्ट परवानग्या." msgid "username" -msgstr "" +msgstr "वापरकर्तानाव" -msgid "Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only." -msgstr "" - -msgid "" -"Enter a valid username. This value may contain only letters, numbers and @/./" -"+/-/_ characters." -msgstr "" +msgid "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only." +msgstr "आवश्यक. 150 किंवा कमी वर्ण. अक्षरे, अंक आणि @/./+/-/_ फक्त. " msgid "A user with that username already exists." -msgstr "" +msgstr "त्या वापरकर्ता नावासह वापरकर्ता आधीपासूनच अस्तित्वात आहे." msgid "first name" -msgstr "" +msgstr "पहिले नाव" msgid "last name" -msgstr "" +msgstr "आडनाव" msgid "email address" -msgstr "" +msgstr "विपत्र पत्ता" msgid "staff status" -msgstr "" +msgstr "कर्मचारी स्थिती" msgid "Designates whether the user can log into this admin site." -msgstr "" +msgstr "वापरकर्ता या प्रशासक स्थळावर प्रवेश करू शकतो की नाही हे नियुक्त करते." msgid "active" -msgstr "" +msgstr "सक्रिय" msgid "" "Designates whether this user should be treated as active. Unselect this " "instead of deleting accounts." msgstr "" +"या वापरकर्त्याला सक्रिय मानले जावे की नाही हे नियुक्त करते. खाती हटवण्याऐवजी ही निवड " +"कमी करा. " msgid "date joined" -msgstr "" +msgstr "सहभाग दिनांक" msgid "user" -msgstr "" +msgstr "वापरकर्ता" msgid "users" -msgstr "" +msgstr "वापरकर्ते" + +#, python-format +msgid "" +"This password is too short. It must contain at least %(min_length)d " +"character." +msgid_plural "" +"This password is too short. It must contain at least %(min_length)d " +"characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Your password must contain at least %(min_length)d character." +msgid_plural "Your password must contain at least %(min_length)d characters." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "The password is too similar to the %(verbose_name)s." +msgstr "गुप्तशब्द %(verbose_name)s सारखा अत्यंत सामान्य आहे." + +msgid "Your password can’t be too similar to your other personal information." +msgstr "तुमचा गुप्तशब्द तुमच्या इतर वैयक्तिक माहितीशी सारखा असू शकत नाही." + +msgid "This password is too common." +msgstr "हा गुप्तशब्द खूपच सामान्य आहे." + +msgid "Your password can’t be a commonly used password." +msgstr "तुमचा गुप्तशब्द हा सामान्यतः वापरला जाणारा गुप्तशब्द असू शकत नाही." + +msgid "This password is entirely numeric." +msgstr "हा गुप्तशब्द पूर्णपणे संख्यात्मक आहे." + +msgid "Your password can’t be entirely numeric." +msgstr "तुमचा गुप्तशब्द पूर्णपणे संख्यात्मक असू शकत नाही." #, python-format msgid "Password reset on %(site_name)s" +msgstr "%(site_name)s वरील गुप्तशब्द पुनरस्थापना" + +msgid "" +"Enter a valid username. This value may contain only unaccented lowercase a-z " +"and uppercase A-Z letters, numbers, and @/./+/-/_ characters." msgstr "" +"वैध वापरकर्तानाव प्रविष्ट करा. या मूल्यामध्ये केवळ असुरक्षित लोअरकेस a-z आणि अपरकेस A-Z " +"अक्षरे, संख्या आणि @/./+/-/_ वर्ण असू शकतात." -msgid "Logged out" +msgid "" +"Enter a valid username. This value may contain only letters, numbers, and " +"@/./+/-/_ characters." msgstr "" +"वैध वापरकर्तानाव प्रविष्ट करा. या मूल्यामध्ये फक्त अक्षरे, संख्या आणि @/./+/-/_ वर्ण असू " +"शकतात." + +msgid "Logged out" +msgstr "बाहेर पडलात" msgid "Password reset" -msgstr "" +msgstr "गुप्तशब्द पुनरस्थापना" msgid "Password reset sent" -msgstr "" +msgstr "गुप्तशब्द पुनरस्थापना पाठविले गेले आहे" msgid "Enter new password" -msgstr "" +msgstr "नवीन गुप्तशब्द लिहा" msgid "Password reset unsuccessful" -msgstr "" +msgstr "गुप्तशब्द पुनरस्थापना अयशस्वी" msgid "Password reset complete" -msgstr "" +msgstr "गुप्तशब्द पुनरस्थापना पूर्ण" msgid "Password change" -msgstr "" +msgstr "गुप्तशब्द बदलणे" msgid "Password change successful" -msgstr "" +msgstr "गुप्तशब्द बदलणे यशस्वी झाले" diff --git a/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.mo b/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.mo index 183b3d14e9fb10c1d39cdf7eb3080abd7a0a7b50..4f5b10dc6571f325e7fd6053a923f077cdfa172f 100644 GIT binary patch literal 1004 zcmb7BO=}cE5N$PzjC%3n#Y1@zHpJd9Bg6@dpe7K=nkB5B1nJClb|=ns58WL}L_xiX z2M-=XKtvIGF-kBY5Y&tQ6X`$TAMj-L>~4aP98&P6rg~nzdR_DT{Ky)?IEA=~m_?jH zJVE%_K%7H-MqERDL!3qYLHP5(hzp3*#|XKP07MPzr^g9-k9iC880I@C`sa@^-@tkk zGg9~B*j@VW7R5b4`Yo!3r*yBJ&`LM>WWWB_0{*G7Ulk(^^Ie zGdzY&#ylm_K*M+aS7?&2nywUm9z-d&f?ydZEhW7qor&o^u5=8>Nu^BL+yH4ua8wRf?1{wZ7U{p%8XPY z%w-Rmf)-P3;R^QD$B`mB%dEp`o3kv0CVn#A1WH|F@~~22d0sYNAX(%qIVEF@;nW(b)ITIsT4DV>%o(;4e>(fs^`1Ms z?s~7C-FCfa&c1cMm*DJ|!I51nc-v(ES3A3fXUI8N;(+Et0)=tNp!JQjn??N&$2lD0 zzkP6aXHWTsXIOlGa`u2QrGendllC=o**;RahAsX&V3m zmrr7GiEc7ON&q*%HM;-+ diff --git a/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po b/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po index 822bd2e63c1..880ce36a51d 100644 --- a/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po +++ b/django/contrib/contenttypes/locale/mr/LC_MESSAGES/django.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Omkar Parab, 2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"POT-Creation-Date: 2019-09-08 17:27+0200\n" +"PO-Revision-Date: 2024-01-24 19:22+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,25 +18,25 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Content Types" -msgstr "" +msgstr "सामुग्रीचे प्रकार" msgid "python model class name" -msgstr "" +msgstr "पायथन मॉडेल वर्गाचे नाव" msgid "content type" -msgstr "" +msgstr "सामुग्री प्रकार" msgid "content types" -msgstr "" +msgstr "सामुग्रीचे प्रकार" #, python-format msgid "Content type %(ct_id)s object has no associated model" -msgstr "" +msgstr "%(ct_id)s या सामुग्री प्रकाराच्या ऑब्जेक्टला संबंधित मॉडेल नाही." #, python-format -msgid "Content type %(ct_id)s object %(obj_id)s doesn't exist" +msgid "Content type %(ct_id)s object %(obj_id)s doesn’t exist" msgstr "" #, python-format -msgid "%(ct_name)s objects don't have a get_absolute_url() method" +msgid "%(ct_name)s objects don’t have a get_absolute_url() method" msgstr "" diff --git a/django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo b/django/contrib/flatpages/locale/af/LC_MESSAGES/django.mo index aef2cabae3dec1b024641c8e7ae7363cd532caac..d9b1b120e3b8a66f743d27972a01826ac3113333 100644 GIT binary patch delta 177 zcmaDZ_)2iXnffRO1_m}Z28IA2od~3>f%GOI%>$(M*clk?fwVP{_6E|`KspCV9|zLR zK-z?Zfk7QeTL5VdAe{iDfm#_lfwVA?o&cn|f%Fm}4Ki;7RD3UxW(D#uaxn0LC9XpS fo@|a}+{VIaHJP6+3QQVIp2?=bXtjAKn;sJYsa_Yk delta 171 zcmaDQ_*`(pnfgcu1_m}Z1_pm1odBe(fb<3+%>$&h*%=t@fwTpX_6E`wKspCV9|6+L zK-!Rlfk7Qen*wPKARP;&fm#{bfV41>?gi4^KzbpN2AQ`OD!vOyvjX|&I2icA5?7!C b4>w0LZey7&z!n9>29syADQw=urpE*T7$+9o diff --git a/django/contrib/flatpages/locale/af/LC_MESSAGES/django.po b/django/contrib/flatpages/locale/af/LC_MESSAGES/django.po index dbad3064089..dc81ad496c2 100644 --- a/django/contrib/flatpages/locale/af/LC_MESSAGES/django.po +++ b/django/contrib/flatpages/locale/af/LC_MESSAGES/django.po @@ -29,7 +29,7 @@ msgstr "URL" msgid "" "Example: “/about/contact/”. Make sure to have leading and trailing slashes." msgstr "" -"Voorbeeld “/about/kontak/”. Maak seker dat dit begin en eindig met ’n " +"Voorbeeld: “/about/kontak/”. Maak seker dat dit begin en eindig met ’n " "skuinsstreep." msgid "" @@ -41,7 +41,7 @@ msgstr "" msgid "Example: “/about/contact”. Make sure to have a leading slash." msgstr "" -"Voorbeeld “/about/kontak/”. Maak seker dat dit begin met ’n skuinsstreep." +"Voorbeeld: “/about/kontak/”. Maak seker dat dit begin met ’n skuinsstreep." msgid "URL is missing a leading slash." msgstr "’n Skuinsstreep ontbreek vooraan URL." @@ -69,7 +69,7 @@ msgid "" "Example: “flatpages/contact_page.html”. If this isn’t provided, the system " "will use “flatpages/default.html”." msgstr "" -"Voorbeeld “/flatpages/kontakbladsy.html”. As dit weggelaat word, sal die " +"Voorbeeld: “/flatpages/kontakbladsy.html”. As dit weggelaat word, sal die " "stelsel “flatpages/default.html” gebruik." msgid "registration required" diff --git a/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo b/django/contrib/flatpages/locale/mr/LC_MESSAGES/django.mo index 7d4393d635ec976459a46c633ce748198e214420..6197eac0e75143517fe730d26d6bd565a997839a 100644 GIT binary patch literal 2040 zcmcgs&x;&I6s~CeHU1{SH7JP*gb4WyJb9ER=*^=?4}MiWJ8RY?c(S4A>sR&OtM7g9 z)%?0|?||WX2JcIFKf(Jv-oNnL=bb%_JqKI>E&<;M9t2(n9tHjZeAwlRW{f zjJ^@VK*woiYuq^uMZ7 zgP#zjGbPBR)a9#!V!^{mc8JT6jN(yj4IOjc6}tL>eD_Jm#|d4IDr9wuQ5XDNs?L8avx!8U}iFe)lQXw5jrlD+oUK}WTH5<^bW5q+Lv%d5^3$~ z*iGPH`*&AaWtNeUh6%}Au>ip&fvK4iok+vkDoaXykVQ&_Oh-m&W&~vBMv&x*U?wuL zV9P2!F51Rh2)!dy9)t8)ZImI75UdA4Tfjn@lBBroNe`o zRHgBwYs8sJtU)xSSRdU5;8JcMu7#bLG1^DX*rIuwDV^?QkWo)8t00dk< ziNz(lAw`LK#W{&3`9)R=UWs{mnZ*h|shKIMISMveV6H\n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"POT-Creation-Date: 2019-09-08 17:27+0200\n" +"PO-Revision-Date: 2024-01-24 19:03+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,56 +18,63 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Advanced options" -msgstr "" +msgstr "प्रगत पर्याय" msgid "Flat Pages" msgstr "" msgid "URL" -msgstr "" +msgstr "यूआरएल" msgid "" -"Example: '/about/contact/'. Make sure to have leading and trailing slashes." -msgstr "" +"Example: “/about/contact/”. Make sure to have leading and trailing slashes." +msgstr "अग्रगण्य आणि अनुगामी स्लॅश असल्याची खात्री करा. उदाहरण: “/about/contact/”." msgid "" "This value must contain only letters, numbers, dots, underscores, dashes, " "slashes or tildes." msgstr "" +"या मूल्यामध्ये फक्त अक्षरे, संख्या, ठिपके, अंडरस्कोअर, डॅश, स्लॅश किंवा टिल्ड असणे आवश्यक आहे." + +msgid "Example: “/about/contact”. Make sure to have a leading slash." +msgstr "अग्रगण्य स्लॅश असल्याची खात्री करा. उदाहरण: “/about/contact”. " msgid "URL is missing a leading slash." -msgstr "" +msgstr "URL मधे अग्रगण्य स्लॅश गहाळ आहे." msgid "URL is missing a trailing slash." -msgstr "" +msgstr "URL मधे अनुगामी स्लॅश गहाळ आहे. " #, python-format msgid "Flatpage with url %(url)s already exists for site %(site)s" msgstr "" msgid "title" -msgstr "" +msgstr "शीर्षक" msgid "content" -msgstr "" +msgstr "सामुग्री" msgid "enable comments" -msgstr "" +msgstr "प्रतिक्रिया सक्षम करा" msgid "template name" -msgstr "" +msgstr "टेम्पलेटचे नाव" msgid "" -"Example: 'flatpages/contact_page.html'. If this isn't provided, the system " -"will use 'flatpages/default.html'." +"Example: “flatpages/contact_page.html”. If this isn’t provided, the system " +"will use “flatpages/default.html”." msgstr "" msgid "registration required" -msgstr "" +msgstr "नोंदणी आवश्यक" msgid "If this is checked, only logged-in users will be able to view the page." msgstr "" +msgid "sites" +msgstr "स्थळे" + msgid "flat page" msgstr "" diff --git a/django/contrib/gis/locale/mn/LC_MESSAGES/django.mo b/django/contrib/gis/locale/mn/LC_MESSAGES/django.mo index 2ebb08f69c0a305bcaae1e6b9bb330063c123fdc..8643c1fe724b012efe000701b30d7cbc27aaae73 100644 GIT binary patch delta 430 zcmZwBze_?<6bJD0s^@bsf=3O3)up27rzwI%(9j>y)X z5g=NF>u?bsz-4#|WAF~fVGmBhaqBO)0Jm`8gA*_d6YvT~UX-xe+PgFh%tqc9mH zio#7e2M^&5bk&LRK4R}XXBp=-of5mr^K{C&NFK|~*w+e6_PEWD?CG3#xy}t%g4IB= zC2vhJ&-dtU;M5j}Mh9TU-_Oq7RTFaxI) zqAV=JLFmE(cmv1bD@?;~l}Ljb8088u+LvH2Jc5((9FD+uh$tl!H1reH5=4C%WZ?vy zg;DV)bm3uOO3xjm^TxWlQQ6YxR?23@G)nq(F}~%j-&JANGR$&rY0b)e3tb=Hn>3T; ztI!v=*x@$ca?@Lu^|WxrE(fB, 2011 # Jannis Leidel , 2011 # Mariusz Felisiak , 2023 +# Turmunkh Batkhuyag, 2023 # Zorig, 2014,2016 # Анхбаяр Анхаа , 2011-2012,2015 # Баясгалан Цэвлээ , 2011,2015 @@ -12,8 +13,8 @@ msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-09-18 11:41-0300\n" -"PO-Revision-Date: 2023-12-04 18:45+0000\n" -"Last-Translator: Mariusz Felisiak , 2023\n" +"PO-Revision-Date: 2023-12-24 18:45+0000\n" +"Last-Translator: Turmunkh Batkhuyag, 2023\n" "Language-Team: Mongolian (http://app.transifex.com/django/django/language/" "mn/)\n" "MIME-Version: 1.0\n" @@ -53,7 +54,7 @@ msgid "Multi polygon" msgstr "Олон өнцөгтийн олонлог" msgid "Geometry collection" -msgstr "Дүрсний цуглуулга" +msgstr "Геометрийн цуглуулга" msgid "Extent Aggregate Field" msgstr "Aggregate талбарыг өргөтгөх" @@ -62,20 +63,19 @@ msgid "Raster Field" msgstr "Растер талбар" msgid "No geometry value provided." -msgstr "Дүрс оруулаагүй байна." +msgstr "Геометрийн утгыг өгөөгүй." msgid "Invalid geometry value." -msgstr "Буруу дүрс байна." +msgstr "Буруу геометрийн утга байна." msgid "Invalid geometry type." -msgstr "Дүрсийн төрөл буруу байна." +msgstr "Геометер төрөл буруу байна." msgid "" "An error occurred when transforming the geometry to the SRID of the geometry " "form field." msgstr "" -"An error occurred when transforming the geometry to the SRID дүрсний форм " -"талбарын SRID утгыг хөрвүүлэхэд алдаа гарлаа." +"Геометрийг геометрийн форм талбарын SRID болгон хувиргах үед алдаа гарлаа." msgid "Delete all Features" msgstr "Бүх онцлогүүдыг устгах" diff --git a/django/contrib/gis/locale/mr/LC_MESSAGES/django.mo b/django/contrib/gis/locale/mr/LC_MESSAGES/django.mo index 0fc4a9cedae7a0cc53f90d9945093de9255a1570..2c755725db944be034bb97773e46c48135d1a5ca 100644 GIT binary patch delta 274 zcmcb@{Es>1o)F7a1|VPpVi_RT0b*7lwgF-g2moSXAPxlL7)Az$R3L2)#D{=vAc6ys zelT!J%}FguRY=UqQE*F5EGaEYEuLs$>Y*EyT9#RynV+ZYl30>zrC?-WXsl~sqHAQL zU}#}wVybNb1YACe#U;8SMTvREIf*6tMOF&_x!H+D3IT~liAg#@Jw_%I-z!KY78K}} zfD~n>rB>)A=jZCDWF_XM=TFvVTxs)Q$&Lq0Hau9``(Vjd1t5N~wBx~&Z4Z|0f3Rdb cSad#^T>oHcJ5YMYgC+YOEZGE7w`3m!0NCbQIsgCw delta 232 zcmeyze1+NKo)F7a1|VPrVi_P-0b*t#)&XJ=umIv&KuJp=4N?OG6H`psQWHxu z^Ye6F5=&C86pRcEO?3^7bqy^P3@oh-&9n^+4Gg#f{B?s;%QB0xtFy2&Hq|x&0xqA# z;u77EqQt!7oWzp+A}a;2#Js%BVg;Yn%#_p|1)D4|*C7YY)yvFdPRqBO_)tNnyu4hm e1f(r9Eww@~IX_pwpeR2pHMyi%zhJT?<4OQoWjlrd diff --git a/django/contrib/gis/locale/mr/LC_MESSAGES/django.po b/django/contrib/gis/locale/mr/LC_MESSAGES/django.po index 83ef357230e..1083d9520eb 100644 --- a/django/contrib/gis/locale/mr/LC_MESSAGES/django.po +++ b/django/contrib/gis/locale/mr/LC_MESSAGES/django.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Omkar Parab, 2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-03-18 09:16+0100\n" -"PO-Revision-Date: 2015-03-18 08:35+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2024-01-24 18:45+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,11 @@ msgstr "" msgid "GIS" msgstr "" -msgid "The base GIS field -- maps to the OpenGIS Specification Geometry type." +msgid "The base GIS field." +msgstr "" + +msgid "" +"The base Geometry field — maps to the OpenGIS Specification Geometry type." msgstr "" msgid "Point" @@ -46,6 +51,9 @@ msgstr "" msgid "Extent Aggregate Field" msgstr "" +msgid "Raster Field" +msgstr "" + msgid "No geometry value provided." msgstr "" @@ -61,13 +69,7 @@ msgid "" msgstr "" msgid "Delete all Features" -msgstr "" - -msgid "WKT debugging window:" -msgstr "" - -msgid "Google Maps via GeoDjango" -msgstr "" +msgstr "सर्व वैशिष्ट्ये घालवा" msgid "Debugging window (serialized value)" msgstr "" @@ -76,5 +78,5 @@ msgid "No feeds are registered." msgstr "" #, python-format -msgid "Slug %r isn't registered." +msgid "Slug %r isn’t registered." msgstr "" diff --git a/django/contrib/humanize/locale/mn/LC_MESSAGES/django.mo b/django/contrib/humanize/locale/mn/LC_MESSAGES/django.mo index de62154a085e99cff66a5c5ea793fa16ae9da620..0f2c700ef91650ff0d4e7126f02a6477aece9242 100644 GIT binary patch literal 4863 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 diff --git a/django/contrib/humanize/locale/mn/LC_MESSAGES/django.po b/django/contrib/humanize/locale/mn/LC_MESSAGES/django.po index 8b2de470c0f..94bb307b786 100644 --- a/django/contrib/humanize/locale/mn/LC_MESSAGES/django.po +++ b/django/contrib/humanize/locale/mn/LC_MESSAGES/django.po @@ -3,6 +3,7 @@ # Translators: # Bayarkhuu Bataa, 2014 # Bayarkhuu Bataa, 2013 +# Turmunkh Batkhuyag, 2023 # Zorig, 2013 # Zorig, 2019 # Анхбаяр Анхаа , 2013 @@ -10,10 +11,10 @@ msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-01-16 20:42+0100\n" -"PO-Revision-Date: 2019-02-19 02:28+0000\n" -"Last-Translator: Zorig\n" -"Language-Team: Mongolian (http://www.transifex.com/django/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2023-12-24 18:40+0000\n" +"Last-Translator: Turmunkh Batkhuyag, 2023\n" +"Language-Team: Mongolian (http://app.transifex.com/django/django/language/" "mn/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,24 +28,24 @@ msgstr "Хүнчлэх" #. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). msgctxt "ordinal 11, 12, 13" msgid "{}th" -msgstr "{} дэхь" +msgstr "{} дэх" #. Translators: Ordinal format when value ends with 0, e.g. 80th. msgctxt "ordinal 0" msgid "{}th" -msgstr "{} дэхь" +msgstr "{} дэх" #. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. msgctxt "ordinal 1" msgid "{}st" -msgstr "{} дэхь" +msgstr "{} дэх" #. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. msgctxt "ordinal 2" msgid "{}nd" msgstr "{} дахь" -#. Translators: Ordinal format when value ends with 3, e.g. 83th, except 13. +#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. msgctxt "ordinal 3" msgid "{}rd" msgstr "{} дахь" @@ -52,38 +53,32 @@ msgstr "{} дахь" #. Translators: Ordinal format when value ends with 4, e.g. 84th. msgctxt "ordinal 4" msgid "{}th" -msgstr "{} дахь" +msgstr "{} дэх" #. Translators: Ordinal format when value ends with 5, e.g. 85th. msgctxt "ordinal 5" msgid "{}th" -msgstr "{} дэхь" +msgstr "{} дахь" #. Translators: Ordinal format when value ends with 6, e.g. 86th. msgctxt "ordinal 6" msgid "{}th" -msgstr "{} дэхь" +msgstr "{} дахь" #. Translators: Ordinal format when value ends with 7, e.g. 87th. msgctxt "ordinal 7" msgid "{}th" -msgstr "{} дэхь" +msgstr "{} дахь" #. Translators: Ordinal format when value ends with 8, e.g. 88th. msgctxt "ordinal 8" msgid "{}th" -msgstr "{} дэхь" +msgstr "{} дахь" #. Translators: Ordinal format when value ends with 9, e.g. 89th. msgctxt "ordinal 9" msgid "{}th" -msgstr "{} дэхь" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "%(value).1f сая" -msgstr[1] "%(value).1f сая" +msgstr "{} дэх" #, python-format msgid "%(value)s million" @@ -91,35 +86,17 @@ msgid_plural "%(value)s million" msgstr[0] "%(value)s сая" msgstr[1] "%(value)s сая" -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "%(value).1f тэрбум" -msgstr[1] "%(value).1f тэрбум" - #, python-format msgid "%(value)s billion" msgid_plural "%(value)s billion" msgstr[0] "%(value)s тэрбум" msgstr[1] "%(value)s тэрбум" -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "%(value).1f наяд" -msgstr[1] "%(value).1f наяд" - #, python-format msgid "%(value)s trillion" msgid_plural "%(value)s trillion" msgstr[0] "%(value)s наяд" -msgstr[1] "%(value)s наяд" - -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "%(value).1f тунамал" -msgstr[1] "%(value).1f тунамал" +msgstr[1] "%(value)s их наяд" #, python-format msgid "%(value)s quadrillion" @@ -127,84 +104,42 @@ msgid_plural "%(value)s quadrillion" msgstr[0] "%(value)s тунамал" msgstr[1] "%(value)s тунамал" -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "%(value).1f их ингүүмэл " -msgstr[1] "%(value).1f их ингүүмэл " - #, python-format msgid "%(value)s quintillion" msgid_plural "%(value)s quintillion" msgstr[0] "%(value)s их ингүүмэл " msgstr[1] "%(value)s их ингүүмэл " -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "%(value).1f ялгаруулагч" -msgstr[1] "%(value).1f ялгаруулагч" - #, python-format msgid "%(value)s sextillion" msgid_plural "%(value)s sextillion" msgstr[0] "%(value)s ялгаруулагч" msgstr[1] "%(value)s ялгаруулагч" -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "%(value).1f их өөр дээр " -msgstr[1] "%(value).1f их өөр дээр " - #, python-format msgid "%(value)s septillion" msgid_plural "%(value)s septillion" msgstr[0] "%(value)s их өөр дээр " msgstr[1] "%(value)s их өөр дээр " -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "%(value).1f өөр дээр " -msgstr[1] "%(value).1f өөр дээр " - #, python-format msgid "%(value)s octillion" msgid_plural "%(value)s octillion" msgstr[0] "%(value)s өөр дээр " msgstr[1] "%(value)s өөр дээр " -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "%(value).1f их шалтгааны үзэгдэл" -msgstr[1] "%(value).1f их шалтгааны үзэгдэл" - #, python-format msgid "%(value)s nonillion" msgid_plural "%(value)s nonillion" msgstr[0] "%(value)s их шалтгааны үзэгдэл" msgstr[1] "%(value)s их шалтгааны үзэгдэл" -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "%(value).1f эрхэт" -msgstr[1] "%(value).1f эрхэт" - #, python-format msgid "%(value)s decillion" msgid_plural "%(value)s decillion" msgstr[0] "%(value)s эрхэт" msgstr[1] "%(value)s эрхэт" -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "%(value).1f googol" -msgstr[1] "%(value).1f googol" - #, python-format msgid "%(value)s googol" msgid_plural "%(value)s googol" @@ -313,86 +248,86 @@ msgstr "одооноос %(delta)s " #. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' #, python-format msgctxt "naturaltime-past" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d жил" -msgstr[1] "%d жилүүд" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d жил" +msgstr[1] "%(num)d жил" #, python-format msgctxt "naturaltime-past" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d сар" -msgstr[1] "%d сар" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d сар" +msgstr[1] "%(num)d сар" #, python-format msgctxt "naturaltime-past" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d долоо хоног" -msgstr[1] "%d долоо хоног" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d долоо хоног" +msgstr[1] "%(num)d долоо хоног" #, python-format msgctxt "naturaltime-past" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d өдөр" -msgstr[1] "%d өдөр" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d өдөр" +msgstr[1] "%(num)d өдөр" #, python-format msgctxt "naturaltime-past" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d цаг" -msgstr[1] "%d цаг" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d цаг" +msgstr[1] "%(num)d цаг" #, python-format msgctxt "naturaltime-past" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минут" -msgstr[1] "%d минут" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d минут" +msgstr[1] "%(num)d минут" #. Translators: 'naturaltime-future' strings will be included in '%(delta)s #. from now' #, python-format msgctxt "naturaltime-future" -msgid "%d year" -msgid_plural "%d years" -msgstr[0] "%d жил" -msgstr[1] "%d жил" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "%(num)d жил" +msgstr[1] "%(num)d жил" #, python-format msgctxt "naturaltime-future" -msgid "%d month" -msgid_plural "%d months" -msgstr[0] "%d сар" -msgstr[1] "%d сар" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "%(num)d сар" +msgstr[1] "%(num)d сар" #, python-format msgctxt "naturaltime-future" -msgid "%d week" -msgid_plural "%d weeks" -msgstr[0] "%d долоо хоног" -msgstr[1] "%d долоо хоног" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "%(num)d долоо хоног" +msgstr[1] "%(num)d долоо хоног" #, python-format msgctxt "naturaltime-future" -msgid "%d day" -msgid_plural "%d days" -msgstr[0] "%d өдөр" -msgstr[1] "%d өдөр" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "%(num)d өдөр" +msgstr[1] "%(num)d өдөр" #, python-format msgctxt "naturaltime-future" -msgid "%d hour" -msgid_plural "%d hours" -msgstr[0] "%d цаг" -msgstr[1] "%d цаг" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "%(num)d цаг" +msgstr[1] "%(num)d цаг" #, python-format msgctxt "naturaltime-future" -msgid "%d minute" -msgid_plural "%d minutes" -msgstr[0] "%d минут" -msgstr[1] "%d минут" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "%(num)d минут" +msgstr[1] "%(num)d минут" diff --git a/django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo b/django/contrib/humanize/locale/mr/LC_MESSAGES/django.mo index 183b3d14e9fb10c1d39cdf7eb3080abd7a0a7b50..9e758b08fc331c1728e8304539dc3bb658f7b4f0 100644 GIT binary patch literal 1506 zcmb`F%WD)d9LJ+ptK<9qMB<^)qSJl2YMoL9YsG>~t5!krV7i;#9oo-`oS!O_!M=ywn^jn{`JOP?~PlI^KFkVZ*0(cg+RY6nlXB4ps{0S}s7hqEp z=UA=-&G>ff+pJH3X8*mG2P}_R9N>Kf1CM!rkQ_aGqemc zcY-Ubx22YUfmG@_)_q%ho|iT22q-H`a->#a!oS1`_lqS>3jPQu1zA%>_<|E5FA@n# zmG=cJ(`3u|gf7k56l|ayHnoeU($Mbaur#d5&xM&;)v%f7;62TDZ?oOkY`dE6{@4b5 zgbNb*qePb!=S0gq8^gOIl|n)Kq9kKH&|I0}K_$=goOb*3?kTPUUkZ=r&ofb!&T(Fq zO1s&h=;z&owPN57Nsl^%1MYD?;+s(S5YybF>11lRo6NZB3{7=;ndHtSnsbx|+8t6% z1ZAeB^5{V20#kI5DK@+dYtk8nh+>TuxjV#J#iLnF>5@;|OIlaGM1obTo!V^R7x-vr zPF50eW`9w(%M%rq=y0Z>GoHoFJu;TGto6P&^0gxs<1LN(l!7B zE}z8W65WuZ#Ju91#FG3XD+RB_yu8d}1)tQ+l++vrn=CNbAqULW%gjs5x10QiSwW_} hyj-sYq%AWowL&jBKUcq?C_gJTxujUXV6qC!N&t}sHU0nq diff --git a/django/contrib/humanize/locale/mr/LC_MESSAGES/django.po b/django/contrib/humanize/locale/mr/LC_MESSAGES/django.po index b042b29121a..97d741ba36d 100644 --- a/django/contrib/humanize/locale/mr/LC_MESSAGES/django.po +++ b/django/contrib/humanize/locale/mr/LC_MESSAGES/django.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Omkar Parab, 2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"POT-Creation-Date: 2023-09-18 11:41-0300\n" +"PO-Revision-Date: 2024-01-24 18:40+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,25 +18,62 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Humanize" -msgstr "" - -msgid "th" -msgstr "" - -msgid "st" -msgstr "" - -msgid "nd" -msgstr "" - -msgid "rd" -msgstr "" - -#, python-format -msgid "%(value).1f million" -msgid_plural "%(value).1f million" -msgstr[0] "" -msgstr[1] "" +msgstr "मानवीकरण" + +#. Translators: Ordinal format for 11 (11th), 12 (12th), and 13 (13th). +msgctxt "ordinal 11, 12, 13" +msgid "{}th" +msgstr "{}वा" + +#. Translators: Ordinal format when value ends with 0, e.g. 80th. +msgctxt "ordinal 0" +msgid "{}th" +msgstr "{}वा" + +#. Translators: Ordinal format when value ends with 1, e.g. 81st, except 11. +msgctxt "ordinal 1" +msgid "{}st" +msgstr "{}वा" + +#. Translators: Ordinal format when value ends with 2, e.g. 82nd, except 12. +msgctxt "ordinal 2" +msgid "{}nd" +msgstr "{}वा" + +#. Translators: Ordinal format when value ends with 3, e.g. 83rd, except 13. +msgctxt "ordinal 3" +msgid "{}rd" +msgstr "{}वा" + +#. Translators: Ordinal format when value ends with 4, e.g. 84th. +msgctxt "ordinal 4" +msgid "{}th" +msgstr "{}वा" + +#. Translators: Ordinal format when value ends with 5, e.g. 85th. +msgctxt "ordinal 5" +msgid "{}th" +msgstr "{}वा" + +#. Translators: Ordinal format when value ends with 6, e.g. 86th. +msgctxt "ordinal 6" +msgid "{}th" +msgstr "{}वा" + +#. Translators: Ordinal format when value ends with 7, e.g. 87th. +msgctxt "ordinal 7" +msgid "{}th" +msgstr "{}वा" + +#. Translators: Ordinal format when value ends with 8, e.g. 88th. +msgctxt "ordinal 8" +msgid "{}th" +msgstr "{}वा" + +#. Translators: Ordinal format when value ends with 9, e.g. 89th. +msgctxt "ordinal 9" +msgid "{}th" +msgstr "{वा}" #, python-format msgid "%(value)s million" @@ -43,120 +81,60 @@ msgid_plural "%(value)s million" msgstr[0] "" msgstr[1] "" -#, python-format -msgid "%(value).1f billion" -msgid_plural "%(value).1f billion" -msgstr[0] "" -msgstr[1] "" - #, python-format msgid "%(value)s billion" msgid_plural "%(value)s billion" msgstr[0] "" msgstr[1] "" -#, python-format -msgid "%(value).1f trillion" -msgid_plural "%(value).1f trillion" -msgstr[0] "" -msgstr[1] "" - #, python-format msgid "%(value)s trillion" msgid_plural "%(value)s trillion" msgstr[0] "" msgstr[1] "" -#, python-format -msgid "%(value).1f quadrillion" -msgid_plural "%(value).1f quadrillion" -msgstr[0] "" -msgstr[1] "" - #, python-format msgid "%(value)s quadrillion" msgid_plural "%(value)s quadrillion" msgstr[0] "" msgstr[1] "" -#, python-format -msgid "%(value).1f quintillion" -msgid_plural "%(value).1f quintillion" -msgstr[0] "" -msgstr[1] "" - #, python-format msgid "%(value)s quintillion" msgid_plural "%(value)s quintillion" msgstr[0] "" msgstr[1] "" -#, python-format -msgid "%(value).1f sextillion" -msgid_plural "%(value).1f sextillion" -msgstr[0] "" -msgstr[1] "" - #, python-format msgid "%(value)s sextillion" msgid_plural "%(value)s sextillion" msgstr[0] "" msgstr[1] "" -#, python-format -msgid "%(value).1f septillion" -msgid_plural "%(value).1f septillion" -msgstr[0] "" -msgstr[1] "" - #, python-format msgid "%(value)s septillion" msgid_plural "%(value)s septillion" msgstr[0] "" msgstr[1] "" -#, python-format -msgid "%(value).1f octillion" -msgid_plural "%(value).1f octillion" -msgstr[0] "" -msgstr[1] "" - #, python-format msgid "%(value)s octillion" msgid_plural "%(value)s octillion" msgstr[0] "" msgstr[1] "" -#, python-format -msgid "%(value).1f nonillion" -msgid_plural "%(value).1f nonillion" -msgstr[0] "" -msgstr[1] "" - #, python-format msgid "%(value)s nonillion" msgid_plural "%(value)s nonillion" msgstr[0] "" msgstr[1] "" -#, python-format -msgid "%(value).1f decillion" -msgid_plural "%(value).1f decillion" -msgstr[0] "" -msgstr[1] "" - #, python-format msgid "%(value)s decillion" msgid_plural "%(value)s decillion" msgstr[0] "" msgstr[1] "" -#, python-format -msgid "%(value).1f googol" -msgid_plural "%(value).1f googol" -msgstr[0] "" -msgstr[1] "" - #, python-format msgid "%(value)s googol" msgid_plural "%(value)s googol" @@ -164,98 +142,187 @@ msgstr[0] "" msgstr[1] "" msgid "one" -msgstr "" +msgstr "एक" msgid "two" -msgstr "" +msgstr "दोन" msgid "three" -msgstr "" +msgstr "तीन" msgid "four" -msgstr "" +msgstr "चार" msgid "five" -msgstr "" +msgstr "पाच" msgid "six" -msgstr "" +msgstr "सहा" msgid "seven" -msgstr "" +msgstr "सात" msgid "eight" -msgstr "" +msgstr "आठ" msgid "nine" -msgstr "" +msgstr "नऊ" msgid "today" -msgstr "" +msgstr "आज" msgid "tomorrow" -msgstr "" +msgstr "उद्या" msgid "yesterday" -msgstr "" +msgstr "काल" +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' #, python-format -msgctxt "naturaltime" msgid "%(delta)s ago" -msgstr "" +msgstr "%(delta)s पूर्वी" -msgid "now" -msgstr "" - -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. #, python-format -msgid "a second ago" -msgid_plural "%(count)s seconds ago" +msgid "an hour ago" +msgid_plural "%(count)s hours ago" msgstr[0] "" msgstr[1] "" -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. #, python-format msgid "a minute ago" msgid_plural "%(count)s minutes ago" msgstr[0] "" msgstr[1] "" -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. #, python-format -msgid "an hour ago" -msgid_plural "%(count)s hours ago" +msgid "a second ago" +msgid_plural "%(count)s seconds ago" msgstr[0] "" msgstr[1] "" -#, python-format -msgctxt "naturaltime" -msgid "%(delta)s from now" -msgstr "" +msgid "now" +msgstr "आता" -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. #, python-format msgid "a second from now" msgid_plural "%(count)s seconds from now" msgstr[0] "" msgstr[1] "" -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. #, python-format msgid "a minute from now" msgid_plural "%(count)s minutes from now" msgstr[0] "" msgstr[1] "" -#. Translators: please keep a non-breaking space (U+00A0) -#. between count and time unit. +#. Translators: please keep a non-breaking space (U+00A0) between count +#. and time unit. #, python-format msgid "an hour from now" msgid_plural "%(count)s hours from now" msgstr[0] "" msgstr[1] "" + +#. Translators: delta will contain a string like '2 months' or '1 month, 2 +#. weeks' +#, python-format +msgid "%(delta)s from now" +msgstr "" + +#. Translators: 'naturaltime-past' strings will be included in '%(delta)s ago' +#, python-format +msgctxt "naturaltime-past" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-past" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" + +#. Translators: 'naturaltime-future' strings will be included in '%(delta)s +#. from now' +#, python-format +msgctxt "naturaltime-future" +msgid "%(num)d year" +msgid_plural "%(num)d years" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%(num)d month" +msgid_plural "%(num)d months" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%(num)d week" +msgid_plural "%(num)d weeks" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%(num)d day" +msgid_plural "%(num)d days" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%(num)d hour" +msgid_plural "%(num)d hours" +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgctxt "naturaltime-future" +msgid "%(num)d minute" +msgid_plural "%(num)d minutes" +msgstr[0] "" +msgstr[1] "" diff --git a/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.mo b/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.mo index 652b8fd85f916f4e3e6a7887f8ba7ccc96a6ea37..e5b798fb05ca3535947a39ec0d35f79f3d751668 100644 GIT binary patch delta 816 zcmb8s&r1|x7{Kvo8^^Rv%Qn}_*tbJqWg)ACP+fw45Ct7N1V%XFXsOI@JG+FZy{xha z=`sv?>Zlf!=^zO952PLHQt#|QP}fdD;K57Z9XFw%pm%xR&-1?X&c4t4&T{JGk<#b( z2484NqKkM#93$=~=xFcpFn+-6_ziF3xm_adSjMCH6gx1$6s}_@eno{_cpAG5kp;Yl zb0Q`APLgI~wn3yDSMd;jL4})m5<5+i3wR0pu!NHo6W{>jGrL7x9KlCe#o9q`G;OaR z!yd-Zu(rJ0wef$d!AqNR+kXE9NpkCq9ggW9+z<%-P18MeN zCRD~P=51AYU=`?WHIaR6=hgje(HU0Rk$5U^Iit3E=qe{$P!qQ6ddH3AfO}RhJHNkM z%;o<1?r7e&3SQdiNVvh<#F}CDWO_6GUfJw6tX$4pG`9w;E8%oBqv!QP~W)AH2YYg9w8srdPds7Chp(`9^wGsG3&$z(kGKPg{KMW0KG|R4bN~3 zZ*dP_@Ce;0X&+liKYuaHj7yqe%LI2bG0iwb()+(i#|OA1Jt+IT#RW{zkLF0uHNQSC bX2Q2bsehRqSYh4vEZ_ITQ~RsmaGdlHJIE}Y diff --git a/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.po b/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.po index 4c93f29da63..35664e99edd 100644 --- a/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.po +++ b/django/contrib/postgres/locale/ckb/LC_MESSAGES/django.po @@ -1,15 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: -# Swara , 2022 +# Swara , 2022,2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-01-17 02:13-0600\n" -"PO-Revision-Date: 2023-04-19 09:22+0000\n" -"Last-Translator: Swara , 2022\n" -"Language-Team: Central Kurdish (http://www.transifex.com/django/django/" +"PO-Revision-Date: 2024-01-19 09:22+0000\n" +"Last-Translator: Swara , 2022,2024\n" +"Language-Team: Central Kurdish (http://app.transifex.com/django/django/" "language/ckb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -93,9 +93,9 @@ msgstr "هەندێک کلیلی نەناسراو دابین کران: %(keys)s" #, python-format msgid "" "Ensure that the upper bound of the range is not greater than %(limit_value)s." -msgstr "" +msgstr "دڵنیابە لەوەی کە سنووری سەرەوەی ڕێژەکە زیاتر نییە لە %(limit_value)s." #, python-format msgid "" "Ensure that the lower bound of the range is not less than %(limit_value)s." -msgstr "" +msgstr "دڵنیابە لەوەی کە سنووری خوارەوەی ڕێژەکە کەمتر نییە لە %(limit_value)s." diff --git a/django/contrib/postgres/locale/mr/LC_MESSAGES/django.mo b/django/contrib/postgres/locale/mr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..d183857384acf0ed361dbfa74f1acc72c5f74ec0 GIT binary patch literal 1132 zcmb_ZK~K~`6t0Mx)Eftt;99g=do z{s^vt`?@U)E%_WLz*(FGP|gGGc|g{QG0_e@5(z~D!8|f`edZeRm|_KMJW^Z|wIoQ? z4(GT`e*Lt_0^iGo+);kWkEs3TGaB26qLUuIiA#MExx`ywQB&Bn zJQh;XYSQ#QI@)d~v@Tp?*JkJ}U-UC6y^4ukQZAM*(_)F1hDmYQEtdz22z#0(iq<8I zl7J~8T{08iVUpCCWOEnMQ@#XA)NHdRr*+OkmsC+wEuZwal!{%)VR2kgnSnpgmkSLM zI-SXWQ1HFo38gb&S0}6E2X819iuRbmP9qF)H^!8TFDoYwm>-RhMvKXWtICb~1RXli zWp~YUNynpx@cgLhlA$?Y{T$OJp|op3Te5&o2pJ|WiQ+s>D&-N10%MT z|6Ze?nRM0Yb))x*(XUPV5T9^bGkV*kD>%K)ldOVd3p%6sOnR^I;i+ZxM&7W6%C6BX zMn5s>W20Yn++O6#w$VFAzc>0_o~}cio9q3;A%h*0J}`O{<&9k4xeA_ZPUetJ`R4!n i{+ZhmL%zgz@`dH^O;<7Z-@O-V7+}dTc#iIWTHrVGU*L)W literal 0 HcmV?d00001 diff --git a/django/contrib/postgres/locale/mr/LC_MESSAGES/django.po b/django/contrib/postgres/locale/mr/LC_MESSAGES/django.po new file mode 100644 index 00000000000..42fb58dec0c --- /dev/null +++ b/django/contrib/postgres/locale/mr/LC_MESSAGES/django.po @@ -0,0 +1,97 @@ +# This file is distributed under the same license as the Django package. +# +# Translators: +# Omkar Parab, 2024 +msgid "" +msgstr "" +"Project-Id-Version: django\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-01-17 02:13-0600\n" +"PO-Revision-Date: 2024-01-19 09:22+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" +"mr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: mr\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +msgid "PostgreSQL extensions" +msgstr "" + +#, python-format +msgid "Item %(nth)s in the array did not validate:" +msgstr "" + +msgid "Nested arrays must have the same length." +msgstr "" + +msgid "Map of strings to strings/nulls" +msgstr "" + +#, python-format +msgid "The value of “%(key)s” is not a string or null." +msgstr "" + +msgid "Could not load JSON data." +msgstr "JSON डेटा लोड करू शकलो नाही. " + +msgid "Input must be a JSON dictionary." +msgstr "" + +msgid "Enter two valid values." +msgstr "दोन वैध मूल्ये प्रविष्ट करा." + +msgid "The start of the range must not exceed the end of the range." +msgstr "" + +msgid "Enter two whole numbers." +msgstr "दोन पूर्ण संख्या प्रविष्ट करा." + +msgid "Enter two numbers." +msgstr "दोन संख्या प्रविष्ट करा." + +msgid "Enter two valid date/times." +msgstr "दोन वैध दिनांक/वेळा प्रविष्ट करा." + +msgid "Enter two valid dates." +msgstr "दोन वैध दिनांका प्रविष्ट करा" + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no more than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no more than " +"%(limit_value)d." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "" +"List contains %(show_value)d item, it should contain no fewer than " +"%(limit_value)d." +msgid_plural "" +"List contains %(show_value)d items, it should contain no fewer than " +"%(limit_value)d." +msgstr[0] "" +msgstr[1] "" + +#, python-format +msgid "Some keys were missing: %(keys)s" +msgstr "" + +#, python-format +msgid "Some unknown keys were provided: %(keys)s" +msgstr "" + +#, python-format +msgid "" +"Ensure that the upper bound of the range is not greater than %(limit_value)s." +msgstr "" + +#, python-format +msgid "" +"Ensure that the lower bound of the range is not less than %(limit_value)s." +msgstr "" diff --git a/django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo b/django/contrib/redirects/locale/mr/LC_MESSAGES/django.mo index 183b3d14e9fb10c1d39cdf7eb3080abd7a0a7b50..54b53f3bea340e8aff80c53f2d41698fb36200c6 100644 GIT binary patch literal 1530 zcmb7D&x;gC6s|-Qb&^~>dwAJgc8xu=GwxyOWiQ4R1Q(ZOHaR4h+Me3!*6yyRs%Epf zjY3#N#N@E*!5qTYNC-hCViF-l@aP}lF;s+{LjDK8s`;@hf?Du+?^S*8dtbfk{`>I$ z9foxXb_CXeeFXaj=9h!{vwvXcVgJFtgnjW2V+Y~y!F&9l@E^cGhWGd<@cZE%{8zAl zVMmdl*vHr>hzs}|$iD~3?;m}Su^4_0z6t*wyx)HW{~`SU@F-*N!#uC=?bo}o10iAz zkje5I(1Nj5(aDrZjArdL)0FU%)&+^oq(TuAzOH57GlD8^Qkv!(J91OZki;=<^zxk6 zR?m<&T$!xw($}cOflg9U2-3X-nWm@xo2fCCjvI}q{U7SXUOJV%yyM%w+~*jHtt9Vt zJRyWoM;1IQspN&I)6y0%s$9gLv>`S{X>>yiu99@ftwuLuWUW9ppaWmnc#MJ1JqmUTDlL??P(9kpdlwUx8cs@TjtG&;!*#I$Cc z$D`S~s5M8;`S^J2(^;(A8Lmy#R=m_XH&VrPwm8oft#HNHkD;bD2T0lN@vey4f)_C@ z4Vym9WqA^r9cKN8hQK-gDZTa-_(%v1K_1W5IvNRY`)c&S| zN+Y&RqslSN1xiw`v@nZn?NibG9?tjL5Gq2Q#_AONmb~W z$||IKv9&=4>!1o2!x@2aG9o^y&ph*XMYV^AmQ$~ zco&p2C;%EgE(YvKz_q{*fxzDx%DUqQmz}*iRO`8Xf8P>2AVGwC;*ws%gMi%~OYCC{ z`hgq{VK@9WuhhH^D0+a+N4RdErp7n z7x%_BU(_)k#ZcE|j)4=*byQw*_Eu;DLQw3+H1*PtH&thW_qFeg_BKFY9Nn9IBBN3~ WqJN>csCX0T==;Oa@!SIpkv#({!?O1P delta 234 zcmeyxeTCWLo)F7a1|VPrVi_P-0b*t#)&XJ=umIv&KuJp=4N?OGlbI{ zGBnaQ00J(b#Nra&kfOxA;+({i{30s_uf)8(%wh$f)XbFB90i*!FxMdm%+<@xV@}Jr oo1Dm`AX8pmu2%xmmzkDYp_iPWt6xx*pOu\n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"POT-Creation-Date: 2021-01-15 09:00+0100\n" +"PO-Revision-Date: 2024-01-24 18:32+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,26 +18,31 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Redirects" -msgstr "" +msgstr "पुनर्निर्देशने" + +msgid "site" +msgstr "स्थळ" msgid "redirect from" -msgstr "" +msgstr "पासून पुनर्निर्देशित" msgid "" -"This should be an absolute path, excluding the domain name. Example: '/" -"events/search/'." -msgstr "" +"This should be an absolute path, excluding the domain name. Example: “/" +"events/search/”." +msgstr "डोमेन नाव वगळून हा एक परिपूर्ण मार्ग असावा. उदाहरण: \"/events/search/\"." msgid "redirect to" -msgstr "" +msgstr "ला पुनर्निर्देशित" msgid "" -"This can be either an absolute path (as above) or a full URL starting with " -"'http://'." +"This can be either an absolute path (as above) or a full URL starting with a " +"scheme such as “https://”." msgstr "" +"हा एकतर निरपेक्ष मार्ग असू शकतो (वरीलप्रमाणे) किंवा एखाद्या योजनेपासून सुरू होणारी पूर्ण " +"URL असू शकते जसे की \"https://\"" msgid "redirect" -msgstr "" +msgstr "पुनर्निर्देशित" msgid "redirects" -msgstr "" +msgstr "पुनर्निर्देशने" diff --git a/django/contrib/sessions/locale/mr/LC_MESSAGES/django.mo b/django/contrib/sessions/locale/mr/LC_MESSAGES/django.mo index 183b3d14e9fb10c1d39cdf7eb3080abd7a0a7b50..0dc523de98ea17773eb997f9e91a0c8e7aacb034 100644 GIT binary patch literal 768 zcmZXPzl#$=6vszBf3OOIwZ&KnIdrl~ION!nM!kar!-X?vWiyw|ZT2oZyUa`^*999J z?M!1MhZ7MS<*Kt$u(7kWlmY($EiL`dCb=W{;IrR(Z@%x%+n?8##sqN@TnBA%89WC* zj=?4H3HbU~;Jx3$74QT2`Y+&pzro`(g#3kG1>0u{DMJO+`(HwDLJy%O=r^eM{ehyb zn7st`aegWUS4CXF_uTAE9ty3KOll&Ad7=dEawCYI7U$}V{3O{I2lKNgEtTzwj$s>J z_DCo{DWcsyF5@iN5_zT!Yw9@Zvb%#=vvwBIptZ@i#FNBZ*?l|~(ORXp!YWl(TcOp} zsCMU81ra>p+OW3bQun#ZR75w^eXeMWE538P=z&GX10D<37Cen;6IZ5}&{EHsJPJde z=VjvuB)ei*?qq2=-E1!XS$mkOa5-phG}li5p<1p4_cCdO#1aQNwlrdB!o1HDS*M*I zS6Z0Hc6*(zp8EV-yF#%w*~z+zj3c_blbDk=Bbut9)gLI{XX}|tbwp)eq`Fb7)9JBM zlJrJ{R+sAmarW3*>n1Op{pcporukE6-#h!JsD5zvv$L<+Bb2-xVd8#tZEW jNnydi{tbSOD=Xprj>`2C0F8iQi4@Lv)>sQWHxu z^Ye6F5=&C86pRcEO?3?nbq&oG3=ORe%(V>+4Gg#f{B?s;%QA~m)S2iS8t59B0<~Bf z8fhB<0hdo=afxn7QDRyQKH>Sg9Jr{&vC nE@4!VDK9VAD*@@tOiQiMOU}>LFDS~-N=+^))-Ra6hH)hTVAVUT diff --git a/django/contrib/sessions/locale/mr/LC_MESSAGES/django.po b/django/contrib/sessions/locale/mr/LC_MESSAGES/django.po index 45b727e128e..cefc17d3008 100644 --- a/django/contrib/sessions/locale/mr/LC_MESSAGES/django.po +++ b/django/contrib/sessions/locale/mr/LC_MESSAGES/django.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Omkar Parab, 2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"PO-Revision-Date: 2024-01-24 18:26+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,19 +18,19 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Sessions" -msgstr "" +msgstr "सत्रे" msgid "session key" -msgstr "" +msgstr "सत्राची किल्ली" msgid "session data" -msgstr "" +msgstr "सत्रातील डेटा" msgid "expire date" -msgstr "" +msgstr "संपण्याची दिनांक" msgid "session" -msgstr "" +msgstr "सत्र" msgid "sessions" -msgstr "" +msgstr "सत्रे" diff --git a/django/contrib/sites/locale/mr/LC_MESSAGES/django.mo b/django/contrib/sites/locale/mr/LC_MESSAGES/django.mo index 183b3d14e9fb10c1d39cdf7eb3080abd7a0a7b50..40f14123d20427b1aed79b52803e369be7a88203 100644 GIT binary patch literal 884 zcmY*VPiqu09F1BPMnMtrBp5xlX!f5K%apySEfie3)KxED(wVqBbtf5;RN9+V#DfZ6 zdhsG+Rz;)=qO=$LO(dVeFQ6|ot!;ns@_xVM<>k%%J~OsXP{)DuKo2+pyaYmR0!M)@ zpapCLCxJge(ESC*LVu{zod!Pu&H<;eZw?dk8vGP|34HblAs4{c!NKP~IOtL^t`Nw` zF(Bj#zM;bVy9HTQcQPvs=?w%;Rn9X>CC>#-xRlD$L`fU=xLl>C;E6C)X=?eRsgX1@ z#gMO-da~~>F>ovwL%LcmiNvzGl-(2BWJ<;~UE;E@q6JYXZCS_kvy|Of?iZW`XkKNFN!FUA&8fI??Q#PZ-R8!!p61dFxm7x*^Z6sLX_srhcm;P_ zlaR>%GVcr46FiS;2S;|0(eZ(`MO?4*qNv$mkUbPDwM6ChD%ma#cdplSU7v_LbDf#J zZ)nyU(M|jtArWG=KuRlCY#sk2lhZUAaBYNb-|fw^sXbkI>!HwWMkXrFWIv`;i<$i& zGp4zYy2EA7hiq2q+{9ECX>(#aBHnHK(JSvp-hKC@=a}F5(F^Z3 zFnITg0^a@d?nk+9c=xfCf5kD*)=TYs?_7Dj_ktDX8u1QB2>8vr4`B^G#QTy#av-yJZ>n@V$#K5-jRywE$UjFQ BOsW6? delta 261 zcmeyuc7@sEo)F7a1|VPrVi_P-0b*t#)&XJ=umIv&KuJp=4N?OGlSLU#>qB&%i&7Iy zGV}9vT@p)DtrUz53{7V~8y=2|KECKe@@WMnF6WR#Q?Sn2DRmzV36fQ-ycORdmL&d=2^D9X=D OO)e?cFPMCaaU}rb$wc@7 diff --git a/django/contrib/sites/locale/mr/LC_MESSAGES/django.po b/django/contrib/sites/locale/mr/LC_MESSAGES/django.po index fc1e2a9358f..3e041c141ed 100644 --- a/django/contrib/sites/locale/mr/LC_MESSAGES/django.po +++ b/django/contrib/sites/locale/mr/LC_MESSAGES/django.po @@ -1,14 +1,15 @@ # This file is distributed under the same license as the Django package. # # Translators: +# Omkar Parab, 2024 msgid "" msgstr "" "Project-Id-Version: django\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-01-17 11:07+0100\n" -"PO-Revision-Date: 2014-10-05 20:12+0000\n" -"Last-Translator: Jannis Leidel \n" -"Language-Team: Marathi (http://www.transifex.com/projects/p/django/language/" +"PO-Revision-Date: 2024-01-24 18:05+0000\n" +"Last-Translator: Omkar Parab, 2024\n" +"Language-Team: Marathi (http://app.transifex.com/django/django/language/" "mr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,19 +18,19 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Sites" -msgstr "" +msgstr "स्थळे" msgid "The domain name cannot contain any spaces or tabs." -msgstr "" +msgstr "डोमेन नावामध्ये कोणताही स्पेस किंवा टॅब असू शकत नाहीत." msgid "domain name" -msgstr "" +msgstr "डोमेनचे नाव" msgid "display name" -msgstr "" +msgstr "प्रदर्शन नाव" msgid "site" -msgstr "" +msgstr "स्थळ" msgid "sites" -msgstr "" +msgstr "स्थळे" diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index 05f80bb00f9..ba630c6398c 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -4,7 +4,8 @@ Django 5.0.2 release notes *Expected February 5, 2024* -Django 5.0.2 fixes several bugs in 5.0.1. +Django 5.0.2 fixes several bugs in 5.0.1. Also, the latest string translations +from Transifex are incorporated. Bugfixes ======== From f588c444fd94e07d202cbc207ac32ec2dfed49e6 Mon Sep 17 00:00:00 2001 From: Natalia <124304+nessita@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:41:53 -0300 Subject: [PATCH 50/67] [5.0.x] Added stub release notes and release date for 5.0.2, 4.2.10, and 3.2.24. Backport of 06d0a1bd56a9899c351ca047a05813e8dd6a4e17 from main --- docs/releases/3.2.24.txt | 9 +++++++++ docs/releases/4.2.10.txt | 9 +++++++++ docs/releases/5.0.2.txt | 6 +++--- docs/releases/index.txt | 2 ++ 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 docs/releases/3.2.24.txt create mode 100644 docs/releases/4.2.10.txt diff --git a/docs/releases/3.2.24.txt b/docs/releases/3.2.24.txt new file mode 100644 index 00000000000..1ab7024f73c --- /dev/null +++ b/docs/releases/3.2.24.txt @@ -0,0 +1,9 @@ +=========================== +Django 3.2.24 release notes +=========================== + +*February 6, 2024* + +Django 3.2.24 fixes a security issue with severity "moderate" in 3.2.23. + +... diff --git a/docs/releases/4.2.10.txt b/docs/releases/4.2.10.txt new file mode 100644 index 00000000000..c039f6840f7 --- /dev/null +++ b/docs/releases/4.2.10.txt @@ -0,0 +1,9 @@ +=========================== +Django 4.2.10 release notes +=========================== + +*February 6, 2024* + +Django 4.2.10 fixes a security issue with severity "moderate" in 4.2.9. + +... diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index ba630c6398c..c795049c737 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -2,10 +2,10 @@ Django 5.0.2 release notes ========================== -*Expected February 5, 2024* +*February 6, 2024* -Django 5.0.2 fixes several bugs in 5.0.1. Also, the latest string translations -from Transifex are incorporated. +Django 5.0.2 fixes a security issue with severity "moderate" and several bugs +in 5.0.1. Also, the latest string translations from Transifex are incorporated. Bugfixes ======== diff --git a/docs/releases/index.txt b/docs/releases/index.txt index 032588a178a..ba6d7fbd460 100644 --- a/docs/releases/index.txt +++ b/docs/releases/index.txt @@ -35,6 +35,7 @@ versions of the documentation contain the release notes for any later releases. .. toctree:: :maxdepth: 1 + 4.2.10 4.2.9 4.2.8 4.2.7 @@ -88,6 +89,7 @@ versions of the documentation contain the release notes for any later releases. .. toctree:: :maxdepth: 1 + 3.2.24 3.2.23 3.2.22 3.2.21 From 28d6db26a2e3ff7f44ea7843913496bd4a752f24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Lazarevi=C4=87?= Date: Fri, 26 Jan 2024 03:59:54 +0100 Subject: [PATCH 51/67] [5.0.x] Fixed #35141 -- Clarified the expected type of CACHE_MIDDLEWARE_SECONDS setting. Backport of a5365339eaee043895a79dbbdd7462f1399136e5 from main --- docs/ref/settings.txt | 4 ++-- docs/topics/cache.txt | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index 477c83fca49..a7b789c3f69 100644 --- a/docs/ref/settings.txt +++ b/docs/ref/settings.txt @@ -273,8 +273,8 @@ See :doc:`/topics/cache`. Default: ``600`` -The default number of seconds to cache a page for the :ref:`cache middleware -`. +The default integer number of seconds to cache a page for the +:ref:`cache middleware `. See :doc:`/topics/cache`. diff --git a/docs/topics/cache.txt b/docs/topics/cache.txt index a2bdba7ccd5..d2951acfa41 100644 --- a/docs/topics/cache.txt +++ b/docs/topics/cache.txt @@ -608,8 +608,9 @@ entire site. You'll need to add Then, add the following required settings to your Django settings file: * :setting:`CACHE_MIDDLEWARE_ALIAS` -- The cache alias to use for storage. -* :setting:`CACHE_MIDDLEWARE_SECONDS` -- The number of seconds each page should - be cached. +* :setting:`CACHE_MIDDLEWARE_SECONDS` -- The integer number of seconds each + page should be cached. + * :setting:`CACHE_MIDDLEWARE_KEY_PREFIX` -- If the cache is shared across multiple sites using the same Django installation, set this to the name of the site, or some other string that is unique to this Django instance, to From a5440054d2285b2abf54251a33990fd9a6f94060 Mon Sep 17 00:00:00 2001 From: Nicolas Delaby Date: Tue, 23 Jan 2024 11:51:24 +0100 Subject: [PATCH 52/67] [5.0.x] Fixed #35135 -- Made FilteredRelation raise ValueError on querysets as rhs. Regression in 59f475470494ce5b8cbff816b1e5dafcbd10a3a3. Backport of 820c5f1bacd41713bd30d8b5fefb66752ff15c4c from main --- django/db/models/sql/query.py | 10 ++++++++++ docs/releases/5.0.2.txt | 5 +++++ tests/filtered_relation/tests.py | 10 ++++++++++ 3 files changed, 25 insertions(+) diff --git a/django/db/models/sql/query.py b/django/db/models/sql/query.py index c292af24a3e..277e8a18ca4 100644 --- a/django/db/models/sql/query.py +++ b/django/db/models/sql/query.py @@ -91,6 +91,8 @@ def get_children_from_q(q): def get_child_with_renamed_prefix(prefix, replacement, child): + from django.db.models.query import QuerySet + if isinstance(child, Node): return rename_prefix_from_q(prefix, replacement, child) if isinstance(child, tuple): @@ -105,6 +107,14 @@ def get_child_with_renamed_prefix(prefix, replacement, child): child = child.copy() if child.name.startswith(prefix + LOOKUP_SEP): child.name = child.name.replace(prefix, replacement, 1) + elif isinstance(child, QuerySet): + # QuerySet may contain OuterRef() references which cannot work properly + # without repointing to the filtered annotation and will spawn a + # different JOIN. Always raise ValueError instead of providing partial + # support in other cases. + raise ValueError( + "Passing a QuerySet within a FilteredRelation is not supported." + ) elif hasattr(child, "resolve_expression"): child = child.copy() child.set_source_expressions( diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index c795049c737..8e2d648ecce 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -19,3 +19,8 @@ Bugfixes * Fixed a bug in Django 5.0 that caused a crash of ``Model.full_clean()`` on models with a ``GeneratedField`` (:ticket:`35127`). + +* Fixed a regression in Django 5.0 that caused a crash of + ``FilteredRelation()`` with querysets as right-hand sides (:ticket:`35135`). + ``FilteredRelation()`` now raises a ``ValueError`` on querysets as right-hand + sides. diff --git a/tests/filtered_relation/tests.py b/tests/filtered_relation/tests.py index 19714e84433..82caba86621 100644 --- a/tests/filtered_relation/tests.py +++ b/tests/filtered_relation/tests.py @@ -828,6 +828,16 @@ def test_conditional_expression_lhs_contains_relation_name(self): ).filter(rel__isnull=True) self.assertSequenceEqual(qs, []) + def test_conditional_expression_does_not_support_queryset(self): + msg = "Passing a QuerySet within a FilteredRelation is not supported." + with self.assertRaisesMessage(ValueError, msg): + Author.objects.annotate( + poem_book=FilteredRelation( + "book", + condition=Q(book__in=Book.objects.filter(title__istartswith="a")), + ), + ).filter(poem_book__isnull=False) + class FilteredRelationAggregationTests(TestCase): @classmethod From 2822cafa3c38c8352eacb82aad27cc29338d8ad7 Mon Sep 17 00:00:00 2001 From: evananyonga Date: Sat, 20 Jan 2024 11:37:13 +0300 Subject: [PATCH 53/67] [5.0.x] Corrected BaseCommand.check() signature in docs. Backport of ae8baaee9d717cb48d59514b7130e35ae921d265 from main --- docs/howto/custom-management-commands.txt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/howto/custom-management-commands.txt b/docs/howto/custom-management-commands.txt index b472f092e93..d3775905d3f 100644 --- a/docs/howto/custom-management-commands.txt +++ b/docs/howto/custom-management-commands.txt @@ -304,7 +304,7 @@ the :meth:`~BaseCommand.handle` method must be implemented. It may return a string which will be printed to ``stdout`` (wrapped by ``BEGIN;`` and ``COMMIT;`` if :attr:`output_transaction` is ``True``). -.. method:: BaseCommand.check(app_configs=None, tags=None, display_num_errors=False) +.. method:: BaseCommand.check(app_configs=None, tags=None,display_num_errors=False, include_deployment_checks=False, fail_level=checks.ERROR, databases=None) Uses the system check framework to inspect the entire Django project for potential problems. Serious problems are raised as a :exc:`CommandError`; @@ -312,8 +312,12 @@ the :meth:`~BaseCommand.handle` method must be implemented. ``stdout``. If ``app_configs`` and ``tags`` are both ``None``, all system checks are - performed. ``tags`` can be a list of check tags, like ``compatibility`` or - ``models``. + performed except deployment and database related checks. ``tags`` can be a + list of check tags, like ``compatibility`` or ``models``. + + You can pass ``include_deployment_checks=True`` to also perform deployment + checks, and list of database aliases in the ``databases`` to run database + related checks against them. .. _ref-basecommand-subclasses: From 7453d6a80792e3f811fc662b8b25fdcbc5ea7eb3 Mon Sep 17 00:00:00 2001 From: Mariusz Felisiak Date: Wed, 31 Jan 2024 16:10:05 +0100 Subject: [PATCH 54/67] [5.0.x] Fixed #35159 -- Fixed dumpdata crash when base querysets use prefetch_related(). Regression in 139135627650ed6aaaf4c755b82c3bd43f2b8f51 following deprecation in edbf930287cb72e9afab1f7208c24b1146b0c4ec. Thanks Andrea F for the report. Backport of 38eaf2f21a2398a8dd8444f6df3723898cb5fe2a from main --- django/core/management/commands/dumpdata.py | 5 ++++- docs/releases/5.0.2.txt | 4 ++++ tests/fixtures/models.py | 6 ++++++ tests/fixtures/tests.py | 16 ++++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/django/core/management/commands/dumpdata.py b/django/core/management/commands/dumpdata.py index cc183517e30..01ff8974dd1 100644 --- a/django/core/management/commands/dumpdata.py +++ b/django/core/management/commands/dumpdata.py @@ -219,7 +219,10 @@ def get_objects(count_only=False): if count_only: yield queryset.order_by().count() else: - yield from queryset.iterator() + chunk_size = ( + 2000 if queryset._prefetch_related_lookups else None + ) + yield from queryset.iterator(chunk_size=chunk_size) try: self.stdout.ending = None diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index 8e2d648ecce..83f1af7b4f0 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -24,3 +24,7 @@ Bugfixes ``FilteredRelation()`` with querysets as right-hand sides (:ticket:`35135`). ``FilteredRelation()`` now raises a ``ValueError`` on querysets as right-hand sides. + +* Fixed a regression in Django 5.0 that caused a crash of the ``dumpdata`` + management command when a base queryset used ``prefetch_related()`` + (:ticket:`35159`). diff --git a/tests/fixtures/models.py b/tests/fixtures/models.py index 37b0066d70c..c87e170afc9 100644 --- a/tests/fixtures/models.py +++ b/tests/fixtures/models.py @@ -101,9 +101,15 @@ class Meta: proxy = True +class VisaManager(models.Manager): + def get_queryset(self): + return super().get_queryset().prefetch_related("permissions") + + class Visa(models.Model): person = models.ForeignKey(Person, models.CASCADE) permissions = models.ManyToManyField(Permission, blank=True) + objects = VisaManager() def __str__(self): return "%s %s" % ( diff --git a/tests/fixtures/tests.py b/tests/fixtures/tests.py index 78141b25b43..bce55bc3554 100644 --- a/tests/fixtures/tests.py +++ b/tests/fixtures/tests.py @@ -830,6 +830,22 @@ def test_dumpdata_proxy_with_concrete(self): ) self.assertEqual(len(warning_list), 0) + def test_dumpdata_objects_with_prefetch_related(self): + management.call_command( + "loaddata", "fixture6.json", "fixture8.json", verbosity=0 + ) + with self.assertNumQueries(5): + self._dumpdata_assert( + ["fixtures.visa"], + '[{"fields": {"permissions": [["add_user", "auth", "user"]],' + '"person": ["Stephane Grappelli"]},' + '"model": "fixtures.visa", "pk": 2},' + '{"fields": {"permissions": [], "person": ["Prince"]},' + '"model": "fixtures.visa", "pk": 3}]', + natural_foreign_keys=True, + primary_keys="2,3", + ) + def test_compress_format_loading(self): # Load fixture 4 (compressed), using format specification management.call_command("loaddata", "fixture4.json", verbosity=0) From d28c61b777d69e8be724da9287d2bc74c784b802 Mon Sep 17 00:00:00 2001 From: Ben Cail Date: Wed, 31 Jan 2024 10:27:33 -0500 Subject: [PATCH 55/67] [5.0.x] Fixed #35156 -- Removed outdated note about not supporting foreign keys by SQLite. Backport of b3dc80682e678b20c89fb2a430c0bc77960a29ac from main --- docs/topics/db/multi-db.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/topics/db/multi-db.txt b/docs/topics/db/multi-db.txt index 8da71df2500..be7e9953fa8 100644 --- a/docs/topics/db/multi-db.txt +++ b/docs/topics/db/multi-db.txt @@ -740,14 +740,14 @@ primary key of the related object is valid. If the primary key is stored on a separate database, it's not possible to easily evaluate the validity of a primary key. -If you're using Postgres, Oracle, or MySQL with InnoDB, this is +If you're using Postgres, SQLite, Oracle, or MySQL with InnoDB, this is enforced at the database integrity level -- database level key constraints prevent the creation of relations that can't be validated. -However, if you're using SQLite or MySQL with MyISAM tables, there is -no enforced referential integrity; as a result, you may be able to -'fake' cross database foreign keys. However, this configuration is not -officially supported by Django. +However, if you're using MySQL with MyISAM tables, there is no enforced +referential integrity; as a result, you may be able to 'fake' cross database +foreign keys. However, this configuration is not officially supported by +Django. .. _contrib_app_multiple_databases: From bbb9ef3c62674e94ad8e6556933b112d84891f3d Mon Sep 17 00:00:00 2001 From: Natalia <124304+nessita@users.noreply.github.com> Date: Wed, 31 Jan 2024 11:12:03 -0300 Subject: [PATCH 56/67] [5.0.x] Refs #35059 -- Made asgi tests' SignalHandler helper class re-usable by other tests. Backport of a43d75e81da783fda08bf8d3493252e3676d11ea from main --- tests/asgi/tests.py | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/tests/asgi/tests.py b/tests/asgi/tests.py index ced24c658e8..50d15d2306c 100644 --- a/tests/asgi/tests.py +++ b/tests/asgi/tests.py @@ -26,6 +26,17 @@ TEST_STATIC_ROOT = Path(__file__).parent / "project" / "static" +class SignalHandler: + """Helper class to track threads and kwargs when signals are dispatched.""" + + def __init__(self): + super().__init__() + self.calls = [] + + def __call__(self, signal, **kwargs): + self.calls.append({"thread": threading.current_thread(), "kwargs": kwargs}) + + @override_settings(ROOT_URLCONF="asgi.urls") class ASGITest(SimpleTestCase): async_request_factory = AsyncRequestFactory() @@ -312,17 +323,12 @@ async def test_non_unicode_query_string(self): self.assertEqual(response_body["body"], b"") async def test_request_lifecycle_signals_dispatched_with_thread_sensitive(self): - class SignalHandler: - """Track threads handler is dispatched on.""" - - threads = [] - - def __call__(self, **kwargs): - self.threads.append(threading.current_thread()) - + # Track request_started and request_finished signals. signal_handler = SignalHandler() request_started.connect(signal_handler) + self.addCleanup(request_started.disconnect, signal_handler) request_finished.connect(signal_handler) + self.addCleanup(request_finished.disconnect, signal_handler) # Perform a basic request. application = get_asgi_application() @@ -339,10 +345,9 @@ def __call__(self, **kwargs): await communicator.wait() # AsyncToSync should have executed the signals in the same thread. - request_started_thread, request_finished_thread = signal_handler.threads - self.assertEqual(request_started_thread, request_finished_thread) - request_started.disconnect(signal_handler) - request_finished.disconnect(signal_handler) + self.assertEqual(len(signal_handler.calls), 2) + request_started_call, request_finished_call = signal_handler.calls + self.assertEqual(request_started_call["thread"], request_finished_call["thread"]) async def test_concurrent_async_uses_multiple_thread_pools(self): sync_waiter.active_threads.clear() From f1fbd061ac34f0afdaac4a5c7db099c39b43cb4a Mon Sep 17 00:00:00 2001 From: James Thorniley Date: Thu, 4 Jan 2024 13:14:30 +0000 Subject: [PATCH 57/67] [5.0.x] Fixed #35059 -- Ensured that ASGIHandler always sends the request_finished signal. Prior to this work, when async tasks that process the request are cancelled due to receiving an early "http.disconnect" ASGI message, the request_finished signal was not being sent, potentially leading to resource leaks (such as database connections). This branch ensures that the request_finished signal is sent even in the case of early termination of the response. Regression in 64cea1e48f285ea2162c669208d95188b32bbc82. Co-authored-by: Natalia <124304+nessita@users.noreply.github.com> Co-authored-by: Carlton Gibson Backport of 11393ab1316f973c5fbb534305750740d909b4e4 from main --- django/core/handlers/asgi.py | 18 ++++- docs/releases/5.0.2.txt | 4 ++ tests/asgi/tests.py | 134 ++++++++++++++++++++++++++++++++++- 3 files changed, 153 insertions(+), 3 deletions(-) diff --git a/django/core/handlers/asgi.py b/django/core/handlers/asgi.py index 7b0086fb765..3af080599ab 100644 --- a/django/core/handlers/asgi.py +++ b/django/core/handlers/asgi.py @@ -186,11 +186,18 @@ async def handle(self, scope, receive, send): if request is None: body_file.close() await self.send_response(error_response, send) + await sync_to_async(error_response.close)() return async def process_request(request, send): response = await self.run_get_response(request) - await self.send_response(response, send) + try: + await self.send_response(response, send) + except asyncio.CancelledError: + # Client disconnected during send_response (ignore exception). + pass + + return response # Try to catch a disconnect while getting response. tasks = [ @@ -221,6 +228,14 @@ async def process_request(request, send): except asyncio.CancelledError: # Task re-raised the CancelledError as expected. pass + + try: + response = tasks[1].result() + except asyncio.CancelledError: + await signals.request_finished.asend(sender=self.__class__) + else: + await sync_to_async(response.close)() + body_file.close() async def listen_for_disconnect(self, receive): @@ -346,7 +361,6 @@ async def send_response(self, response, send): "more_body": not last, } ) - await sync_to_async(response.close, thread_sensitive=True)() @classmethod def chunk_bytes(cls, data): diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index 83f1af7b4f0..64ffcb88bda 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -28,3 +28,7 @@ Bugfixes * Fixed a regression in Django 5.0 that caused a crash of the ``dumpdata`` management command when a base queryset used ``prefetch_related()`` (:ticket:`35159`). + +* Fixed a regression in Django 5.0 that caused the ``request_finished`` signal to + sometimes not be fired when running Django through an ASGI server, resulting + in potential resource leaks (:ticket:`35059`). diff --git a/tests/asgi/tests.py b/tests/asgi/tests.py index 50d15d2306c..bbb274d9ed7 100644 --- a/tests/asgi/tests.py +++ b/tests/asgi/tests.py @@ -1,12 +1,15 @@ import asyncio import sys import threading +import time from pathlib import Path +from asgiref.sync import sync_to_async from asgiref.testing import ApplicationCommunicator from django.contrib.staticfiles.handlers import ASGIStaticFilesHandler from django.core.asgi import get_asgi_application +from django.core.exceptions import RequestDataTooBig from django.core.handlers.asgi import ASGIHandler, ASGIRequest from django.core.signals import request_finished, request_started from django.db import close_old_connections @@ -20,6 +23,7 @@ ) from django.urls import path from django.utils.http import http_date +from django.views.decorators.csrf import csrf_exempt from .urls import sync_waiter, test_filename @@ -207,6 +211,96 @@ async def test_post_body(self): self.assertEqual(response_body["type"], "http.response.body") self.assertEqual(response_body["body"], b"Echo!") + async def test_create_request_error(self): + # Track request_finished signal. + signal_handler = SignalHandler() + request_finished.connect(signal_handler) + self.addCleanup(request_finished.disconnect, signal_handler) + + # Request class that always fails creation with RequestDataTooBig. + class TestASGIRequest(ASGIRequest): + + def __init__(self, scope, body_file): + super().__init__(scope, body_file) + raise RequestDataTooBig() + + # Handler to use the custom request class. + class TestASGIHandler(ASGIHandler): + request_class = TestASGIRequest + + application = TestASGIHandler() + scope = self.async_request_factory._base_scope(path="/not-important/") + communicator = ApplicationCommunicator(application, scope) + + # Initiate request. + await communicator.send_input({"type": "http.request"}) + # Give response.close() time to finish. + await communicator.wait() + + self.assertEqual(len(signal_handler.calls), 1) + self.assertNotEqual( + signal_handler.calls[0]["thread"], threading.current_thread() + ) + + async def test_cancel_post_request_with_sync_processing(self): + """ + The request.body object should be available and readable in view + code, even if the ASGIHandler cancels processing part way through. + """ + loop = asyncio.get_event_loop() + # Events to monitor the view processing from the parent test code. + view_started_event = asyncio.Event() + view_finished_event = asyncio.Event() + # Record received request body or exceptions raised in the test view + outcome = [] + + # This view will run in a new thread because it is wrapped in + # sync_to_async. The view consumes the POST body data after a short + # delay. The test will cancel the request using http.disconnect during + # the delay, but because this is a sync view the code runs to + # completion. There should be no exceptions raised inside the view + # code. + @csrf_exempt + @sync_to_async + def post_view(request): + try: + loop.call_soon_threadsafe(view_started_event.set) + time.sleep(0.1) + # Do something to read request.body after pause + outcome.append({"request_body": request.body}) + return HttpResponse("ok") + except Exception as e: + outcome.append({"exception": e}) + finally: + loop.call_soon_threadsafe(view_finished_event.set) + + # Request class to use the view. + class TestASGIRequest(ASGIRequest): + urlconf = (path("post/", post_view),) + + # Handler to use request class. + class TestASGIHandler(ASGIHandler): + request_class = TestASGIRequest + + application = TestASGIHandler() + scope = self.async_request_factory._base_scope( + method="POST", + path="/post/", + ) + communicator = ApplicationCommunicator(application, scope) + + await communicator.send_input({"type": "http.request", "body": b"Body data!"}) + + # Wait until the view code has started, then send http.disconnect. + await view_started_event.wait() + await communicator.send_input({"type": "http.disconnect"}) + # Wait until view code has finished. + await view_finished_event.wait() + with self.assertRaises(asyncio.TimeoutError): + await communicator.receive_output() + + self.assertEqual(outcome, [{"request_body": b"Body data!"}]) + async def test_untouched_request_body_gets_closed(self): application = get_asgi_application() scope = self.async_request_factory._base_scope(method="POST", path="/post/") @@ -347,7 +441,9 @@ async def test_request_lifecycle_signals_dispatched_with_thread_sensitive(self): # AsyncToSync should have executed the signals in the same thread. self.assertEqual(len(signal_handler.calls), 2) request_started_call, request_finished_call = signal_handler.calls - self.assertEqual(request_started_call["thread"], request_finished_call["thread"]) + self.assertEqual( + request_started_call["thread"], request_finished_call["thread"] + ) async def test_concurrent_async_uses_multiple_thread_pools(self): sync_waiter.active_threads.clear() @@ -383,6 +479,10 @@ async def test_concurrent_async_uses_multiple_thread_pools(self): async def test_asyncio_cancel_error(self): # Flag to check if the view was cancelled. view_did_cancel = False + # Track request_finished signal. + signal_handler = SignalHandler() + request_finished.connect(signal_handler) + self.addCleanup(request_finished.disconnect, signal_handler) # A view that will listen for the cancelled error. async def view(request): @@ -417,6 +517,13 @@ class TestASGIHandler(ASGIHandler): # Give response.close() time to finish. await communicator.wait() self.assertIs(view_did_cancel, False) + # Exactly one call to request_finished handler. + self.assertEqual(len(signal_handler.calls), 1) + handler_call = signal_handler.calls.pop() + # It was NOT on the async thread. + self.assertNotEqual(handler_call["thread"], threading.current_thread()) + # The signal sender is the handler class. + self.assertEqual(handler_call["kwargs"], {"sender": TestASGIHandler}) # Request cycle with a disconnect before the view can respond. application = TestASGIHandler() @@ -432,11 +539,22 @@ class TestASGIHandler(ASGIHandler): await communicator.receive_output() await communicator.wait() self.assertIs(view_did_cancel, True) + # Exactly one call to request_finished handler. + self.assertEqual(len(signal_handler.calls), 1) + handler_call = signal_handler.calls.pop() + # It was NOT on the async thread. + self.assertNotEqual(handler_call["thread"], threading.current_thread()) + # The signal sender is the handler class. + self.assertEqual(handler_call["kwargs"], {"sender": TestASGIHandler}) async def test_asyncio_streaming_cancel_error(self): # Similar to test_asyncio_cancel_error(), but during a streaming # response. view_did_cancel = False + # Track request_finished signals. + signal_handler = SignalHandler() + request_finished.connect(signal_handler) + self.addCleanup(request_finished.disconnect, signal_handler) async def streaming_response(): nonlocal view_did_cancel @@ -471,6 +589,13 @@ class TestASGIHandler(ASGIHandler): self.assertEqual(response_body["body"], b"Hello World!") await communicator.wait() self.assertIs(view_did_cancel, False) + # Exactly one call to request_finished handler. + self.assertEqual(len(signal_handler.calls), 1) + handler_call = signal_handler.calls.pop() + # It was NOT on the async thread. + self.assertNotEqual(handler_call["thread"], threading.current_thread()) + # The signal sender is the handler class. + self.assertEqual(handler_call["kwargs"], {"sender": TestASGIHandler}) # Request cycle with a disconnect. application = TestASGIHandler() @@ -489,6 +614,13 @@ class TestASGIHandler(ASGIHandler): await communicator.receive_output() await communicator.wait() self.assertIs(view_did_cancel, True) + # Exactly one call to request_finished handler. + self.assertEqual(len(signal_handler.calls), 1) + handler_call = signal_handler.calls.pop() + # It was NOT on the async thread. + self.assertNotEqual(handler_call["thread"], threading.current_thread()) + # The signal sender is the handler class. + self.assertEqual(handler_call["kwargs"], {"sender": TestASGIHandler}) async def test_streaming(self): scope = self.async_request_factory._base_scope( From 06b05c748ff4079411b7e570311de879671399df Mon Sep 17 00:00:00 2001 From: David Sanders Date: Tue, 31 Oct 2023 22:37:40 +1100 Subject: [PATCH 58/67] [5.0.x] Refs #34936 -- Added test for altering DecimalField with db_default to non-nullable. Backport of 1944f490f91e44e1378d53420b64a78163aea815 from main --- tests/migrations/test_operations.py | 38 +++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index 18121bd4b65..462170bd4b7 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -1,4 +1,5 @@ import math +from decimal import Decimal from django.core.exceptions import FieldDoesNotExist from django.db import IntegrityError, connection, migrations, models, transaction @@ -2219,6 +2220,43 @@ def test_alter_field_change_nullable_to_database_default_not_null(self): pony = project_state.apps.get_model(app_label, "pony").objects.create(weight=1) self.assertIsNone(pony.green) + def test_alter_field_change_nullable_to_decimal_database_default_not_null(self): + app_label = "test_alflcntdddn" + project_state = self.set_up_test_model(app_label) + operation_1 = migrations.AddField( + "Pony", + "height", + models.DecimalField(null=True, max_digits=5, decimal_places=2), + ) + operation_2 = migrations.AlterField( + "Pony", + "height", + models.DecimalField( + max_digits=5, decimal_places=2, db_default=Decimal("12.22") + ), + ) + table_name = f"{app_label}_pony" + self.assertColumnNotExists(table_name, "height") + # Add field. + new_state = project_state.clone() + operation_1.state_forwards(app_label, new_state) + with connection.schema_editor() as editor: + operation_1.database_forwards(app_label, editor, project_state, new_state) + self.assertColumnExists(table_name, "height") + old_pony = new_state.apps.get_model(app_label, "pony").objects.create(weight=1) + self.assertIsNone(old_pony.height) + # Alter field. + project_state, new_state = new_state, new_state.clone() + operation_2.state_forwards(app_label, new_state) + with connection.schema_editor() as editor: + operation_2.database_forwards(app_label, editor, project_state, new_state) + old_pony.refresh_from_db() + self.assertEqual(old_pony.height, Decimal("12.22")) + pony = new_state.apps.get_model(app_label, "pony").objects.create(weight=2) + if not connection.features.can_return_columns_from_insert: + pony.refresh_from_db() + self.assertEqual(pony.height, Decimal("12.22")) + @skipIfDBFeature("interprets_empty_strings_as_nulls") def test_alter_field_change_blank_nullable_database_default_to_not_null(self): app_label = "test_alflcbnddnn" From a8f9c29d4bf1387bf1ede03a173dd7bfed3e2ce0 Mon Sep 17 00:00:00 2001 From: Priya Date: Thu, 1 Feb 2024 13:50:11 +0530 Subject: [PATCH 59/67] [5.0.x] Removed mention of designers in DTL design philosophy. Signed-off-by: Priya Pahwa Backport of 6f2c7cf6b41f9346feff0098319c302c15cef9a3 from main --- docs/misc/design-philosophies.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/misc/design-philosophies.txt b/docs/misc/design-philosophies.txt index 207685d5569..95ba3d86cd3 100644 --- a/docs/misc/design-philosophies.txt +++ b/docs/misc/design-philosophies.txt @@ -254,10 +254,6 @@ enough programming-esque functionality, such as branching and looping, that is essential for making presentation-related decisions. The :ref:`Django Template Language (DTL) ` aims to avoid advanced logic. -The Django template system recognizes that templates are most often written by -*designers*, not *programmers*, and therefore should not assume Python -knowledge. - Safety and security ------------------- From 58d5e5779c6b079f1a36e537a3fc2ebc446a721a Mon Sep 17 00:00:00 2001 From: Ebram Shehata Date: Thu, 1 Feb 2024 10:25:09 +0200 Subject: [PATCH 60/67] [5.0.x] Fixed typo in docs/topics/db/managers.txt. Backport of 2152246c0a4408df7716c84b20bd0fa79a31179b from main --- docs/topics/db/managers.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/topics/db/managers.txt b/docs/topics/db/managers.txt index 61de153898b..3a7a635e490 100644 --- a/docs/topics/db/managers.txt +++ b/docs/topics/db/managers.txt @@ -380,8 +380,8 @@ this base class:: class Meta: abstract = True -If you use this directly in a subclass, ``objects`` will be the default -manager if you declare no managers in the base class:: +If you use this directly in a child class, ``objects`` will be the default +manager if you declare no managers in the child class:: class ChildA(AbstractBase): # ... From 741f080ab595fa34ad0d682a096026abade0dcab Mon Sep 17 00:00:00 2001 From: Petar Netev Date: Tue, 30 Jan 2024 10:10:59 +0200 Subject: [PATCH 61/67] [5.0.x] Fixed #35147 -- Added backward incompatibility note about filtering against overflowing integers. Backport of 0630ca5725ba5b17c61cd1f6a05dce2660c4724e from main --- docs/releases/5.0.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/releases/5.0.txt b/docs/releases/5.0.txt index 6b18bace4f4..a10c9d280a9 100644 --- a/docs/releases/5.0.txt +++ b/docs/releases/5.0.txt @@ -588,6 +588,11 @@ Miscellaneous * The minimum supported version of ``docutils`` is increased to 0.19. +* Filtering querysets against overflowing integer values now always returns an + empty queryset. As a consequence, you may need to use ``ExpressionWrapper()`` + to :ref:`explicitly wrap ` arithmetic against + integer fields in such cases. + .. _deprecated-features-5.0: Features deprecated in 5.0 From 3e7a30fb3a5ea38d06bbedd53e2130bf192425c7 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Sat, 3 Feb 2024 10:54:51 -0500 Subject: [PATCH 62/67] [5.0.x] Fixed #35162 -- Fixed crash when adding fields with db_default on MySQL. MySQL doesn't allow literal DEFAULT values to be used for BLOB, TEXT, GEOMETRY or JSON columns and requires expression to be used instead. Regression in 7414704e88d73dafbcfbb85f9bc54cb6111439d3. Backport of dfc77637ea5c1aa81caa72b1cf900e6931d61b54 from main --- django/db/backends/base/schema.py | 6 +++++- docs/releases/5.0.2.txt | 4 ++++ tests/schema/tests.py | 13 +++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index ebd3726e657..ff0f2bba758 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -412,7 +412,11 @@ def db_default_sql(self, field): """Return the sql and params for the field's database default.""" from django.db.models.expressions import Value - sql = "%s" if isinstance(field.db_default, Value) else "(%s)" + sql = ( + self._column_default_sql(field) + if isinstance(field.db_default, Value) + else "(%s)" + ) query = Query(model=field.model) compiler = query.get_compiler(connection=self.connection) default_sql, params = compiler.compile(field.db_default) diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index 64ffcb88bda..a385fbd13ef 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -32,3 +32,7 @@ Bugfixes * Fixed a regression in Django 5.0 that caused the ``request_finished`` signal to sometimes not be fired when running Django through an ASGI server, resulting in potential resource leaks (:ticket:`35059`). + +* Fixed a bug in Django 5.0 that caused a migration crash on MySQL when adding + a ``BinaryField``, ``TextField``, ``JSONField``, or ``GeometryField`` with a + ``db_default`` (:ticket:`35162`). diff --git a/tests/schema/tests.py b/tests/schema/tests.py index a16c4a6bfe0..eeaa46af064 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -2306,6 +2306,19 @@ class Meta: columns = self.column_classes(Author) self.assertEqual(columns["birth_year"][1].default, "1988") + @isolate_apps("schema") + def test_add_text_field_with_db_default(self): + class Author(Model): + description = TextField(db_default="(missing)") + + class Meta: + app_label = "schema" + + with connection.schema_editor() as editor: + editor.create_model(Author) + columns = self.column_classes(Author) + self.assertIn("(missing)", columns["description"][1].default) + @skipUnlessDBFeature( "supports_column_check_constraints", "can_introspect_check_constraints" ) From 914eee1a9bee7ae48e6b23ef905ec00bcc241791 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Sat, 3 Feb 2024 01:10:41 -0500 Subject: [PATCH 63/67] [5.0.x] Refs #35149 -- Made equivalent db_default alterations noops. This allows for an easier transition of preserving the literal nature of non-compilable db_default. Backport of fe1cb62f5c3f87fafc4a6b52fee2ccc6c80c41e2 from main --- django/db/backends/base/schema.py | 8 ++++++++ tests/schema/tests.py | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index ff0f2bba758..a319b5ecd56 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -1646,6 +1646,14 @@ def _field_should_be_altered(self, old_field, new_field, ignore=None): ): old_kwargs.pop("to", None) new_kwargs.pop("to", None) + # db_default can take many form but result in the same SQL. + if ( + old_kwargs.get("db_default") + and new_kwargs.get("db_default") + and self.db_default_sql(old_field) == self.db_default_sql(new_field) + ): + old_kwargs.pop("db_default") + new_kwargs.pop("db_default") return self.quote_name(old_field.column) != self.quote_name( new_field.column ) or (old_path, old_args, old_kwargs) != (new_path, new_args, new_kwargs) diff --git a/tests/schema/tests.py b/tests/schema/tests.py index eeaa46af064..b240f26a0b4 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -2319,6 +2319,23 @@ class Meta: columns = self.column_classes(Author) self.assertIn("(missing)", columns["description"][1].default) + @isolate_apps("schema") + def test_db_default_equivalent_sql_noop(self): + class Author(Model): + name = TextField(db_default=Value("foo")) + + class Meta: + app_label = "schema" + + with connection.schema_editor() as editor: + editor.create_model(Author) + + new_field = TextField(db_default="foo") + new_field.set_attributes_from_name("name") + new_field.model = Author + with connection.schema_editor() as editor, self.assertNumQueries(0): + editor.alter_field(Author, Author._meta.get_field("name"), new_field) + @skipUnlessDBFeature( "supports_column_check_constraints", "can_introspect_check_constraints" ) From 761946f8e1b6d725f83fa4f3b04ca9750f486009 Mon Sep 17 00:00:00 2001 From: Simon Charette Date: Sun, 28 Jan 2024 12:02:33 -0500 Subject: [PATCH 64/67] [5.0.x] Fixed #35149 -- Fixed crashes of db_default with unresolvable output field. Field.db_default accepts either literal Python values or compilables (as_sql) and wrap the former ones in Value internally. While 1e38f11 added support for automatic resolving of output fields for types such as str, int, float, and other unambigous ones it's cannot do so for all types such as dict or even contrib.postgres and contrib.gis primitives. When a literal, non-compilable, value is provided it likely make the most sense to bind its output field to the field its attached to avoid forcing the user to provide an explicit `Value(output_field)`. Thanks David Sanders for the report. Backport of e67d7d70fa10c06aca36b9057f82054eda45269d from main --- django/db/backends/base/schema.py | 7 +++---- django/db/models/fields/__init__.py | 21 +++++++++++++-------- docs/releases/5.0.2.txt | 5 +++++ tests/migrations/test_autodetector.py | 4 ++-- tests/migrations/test_operations.py | 12 ++++++------ tests/schema/tests.py | 21 +++++++++++++++++++++ 6 files changed, 50 insertions(+), 20 deletions(-) diff --git a/django/db/backends/base/schema.py b/django/db/backends/base/schema.py index a319b5ecd56..d2c8c659797 100644 --- a/django/db/backends/base/schema.py +++ b/django/db/backends/base/schema.py @@ -412,14 +412,13 @@ def db_default_sql(self, field): """Return the sql and params for the field's database default.""" from django.db.models.expressions import Value + db_default = field._db_default_expression sql = ( - self._column_default_sql(field) - if isinstance(field.db_default, Value) - else "(%s)" + self._column_default_sql(field) if isinstance(db_default, Value) else "(%s)" ) query = Query(model=field.model) compiler = query.get_compiler(connection=self.connection) - default_sql, params = compiler.compile(field.db_default) + default_sql, params = compiler.compile(db_default) if self.connection.features.requires_literal_defaults: # Some databases doesn't support parameterized defaults (Oracle, # SQLite). If this is the case, the individual schema backend diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index ce3bebb5917..26cb1bc485e 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -218,12 +218,6 @@ def __init__( self.remote_field = rel self.is_relation = self.remote_field is not None self.default = default - if db_default is not NOT_PROVIDED and not hasattr( - db_default, "resolve_expression" - ): - from django.db.models.expressions import Value - - db_default = Value(db_default) self.db_default = db_default self.editable = editable self.serialize = serialize @@ -407,7 +401,7 @@ def _check_db_default(self, databases=None, **kwargs): continue connection = connections[db] - if not getattr(self.db_default, "allowed_default", False) and ( + if not getattr(self._db_default_expression, "allowed_default", False) and ( connection.features.supports_expression_defaults ): msg = f"{self.db_default} cannot be used in db_default." @@ -993,7 +987,7 @@ def pre_save(self, model_instance, add): from django.db.models.expressions import DatabaseDefault if isinstance(value, DatabaseDefault): - return self.db_default + return self._db_default_expression return value def get_prep_value(self, value): @@ -1046,6 +1040,17 @@ def _get_default(self): return return_None return str # return empty string + @cached_property + def _db_default_expression(self): + db_default = self.db_default + if db_default is not NOT_PROVIDED and not hasattr( + db_default, "resolve_expression" + ): + from django.db.models.expressions import Value + + db_default = Value(db_default, self) + return db_default + def get_choices( self, include_blank=True, diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index a385fbd13ef..6312dee3127 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -36,3 +36,8 @@ Bugfixes * Fixed a bug in Django 5.0 that caused a migration crash on MySQL when adding a ``BinaryField``, ``TextField``, ``JSONField``, or ``GeometryField`` with a ``db_default`` (:ticket:`35162`). + +* Fixed a bug in Django 5.0 that caused a migration crash on models with a + literal ``db_default`` of a complex type such as ``dict`` instance of a + ``JSONField``. Running ``makemigrations`` might generate no-op ``AlterField`` + operations for fields using ``db_default`` (:ticket:`35149`). diff --git a/tests/migrations/test_autodetector.py b/tests/migrations/test_autodetector.py index 85674e552ad..d0a76e10801 100644 --- a/tests/migrations/test_autodetector.py +++ b/tests/migrations/test_autodetector.py @@ -1310,7 +1310,7 @@ def test_add_not_null_field_with_db_default(self, mocked_ask_method): changes, "testapp", 0, 0, name="name", preserve_default=True ) self.assertOperationFieldAttributes( - changes, "testapp", 0, 0, db_default=models.Value("Ada Lovelace") + changes, "testapp", 0, 0, db_default="Ada Lovelace" ) @mock.patch( @@ -1516,7 +1516,7 @@ def test_alter_field_to_not_null_with_db_default(self, mocked_ask_method): changes, "testapp", 0, 0, name="name", preserve_default=True ) self.assertOperationFieldAttributes( - changes, "testapp", 0, 0, db_default=models.Value("Ada Lovelace") + changes, "testapp", 0, 0, db_default="Ada Lovelace" ) @mock.patch( diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index 462170bd4b7..9fb8f0aa35a 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -1574,7 +1574,7 @@ def test_add_field_database_default(self): self.assertEqual(len(new_state.models[app_label, "pony"].fields), 6) field = new_state.models[app_label, "pony"].fields["height"] self.assertEqual(field.default, models.NOT_PROVIDED) - self.assertEqual(field.db_default, Value(4)) + self.assertEqual(field.db_default, 4) project_state.apps.get_model(app_label, "pony").objects.create(weight=4) self.assertColumnNotExists(table_name, "height") # Add field. @@ -1625,7 +1625,7 @@ def test_add_field_database_default_special_char_escaping(self): self.assertEqual(len(new_state.models[app_label, "pony"].fields), 6) field = new_state.models[app_label, "pony"].fields["special_char"] self.assertEqual(field.default, models.NOT_PROVIDED) - self.assertEqual(field.db_default, Value(db_default)) + self.assertEqual(field.db_default, db_default) self.assertColumnNotExists(table_name, "special_char") with connection.schema_editor() as editor: operation.database_forwards( @@ -1693,7 +1693,7 @@ def test_add_field_both_defaults(self): self.assertEqual(len(new_state.models[app_label, "pony"].fields), 6) field = new_state.models[app_label, "pony"].fields["height"] self.assertEqual(field.default, 3) - self.assertEqual(field.db_default, Value(4)) + self.assertEqual(field.db_default, 4) pre_pony_pk = ( project_state.apps.get_model(app_label, "pony").objects.create(weight=4).pk ) @@ -2128,7 +2128,7 @@ def test_alter_field_add_database_default(self): old_weight = project_state.models[app_label, "pony"].fields["weight"] self.assertIs(old_weight.db_default, models.NOT_PROVIDED) new_weight = new_state.models[app_label, "pony"].fields["weight"] - self.assertEqual(new_weight.db_default, Value(4.5)) + self.assertEqual(new_weight.db_default, 4.5) with self.assertRaises(IntegrityError), transaction.atomic(): project_state.apps.get_model(app_label, "pony").objects.create() # Alter field. @@ -2170,7 +2170,7 @@ def test_alter_field_change_default_to_database_default(self): self.assertIs(old_pink.db_default, models.NOT_PROVIDED) new_pink = new_state.models[app_label, "pony"].fields["pink"] self.assertIs(new_pink.default, models.NOT_PROVIDED) - self.assertEqual(new_pink.db_default, Value(4)) + self.assertEqual(new_pink.db_default, 4) pony = project_state.apps.get_model(app_label, "pony").objects.create(weight=1) self.assertEqual(pony.pink, 3) # Alter field. @@ -2200,7 +2200,7 @@ def test_alter_field_change_nullable_to_database_default_not_null(self): old_green = project_state.models[app_label, "pony"].fields["green"] self.assertIs(old_green.db_default, models.NOT_PROVIDED) new_green = new_state.models[app_label, "pony"].fields["green"] - self.assertEqual(new_green.db_default, Value(4)) + self.assertEqual(new_green.db_default, 4) old_pony = project_state.apps.get_model(app_label, "pony").objects.create( weight=1 ) diff --git a/tests/schema/tests.py b/tests/schema/tests.py index b240f26a0b4..465245e3e7c 100644 --- a/tests/schema/tests.py +++ b/tests/schema/tests.py @@ -7,6 +7,7 @@ from django.core.exceptions import FieldError from django.core.management.color import no_style +from django.core.serializers.json import DjangoJSONEncoder from django.db import ( DatabaseError, DataError, @@ -2336,6 +2337,26 @@ class Meta: with connection.schema_editor() as editor, self.assertNumQueries(0): editor.alter_field(Author, Author._meta.get_field("name"), new_field) + @isolate_apps("schema") + def test_db_default_output_field_resolving(self): + class Author(Model): + data = JSONField( + encoder=DjangoJSONEncoder, + db_default={ + "epoch": datetime.datetime(1970, 1, 1, tzinfo=datetime.timezone.utc) + }, + ) + + class Meta: + app_label = "schema" + + with connection.schema_editor() as editor: + editor.create_model(Author) + + author = Author.objects.create() + author.refresh_from_db() + self.assertEqual(author.data, {"epoch": "1970-01-01T00:00:00Z"}) + @skipUnlessDBFeature( "supports_column_check_constraints", "can_introspect_check_constraints" ) From 2cfa3fba0c8c5f3cf5daf23fd5333902a34fea86 Mon Sep 17 00:00:00 2001 From: shivaramkumar Date: Mon, 5 Feb 2024 05:36:32 +0100 Subject: [PATCH 65/67] [5.0.x] Changed severity levels to list in security policy docs. Backport of a47de0d6cd440d4515ede48df8335d91d7ac7793 from main --- docs/internals/security.txt | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/internals/security.txt b/docs/internals/security.txt index 373012b707e..55300b01e17 100644 --- a/docs/internals/security.txt +++ b/docs/internals/security.txt @@ -84,24 +84,24 @@ upcoming security release, as well as the severity of the issues. This is to aid organizations that need to ensure they have staff available to handle triaging our announcement and upgrade Django as needed. Severity levels are: -**High**: +* **High** -* Remote code execution -* SQL injection + * Remote code execution + * SQL injection -**Moderate**: +* **Moderate** -* Cross site scripting (XSS) -* Cross site request forgery (CSRF) -* Denial-of-service attacks -* Broken authentication + * Cross site scripting (XSS) + * Cross site request forgery (CSRF) + * Denial-of-service attacks + * Broken authentication -**Low**: +* **Low** -* Sensitive data exposure -* Broken session management -* Unvalidated redirects/forwards -* Issues requiring an uncommon configuration option + * Sensitive data exposure + * Broken session management + * Unvalidated redirects/forwards + * Issues requiring an uncommon configuration option Second, we notify a list of :ref:`people and organizations `, primarily composed of operating-system vendors and From 16a8fe18a3b81250f4fa57e3f93f0599dc4895bc Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Mon, 22 Jan 2024 13:21:13 +0000 Subject: [PATCH 66/67] [5.0.x] Fixed CVE-2024-24680 -- Mitigated potential DoS in intcomma template filter. Thanks Seokchan Yoon for the report. Co-authored-by: Mariusz Felisiak Co-authored-by: Natalia <124304+nessita@users.noreply.github.com> Co-authored-by: Shai Berger --- .../contrib/humanize/templatetags/humanize.py | 13 ++-- docs/releases/3.2.24.txt | 6 +- docs/releases/4.2.10.txt | 6 +- docs/releases/5.0.2.txt | 6 ++ tests/humanize_tests/tests.py | 64 +++++++++++++++++++ 5 files changed, 87 insertions(+), 8 deletions(-) diff --git a/django/contrib/humanize/templatetags/humanize.py b/django/contrib/humanize/templatetags/humanize.py index 23224779c55..2c26f8944a7 100644 --- a/django/contrib/humanize/templatetags/humanize.py +++ b/django/contrib/humanize/templatetags/humanize.py @@ -75,12 +75,13 @@ def intcomma(value, use_l10n=True): return intcomma(value, False) else: return number_format(value, use_l10n=True, force_grouping=True) - orig = str(value) - new = re.sub(r"^(-?\d+)(\d{3})", r"\g<1>,\g<2>", orig) - if orig == new: - return new - else: - return intcomma(new, use_l10n) + result = str(value) + match = re.match(r"-?\d+", result) + if match: + prefix = match[0] + prefix_with_commas = re.sub(r"\d{3}", r"\g<0>,", prefix[::-1])[::-1] + result = prefix_with_commas + result[len(prefix) :] + return result # A tuple of standard large number to their converters diff --git a/docs/releases/3.2.24.txt b/docs/releases/3.2.24.txt index 1ab7024f73c..67be0f65d18 100644 --- a/docs/releases/3.2.24.txt +++ b/docs/releases/3.2.24.txt @@ -6,4 +6,8 @@ Django 3.2.24 release notes Django 3.2.24 fixes a security issue with severity "moderate" in 3.2.23. -... +CVE-2024-24680: Potential denial-of-service in ``intcomma`` template filter +=========================================================================== + +The ``intcomma`` template filter was subject to a potential denial-of-service +attack when used with very long strings. diff --git a/docs/releases/4.2.10.txt b/docs/releases/4.2.10.txt index c039f6840f7..7cdfa698144 100644 --- a/docs/releases/4.2.10.txt +++ b/docs/releases/4.2.10.txt @@ -6,4 +6,8 @@ Django 4.2.10 release notes Django 4.2.10 fixes a security issue with severity "moderate" in 4.2.9. -... +CVE-2024-24680: Potential denial-of-service in ``intcomma`` template filter +=========================================================================== + +The ``intcomma`` template filter was subject to a potential denial-of-service +attack when used with very long strings. diff --git a/docs/releases/5.0.2.txt b/docs/releases/5.0.2.txt index 6312dee3127..1da6dc02d93 100644 --- a/docs/releases/5.0.2.txt +++ b/docs/releases/5.0.2.txt @@ -7,6 +7,12 @@ Django 5.0.2 release notes Django 5.0.2 fixes a security issue with severity "moderate" and several bugs in 5.0.1. Also, the latest string translations from Transifex are incorporated. +CVE-2024-24680: Potential denial-of-service in ``intcomma`` template filter +=========================================================================== + +The ``intcomma`` template filter was subject to a potential denial-of-service +attack when used with very long strings. + Bugfixes ======== diff --git a/tests/humanize_tests/tests.py b/tests/humanize_tests/tests.py index cf29f582329..a78bbadafd8 100644 --- a/tests/humanize_tests/tests.py +++ b/tests/humanize_tests/tests.py @@ -116,39 +116,71 @@ def test_i18n_html_ordinal(self): def test_intcomma(self): test_list = ( 100, + -100, 1000, + -1000, 10123, + -10123, 10311, + -10311, 1000000, + -1000000, 1234567.25, + -1234567.25, "100", + "-100", "1000", + "-1000", "10123", + "-10123", "10311", + "-10311", "1000000", + "-1000000", "1234567.1234567", + "-1234567.1234567", Decimal("1234567.1234567"), + Decimal("-1234567.1234567"), None, "1234567", + "-1234567", "1234567.12", + "-1234567.12", + "the quick brown fox jumped over the lazy dog", ) result_list = ( "100", + "-100", "1,000", + "-1,000", "10,123", + "-10,123", "10,311", + "-10,311", "1,000,000", + "-1,000,000", "1,234,567.25", + "-1,234,567.25", "100", + "-100", "1,000", + "-1,000", "10,123", + "-10,123", "10,311", + "-10,311", "1,000,000", + "-1,000,000", "1,234,567.1234567", + "-1,234,567.1234567", "1,234,567.1234567", + "-1,234,567.1234567", None, "1,234,567", + "-1,234,567", "1,234,567.12", + "-1,234,567.12", + "the quick brown fox jumped over the lazy dog", ) with translation.override("en"): self.humanize_tester(test_list, result_list, "intcomma") @@ -156,39 +188,71 @@ def test_intcomma(self): def test_l10n_intcomma(self): test_list = ( 100, + -100, 1000, + -1000, 10123, + -10123, 10311, + -10311, 1000000, + -1000000, 1234567.25, + -1234567.25, "100", + "-100", "1000", + "-1000", "10123", + "-10123", "10311", + "-10311", "1000000", + "-1000000", "1234567.1234567", + "-1234567.1234567", Decimal("1234567.1234567"), + -Decimal("1234567.1234567"), None, "1234567", + "-1234567", "1234567.12", + "-1234567.12", + "the quick brown fox jumped over the lazy dog", ) result_list = ( "100", + "-100", "1,000", + "-1,000", "10,123", + "-10,123", "10,311", + "-10,311", "1,000,000", + "-1,000,000", "1,234,567.25", + "-1,234,567.25", "100", + "-100", "1,000", + "-1,000", "10,123", + "-10,123", "10,311", + "-10,311", "1,000,000", + "-1,000,000", "1,234,567.1234567", + "-1,234,567.1234567", "1,234,567.1234567", + "-1,234,567.1234567", None, "1,234,567", + "-1,234,567", "1,234,567.12", + "-1,234,567.12", + "the quick brown fox jumped over the lazy dog", ) with self.settings(USE_THOUSAND_SEPARATOR=False): with translation.override("en"): From 428d06ccef09e70bcef9869c5a9404863b2fc7d8 Mon Sep 17 00:00:00 2001 From: Natalia <124304+nessita@users.noreply.github.com> Date: Tue, 6 Feb 2024 09:22:47 -0300 Subject: [PATCH 67/67] [5.0.x] Bumped version for 5.0.2 release. --- django/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/__init__.py b/django/__init__.py index fe0cae94b9a..9a527fd50d7 100644 --- a/django/__init__.py +++ b/django/__init__.py @@ -1,6 +1,6 @@ from django.utils.version import get_version -VERSION = (5, 0, 2, "alpha", 0) +VERSION = (5, 0, 2, "final", 0) __version__ = get_version(VERSION)