diff --git a/docs/modeltranslation/conf.py b/docs/modeltranslation/conf.py index 8433ac6..3647345 100644 --- a/docs/modeltranslation/conf.py +++ b/docs/modeltranslation/conf.py @@ -1,3 +1,4 @@ +# fmt: off # django-modeltranslation documentation build configuration file, created by # sphinx-quickstart on Wed Oct 17 10:26:58 2012. # @@ -59,8 +60,8 @@ source_suffix = '.rst' master_doc = 'index' # General information about the project. -project = u'django-modeltranslation' -copyright = u'2009-2019, Peter Eschler, Dirk Eschler, Jacek Tomaszewski' +project = 'django-modeltranslation' +copyright = '2009-2019, Peter Eschler, Dirk Eschler, Jacek Tomaszewski' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -199,8 +200,8 @@ latex_elements = { # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'django-modeltranslation.tex', - u'django-modeltranslation Documentation', - u'Dirk Eschler', 'manual'), + 'django-modeltranslation Documentation', + 'Dirk Eschler', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of @@ -230,8 +231,8 @@ latex_documents = [ # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'django-modeltranslation', - u'django-modeltranslation Documentation', - [u'Dirk Eschler'], 1) + 'django-modeltranslation Documentation', + ['Dirk Eschler'], 1) ] # If true, show URL addresses after external links. @@ -245,7 +246,7 @@ man_pages = [ # dir menu entry, description, category) texinfo_documents = [ ('index', 'django-modeltranslation', - u'django-modeltranslation Documentation', u'Dirk Eschler', + 'django-modeltranslation Documentation', 'Dirk Eschler', 'django-modeltranslation', 'One line description of project.', 'Miscellaneous'), ] @@ -263,10 +264,10 @@ texinfo_documents = [ # -- Options for Epub output -------------------------------------------------- # Bibliographic Dublin Core info. -epub_title = u'django-modeltranslation' -epub_author = u'Dirk Eschler' -epub_publisher = u'Dirk Eschler' -epub_copyright = u'2009-2019, Peter Eschler, Dirk Eschler, Jacek Tomaszewski' +epub_title = 'django-modeltranslation' +epub_author = 'Dirk Eschler' +epub_publisher = 'Dirk Eschler' +epub_copyright = '2009-2019, Peter Eschler, Dirk Eschler, Jacek Tomaszewski' # The language of the text. It defaults to the language option # or en if the language is not set. diff --git a/get-django-version.py b/get-django-version.py index a4768f5..49df764 100755 --- a/get-django-version.py +++ b/get-django-version.py @@ -2,8 +2,8 @@ import sys version = sys.argv[1] -if version.startswith('http'): +if version.startswith("http"): print(version) else: - next_version = version[:-1] + '%d' % (int(version[-1]) + 1) - print('Django>=%s,<%s' % (version, next_version)) + next_version = version[:-1] + "%d" % (int(version[-1]) + 1) + print("Django>=%s,<%s" % (version, next_version)) diff --git a/modeltranslation/__init__.py b/modeltranslation/__init__.py index 3c9a8c3..23c0319 100644 --- a/modeltranslation/__init__.py +++ b/modeltranslation/__init__.py @@ -2,6 +2,6 @@ try: from django import VERSION as _django_version if _django_version < (3, 2): - default_app_config = 'modeltranslation.apps.ModeltranslationConfig' + default_app_config = "modeltranslation.apps.ModeltranslationConfig" except ImportError: pass diff --git a/modeltranslation/admin.py b/modeltranslation/admin.py index 2792123..3f945ab 100644 --- a/modeltranslation/admin.py +++ b/modeltranslation/admin.py @@ -29,18 +29,18 @@ class TranslationBaseModelAdmin(BaseModelAdmin): def _get_declared_fieldsets(self, request, obj=None): # Take custom modelform fields option into account - if not self.fields and hasattr(self.form, '_meta') and self.form._meta.fields: + if not self.fields and hasattr(self.form, "_meta") and self.form._meta.fields: self.fields = self.form._meta.fields # takes into account non-standard add_fieldsets attribute used by UserAdmin fieldsets = ( self.add_fieldsets - if getattr(self, 'add_fieldsets', None) and obj is None + if getattr(self, "add_fieldsets", None) and obj is None else self.fieldsets ) if fieldsets: return self._patch_fieldsets(fieldsets) elif self.fields: - return [(None, {'fields': self.replace_orig_field(self.get_fields(request, obj))})] + return [(None, {"fields": self.replace_orig_field(self.get_fields(request, obj))})] return None def formfield_for_dbfield(self, db_field, request, **kwargs): @@ -53,7 +53,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin): if field.required: field.required = False field.blank = True - self._orig_was_required['%s.%s' % (db_field.model._meta, db_field.name)] = True + self._orig_was_required["%s.%s" % (db_field.model._meta, db_field.name)] = True # For every localized field copy the widget from the original field # and add a css class to identify a modeltranslation widget. @@ -83,24 +83,24 @@ class TranslationBaseModelAdmin(BaseModelAdmin): b for b in form_class.__bases__ if b != NullCharField ) field.__class__ = type( - 'Nullable%s' % form_class.__name__, (NullableField, form_class), {} + "Nullable%s" % form_class.__name__, (NullableField, form_class), {} ) if ( - db_field.empty_value == 'both' or orig_field.name in self.both_empty_values_fields + db_field.empty_value == "both" or orig_field.name in self.both_empty_values_fields ) and isinstance(field.widget, (forms.TextInput, forms.Textarea)): field.widget = ClearableWidgetWrapper(field.widget) - css_classes = self._get_widget_from_field(field).attrs.get('class', '').split(' ') - css_classes.append('mt') + css_classes = self._get_widget_from_field(field).attrs.get("class", "").split(" ") + css_classes.append("mt") # Add localized fieldname css class - css_classes.append(build_css_class(db_field.name, 'mt-field')) + css_classes.append(build_css_class(db_field.name, "mt-field")) # Add mt-bidi css class if language is bidirectional if get_language_bidi(db_field.language): - css_classes.append('mt-bidi') + css_classes.append("mt-bidi") if db_field.language == mt_settings.DEFAULT_LANGUAGE: # Add another css class to identify a default modeltranslation widget - css_classes.append('mt-default') + css_classes.append("mt-default") if orig_formfield.required or self._orig_was_required.get( - '%s.%s' % (orig_field.model._meta, orig_field.name) + "%s.%s" % (orig_field.model._meta, orig_field.name) ): # In case the original form field was required, make the # default translation field required instead. @@ -111,7 +111,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin): # Hide clearable widget for required fields if isinstance(field.widget, ClearableWidgetWrapper): field.widget = field.widget.widget - self._get_widget_from_field(field).attrs['class'] = ' '.join(css_classes) + self._get_widget_from_field(field).attrs["class"] = " ".join(css_classes) def _get_widget_from_field(self, field): # retrieve "nested" widget in case of related field @@ -171,8 +171,8 @@ class TranslationBaseModelAdmin(BaseModelAdmin): if fieldsets: fieldsets_new = list(fieldsets) for name, dct in fieldsets: - if 'fields' in dct: - dct['fields'] = self.replace_orig_field(dct['fields']) + if "fields" in dct: + dct["fields"] = self.replace_orig_field(dct["fields"]) fieldsets = fieldsets_new return fieldsets @@ -208,7 +208,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin): else: exclude = list(exclude) exclude.extend(self.get_readonly_fields(request, obj)) - if not exclude and hasattr(self.form, '_meta') and self.form._meta.exclude: + if not exclude and hasattr(self.form, "_meta") and self.form._meta.exclude: # Take the custom ModelForm's Meta.exclude into account only if the # ModelAdmin doesn't define its own. exclude.extend(self.form._meta.exclude) @@ -216,7 +216,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin): # default on modelform_factory exclude = self.replace_orig_field(exclude) or None exclude = self._exclude_original_fields(exclude) - kwargs.update({'exclude': exclude}) + kwargs.update({"exclude": exclude}) return kwargs @@ -234,7 +234,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin): """ base_fields = self.replace_orig_field(form.base_fields.keys()) fields = list(base_fields) + list(self.get_readonly_fields(request, obj)) - return [(None, {'fields': self.replace_orig_field(fields)})] + return [(None, {"fields": self.replace_orig_field(fields)})] def get_translation_field_excludes(self, exclude_languages=None): """ @@ -296,13 +296,14 @@ class TranslationAdmin(TranslationBaseModelAdmin, admin.ModelAdmin): untranslated_fields = [ f.name for f in fields - if ( + if + ( # Exclude the primary key field f is not self.opts.auto_field # Exclude non-editable fields and f.editable # Exclude the translation fields - and not hasattr(f, 'translated_field') + and not hasattr(f, "translated_field") # Honour field arguments. We rely on the fact that the # passed fieldsets argument is already fully filtered # and takes options like exclude into account. @@ -313,8 +314,8 @@ class TranslationAdmin(TranslationBaseModelAdmin, admin.ModelAdmin): fieldsets = ( [ ( - '', - {'fields': untranslated_fields}, + "", + {"fields": untranslated_fields}, ) ] if untranslated_fields @@ -331,13 +332,13 @@ class TranslationAdmin(TranslationBaseModelAdmin, admin.ModelAdmin): label = self.model._meta.get_field(orig_field).verbose_name.capitalize() temp_fieldsets[orig_field] = ( label, - {'fields': trans_fieldnames, 'classes': ('mt-fieldset',)}, + {"fields": trans_fieldnames, "classes": ("mt-fieldset",)}, ) fields_order = unique( f.translated_field.name for f in self.opts.fields - if hasattr(f, 'translated_field') and f.name in flattened_fieldsets + if hasattr(f, "translated_field") and f.name in flattened_fieldsets ) for field_name in fields_order: fieldsets.append(temp_fieldsets.pop(field_name)) @@ -397,13 +398,13 @@ class TabbedDjangoJqueryTranslationAdmin(TranslationAdmin): class Media: js = ( - 'admin/js/jquery.init.js', - 'modeltranslation/js/force_jquery.js', + "admin/js/jquery.init.js", + "modeltranslation/js/force_jquery.js", mt_settings.JQUERY_UI_URL, - 'modeltranslation/js/tabbed_translation_fields.js', + "modeltranslation/js/tabbed_translation_fields.js", ) css = { - 'all': ('modeltranslation/css/tabbed_translation_fields.css',), + "all": ("modeltranslation/css/tabbed_translation_fields.css",), } @@ -417,10 +418,10 @@ class TabbedExternalJqueryTranslationAdmin(TranslationAdmin): js = ( mt_settings.JQUERY_URL, mt_settings.JQUERY_UI_URL, - 'modeltranslation/js/tabbed_translation_fields.js', + "modeltranslation/js/tabbed_translation_fields.js", ) css = { - 'screen': ('modeltranslation/css/tabbed_translation_fields.css',), + "screen": ("modeltranslation/css/tabbed_translation_fields.css",), } diff --git a/modeltranslation/apps.py b/modeltranslation/apps.py index e944123..767ec25 100644 --- a/modeltranslation/apps.py +++ b/modeltranslation/apps.py @@ -2,8 +2,8 @@ from django.apps import AppConfig class ModeltranslationConfig(AppConfig): - name = 'modeltranslation' - verbose_name = 'Modeltranslation' + name = "modeltranslation" + verbose_name = "Modeltranslation" def ready(self): from modeltranslation.models import handle_translation_registrations diff --git a/modeltranslation/fields.py b/modeltranslation/fields.py index b1423f4..6515889 100644 --- a/modeltranslation/fields.py +++ b/modeltranslation/fields.py @@ -70,12 +70,12 @@ def create_translation_field(model, field_name, lang, empty_value): If the class is neither a subclass of fields in ``SUPPORTED_FIELDS``, nor in ``CUSTOM_FIELDS`` an ``ImproperlyConfigured`` exception will be raised. """ - if empty_value not in ('', 'both', None, NONE): - raise ImproperlyConfigured('%s is not a valid empty_value.' % empty_value) + if empty_value not in ("", "both", None, NONE): + raise ImproperlyConfigured("%s is not a valid empty_value." % empty_value) field = model._meta.get_field(field_name) cls_name = field.__class__.__name__ if not (isinstance(field, SUPPORTED_FIELDS) or cls_name in mt_settings.CUSTOM_FIELDS): - raise ImproperlyConfigured('%s is not supported by modeltranslation.' % cls_name) + raise ImproperlyConfigured("%s is not supported by modeltranslation." % cls_name) translation_class = field_factory(field.__class__) return translation_class(translated_field=field, language=lang, empty_value=empty_value) @@ -85,7 +85,7 @@ def field_factory(baseclass): pass # Reflect baseclass name of returned subclass - TranslationFieldSpecific.__name__ = 'Translation%s' % baseclass.__name__ + TranslationFieldSpecific.__name__ = "Translation%s" % baseclass.__name__ return TranslationFieldSpecific @@ -121,7 +121,7 @@ class TranslationField: self.language = language self.empty_value = empty_value if empty_value is NONE: - self.empty_value = None if translated_field.null else '' + self.empty_value = None if translated_field.null else "" # Default behaviour is that all translations are optional if not isinstance(self, fields.BooleanField): @@ -145,7 +145,7 @@ class TranslationField: try: req_fields = required_languages[self.language] except KeyError: - req_fields = required_languages.get('default', ()) + req_fields = required_languages.get("default", ()) if self.name in req_fields: # TODO: We might have to handle the whole thing through the # FieldsAggregationMetaClass, as fields can be inherited. @@ -205,7 +205,7 @@ class TranslationField: ) self.remote_field.field = self - if hasattr(self.remote_field.model._meta, '_related_objects_cache'): + if hasattr(self.remote_field.model._meta, "_related_objects_cache"): del self.remote_field.model._meta._related_objects_cache # ForeignKey support - rewrite related_name @@ -223,7 +223,7 @@ class TranslationField: self.related_query_name = lambda: loc_related_query_name self.rel.related_name = build_localized_fieldname(current, self.language) self.rel.field = self - if hasattr(self.rel.to._meta, '_related_objects_cache'): + if hasattr(self.rel.to._meta, "_related_objects_cache"): del self.rel.to._meta._related_objects_cache elif NEW_RELATED_API and self.remote_field and not self.remote_field.is_hidden(): current = self.remote_field.get_accessor_name() @@ -238,7 +238,7 @@ class TranslationField: self.related_query_name = lambda: loc_related_query_name self.remote_field.related_name = build_localized_fieldname(current, self.language) self.remote_field.field = self - if hasattr(self.remote_field.model._meta, '_related_objects_cache'): + if hasattr(self.remote_field.model._meta, "_related_objects_cache"): del self.remote_field.model._meta._related_objects_cache # Django 1.5 changed definition of __hash__ for fields to be fine with hash requirements. @@ -249,7 +249,7 @@ class TranslationField: def __eq__(self, other): if isinstance(other, fields.Field): return self.creation_counter == other.creation_counter and self.language == getattr( - other, 'language', None + other, "language", None ) return super().__eq__(other) @@ -301,16 +301,16 @@ class TranslationField: from modeltranslation.forms import NullCharField form_class = formfield.__class__ - kwargs['form_class'] = type( - 'Null%s' % form_class.__name__, (NullCharField, form_class), {} + kwargs["form_class"] = type( + "Null%s" % form_class.__name__, (NullCharField, form_class), {} ) formfield = super().formfield(*args, **kwargs) - elif self.empty_value == 'both': + elif self.empty_value == "both": from modeltranslation.forms import NullableField form_class = formfield.__class__ - kwargs['form_class'] = type( - 'Nullable%s' % form_class.__name__, (NullableField, form_class), {} + kwargs["form_class"] = type( + "Nullable%s" % form_class.__name__, (NullableField, form_class), {} ) formfield = super().formfield(*args, **kwargs) if isinstance(formfield.widget, (forms.TextInput, forms.Textarea)): @@ -328,7 +328,7 @@ class TranslationField: # Questionable fields are stored in special variable, which is later handled by clean_fields # method on the model. if check and self.language == get_language() and getattr(instance, self.name) and not data: - if not hasattr(instance, '_mt_form_pending_clear'): + if not hasattr(instance, "_mt_form_pending_clear"): instance._mt_form_pending_clear = {} instance._mt_form_pending_clear[self.name] = data else: @@ -337,9 +337,9 @@ class TranslationField: def deconstruct(self): name, path, args, kwargs = self.translated_field.deconstruct() if self.null is True: - kwargs.update({'null': True}) - if 'db_column' in kwargs: - kwargs['db_column'] = self.db_column + kwargs.update({"null": True}) + if "db_column" in kwargs: + kwargs["db_column"] = self.db_column return self.name, path, args, kwargs def clone(self): @@ -375,7 +375,7 @@ class TranslationFieldDescriptor: instance.__dict__[self.field.name] = value if isinstance(self.field, fields.related.ForeignKey): instance.__dict__[self.field.get_attname()] = None if value is None else value.pk - if getattr(instance, '_mt_init', False) or getattr(instance, '_mt_disable', False): + if getattr(instance, "_mt_init", False) or getattr(instance, "_mt_disable", False): # When assignment takes place in model instance constructor, don't set value. # This is essential for only/defer to work, but I think it's sensible anyway. # Setting the localized field may also be disabled by setting _mt_disable. diff --git a/modeltranslation/forms.py b/modeltranslation/forms.py index 8d2396a..63df5d0 100644 --- a/modeltranslation/forms.py +++ b/modeltranslation/forms.py @@ -42,7 +42,7 @@ class NullableField(forms.Field): if (initial is None and data is not None) or (initial is not None and data is None): return True obj = super() - if hasattr(obj, 'has_changed'): + if hasattr(obj, "has_changed"): return obj.has_changed(initial, data) else: # Django < 1.9 compat return obj._has_changed(initial, data) diff --git a/modeltranslation/management/commands/loaddata.py b/modeltranslation/management/commands/loaddata.py index 395ab2c..a70d45f 100644 --- a/modeltranslation/management/commands/loaddata.py +++ b/modeltranslation/management/commands/loaddata.py @@ -7,12 +7,12 @@ from django.core.management.commands.loaddata import Command as LoadDataCommand from modeltranslation import settings as mt_settings from modeltranslation.utils import auto_populate -ALLOWED = (None, False, 'all', 'default', 'required') -ALLOWED_FOR_PRINT = ', '.join(str(i) for i in (0,) + ALLOWED[1:]) # For pretty-printing +ALLOWED = (None, False, "all", "default", "required") +ALLOWED_FOR_PRINT = ", ".join(str(i) for i in (0,) + ALLOWED[1:]) # For pretty-printing def check_mode(option, opt_str, value, parser, namespace=None): - if value == '0' or value.lower() == 'false': + if value == "0" or value.lower() == "false": value = False if value not in ALLOWED: raise ValueError("%s option can be only one of: %s" % (opt_str, ALLOWED_FOR_PRINT)) @@ -29,19 +29,19 @@ class Command(LoadDataCommand): def add_arguments(self, parser): super().add_arguments(parser) parser.add_argument( - '--populate', + "--populate", action=self.CheckAction, type=str, - dest='populate', - metavar='MODE', + dest="populate", + metavar="MODE", help=( - 'Using this option will cause fixtures to be loaded under auto-population MODE. ' - + 'Allowed values are: %s' % ALLOWED_FOR_PRINT + "Using this option will cause fixtures to be loaded under auto-population MODE. " + + "Allowed values are: %s" % ALLOWED_FOR_PRINT ), ) def handle(self, *fixture_labels, **options): - mode = options.get('populate') + mode = options.get("populate") if mode is not None: with auto_populate(mode): return super().handle(*fixture_labels, **options) diff --git a/modeltranslation/management/commands/sync_translation_fields.py b/modeltranslation/management/commands/sync_translation_fields.py index fe5576c..6678782 100644 --- a/modeltranslation/management/commands/sync_translation_fields.py +++ b/modeltranslation/management/commands/sync_translation_fields.py @@ -21,18 +21,18 @@ from modeltranslation.utils import build_localized_fieldname def ask_for_confirmation(sql_sentences, model_full_name, interactive): print('\nSQL to synchronize "%s" schema:' % model_full_name) for sentence in sql_sentences: - print(' %s' % sentence) + print(" %s" % sentence) while True: - prompt = '\nAre you sure that you want to execute the previous SQL: (y/n) [n]: ' + prompt = "\nAre you sure that you want to execute the previous SQL: (y/n) [n]: " if interactive: answer = input(prompt).strip() else: - answer = 'y' - if answer == '': + answer = "y" + if answer == "": return False - elif answer not in ('y', 'n', 'yes', 'no'): - print('Please answer yes or no') - elif answer == 'y' or answer == 'yes': + elif answer not in ("y", "n", "yes", "no"): + print("Please answer yes or no") + elif answer == "y" or answer == "yes": return True else: return False @@ -47,9 +47,9 @@ def print_missing_langs(missing_langs, field_name, model_name): class Command(BaseCommand): help = ( - 'Detect new translatable fields or new available languages and' - ' sync database structure. Does not remove columns of removed' - ' languages or undeclared fields.' + "Detect new translatable fields or new available languages and" + " sync database structure. Does not remove columns of removed" + " languages or undeclared fields." ) if VERSION < (1, 8): @@ -57,23 +57,25 @@ class Command(BaseCommand): option_list = BaseCommand.option_list + ( make_option( - '--noinput', - action='store_false', - dest='interactive', + "--noinput", + action="store_false", + dest="interactive", default=True, - help='Do NOT prompt the user for input of any kind.', + help="Do NOT prompt the user for input of any kind.", ), ) else: def add_arguments(self, parser): - parser.add_argument( - '--noinput', - action='store_false', - dest='interactive', - default=True, - help='Do NOT prompt the user for input of any kind.', - ), + ( + parser.add_argument( + "--noinput", + action="store_false", + dest="interactive", + default=True, + help="Do NOT prompt the user for input of any kind.", + ), + ) def handle(self, *args, **options): """ @@ -81,14 +83,14 @@ class Command(BaseCommand): """ self.cursor = connection.cursor() self.introspection = connection.introspection - self.interactive = options['interactive'] + self.interactive = options["interactive"] found_missing_fields = False models = translator.get_registered_models(abstract=False) for model in models: db_table = model._meta.db_table model_name = model._meta.model_name - model_full_name = '%s.%s' % (model._meta.app_label, model_name) + model_full_name = "%s.%s" % (model._meta.app_label, model_name) opts = translator.get_options_for_model(model) for field_name, fields in opts.local_fields.items(): # Take `db_column` attribute into account @@ -108,15 +110,15 @@ class Command(BaseCommand): sql_sentences, model_full_name, self.interactive ) if execute_sql: - print('Executing SQL...') + print("Executing SQL...") for sentence in sql_sentences: self.cursor.execute(sentence) - print('Done') + print("Done") else: - print('SQL not executed') + print("SQL not executed") if not found_missing_fields: - print('No new translatable fields detected') + print("No new translatable fields detected") def get_table_fields(self, db_table): """ @@ -148,8 +150,8 @@ class Command(BaseCommand): col_type = f.db_type(connection=connection) field_sql = [style.SQL_FIELD(qn(f.column)), style.SQL_COLTYPE(col_type)] # column creation - stmt = "ALTER TABLE %s ADD COLUMN %s" % (qn(db_table), ' '.join(field_sql)) + stmt = "ALTER TABLE %s ADD COLUMN %s" % (qn(db_table), " ".join(field_sql)) if not f.null: - stmt += " " + style.SQL_KEYWORD('NOT NULL') + stmt += " " + style.SQL_KEYWORD("NOT NULL") sql_output.append(stmt + ";") return sql_output diff --git a/modeltranslation/management/commands/update_translation_fields.py b/modeltranslation/management/commands/update_translation_fields.py index 751ac51..6f3b17e 100644 --- a/modeltranslation/management/commands/update_translation_fields.py +++ b/modeltranslation/management/commands/update_translation_fields.py @@ -10,32 +10,32 @@ COMMASPACE = ", " class Command(BaseCommand): help = ( - 'Updates empty values of translation fields using' - ' values from original fields (in all translated models).' + "Updates empty values of translation fields using" + " values from original fields (in all translated models)." ) def add_arguments(self, parser): parser.add_argument( - 'app_label', - nargs='?', - help='App label of an application to update empty values.', + "app_label", + nargs="?", + help="App label of an application to update empty values.", ) parser.add_argument( - 'model_name', - nargs='?', - help='Model name to update empty values of only this model.', + "model_name", + nargs="?", + help="Model name to update empty values of only this model.", ) parser.add_argument( - '--language', - action='store', + "--language", + action="store", help=( - 'Language translation field the be updated.' - ' Default language field if not provided' + "Language translation field the be updated." + " Default language field if not provided" ), ) def handle(self, *args, **options): - verbosity = options['verbosity'] + verbosity = options["verbosity"] if verbosity > 0: self.stdout.write("Using default language: %s" % DEFAULT_LANGUAGE) @@ -44,30 +44,30 @@ class Command(BaseCommand): models = [m for m in models if not m._meta.proxy and m._meta.managed] # optionally filter by given app_label - app_label = options['app_label'] + app_label = options["app_label"] if app_label: models = [m for m in models if m._meta.app_label == app_label] # optionally filter by given model_name - model_name = options['model_name'] + model_name = options["model_name"] if model_name: model_name = model_name.lower() models = [m for m in models if m._meta.model_name == model_name] # optionally defining the translation field language - lang = options.get('language') or DEFAULT_LANGUAGE + lang = options.get("language") or DEFAULT_LANGUAGE if lang not in AVAILABLE_LANGUAGES: raise CommandError( "Cannot find language '%s'. Options are %s." % (lang, COMMASPACE.join(AVAILABLE_LANGUAGES)) ) else: - lang = lang.replace('-', '_') + lang = lang.replace("-", "_") if verbosity > 0: self.stdout.write( "Working on models: %s" - % ', '.join( + % ", ".join( ["{app_label}.{object_name}".format(**m._meta.__dict__) for m in models] ) ) diff --git a/modeltranslation/manager.py b/modeltranslation/manager.py index d7452e8..9ddf170 100644 --- a/modeltranslation/manager.py +++ b/modeltranslation/manager.py @@ -43,7 +43,7 @@ def get_translatable_fields_for_model(model): def rewrite_lookup_key(model, lookup_key): try: - pieces = lookup_key.split('__', 1) + pieces = lookup_key.split("__", 1) original_key = pieces[0] translatable_fields = get_translatable_fields_for_model(model) @@ -61,7 +61,7 @@ def rewrite_lookup_key(model, lookup_key): if original_key in fields_to_trans_models: transmodel = fields_to_trans_models[original_key] pieces[1] = rewrite_lookup_key(transmodel, pieces[1]) - return '__'.join(pieces) + return "__".join(pieces) except AttributeError: return lookup_key @@ -99,7 +99,7 @@ def append_translated(model, fields): def append_lookup_key(model, lookup_key): "Transform spanned__lookup__key into all possible translation versions, on all levels" - pieces = lookup_key.split('__', 1) + pieces = lookup_key.split("__", 1) fields = append_translated(model, (pieces[0],)) @@ -109,9 +109,9 @@ def append_lookup_key(model, lookup_key): if pieces[0] in fields_to_trans_models: transmodel = fields_to_trans_models[pieces[0]] rest = append_lookup_key(transmodel, pieces[1]) - fields = {'__'.join(pr) for pr in itertools.product(fields, rest)} + fields = {"__".join(pr) for pr in itertools.product(fields, rest)} else: - fields = {'%s__%s' % (f, pieces[1]) for f in fields} + fields = {"%s__%s" % (f, pieces[1]) for f in fields} return fields @@ -129,8 +129,8 @@ def append_lookup_keys(model, fields): def rewrite_order_lookup_key(model, lookup_key): try: - if lookup_key.startswith('-'): - return '-' + rewrite_lookup_key(model, lookup_key[1:]) + if lookup_key.startswith("-"): + return "-" + rewrite_lookup_key(model, lookup_key[1:]) else: return rewrite_lookup_key(model, lookup_key) except AttributeError: @@ -201,12 +201,12 @@ class MultilingualQuerySet(QuerySet): # This method is private, so outside code can use default _clone without `kwargs`, # and we're here can use private version with `kwargs`. # Refs: https://github.com/deschler/django-modeltranslation/issues/483 - kwargs.setdefault('_rewrite', self._rewrite) - kwargs.setdefault('_populate', self._populate) - if hasattr(self, 'translation_fields'): - kwargs.setdefault('translation_fields', self.translation_fields) - if hasattr(self, 'original_fields'): - kwargs.setdefault('original_fields', self.original_fields) + kwargs.setdefault("_rewrite", self._rewrite) + kwargs.setdefault("_populate", self._populate) + if hasattr(self, "translation_fields"): + kwargs.setdefault("translation_fields", self.translation_fields) + if hasattr(self, "original_fields"): + kwargs.setdefault("original_fields", self.original_fields) cloned = super()._clone() cloned.__dict__.update(kwargs) return cloned @@ -214,7 +214,7 @@ class MultilingualQuerySet(QuerySet): def rewrite(self, mode=True): return self.__clone(_rewrite=mode) - def populate(self, mode='all'): + def populate(self, mode="all"): """ Overrides the translation fields population mode for this query set. """ @@ -255,9 +255,9 @@ class MultilingualQuerySet(QuerySet): if col.target is col.source: col.source = new_field col.target = new_field - elif hasattr(col, 'col'): + elif hasattr(col, "col"): self._rewrite_col(col.col) - elif hasattr(col, 'lhs'): + elif hasattr(col, "lhs"): self._rewrite_col(col.lhs) def _rewrite_where(self, q): @@ -302,9 +302,9 @@ class MultilingualQuerySet(QuerySet): if isinstance(q, Node): q.children = list(map(self._rewrite_f, q.children)) # Django >= 1.8 - if hasattr(q, 'lhs'): + if hasattr(q, "lhs"): q.lhs = self._rewrite_f(q.lhs) - if hasattr(q, 'rhs'): + if hasattr(q, "rhs"): q.rhs = self._rewrite_f(q.rhs) return q @@ -333,7 +333,7 @@ class MultilingualQuerySet(QuerySet): def _get_original_fields(self): source = ( self.model._meta.concrete_fields - if hasattr(self.model._meta, 'concrete_fields') + if hasattr(self.model._meta, "concrete_fields") else self.model._meta.fields ) return [f.attname for f in source if not isinstance(f, TranslationField)] @@ -433,8 +433,8 @@ class MultilingualQuerySet(QuerySet): return super().values(*fields, **expressions) def _values(self, *original, **kwargs): - selects_all = kwargs.pop('selects_all', False) - if not kwargs.pop('prepare', False): + selects_all = kwargs.pop("selects_all", False) + if not kwargs.pop("prepare", False): return super()._values(*original, **kwargs) new_fields, translation_fields = append_fallback(self.model, original) annotation_keys = set(self.query.annotation_select.keys()) if selects_all else set() @@ -472,13 +472,13 @@ class MultilingualQuerySet(QuerySet): # Emulate original queryset behaviour: get all fields that are not translation fields fields = self._get_original_fields() - field_names = {f for f in fields if not hasattr(f, 'resolve_expression')} + field_names = {f for f in fields if not hasattr(f, "resolve_expression")} _fields = [] expressions = {} counter = 1 for field in fields: - if hasattr(field, 'resolve_expression'): - field_id_prefix = getattr(field, 'default_alias', field.__class__.__name__.lower()) + if hasattr(field, "resolve_expression"): + field_id_prefix = getattr(field, "default_alias", field.__class__.__name__.lower()) while True: field_id = field_id_prefix + str(counter) counter += 1 @@ -555,7 +555,7 @@ def multilingual_queryset_factory(old_cls, instantiate=True): class NewClass(old_cls, MultilingualQuerySet): pass - NewClass.__name__ = 'Multilingual%s' % old_cls.__name__ + NewClass.__name__ = "Multilingual%s" % old_cls.__name__ return NewClass() if instantiate else NewClass diff --git a/modeltranslation/models.py b/modeltranslation/models.py index 4358f23..5566fba 100644 --- a/modeltranslation/models.py +++ b/modeltranslation/models.py @@ -19,7 +19,7 @@ def autodiscover(): for app, mod in mods: # Attempt to import the app's translation module. - module = '%s.translation' % app + module = "%s.translation" % app before_import_registry = copy.copy(translator._registry) try: import_module(module) @@ -32,7 +32,7 @@ def autodiscover(): # Decide whether to bubble up this error. If the app just # doesn't have an translation module, we can ignore the error # attempting to import it, otherwise we want it to bubble up. - if module_has_submodule(mod, 'translation'): + if module_has_submodule(mod, "translation"): raise for module in TRANSLATION_FILES: @@ -46,12 +46,12 @@ def autodiscover(): # order, as far as base classes are registered before subclasses. if DEBUG: try: - if sys.argv[1] in ('runserver', 'runserver_plus'): + if sys.argv[1] in ("runserver", "runserver_plus"): models = translator.get_registered_models() - names = ', '.join(m.__name__ for m in models) + names = ", ".join(m.__name__ for m in models) print( - 'modeltranslation: Registered %d models for translation' - ' (%s) [pid: %d].' % (len(models), names, os.getpid()) + "modeltranslation: Registered %d models for translation" + " (%s) [pid: %d]." % (len(models), names, os.getpid()) ) except IndexError: pass diff --git a/modeltranslation/tests/migrations/0001_initial.py b/modeltranslation/tests/migrations/0001_initial.py index c83ac09..e47d226 100644 --- a/modeltranslation/tests/migrations/0001_initial.py +++ b/modeltranslation/tests/migrations/0001_initial.py @@ -11,486 +11,486 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('auth', '0001_initial'), + ("auth", "0001_initial"), ] operations = [ migrations.CreateModel( - name='AbstractConflictModelB', + name="AbstractConflictModelB", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title_de', models.IntegerField()), - ('title', models.CharField(max_length=255, verbose_name='title')), + ("title_de", models.IntegerField()), + ("title", models.CharField(max_length=255, verbose_name="title")), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.CreateModel( - name='AbstractModelB', + name="AbstractModelB", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('titlea', models.CharField(max_length=255, verbose_name='title a')), - ('titlea_de', models.CharField(max_length=255, null=True, verbose_name='title a')), - ('titlea_en', models.CharField(max_length=255, null=True, verbose_name='title a')), - ('titleb', models.CharField(max_length=255, verbose_name='title b')), - ('titleb_de', models.CharField(max_length=255, null=True, verbose_name='title b')), - ('titleb_en', models.CharField(max_length=255, null=True, verbose_name='title b')), + ("titlea", models.CharField(max_length=255, verbose_name="title a")), + ("titlea_de", models.CharField(max_length=255, null=True, verbose_name="title a")), + ("titlea_en", models.CharField(max_length=255, null=True, verbose_name="title a")), + ("titleb", models.CharField(max_length=255, verbose_name="title b")), + ("titleb_de", models.CharField(max_length=255, null=True, verbose_name="title b")), + ("titleb_en", models.CharField(max_length=255, null=True, verbose_name="title b")), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.CreateModel( - name='ConflictModel', + name="ConflictModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.IntegerField()), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.IntegerField()), ], ), migrations.CreateModel( - name='CustomManager2TestModel', + name="CustomManager2TestModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), ], ), migrations.CreateModel( - name='CustomManagerChildTestModel', + name="CustomManagerChildTestModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('needs_translation', models.BooleanField(default=False)), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ("needs_translation", models.BooleanField(default=False)), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.CreateModel( - name='CustomManagerTestModel', + name="CustomManagerTestModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), - ('description', models.CharField(db_column='xyz', max_length=255, null=True)), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), + ("description", models.CharField(db_column="xyz", max_length=255, null=True)), ], ), migrations.CreateModel( - name='CustomThroughModel', + name="CustomThroughModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), ], ), migrations.CreateModel( - name='DataModel', + name="DataModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('data', models.TextField(blank=True, null=True)), + ("data", models.TextField(blank=True, null=True)), ], ), migrations.CreateModel( - name='DescriptorModel', + name="DescriptorModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('normal', modeltranslation.tests.models.FancyField(default='')), - ('trans', modeltranslation.tests.models.FancyField(default='')), - ('trans_de', modeltranslation.tests.models.FancyField(default='', null=True)), - ('trans_en', modeltranslation.tests.models.FancyField(default='', null=True)), + ("normal", modeltranslation.tests.models.FancyField(default="")), + ("trans", modeltranslation.tests.models.FancyField(default="")), + ("trans_de", modeltranslation.tests.models.FancyField(default="", null=True)), + ("trans_en", modeltranslation.tests.models.FancyField(default="", null=True)), ], ), migrations.CreateModel( - name='FallbackModel', + name="FallbackModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), - ('text', models.TextField(blank=True, null=True)), - ('text_de', models.TextField(blank=True, null=True)), - ('text_en', models.TextField(blank=True, null=True)), - ('url', models.URLField(blank=True, null=True)), - ('url_de', models.URLField(blank=True, null=True)), - ('url_en', models.URLField(blank=True, null=True)), - ('email', models.EmailField(blank=True, max_length=254, null=True)), - ('email_de', models.EmailField(blank=True, max_length=254, null=True)), - ('email_en', models.EmailField(blank=True, max_length=254, null=True)), - ('description', models.CharField(max_length=255, null=True)), - ('description_de', models.CharField(max_length=255, null=True)), - ('description_en', models.CharField(max_length=255, null=True)), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), + ("text", models.TextField(blank=True, null=True)), + ("text_de", models.TextField(blank=True, null=True)), + ("text_en", models.TextField(blank=True, null=True)), + ("url", models.URLField(blank=True, null=True)), + ("url_de", models.URLField(blank=True, null=True)), + ("url_en", models.URLField(blank=True, null=True)), + ("email", models.EmailField(blank=True, max_length=254, null=True)), + ("email_de", models.EmailField(blank=True, max_length=254, null=True)), + ("email_en", models.EmailField(blank=True, max_length=254, null=True)), + ("description", models.CharField(max_length=255, null=True)), + ("description_de", models.CharField(max_length=255, null=True)), + ("description_en", models.CharField(max_length=255, null=True)), ], ), migrations.CreateModel( - name='FallbackModel2', + name="FallbackModel2", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), - ('text', models.TextField(blank=True, null=True)), - ('text_de', models.TextField(blank=True, null=True)), - ('text_en', models.TextField(blank=True, null=True)), - ('url', models.URLField(blank=True, null=True)), - ('url_de', models.URLField(blank=True, null=True)), - ('url_en', models.URLField(blank=True, null=True)), - ('email', models.EmailField(blank=True, max_length=254, null=True)), - ('email_de', models.EmailField(blank=True, max_length=254, null=True)), - ('email_en', models.EmailField(blank=True, max_length=254, null=True)), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), + ("text", models.TextField(blank=True, null=True)), + ("text_de", models.TextField(blank=True, null=True)), + ("text_en", models.TextField(blank=True, null=True)), + ("url", models.URLField(blank=True, null=True)), + ("url_de", models.URLField(blank=True, null=True)), + ("url_en", models.URLField(blank=True, null=True)), + ("email", models.EmailField(blank=True, max_length=254, null=True)), + ("email_de", models.EmailField(blank=True, max_length=254, null=True)), + ("email_en", models.EmailField(blank=True, max_length=254, null=True)), ], ), migrations.CreateModel( - name='FileFieldsModel', + name="FileFieldsModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), ( - 'file', - models.FileField(blank=True, null=True, upload_to='modeltranslation_tests'), + "file", + models.FileField(blank=True, null=True, upload_to="modeltranslation_tests"), ), ( - 'file_de', - models.FileField(blank=True, null=True, upload_to='modeltranslation_tests'), + "file_de", + models.FileField(blank=True, null=True, upload_to="modeltranslation_tests"), ), ( - 'file_en', - models.FileField(blank=True, null=True, upload_to='modeltranslation_tests'), + "file_en", + models.FileField(blank=True, null=True, upload_to="modeltranslation_tests"), ), - ('file2', models.FileField(upload_to='modeltranslation_tests')), - ('file2_de', models.FileField(null=True, upload_to='modeltranslation_tests')), - ('file2_en', models.FileField(null=True, upload_to='modeltranslation_tests')), + ("file2", models.FileField(upload_to="modeltranslation_tests")), + ("file2_de", models.FileField(null=True, upload_to="modeltranslation_tests")), + ("file2_en", models.FileField(null=True, upload_to="modeltranslation_tests")), ( - 'image', - models.ImageField(blank=True, null=True, upload_to='modeltranslation_tests'), + "image", + models.ImageField(blank=True, null=True, upload_to="modeltranslation_tests"), ), ( - 'image_de', - models.ImageField(blank=True, null=True, upload_to='modeltranslation_tests'), + "image_de", + models.ImageField(blank=True, null=True, upload_to="modeltranslation_tests"), ), ( - 'image_en', - models.ImageField(blank=True, null=True, upload_to='modeltranslation_tests'), + "image_en", + models.ImageField(blank=True, null=True, upload_to="modeltranslation_tests"), ), ], ), migrations.CreateModel( - name='FilteredTestModel', + name="FilteredTestModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), ], ), migrations.CreateModel( - name='GroupFieldsetsModel', + name="GroupFieldsetsModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255)), - ('title_de', models.CharField(max_length=255, null=True)), - ('title_en', models.CharField(max_length=255, null=True)), - ('text', models.TextField(blank=True, null=True)), - ('text_de', models.TextField(blank=True, null=True)), - ('text_en', models.TextField(blank=True, null=True)), - ('email', models.EmailField(blank=True, max_length=254, null=True)), + ("title", models.CharField(max_length=255)), + ("title_de", models.CharField(max_length=255, null=True)), + ("title_en", models.CharField(max_length=255, null=True)), + ("text", models.TextField(blank=True, null=True)), + ("text_de", models.TextField(blank=True, null=True)), + ("text_en", models.TextField(blank=True, null=True)), + ("email", models.EmailField(blank=True, max_length=254, null=True)), ], ), migrations.CreateModel( - name='InheritedPermission', + name="InheritedPermission", fields=[ ( - 'permission_ptr', + "permission_ptr", models.OneToOneField( auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, - to='auth.permission', + to="auth.permission", ), ), - ('translated_var', models.CharField(max_length=255)), - ('translated_var_de', models.CharField(max_length=255, null=True)), - ('translated_var_en', models.CharField(max_length=255, null=True)), + ("translated_var", models.CharField(max_length=255)), + ("translated_var_de", models.CharField(max_length=255, null=True)), + ("translated_var_en", models.CharField(max_length=255, null=True)), ], - bases=('auth.permission',), + bases=("auth.permission",), managers=[ - ('objects', django.contrib.auth.models.PermissionManager()), + ("objects", django.contrib.auth.models.PermissionManager()), ], ), migrations.CreateModel( - name='ManagerTestModel', + name="ManagerTestModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), - ('visits', models.IntegerField(default=0, verbose_name='visits')), - ('visits_de', models.IntegerField(default=0, null=True, verbose_name='visits')), - ('visits_en', models.IntegerField(default=0, null=True, verbose_name='visits')), - ('description', models.CharField(max_length=255, null=True)), - ('description_de', models.CharField(max_length=255, null=True)), - ('description_en', models.CharField(max_length=255, null=True)), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), + ("visits", models.IntegerField(default=0, verbose_name="visits")), + ("visits_de", models.IntegerField(default=0, null=True, verbose_name="visits")), + ("visits_en", models.IntegerField(default=0, null=True, verbose_name="visits")), + ("description", models.CharField(max_length=255, null=True)), + ("description_de", models.CharField(max_length=255, null=True)), + ("description_en", models.CharField(max_length=255, null=True)), ], options={ - 'ordering': ('-visits',), + "ordering": ("-visits",), }, ), migrations.CreateModel( - name='ManyToManyFieldModel', + name="ManyToManyFieldModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), ( - 'self_call_1', + "self_call_1", models.ManyToManyField( - related_name='_tests_manytomanyfieldmodel_self_call_1_+', - to='tests.ManyToManyFieldModel', + related_name="_tests_manytomanyfieldmodel_self_call_1_+", + to="tests.ManyToManyFieldModel", ), ), ( - 'self_call_1_de', + "self_call_1_de", models.ManyToManyField( null=True, - related_name='_tests_manytomanyfieldmodel_self_call_1_de_+', - to='tests.ManyToManyFieldModel', + related_name="_tests_manytomanyfieldmodel_self_call_1_de_+", + to="tests.ManyToManyFieldModel", ), ), ( - 'self_call_1_en', + "self_call_1_en", models.ManyToManyField( null=True, - related_name='_tests_manytomanyfieldmodel_self_call_1_en_+', - to='tests.ManyToManyFieldModel', + related_name="_tests_manytomanyfieldmodel_self_call_1_en_+", + to="tests.ManyToManyFieldModel", ), ), ( - 'self_call_2', + "self_call_2", models.ManyToManyField( - related_name='_tests_manytomanyfieldmodel_self_call_2_+', - to='tests.ManyToManyFieldModel', + related_name="_tests_manytomanyfieldmodel_self_call_2_+", + to="tests.ManyToManyFieldModel", ), ), ( - 'self_call_2_de', + "self_call_2_de", models.ManyToManyField( null=True, - related_name='_tests_manytomanyfieldmodel_self_call_2_de_+', - to='tests.ManyToManyFieldModel', + related_name="_tests_manytomanyfieldmodel_self_call_2_de_+", + to="tests.ManyToManyFieldModel", ), ), ( - 'self_call_2_en', + "self_call_2_en", models.ManyToManyField( null=True, - related_name='_tests_manytomanyfieldmodel_self_call_2_en_+', - to='tests.ManyToManyFieldModel', + related_name="_tests_manytomanyfieldmodel_self_call_2_en_+", + to="tests.ManyToManyFieldModel", ), ), ], ), migrations.CreateModel( - name='ModelX', + name="ModelX", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('name', models.CharField(max_length=255)), - ('name_de', models.CharField(max_length=255, null=True)), - ('name_en', models.CharField(max_length=255, null=True)), + ("name", models.CharField(max_length=255)), + ("name_de", models.CharField(max_length=255, null=True)), + ("name_en", models.CharField(max_length=255, null=True)), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.CreateModel( - name='ModelXY', + name="ModelXY", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), ( - 'model_x', + "model_x", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.modelx' + on_delete=django.db.models.deletion.CASCADE, to="tests.modelx" ), ), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.CreateModel( - name='MultitableConflictModelA', + name="MultitableConflictModelA", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title_de', models.IntegerField()), + ("title_de", models.IntegerField()), ], ), migrations.CreateModel( - name='MultitableModelA', + name="MultitableModelA", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('titlea', models.CharField(max_length=255, verbose_name='title a')), - ('titlea_de', models.CharField(max_length=255, null=True, verbose_name='title a')), - ('titlea_en', models.CharField(max_length=255, null=True, verbose_name='title a')), + ("titlea", models.CharField(max_length=255, verbose_name="title a")), + ("titlea_de", models.CharField(max_length=255, null=True, verbose_name="title a")), + ("titlea_en", models.CharField(max_length=255, null=True, verbose_name="title a")), ], ), migrations.CreateModel( - name='NameModel', + name="NameModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('firstname', models.CharField(max_length=50)), - ('firstname_de', models.CharField(max_length=50, null=True)), - ('firstname_en', models.CharField(max_length=50, null=True)), - ('lastname', models.CharField(max_length=50)), - ('lastname_de', models.CharField(max_length=50, null=True)), - ('lastname_en', models.CharField(max_length=50, null=True)), - ('age', models.CharField(max_length=50)), - ('slug', models.SlugField(max_length=100)), - ('slug2', models.SlugField(max_length=100)), - ('slug2_de', models.SlugField(max_length=100, null=True)), - ('slug2_en', models.SlugField(max_length=100, null=True)), + ("firstname", models.CharField(max_length=50)), + ("firstname_de", models.CharField(max_length=50, null=True)), + ("firstname_en", models.CharField(max_length=50, null=True)), + ("lastname", models.CharField(max_length=50)), + ("lastname_de", models.CharField(max_length=50, null=True)), + ("lastname_en", models.CharField(max_length=50, null=True)), + ("age", models.CharField(max_length=50)), + ("slug", models.SlugField(max_length=100)), + ("slug2", models.SlugField(max_length=100)), + ("slug2_de", models.SlugField(max_length=100, null=True)), + ("slug2_en", models.SlugField(max_length=100, null=True)), ], ), migrations.CreateModel( - name='NonTranslated', + name="NonTranslated", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), + ("title", models.CharField(max_length=255, verbose_name="title")), ], ), migrations.CreateModel( - name='OtherFieldsModel', + name="OtherFieldsModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), ( - 'int', + "int", models.PositiveIntegerField( default=42, validators=[django.core.validators.MinValueValidator(0)] ), ), ( - 'int_de', + "int_de", models.PositiveIntegerField( default=42, null=True, @@ -498,825 +498,825 @@ class Migration(migrations.Migration): ), ), ( - 'int_en', + "int_en", models.PositiveIntegerField( default=42, null=True, validators=[django.core.validators.MinValueValidator(0)], ), ), - ('boolean', models.BooleanField(default=False)), - ('boolean_de', models.BooleanField(default=False)), - ('boolean_en', models.BooleanField(default=False)), - ('float', models.FloatField(blank=True, null=True)), - ('float_de', models.FloatField(blank=True, null=True)), - ('float_en', models.FloatField(blank=True, null=True)), + ("boolean", models.BooleanField(default=False)), + ("boolean_de", models.BooleanField(default=False)), + ("boolean_en", models.BooleanField(default=False)), + ("float", models.FloatField(blank=True, null=True)), + ("float_de", models.FloatField(blank=True, null=True)), + ("float_en", models.FloatField(blank=True, null=True)), ( - 'decimal', + "decimal", models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True), ), ( - 'decimal_de', + "decimal_de", models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True), ), ( - 'decimal_en', + "decimal_en", models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True), ), - ('date', models.DateField(blank=True, null=True)), - ('date_de', models.DateField(blank=True, null=True)), - ('date_en', models.DateField(blank=True, null=True)), - ('datetime', models.DateTimeField(blank=True, null=True)), - ('datetime_de', models.DateTimeField(blank=True, null=True)), - ('datetime_en', models.DateTimeField(blank=True, null=True)), - ('time', models.TimeField(blank=True, null=True)), - ('time_de', models.TimeField(blank=True, null=True)), - ('time_en', models.TimeField(blank=True, null=True)), - ('genericip', models.GenericIPAddressField(blank=True, null=True)), - ('genericip_de', models.GenericIPAddressField(blank=True, null=True)), - ('genericip_en', models.GenericIPAddressField(blank=True, null=True)), - ('json', models.JSONField(blank=True, null=True)), - ('json_de', models.JSONField(blank=True, null=True)), - ('json_en', models.JSONField(blank=True, null=True)), + ("date", models.DateField(blank=True, null=True)), + ("date_de", models.DateField(blank=True, null=True)), + ("date_en", models.DateField(blank=True, null=True)), + ("datetime", models.DateTimeField(blank=True, null=True)), + ("datetime_de", models.DateTimeField(blank=True, null=True)), + ("datetime_en", models.DateTimeField(blank=True, null=True)), + ("time", models.TimeField(blank=True, null=True)), + ("time_de", models.TimeField(blank=True, null=True)), + ("time_en", models.TimeField(blank=True, null=True)), + ("genericip", models.GenericIPAddressField(blank=True, null=True)), + ("genericip_de", models.GenericIPAddressField(blank=True, null=True)), + ("genericip_en", models.GenericIPAddressField(blank=True, null=True)), + ("json", models.JSONField(blank=True, null=True)), + ("json_de", models.JSONField(blank=True, null=True)), + ("json_en", models.JSONField(blank=True, null=True)), ], ), migrations.CreateModel( - name='Page', + name="Page", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('slug', models.CharField(max_length=255)), - ('slug_de', models.CharField(max_length=255, null=True)), - ('slug_en', models.CharField(max_length=255, null=True)), - ('keywords', models.CharField(max_length=255)), - ('keywords_de', models.CharField(max_length=255, null=True)), - ('keywords_en', models.CharField(max_length=255, null=True)), - ('title', models.CharField(max_length=255)), - ('title_de', models.CharField(max_length=255, null=True)), - ('title_en', models.CharField(max_length=255, null=True)), + ("slug", models.CharField(max_length=255)), + ("slug_de", models.CharField(max_length=255, null=True)), + ("slug_en", models.CharField(max_length=255, null=True)), + ("keywords", models.CharField(max_length=255)), + ("keywords_de", models.CharField(max_length=255, null=True)), + ("keywords_en", models.CharField(max_length=255, null=True)), + ("title", models.CharField(max_length=255)), + ("title_de", models.CharField(max_length=255, null=True)), + ("title_en", models.CharField(max_length=255, null=True)), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.CreateModel( - name='PlainChildTestModel', + name="PlainChildTestModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('needs_translation', models.BooleanField(default=False)), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ("needs_translation", models.BooleanField(default=False)), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.CreateModel( - name='RequiredModel', + name="RequiredModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('non_req', models.CharField(blank=True, max_length=10)), - ('non_req_de', models.CharField(blank=True, max_length=10, null=True)), - ('non_req_en', models.CharField(blank=True, max_length=10, null=True)), - ('req', models.CharField(max_length=10)), - ('req_de', models.CharField(max_length=10, null=True)), - ('req_en', models.CharField(max_length=10, null=True)), - ('req_reg', models.CharField(max_length=10)), - ('req_reg_de', models.CharField(max_length=10, null=True)), - ('req_reg_en', models.CharField(max_length=10, null=True)), - ('req_en_reg', models.CharField(max_length=10)), - ('req_en_reg_de', models.CharField(max_length=10, null=True)), - ('req_en_reg_en', models.CharField(max_length=10, null=True)), + ("non_req", models.CharField(blank=True, max_length=10)), + ("non_req_de", models.CharField(blank=True, max_length=10, null=True)), + ("non_req_en", models.CharField(blank=True, max_length=10, null=True)), + ("req", models.CharField(max_length=10)), + ("req_de", models.CharField(max_length=10, null=True)), + ("req_en", models.CharField(max_length=10, null=True)), + ("req_reg", models.CharField(max_length=10)), + ("req_reg_de", models.CharField(max_length=10, null=True)), + ("req_reg_en", models.CharField(max_length=10, null=True)), + ("req_en_reg", models.CharField(max_length=10)), + ("req_en_reg_de", models.CharField(max_length=10, null=True)), + ("req_en_reg_en", models.CharField(max_length=10, null=True)), ], ), migrations.CreateModel( - name='TestModel', + name="TestModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), - ('text', models.TextField(blank=True, null=True)), - ('text_de', models.TextField(blank=True, null=True)), - ('text_en', models.TextField(blank=True, null=True)), - ('url', models.URLField(blank=True, null=True)), - ('url_de', models.URLField(blank=True, null=True)), - ('url_en', models.URLField(blank=True, null=True)), - ('email', models.EmailField(blank=True, max_length=254, null=True)), - ('email_de', models.EmailField(blank=True, max_length=254, null=True)), - ('email_en', models.EmailField(blank=True, max_length=254, null=True)), - ('dynamic_default', models.CharField(default='password', max_length=255)), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), + ("text", models.TextField(blank=True, null=True)), + ("text_de", models.TextField(blank=True, null=True)), + ("text_en", models.TextField(blank=True, null=True)), + ("url", models.URLField(blank=True, null=True)), + ("url_de", models.URLField(blank=True, null=True)), + ("url_en", models.URLField(blank=True, null=True)), + ("email", models.EmailField(blank=True, max_length=254, null=True)), + ("email_de", models.EmailField(blank=True, max_length=254, null=True)), + ("email_en", models.EmailField(blank=True, max_length=254, null=True)), + ("dynamic_default", models.CharField(default="password", max_length=255)), ( - 'dynamic_default_de', - models.CharField(default='password', max_length=255, null=True), + "dynamic_default_de", + models.CharField(default="password", max_length=255, null=True), ), ( - 'dynamic_default_en', - models.CharField(default='password', max_length=255, null=True), + "dynamic_default_en", + models.CharField(default="password", max_length=255, null=True), ), ], ), migrations.CreateModel( - name='ThirdPartyModel', + name="ThirdPartyModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('name', models.CharField(max_length=20)), + ("name", models.CharField(max_length=20)), ], ), migrations.CreateModel( - name='ThirdPartyRegisteredModel', + name="ThirdPartyRegisteredModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('name', models.CharField(max_length=20)), - ('name_de', models.CharField(max_length=20, null=True)), - ('name_en', models.CharField(max_length=20, null=True)), + ("name", models.CharField(max_length=20)), + ("name_de", models.CharField(max_length=20, null=True)), + ("name_en", models.CharField(max_length=20, null=True)), ], ), migrations.CreateModel( - name='UniqueNullableModel', + name="UniqueNullableModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, null=True, unique=True)), - ('title_de', models.CharField(max_length=255, null=True, unique=True)), - ('title_en', models.CharField(max_length=255, null=True, unique=True)), + ("title", models.CharField(max_length=255, null=True, unique=True)), + ("title_de", models.CharField(max_length=255, null=True, unique=True)), + ("title_en", models.CharField(max_length=255, null=True, unique=True)), ], ), migrations.CreateModel( - name='MultitableConflictModelB', + name="MultitableConflictModelB", fields=[ ( - 'multitableconflictmodela_ptr', + "multitableconflictmodela_ptr", models.OneToOneField( auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, - to='tests.multitableconflictmodela', + to="tests.multitableconflictmodela", ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), + ("title", models.CharField(max_length=255, verbose_name="title")), ], - bases=('tests.multitableconflictmodela',), + bases=("tests.multitableconflictmodela",), ), migrations.CreateModel( - name='MultitableModelB', + name="MultitableModelB", fields=[ ( - 'multitablemodela_ptr', + "multitablemodela_ptr", models.OneToOneField( auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, - to='tests.multitablemodela', + to="tests.multitablemodela", ), ), - ('titleb', models.CharField(max_length=255, verbose_name='title b')), - ('titleb_de', models.CharField(max_length=255, null=True, verbose_name='title b')), - ('titleb_en', models.CharField(max_length=255, null=True, verbose_name='title b')), + ("titleb", models.CharField(max_length=255, verbose_name="title b")), + ("titleb_de", models.CharField(max_length=255, null=True, verbose_name="title b")), + ("titleb_en", models.CharField(max_length=255, null=True, verbose_name="title b")), ], - bases=('tests.multitablemodela',), + bases=("tests.multitablemodela",), ), migrations.CreateModel( - name='RichTextPage', + name="RichTextPage", fields=[ ( - 'page_ptr', + "page_ptr", models.OneToOneField( auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, - to='tests.page', + to="tests.page", ), ), - ('content', models.CharField(max_length=255)), - ('content_de', models.CharField(max_length=255, null=True)), - ('content_en', models.CharField(max_length=255, null=True)), + ("content", models.CharField(max_length=255)), + ("content_de", models.CharField(max_length=255, null=True)), + ("content_en", models.CharField(max_length=255, null=True)), ], options={ - 'abstract': False, + "abstract": False, }, - bases=('tests.page', models.Model), + bases=("tests.page", models.Model), ), migrations.CreateModel( - name='RegisteredThroughModel_en', + name="RegisteredThroughModel_en", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255)), - ('title_de', models.CharField(max_length=255, null=True)), - ('title_en', models.CharField(max_length=255, null=True)), + ("title", models.CharField(max_length=255)), + ("title_de", models.CharField(max_length=255, null=True)), + ("title_en", models.CharField(max_length=255, null=True)), ( - 'rel_1', + "rel_1", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.manytomanyfieldmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.manytomanyfieldmodel" ), ), ( - 'rel_2', + "rel_2", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.testmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.testmodel" ), ), ], options={ - 'verbose_name': 'registered through model [en]', - 'verbose_name_plural': 'registered through models [en]', - 'db_table': 'tests_registeredthroughmodel_en', - 'db_tablespace': '', - 'auto_created': False, + "verbose_name": "registered through model [en]", + "verbose_name_plural": "registered through models [en]", + "db_table": "tests_registeredthroughmodel_en", + "db_tablespace": "", + "auto_created": False, }, ), migrations.CreateModel( - name='RegisteredThroughModel_de', + name="RegisteredThroughModel_de", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255)), - ('title_de', models.CharField(max_length=255, null=True)), - ('title_en', models.CharField(max_length=255, null=True)), + ("title", models.CharField(max_length=255)), + ("title_de", models.CharField(max_length=255, null=True)), + ("title_en", models.CharField(max_length=255, null=True)), ( - 'rel_1', + "rel_1", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.manytomanyfieldmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.manytomanyfieldmodel" ), ), ( - 'rel_2', + "rel_2", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.testmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.testmodel" ), ), ], options={ - 'verbose_name': 'registered through model [de]', - 'verbose_name_plural': 'registered through models [de]', - 'db_table': 'tests_registeredthroughmodel_de', - 'db_tablespace': '', - 'auto_created': False, + "verbose_name": "registered through model [de]", + "verbose_name_plural": "registered through models [de]", + "db_table": "tests_registeredthroughmodel_de", + "db_tablespace": "", + "auto_created": False, }, ), migrations.CreateModel( - name='RegisteredThroughModel', + name="RegisteredThroughModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255)), - ('title_de', models.CharField(max_length=255, null=True)), - ('title_en', models.CharField(max_length=255, null=True)), + ("title", models.CharField(max_length=255)), + ("title_de", models.CharField(max_length=255, null=True)), + ("title_en", models.CharField(max_length=255, null=True)), ( - 'rel_1', + "rel_1", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.manytomanyfieldmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.manytomanyfieldmodel" ), ), ( - 'rel_2', + "rel_2", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.testmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.testmodel" ), ), ], ), migrations.CreateModel( - name='OneToOneFieldModel', + name="OneToOneFieldModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), ( - 'non', + "non", models.OneToOneField( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_o2o', - to='tests.nontranslated', + related_name="test_o2o", + to="tests.nontranslated", ), ), ( - 'non_de', + "non_de", models.OneToOneField( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_o2o', - to='tests.nontranslated', + related_name="test_o2o", + to="tests.nontranslated", ), ), ( - 'non_en', + "non_en", models.OneToOneField( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_o2o', - to='tests.nontranslated', + related_name="test_o2o", + to="tests.nontranslated", ), ), ( - 'optional', + "optional", models.OneToOneField( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - to='tests.testmodel', + to="tests.testmodel", ), ), ( - 'optional_de', + "optional_de", models.OneToOneField( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - to='tests.testmodel', + to="tests.testmodel", ), ), ( - 'optional_en', + "optional_en", models.OneToOneField( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - to='tests.testmodel', + to="tests.testmodel", ), ), ( - 'test', + "test", models.OneToOneField( null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_o2o', - to='tests.testmodel', + related_name="test_o2o", + to="tests.testmodel", ), ), ( - 'test_de', + "test_de", models.OneToOneField( null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_o2o', - to='tests.testmodel', + related_name="test_o2o", + to="tests.testmodel", ), ), ( - 'test_en', + "test_en", models.OneToOneField( null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_o2o', - to='tests.testmodel', + related_name="test_o2o", + to="tests.testmodel", ), ), ], ), migrations.CreateModel( - name='ModelY', + name="ModelY", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255)), - ('title_de', models.CharField(max_length=255, null=True)), - ('title_en', models.CharField(max_length=255, null=True)), - ('xs', models.ManyToManyField(through='tests.ModelXY', to='tests.ModelX')), + ("title", models.CharField(max_length=255)), + ("title_de", models.CharField(max_length=255, null=True)), + ("title_en", models.CharField(max_length=255, null=True)), + ("xs", models.ManyToManyField(through="tests.ModelXY", to="tests.ModelX")), ], options={ - 'abstract': False, + "abstract": False, }, ), migrations.AddField( - model_name='modelxy', - name='model_y', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='tests.modely'), + model_name="modelxy", + name="model_y", + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="tests.modely"), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='test', - field=models.ManyToManyField(related_name='m2m_test_ref', to='tests.TestModel'), + model_name="manytomanyfieldmodel", + name="test", + field=models.ManyToManyField(related_name="m2m_test_ref", to="tests.TestModel"), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='test_de', + model_name="manytomanyfieldmodel", + name="test_de", field=models.ManyToManyField( - null=True, related_name='m2m_test_ref', to='tests.TestModel' + null=True, related_name="m2m_test_ref", to="tests.TestModel" ), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='test_en', + model_name="manytomanyfieldmodel", + name="test_en", field=models.ManyToManyField( - null=True, related_name='m2m_test_ref', to='tests.TestModel' + null=True, related_name="m2m_test_ref", to="tests.TestModel" ), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='through_model', - field=models.ManyToManyField(through='tests.CustomThroughModel', to='tests.TestModel'), + model_name="manytomanyfieldmodel", + name="through_model", + field=models.ManyToManyField(through="tests.CustomThroughModel", to="tests.TestModel"), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='through_model_de', + model_name="manytomanyfieldmodel", + name="through_model_de", field=models.ManyToManyField( - null=True, through='tests.CustomThroughModel', to='tests.TestModel' + null=True, through="tests.CustomThroughModel", to="tests.TestModel" ), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='through_model_en', + model_name="manytomanyfieldmodel", + name="through_model_en", field=models.ManyToManyField( - null=True, through='tests.CustomThroughModel', to='tests.TestModel' + null=True, through="tests.CustomThroughModel", to="tests.TestModel" ), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='trans_through_model', + model_name="manytomanyfieldmodel", + name="trans_through_model", field=models.ManyToManyField( - related_name='m2m_trans_through_model_ref', - through='tests.RegisteredThroughModel', - to='tests.TestModel', + related_name="m2m_trans_through_model_ref", + through="tests.RegisteredThroughModel", + to="tests.TestModel", ), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='trans_through_model_de', + model_name="manytomanyfieldmodel", + name="trans_through_model_de", field=models.ManyToManyField( null=True, - related_name='m2m_trans_through_model_ref', - through='tests.RegisteredThroughModel', - to='tests.TestModel', + related_name="m2m_trans_through_model_ref", + through="tests.RegisteredThroughModel", + to="tests.TestModel", ), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='trans_through_model_en', + model_name="manytomanyfieldmodel", + name="trans_through_model_en", field=models.ManyToManyField( null=True, - related_name='m2m_trans_through_model_ref', - through='tests.RegisteredThroughModel', - to='tests.TestModel', + related_name="m2m_trans_through_model_ref", + through="tests.RegisteredThroughModel", + to="tests.TestModel", ), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='untrans', - field=models.ManyToManyField(related_name='m2m_untrans_ref', to='tests.NonTranslated'), + model_name="manytomanyfieldmodel", + name="untrans", + field=models.ManyToManyField(related_name="m2m_untrans_ref", to="tests.NonTranslated"), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='untrans_de', + model_name="manytomanyfieldmodel", + name="untrans_de", field=models.ManyToManyField( - null=True, related_name='m2m_untrans_ref', to='tests.NonTranslated' + null=True, related_name="m2m_untrans_ref", to="tests.NonTranslated" ), ), migrations.AddField( - model_name='manytomanyfieldmodel', - name='untrans_en', + model_name="manytomanyfieldmodel", + name="untrans_en", field=models.ManyToManyField( - null=True, related_name='m2m_untrans_ref', to='tests.NonTranslated' + null=True, related_name="m2m_untrans_ref", to="tests.NonTranslated" ), ), migrations.CreateModel( - name='ForeignKeyModel', + name="ForeignKeyModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), ( - 'hidden', + "hidden", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='+', - to='tests.testmodel', + related_name="+", + to="tests.testmodel", ), ), ( - 'hidden_de', + "hidden_de", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='+', - to='tests.testmodel', + related_name="+", + to="tests.testmodel", ), ), ( - 'hidden_en', + "hidden_en", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='+', - to='tests.testmodel', + related_name="+", + to="tests.testmodel", ), ), ( - 'non', + "non", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_fks', - to='tests.nontranslated', + related_name="test_fks", + to="tests.nontranslated", ), ), ( - 'non_de', + "non_de", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_fks', - to='tests.nontranslated', + related_name="test_fks", + to="tests.nontranslated", ), ), ( - 'non_en', + "non_en", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_fks', - to='tests.nontranslated', + related_name="test_fks", + to="tests.nontranslated", ), ), ( - 'optional', + "optional", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - to='tests.testmodel', + to="tests.testmodel", ), ), ( - 'optional_de', + "optional_de", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - to='tests.testmodel', + to="tests.testmodel", ), ), ( - 'optional_en', + "optional_en", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - to='tests.testmodel', + to="tests.testmodel", ), ), ( - 'test', + "test", models.ForeignKey( null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_fks', - to='tests.testmodel', + related_name="test_fks", + to="tests.testmodel", ), ), ( - 'test_de', + "test_de", models.ForeignKey( null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_fks', - to='tests.testmodel', + related_name="test_fks", + to="tests.testmodel", ), ), ( - 'test_en', + "test_en", models.ForeignKey( null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_fks', - to='tests.testmodel', + related_name="test_fks", + to="tests.testmodel", ), ), ( - 'untrans', + "untrans", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_fks_un', - to='tests.testmodel', + related_name="test_fks_un", + to="tests.testmodel", ), ), ], ), migrations.CreateModel( - name='ForeignKeyFilteredModel', + name="ForeignKeyFilteredModel", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), - ('title', models.CharField(max_length=255, verbose_name='title')), - ('title_de', models.CharField(max_length=255, null=True, verbose_name='title')), - ('title_en', models.CharField(max_length=255, null=True, verbose_name='title')), + ("title", models.CharField(max_length=255, verbose_name="title")), + ("title_de", models.CharField(max_length=255, null=True, verbose_name="title")), + ("title_en", models.CharField(max_length=255, null=True, verbose_name="title")), ( - 'test', + "test", models.ForeignKey( null=True, on_delete=django.db.models.deletion.CASCADE, - related_name='test_fks', - to='tests.filteredtestmodel', + related_name="test_fks", + to="tests.filteredtestmodel", ), ), ], ), migrations.CreateModel( - name='CustomThroughModel_en', + name="CustomThroughModel_en", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), ( - 'rel_1', + "rel_1", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.manytomanyfieldmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.manytomanyfieldmodel" ), ), ( - 'rel_2', + "rel_2", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.testmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.testmodel" ), ), ], options={ - 'verbose_name': 'custom through model [en]', - 'verbose_name_plural': 'custom through models [en]', - 'db_table': 'tests_customthroughmodel_en', - 'db_tablespace': '', - 'auto_created': False, + "verbose_name": "custom through model [en]", + "verbose_name_plural": "custom through models [en]", + "db_table": "tests_customthroughmodel_en", + "db_tablespace": "", + "auto_created": False, }, ), migrations.CreateModel( - name='CustomThroughModel_de', + name="CustomThroughModel_de", fields=[ ( - 'id', + "id", models.AutoField( - auto_created=True, primary_key=True, serialize=False, verbose_name='ID' + auto_created=True, primary_key=True, serialize=False, verbose_name="ID" ), ), ( - 'rel_1', + "rel_1", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.manytomanyfieldmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.manytomanyfieldmodel" ), ), ( - 'rel_2', + "rel_2", models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.testmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.testmodel" ), ), ], options={ - 'verbose_name': 'custom through model [de]', - 'verbose_name_plural': 'custom through models [de]', - 'db_table': 'tests_customthroughmodel_de', - 'db_tablespace': '', - 'auto_created': False, + "verbose_name": "custom through model [de]", + "verbose_name_plural": "custom through models [de]", + "db_table": "tests_customthroughmodel_de", + "db_tablespace": "", + "auto_created": False, }, ), migrations.AddField( - model_name='customthroughmodel', - name='rel_1', + model_name="customthroughmodel", + name="rel_1", field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.manytomanyfieldmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.manytomanyfieldmodel" ), ), migrations.AddField( - model_name='customthroughmodel', - name='rel_2', + model_name="customthroughmodel", + name="rel_2", field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, to='tests.testmodel' + on_delete=django.db.models.deletion.CASCADE, to="tests.testmodel" ), ), migrations.CreateModel( - name='ProxyTestModel', + name="ProxyTestModel", fields=[], options={ - 'proxy': True, - 'indexes': [], - 'constraints': [], + "proxy": True, + "indexes": [], + "constraints": [], }, - bases=('tests.testmodel',), + bases=("tests.testmodel",), ), migrations.CreateModel( - name='MultitableModelC', + name="MultitableModelC", fields=[ ( - 'multitablemodelb_ptr', + "multitablemodelb_ptr", models.OneToOneField( auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, - to='tests.multitablemodelb', + to="tests.multitablemodelb", ), ), - ('titlec', models.CharField(max_length=255, verbose_name='title c')), - ('titlec_de', models.CharField(max_length=255, null=True, verbose_name='title c')), - ('titlec_en', models.CharField(max_length=255, null=True, verbose_name='title c')), + ("titlec", models.CharField(max_length=255, verbose_name="title c")), + ("titlec_de", models.CharField(max_length=255, null=True, verbose_name="title c")), + ("titlec_en", models.CharField(max_length=255, null=True, verbose_name="title c")), ], - bases=('tests.multitablemodelb',), + bases=("tests.multitablemodelb",), ), migrations.CreateModel( - name='MultitableModelD', + name="MultitableModelD", fields=[ ( - 'multitablemodelb_ptr', + "multitablemodelb_ptr", models.OneToOneField( auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, - to='tests.multitablemodelb', + to="tests.multitablemodelb", ), ), - ('titled', models.CharField(max_length=255, verbose_name='title d')), + ("titled", models.CharField(max_length=255, verbose_name="title d")), ], - bases=('tests.multitablemodelb',), + bases=("tests.multitablemodelb",), ), ] diff --git a/modeltranslation/tests/models.py b/modeltranslation/tests/models.py index 430966e..57524f9 100644 --- a/modeltranslation/tests/models.py +++ b/modeltranslation/tests/models.py @@ -7,7 +7,7 @@ from modeltranslation.manager import MultilingualManager class TestModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) text = models.TextField(blank=True, null=True) url = models.URLField(blank=True, null=True) email = models.EmailField(blank=True, null=True) @@ -33,7 +33,7 @@ class ProxyTestModel(TestModel): class FallbackModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) text = models.TextField(blank=True, null=True) url = models.URLField(blank=True, null=True) email = models.EmailField(blank=True, null=True) @@ -41,7 +41,7 @@ class FallbackModel(models.Model): class FallbackModel2(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) text = models.TextField(blank=True, null=True) url = models.URLField(blank=True, null=True) email = models.EmailField(blank=True, null=True) @@ -51,21 +51,21 @@ class FallbackModel2(models.Model): class FileFieldsModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) - file = models.FileField(upload_to='modeltranslation_tests', null=True, blank=True) - file2 = models.FileField(upload_to='modeltranslation_tests') - image = models.ImageField(upload_to='modeltranslation_tests', null=True, blank=True) + title = models.CharField(gettext_lazy("title"), max_length=255) + file = models.FileField(upload_to="modeltranslation_tests", null=True, blank=True) + file2 = models.FileField(upload_to="modeltranslation_tests") + image = models.ImageField(upload_to="modeltranslation_tests", null=True, blank=True) # ######### Foreign Key / OneToOneField / ManytoManyField testing class NonTranslated(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) class ForeignKeyModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) test = models.ForeignKey( TestModel, null=True, @@ -97,7 +97,7 @@ class ForeignKeyModel(models.Model): class OneToOneFieldModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) test = models.OneToOneField( TestModel, null=True, @@ -116,7 +116,7 @@ class OneToOneFieldModel(models.Model): class ManyToManyFieldModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) test = models.ManyToManyField( TestModel, related_name="m2m_test_ref", @@ -184,8 +184,8 @@ class FancyDescriptor: def __get__(self, instance, owner): length = instance.__dict__[self.field.name] if length is None: - return '' - return 'a' * length + return "" + return "a" * length def __set__(self, obj, value): if isinstance(value, int): @@ -198,7 +198,7 @@ class FancyDescriptor: class FancyField(models.PositiveIntegerField): def __init__(self, *args, **kwargs): - kwargs.setdefault('default', '') + kwargs.setdefault("default", "") super().__init__(*args, **kwargs) def contribute_to_class(self, cls, name): @@ -222,41 +222,41 @@ class DescriptorModel(models.Model): class MultitableModelA(models.Model): - titlea = models.CharField(gettext_lazy('title a'), max_length=255) + titlea = models.CharField(gettext_lazy("title a"), max_length=255) class MultitableModelB(MultitableModelA): - titleb = models.CharField(gettext_lazy('title b'), max_length=255) + titleb = models.CharField(gettext_lazy("title b"), max_length=255) class MultitableModelC(MultitableModelB): - titlec = models.CharField(gettext_lazy('title c'), max_length=255) + titlec = models.CharField(gettext_lazy("title c"), max_length=255) class MultitableModelD(MultitableModelB): - titled = models.CharField(gettext_lazy('title d'), max_length=255) + titled = models.CharField(gettext_lazy("title d"), max_length=255) # ######### Abstract inheritance testing class AbstractModelA(models.Model): - titlea = models.CharField(gettext_lazy('title a'), max_length=255) + titlea = models.CharField(gettext_lazy("title a"), max_length=255) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.titlea = 'title_a' + self.titlea = "title_a" class Meta: abstract = True class AbstractModelB(AbstractModelA): - titleb = models.CharField(gettext_lazy('title b'), max_length=255) + titleb = models.CharField(gettext_lazy("title b"), max_length=255) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.titleb = 'title_b' + self.titleb = "title_b" # ######### Fields inheritance testing @@ -341,12 +341,12 @@ class FilteredManager(MultilingualManager): class FilteredTestModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) objects = FilteredManager() class ForeignKeyFilteredModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) test = models.ForeignKey( FilteredTestModel, null=True, @@ -356,28 +356,28 @@ class ForeignKeyFilteredModel(models.Model): class ManagerTestModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) - visits = models.IntegerField(gettext_lazy('visits'), default=0) + title = models.CharField(gettext_lazy("title"), max_length=255) + visits = models.IntegerField(gettext_lazy("visits"), default=0) description = models.CharField(max_length=255, null=True) class Meta: - ordering = ('-visits',) + ordering = ("-visits",) class CustomManager(models.Manager): def get_queryset(self): - return super().get_queryset().filter(title__contains='a').exclude(description__contains='x') + return super().get_queryset().filter(title__contains="a").exclude(description__contains="x") def custom_qs(self): return super().get_queryset() def foo(self): - return 'bar' + return "bar" class CustomManagerTestModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) - description = models.CharField(max_length=255, null=True, db_column='xyz') + title = models.CharField(gettext_lazy("title"), max_length=255) + description = models.CharField(max_length=255, null=True, db_column="xyz") objects = CustomManager() another_mgr_name = CustomManager() @@ -393,7 +393,7 @@ class CustomManager2(models.Manager): class CustomManager2TestModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) objects = CustomManager2() @@ -412,13 +412,13 @@ class CustomManagerBaseModel(models.Model): class CustomManagerChildTestModel(CustomManagerBaseModel): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) objects = CustomManager2() class PlainChildTestModel(CustomManagerBaseModel): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) # ######### Required fields testing @@ -435,7 +435,7 @@ class RequiredModel(models.Model): class ConflictModel(models.Model): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) title_de = models.IntegerField() @@ -447,7 +447,7 @@ class AbstractConflictModelA(models.Model): class AbstractConflictModelB(AbstractConflictModelA): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) class MultitableConflictModelA(models.Model): @@ -455,7 +455,7 @@ class MultitableConflictModelA(models.Model): class MultitableConflictModelB(MultitableConflictModelA): - title = models.CharField(gettext_lazy('title'), max_length=255) + title = models.CharField(gettext_lazy("title"), max_length=255) # ######### Complex M2M with abstract classes and custom managers @@ -488,8 +488,8 @@ class ModelX(AbstractModelX): class AbstractModelXY(models.Model): - model_x = models.ForeignKey('ModelX', on_delete=models.CASCADE) - model_y = models.ForeignKey('ModelY', on_delete=models.CASCADE) + model_x = models.ForeignKey("ModelX", on_delete=models.CASCADE) + model_y = models.ForeignKey("ModelY", on_delete=models.CASCADE) class Meta: abstract = True @@ -505,7 +505,7 @@ class CustomManagerY(models.Manager): class AbstractModelY(models.Model): title = models.CharField(max_length=255) - xs = models.ManyToManyField('ModelX', through='ModelXY') + xs = models.ManyToManyField("ModelX", through="ModelXY") objects = CustomManagerY() class Meta: diff --git a/modeltranslation/tests/project_translation.py b/modeltranslation/tests/project_translation.py index b468cbf..96d3ae0 100644 --- a/modeltranslation/tests/project_translation.py +++ b/modeltranslation/tests/project_translation.py @@ -4,7 +4,7 @@ from .test_app.models import Other class OtherTranslationOptions(TranslationOptions): - fields = ('name',) + fields = ("name",) translator.register(Other, OtherTranslationOptions) diff --git a/modeltranslation/tests/settings.py b/modeltranslation/tests/settings.py index f7f693d..282e016 100644 --- a/modeltranslation/tests/settings.py +++ b/modeltranslation/tests/settings.py @@ -1,37 +1,37 @@ import os import warnings -warnings.simplefilter('always', DeprecationWarning) +warnings.simplefilter("always", DeprecationWarning) def _get_database_config(): - db = os.getenv('DB', 'sqlite') - host = os.getenv('DB_HOST', 'localhost') + db = os.getenv("DB", "sqlite") + host = os.getenv("DB_HOST", "localhost") conf = { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': ':memory:', - 'TEST': { - 'SERIALIZE': False, + "ENGINE": "django.db.backends.sqlite3", + "NAME": ":memory:", + "TEST": { + "SERIALIZE": False, }, } - if db == 'mysql': + if db == "mysql": conf.update( { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': os.getenv('MYSQL_DATABASE', 'modeltranslation'), - 'USER': os.getenv('MYSQL_USER', 'root'), - 'PASSWORD': os.getenv('MYSQL_PASSWORD', 'password'), - 'HOST': host, + "ENGINE": "django.db.backends.mysql", + "NAME": os.getenv("MYSQL_DATABASE", "modeltranslation"), + "USER": os.getenv("MYSQL_USER", "root"), + "PASSWORD": os.getenv("MYSQL_PASSWORD", "password"), + "HOST": host, } ) - elif db == 'postgres': + elif db == "postgres": conf.update( { - 'ENGINE': 'django.db.backends.postgresql', - 'USER': os.getenv('POSTGRES_USER', 'postgres'), - 'PASSWORD': os.getenv('POSTGRES_PASSWORD', 'postgres'), - 'NAME': os.getenv('POSTGRES_DB', 'modeltranslation'), - 'HOST': host, + "ENGINE": "django.db.backends.postgresql", + "USER": os.getenv("POSTGRES_USER", "postgres"), + "PASSWORD": os.getenv("POSTGRES_PASSWORD", "postgres"), + "NAME": os.getenv("POSTGRES_DB", "modeltranslation"), + "HOST": host, } ) return conf @@ -40,23 +40,23 @@ def _get_database_config(): DATABASES = {"default": _get_database_config()} INSTALLED_APPS = ( - 'django.contrib.contenttypes', - 'django.contrib.auth', - 'modeltranslation', - 'modeltranslation.tests', + "django.contrib.contenttypes", + "django.contrib.auth", + "modeltranslation", + "modeltranslation.tests", ) -LANGUAGES = (('de', 'Deutsch'), ('en', 'English')) -LANGUAGE_CODE = 'de' +LANGUAGES = (("de", "Deutsch"), ("en", "English")) +LANGUAGE_CODE = "de" USE_I18N = True USE_TZ = False MIDDLEWARE_CLASSES = () -MODELTRANSLATION_DEFAULT_LANGUAGE = 'de' +MODELTRANSLATION_DEFAULT_LANGUAGE = "de" MODELTRANSLATION_AUTO_POPULATE = False MODELTRANSLATION_FALLBACK_LANGUAGES = () -ROOT_URLCONF = 'modeltranslation.tests.urls' +ROOT_URLCONF = "modeltranslation.tests.urls" -DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' +DEFAULT_AUTO_FIELD = "django.db.models.AutoField" diff --git a/modeltranslation/tests/test_app/models.py b/modeltranslation/tests/test_app/models.py index 51441ea..01970ca 100644 --- a/modeltranslation/tests/test_app/models.py +++ b/modeltranslation/tests/test_app/models.py @@ -3,7 +3,7 @@ from django.db import models class News(models.Model): class Meta: - app_label = 'test_app' + app_label = "test_app" title = models.CharField(max_length=50) visits = models.SmallIntegerField(blank=True, null=True) @@ -11,6 +11,6 @@ class News(models.Model): class Other(models.Model): class Meta: - app_label = 'test_app' + app_label = "test_app" name = models.CharField(max_length=50) diff --git a/modeltranslation/tests/test_app/translation.py b/modeltranslation/tests/test_app/translation.py index 87a3226..e01cc20 100644 --- a/modeltranslation/tests/test_app/translation.py +++ b/modeltranslation/tests/test_app/translation.py @@ -4,7 +4,7 @@ from .models import News class NewsTranslationOptions(TranslationOptions): - fields = ('title',) + fields = ("title",) translator.register(News, NewsTranslationOptions) diff --git a/modeltranslation/tests/tests.py b/modeltranslation/tests/tests.py index 7b82912..3adab40 100644 --- a/modeltranslation/tests/tests.py +++ b/modeltranslation/tests/tests.py @@ -75,7 +75,7 @@ def get_field_names(model): continue names.add(field.name) - if hasattr(field, 'attname'): + if hasattr(field, "attname"): names.add(field.attname) return names @@ -117,7 +117,7 @@ class ModeltranslationTransactionTestBase(TransactionTestCase): def setUp(self): super().setUp() self._old_language = get_language() - trans_real.activate('de') + trans_real.activate("de") def tearDown(self): super().tearDown() @@ -137,7 +137,7 @@ class TestAutodiscover(ModeltranslationTestBase): def _pre_setup(self): super()._pre_setup() # Add test_app to INSTALLED_APPS - new_installed_apps = django_settings.INSTALLED_APPS + ('modeltranslation.tests.test_app',) + new_installed_apps = django_settings.INSTALLED_APPS + ("modeltranslation.tests.test_app",) self.__override = override_settings(INSTALLED_APPS=new_installed_apps) self.__override.enable() @@ -148,37 +148,37 @@ class TestAutodiscover(ModeltranslationTestBase): def tearDown(self): # Rollback model classes - del self.cache.all_models['test_app'] + del self.cache.all_models["test_app"] from .test_app import models importlib.reload(models) # Delete translation modules from import cache - sys.modules.pop('modeltranslation.tests.test_app.translation', None) - sys.modules.pop('modeltranslation.tests.project_translation', None) + sys.modules.pop("modeltranslation.tests.test_app.translation", None) + sys.modules.pop("modeltranslation.tests.project_translation", None) super().tearDown() def check_news(self): from .test_app.models import News fields = dir(News()) - assert 'title' in fields - assert 'title_en' in fields - assert 'title_de' in fields - assert 'visits' in fields - assert 'visits_en' not in fields - assert 'visits_de' not in fields + assert "title" in fields + assert "title_en" in fields + assert "title_de" in fields + assert "visits" in fields + assert "visits_en" not in fields + assert "visits_de" not in fields def check_other(self, present=True): from .test_app.models import Other fields = dir(Other()) - assert 'name' in fields + assert "name" in fields if present: - assert 'name_en' in fields - assert 'name_de' in fields + assert "name_en" in fields + assert "name_de" in fields else: - assert 'name_en' not in fields - assert 'name_de' not in fields + assert "name_en" not in fields + assert "name_de" not in fields def test_simple(self): """Check if translation is imported for installed apps.""" @@ -187,7 +187,7 @@ class TestAutodiscover(ModeltranslationTestBase): self.check_other(present=False) @reload_override_settings( - MODELTRANSLATION_TRANSLATION_FILES=('modeltranslation.tests.project_translation',) + MODELTRANSLATION_TRANSLATION_FILES=("modeltranslation.tests.project_translation",) ) def test_global(self): """Check if translation is imported for global translation file.""" @@ -196,7 +196,7 @@ class TestAutodiscover(ModeltranslationTestBase): self.check_other() @reload_override_settings( - MODELTRANSLATION_TRANSLATION_FILES=('modeltranslation.tests.test_app.translation',) + MODELTRANSLATION_TRANSLATION_FILES=("modeltranslation.tests.test_app.translation",) ) def test_duplication(self): """Check if there is no problem with duplicated filenames.""" @@ -211,8 +211,8 @@ class ModeltranslationTest(ModeltranslationTestBase): langs = tuple(val for val, label in django_settings.LANGUAGES) assert langs == tuple(mt_settings.AVAILABLE_LANGUAGES) assert 2 == len(langs) - assert 'de' in langs - assert 'en' in langs + assert "de" in langs + assert "en" in langs assert translator.translator # Check that all models are registered for translation @@ -241,16 +241,16 @@ class ModeltranslationTest(ModeltranslationTestBase): # Exception should be raised when conflicting field name detected with pytest.raises(ValueError): - translator.translator.register(models.ConflictModel, fields=('title',)) + translator.translator.register(models.ConflictModel, fields=("title",)) with pytest.raises(ValueError): translator.translator.register( models.AbstractConflictModelB, - fields=('title',), + fields=("title",), ) with pytest.raises(ValueError): translator.translator.register( models.MultitableConflictModelB, - fields=('title',), + fields=("title",), ) # Model should not be registered @@ -258,35 +258,35 @@ class ModeltranslationTest(ModeltranslationTestBase): def test_fields(self): field_names = dir(models.TestModel()) - assert 'id' in field_names - assert 'title' in field_names - assert 'title_de' in field_names - assert 'title_en' in field_names - assert 'text' in field_names - assert 'text_de' in field_names - assert 'text_en' in field_names - assert 'url' in field_names - assert 'url_de' in field_names - assert 'url_en' in field_names - assert 'email' in field_names - assert 'email_de' in field_names - assert 'email_en' in field_names + assert "id" in field_names + assert "title" in field_names + assert "title_de" in field_names + assert "title_en" in field_names + assert "text" in field_names + assert "text_de" in field_names + assert "text_en" in field_names + assert "url" in field_names + assert "url_de" in field_names + assert "url_en" in field_names + assert "email" in field_names + assert "email_de" in field_names + assert "email_en" in field_names def test_verbose_name(self): - verbose_name = models.TestModel._meta.get_field('title_de').verbose_name - assert verbose_name == 'title [de]' + verbose_name = models.TestModel._meta.get_field("title_de").verbose_name + assert verbose_name == "title [de]" def test_descriptor_introspection(self): # See Django #8248 assert isinstance( models.TestModel.title.__doc__, str - ), 'Descriptor accessed on class should return itself.' + ), "Descriptor accessed on class should return itself." def test_fields_hashes(self): opts = models.TestModel._meta - orig = opts.get_field('title') - en = opts.get_field('title_en') - de = opts.get_field('title_de') + orig = opts.get_field("title") + en = opts.get_field("title_en") + de = opts.get_field("title_de") # Translation field retain creation_counters assert orig.creation_counter == en.creation_counter assert orig.creation_counter == de.creation_counter @@ -300,16 +300,16 @@ class ModeltranslationTest(ModeltranslationTestBase): assert hash(en) != hash(de) assert 3 == len({orig, en, de}) # TranslationFields can compare equal if they have the same language - de.language = 'en' + de.language = "en" assert orig != de assert en == de assert hash(en) == hash(de) assert 2 == len({orig, en, de}) - de.language = 'de' + de.language = "de" def test_set_translation(self): """This test briefly shows main modeltranslation features.""" - assert get_language() == 'de' + assert get_language() == "de" title_de = "title de" title_en = "title en" @@ -321,7 +321,7 @@ class ModeltranslationTest(ModeltranslationTestBase): assert inst2.title_de == title_de # So creating object is language-aware - with override('en'): + with override("en"): inst2 = models.TestModel(title=title_en) assert inst2.title == title_en assert inst2.title_en == title_en @@ -330,23 +330,23 @@ class ModeltranslationTest(ModeltranslationTestBase): # Value from original field is presented in current language: inst2 = models.TestModel(title_de=title_de, title_en=title_en) assert inst2.title == title_de - with override('en'): + with override("en"): assert inst2.title == title_en # Changes made via original field affect current language field: - inst2.title = 'foo' - assert inst2.title == 'foo' + inst2.title = "foo" + assert inst2.title == "foo" assert inst2.title_en == title_en - assert inst2.title_de == 'foo' - with override('en'): - inst2.title = 'bar' - assert inst2.title == 'bar' - assert inst2.title_en == 'bar' - assert inst2.title_de == 'foo' - assert inst2.title == 'foo' + assert inst2.title_de == "foo" + with override("en"): + inst2.title = "bar" + assert inst2.title == "bar" + assert inst2.title_en == "bar" + assert inst2.title_de == "foo" + assert inst2.title == "foo" # When conflict, language field wins with original field - inst2 = models.TestModel(title='foo', title_de=title_de, title_en=title_en) + inst2 = models.TestModel(title="foo", title_de=title_de, title_en=title_en) assert inst2.title == title_de assert inst2.title_en == title_en assert inst2.title_de == title_de @@ -354,7 +354,7 @@ class ModeltranslationTest(ModeltranslationTestBase): # Creating model and assigning only one language inst1 = models.TestModel(title_en=title_en) # Please note: '' and not None, because descriptor falls back to field default value - assert inst1.title == '' + assert inst1.title == "" assert inst1.title_en == title_en assert inst1.title_de is None # Assign current language value - de @@ -374,12 +374,12 @@ class ModeltranslationTest(ModeltranslationTestBase): # Queries are also language-aware: assert 1 == models.TestModel.objects.filter(title=title_de).count() - with override('en'): + with override("en"): assert 0 == models.TestModel.objects.filter(title=title_de).count() def test_fallback_language(self): # Present what happens if current language field is empty - assert get_language() == 'de' + assert get_language() == "de" title_de = "title de" # Create model with value in de only... @@ -390,8 +390,8 @@ class ModeltranslationTest(ModeltranslationTestBase): # In this test environment, fallback language is not set. So return value for en # will be field's default: '' - with override('en'): - assert inst2.title == '' + with override("en"): + assert inst2.title == "" assert inst2.title_en is None # Language field access returns real value # However, by default FALLBACK_LANGUAGES is set to DEFAULT_LANGUAGE @@ -400,7 +400,7 @@ class ModeltranslationTest(ModeltranslationTestBase): assert inst2.title == title_de # ... but for empty en fall back to de - with override('en'): + with override("en"): assert inst2.title == title_de assert inst2.title_en is None # Still real value @@ -429,8 +429,8 @@ class ModeltranslationTest(ModeltranslationTestBase): n.save() n = models.FallbackModel2.objects.get(title=title1_de) trans_real.activate("en") - assert n.title == '' # Falling back to default field value - assert n.text == translation.FallbackModel2TranslationOptions.fallback_values['text'] + assert n.title == "" # Falling back to default field value + assert n.text == translation.FallbackModel2TranslationOptions.fallback_values["text"] def _compare_instances(self, x, y, field): assert getattr(x, field) == getattr(y, field), "Constructor diff on field %s." % field @@ -451,60 +451,60 @@ class ModeltranslationTest(ModeltranslationTestBase): # test different arguments compositions keywords = dict( # original only - title='title', + title="title", # both languages + original - email='q@q.qq', - email_de='d@d.dd', - email_en='e@e.ee', + email="q@q.qq", + email_de="d@d.dd", + email_en="e@e.ee", # both languages without original - text_en='text en', - text_de='text de', + text_en="text en", + text_de="text de", ) self._test_constructor(keywords) keywords = dict( # only current language - title_de='title', + title_de="title", # only not current language - url_en='http://www.google.com', + url_en="http://www.google.com", # original + current - text='text def', - text_de='text de', + text="text def", + text_de="text de", # original + not current - email='q@q.qq', - email_en='e@e.ee', + email="q@q.qq", + email_en="e@e.ee", ) self._test_constructor(keywords) @parameterized.expand( [ - ({'title': 'DE'}, ['title'], {'title': 'DE', 'title_de': 'DE', 'title_en': None}), - ({'title_de': 'DE'}, ['title'], {'title': 'DE', 'title_de': 'DE', 'title_en': None}), - ({'title': 'DE'}, ['title_de'], {'title': 'old', 'title_de': 'DE', 'title_en': None}), + ({"title": "DE"}, ["title"], {"title": "DE", "title_de": "DE", "title_en": None}), + ({"title_de": "DE"}, ["title"], {"title": "DE", "title_de": "DE", "title_en": None}), + ({"title": "DE"}, ["title_de"], {"title": "old", "title_de": "DE", "title_en": None}), ( - {'title_de': 'DE'}, - ['title_de'], - {'title': 'old', 'title_de': 'DE', 'title_en': None}, + {"title_de": "DE"}, + ["title_de"], + {"title": "old", "title_de": "DE", "title_en": None}, ), ( - {'title': 'DE', 'title_en': 'EN'}, - ['title', 'title_en'], - {'title': 'DE', 'title_de': 'DE', 'title_en': 'EN'}, + {"title": "DE", "title_en": "EN"}, + ["title", "title_en"], + {"title": "DE", "title_de": "DE", "title_en": "EN"}, ), ( - {'title_de': 'DE', 'title_en': 'EN'}, - ['title_de', 'title_en'], - {'title': 'old', 'title_de': 'DE', 'title_en': 'EN'}, + {"title_de": "DE", "title_en": "EN"}, + ["title_de", "title_en"], + {"title": "old", "title_de": "DE", "title_en": "EN"}, ), ( - {'title_de': 'DE', 'title_en': 'EN'}, - ['title', 'title_de', 'title_en'], - {'title': 'DE', 'title_de': 'DE', 'title_en': 'EN'}, + {"title_de": "DE", "title_en": "EN"}, + ["title", "title_de", "title_en"], + {"title": "DE", "title_de": "DE", "title_en": "EN"}, ), ] ) def test_save_original_translation_field(self, field_values, update_fields, expected_db_values): - obj = models.TestModel.objects.create(title='old') + obj = models.TestModel.objects.create(title="old") for field, value in field_values.items(): setattr(obj, field, value) @@ -514,34 +514,34 @@ class ModeltranslationTest(ModeltranslationTestBase): @parameterized.expand( [ - ({'title': 'EN'}, ['title'], {'title': 'EN', 'title_de': None, 'title_en': 'EN'}), - ({'title_en': 'EN'}, ['title'], {'title': 'EN', 'title_de': None, 'title_en': 'EN'}), - ({'title': 'EN'}, ['title_en'], {'title': 'old', 'title_de': None, 'title_en': 'EN'}), + ({"title": "EN"}, ["title"], {"title": "EN", "title_de": None, "title_en": "EN"}), + ({"title_en": "EN"}, ["title"], {"title": "EN", "title_de": None, "title_en": "EN"}), + ({"title": "EN"}, ["title_en"], {"title": "old", "title_de": None, "title_en": "EN"}), ( - {'title_en': 'EN'}, - ['title_en'], - {'title': 'old', 'title_de': None, 'title_en': 'EN'}, + {"title_en": "EN"}, + ["title_en"], + {"title": "old", "title_de": None, "title_en": "EN"}, ), ( - {'title': 'EN', 'title_de': 'DE'}, - ['title', 'title_de'], - {'title': 'EN', 'title_de': 'DE', 'title_en': 'EN'}, + {"title": "EN", "title_de": "DE"}, + ["title", "title_de"], + {"title": "EN", "title_de": "DE", "title_en": "EN"}, ), ( - {'title_de': 'DE', 'title_en': 'EN'}, - ['title_de', 'title_en'], - {'title': 'old', 'title_de': 'DE', 'title_en': 'EN'}, + {"title_de": "DE", "title_en": "EN"}, + ["title_de", "title_en"], + {"title": "old", "title_de": "DE", "title_en": "EN"}, ), ( - {'title_de': 'DE', 'title_en': 'EN'}, - ['title', 'title_de', 'title_en'], - {'title': 'EN', 'title_de': 'DE', 'title_en': 'EN'}, + {"title_de": "DE", "title_en": "EN"}, + ["title", "title_de", "title_en"], + {"title": "EN", "title_de": "DE", "title_en": "EN"}, ), ] ) def test_save_active_translation_field(self, field_values, update_fields, expected_db_values): - with override('en'): - obj = models.TestModel.objects.create(title='old') + with override("en"): + obj = models.TestModel.objects.create(title="old") for field, value in field_values.items(): setattr(obj, field, value) @@ -550,82 +550,82 @@ class ModeltranslationTest(ModeltranslationTestBase): assert_db_record(obj, **expected_db_values) def test_save_non_original_translation_field(self): - obj = models.TestModel.objects.create(title='old') + obj = models.TestModel.objects.create(title="old") - obj.title_en = 'en value' - obj.save(update_fields=['title']) - assert_db_record(obj, title='old', title_de='old', title_en=None) + obj.title_en = "en value" + obj.save(update_fields=["title"]) + assert_db_record(obj, title="old", title_de="old", title_en=None) - obj.save(update_fields=['title_en']) - assert_db_record(obj, title='old', title_de='old', title_en='en value') + obj.save(update_fields=["title_en"]) + assert_db_record(obj, title="old", title_de="old", title_en="en value") def test_update_or_create_existing(self): """ Test that update_or_create works as expected """ - obj = models.TestModel.objects.create(title_de='old de', title_en='old en') + obj = models.TestModel.objects.create(title_de="old de", title_en="old en") instance, created = models.TestModel.objects.update_or_create( - pk=obj.pk, defaults={'title': 'NEW DE TITLE'} + pk=obj.pk, defaults={"title": "NEW DE TITLE"} ) assert created is False - assert instance.title == 'NEW DE TITLE' - assert instance.title_en == 'old en' - assert instance.title_de == 'NEW DE TITLE' + assert instance.title == "NEW DE TITLE" + assert instance.title_en == "old en" + assert instance.title_de == "NEW DE TITLE" assert_db_record( instance, - title='NEW DE TITLE', - title_en='old en', - title_de='NEW DE TITLE', + title="NEW DE TITLE", + title_en="old en", + title_de="NEW DE TITLE", ) instance, created = models.TestModel.objects.update_or_create( - pk=obj.pk, defaults={'title_de': 'NEW DE TITLE 2'} + pk=obj.pk, defaults={"title_de": "NEW DE TITLE 2"} ) assert created is False - assert instance.title == 'NEW DE TITLE 2' - assert instance.title_en == 'old en' - assert instance.title_de == 'NEW DE TITLE 2' + assert instance.title == "NEW DE TITLE 2" + assert instance.title_en == "old en" + assert instance.title_de == "NEW DE TITLE 2" assert_db_record( instance, # title='NEW DE TITLE', # TODO: django < 4.2 doesn't pass `"title"` into `.save(update_fields)` - title_en='old en', - title_de='NEW DE TITLE 2', + title_en="old en", + title_de="NEW DE TITLE 2", ) - with override('en'): + with override("en"): instance, created = models.TestModel.objects.update_or_create( - pk=obj.pk, defaults={'title': 'NEW EN TITLE'} + pk=obj.pk, defaults={"title": "NEW EN TITLE"} ) assert created is False - assert instance.title == 'NEW EN TITLE' - assert instance.title_en == 'NEW EN TITLE' - assert instance.title_de == 'NEW DE TITLE 2' + assert instance.title == "NEW EN TITLE" + assert instance.title_en == "NEW EN TITLE" + assert instance.title_de == "NEW DE TITLE 2" assert_db_record( instance, - title='NEW EN TITLE', - title_en='NEW EN TITLE', - title_de='NEW DE TITLE 2', + title="NEW EN TITLE", + title_en="NEW EN TITLE", + title_de="NEW DE TITLE 2", ) def test_update_or_create_new(self): instance, created = models.TestModel.objects.update_or_create( pk=1, - defaults={'title_de': 'old de', 'title_en': 'old en'}, + defaults={"title_de": "old de", "title_en": "old en"}, ) assert created is True - assert instance.title == 'old de' - assert instance.title_en == 'old en' - assert instance.title_de == 'old de' + assert instance.title == "old de" + assert instance.title_en == "old en" + assert instance.title_de == "old de" assert_db_record( instance, - title='old de', - title_en='old en', - title_de='old de', + title="old de", + title_en="old en", + title_de="old de", ) def test_callable_field_default_uses_field_language(self): @@ -648,9 +648,9 @@ class ModeltranslationTest(ModeltranslationTestBase): assert instance.dynamic_default_de == "Passwort" assert_db_record( instance, - dynamic_default='Passwort', - dynamic_default_en='password', - dynamic_default_de='Passwort', + dynamic_default="Passwort", + dynamic_default_en="password", + dynamic_default_de="Passwort", ) @@ -663,30 +663,30 @@ class ModeltranslationTransactionTest(ModeltranslationTransactionTestBase): models.UniqueNullableModel.objects.create(title=None) models.UniqueNullableModel.objects.create(title=None) - models.UniqueNullableModel.objects.create(title='') + models.UniqueNullableModel.objects.create(title="") with pytest.raises(IntegrityError): - models.UniqueNullableModel.objects.create(title='') + models.UniqueNullableModel.objects.create(title="") transaction.rollback() # Postgres - models.UniqueNullableModel.objects.create(title='foo') + models.UniqueNullableModel.objects.create(title="foo") with pytest.raises(IntegrityError): - models.UniqueNullableModel.objects.create(title='foo') + models.UniqueNullableModel.objects.create(title="foo") transaction.rollback() # Postgres class FallbackTests(ModeltranslationTestBase): - test_fallback = {'default': ('de',), 'de': ('en',)} + test_fallback = {"default": ("de",), "de": ("en",)} def test_settings(self): # Initial - assert mt_settings.FALLBACK_LANGUAGES == {'default': ()} + assert mt_settings.FALLBACK_LANGUAGES == {"default": ()} # Tuple/list - with reload_override_settings(MODELTRANSLATION_FALLBACK_LANGUAGES=('de',)): - assert mt_settings.FALLBACK_LANGUAGES == {'default': ('de',)} + with reload_override_settings(MODELTRANSLATION_FALLBACK_LANGUAGES=("de",)): + assert mt_settings.FALLBACK_LANGUAGES == {"default": ("de",)} # Whole dict with reload_override_settings(MODELTRANSLATION_FALLBACK_LANGUAGES=self.test_fallback): assert mt_settings.FALLBACK_LANGUAGES == self.test_fallback # Improper language raises error - config = {'default': (), 'fr': ('en',)} + config = {"default": (), "fr": ("en",)} with override_settings(MODELTRANSLATION_FALLBACK_LANGUAGES=config): with pytest.raises(ImproperlyConfigured): importlib.reload(mt_settings) @@ -696,67 +696,67 @@ class FallbackTests(ModeltranslationTestBase): from modeltranslation.utils import resolution_order with reload_override_settings(MODELTRANSLATION_FALLBACK_LANGUAGES=self.test_fallback): - assert ('en', 'de') == resolution_order('en') - assert ('de', 'en') == resolution_order('de') + assert ("en", "de") == resolution_order("en") + assert ("de", "en") == resolution_order("de") # Overriding - config = {'default': ()} - assert ('en',) == resolution_order('en', config) - assert ('de', 'en') == resolution_order('de', config) + config = {"default": ()} + assert ("en",) == resolution_order("en", config) + assert ("de", "en") == resolution_order("de", config) # Uniqueness - config = {'de': ('en', 'de')} - assert ('en', 'de') == resolution_order('en', config) - assert ('de', 'en') == resolution_order('de', config) + config = {"de": ("en", "de")} + assert ("en", "de") == resolution_order("en", config) + assert ("de", "en") == resolution_order("de", config) # Default fallbacks are always used at the end # That's it: fallbacks specified for a language don't replace defaults, # but just are prepended - config = {'default': ('en', 'de'), 'de': ()} - assert ('en', 'de') == resolution_order('en', config) - assert ('de', 'en') == resolution_order('de', config) + config = {"default": ("en", "de"), "de": ()} + assert ("en", "de") == resolution_order("en", config) + assert ("de", "en") == resolution_order("de", config) # What one may have expected - assert ('de',) != resolution_order('de', config) + assert ("de",) != resolution_order("de", config) # To completely override settings, one should override all keys - config = {'default': (), 'de': ()} - assert ('en',) == resolution_order('en', config) - assert ('de',) == resolution_order('de', config) + config = {"default": (), "de": ()} + assert ("en",) == resolution_order("en", config) + assert ("de",) == resolution_order("de", config) def test_fallback_languages(self): with reload_override_settings(MODELTRANSLATION_FALLBACK_LANGUAGES=self.test_fallback): - title_de = 'title de' - title_en = 'title en' + title_de = "title de" + title_en = "title en" n = models.TestModel(title=title_de) assert n.title_de == title_de assert n.title_en is None assert n.title == title_de - trans_real.activate('en') + trans_real.activate("en") assert n.title == title_de # since default fallback is de n = models.TestModel(title=title_en) assert n.title_de is None assert n.title_en == title_en assert n.title == title_en - trans_real.activate('de') + trans_real.activate("de") assert n.title == title_en # since fallback for de is en n.title_en = None - assert n.title == '' # if all fallbacks fail, return field.get_default() + assert n.title == "" # if all fallbacks fail, return field.get_default() def test_fallbacks_toggle(self): with reload_override_settings(MODELTRANSLATION_FALLBACK_LANGUAGES=self.test_fallback): - m = models.TestModel(title='foo') + m = models.TestModel(title="foo") with fallbacks(True): - assert m.title_de == 'foo' + assert m.title_de == "foo" assert m.title_en is None - assert m.title == 'foo' - with override('en'): - assert m.title == 'foo' + assert m.title == "foo" + with override("en"): + assert m.title == "foo" with fallbacks(False): - assert m.title_de == 'foo' + assert m.title_de == "foo" assert m.title_en is None - assert m.title == 'foo' - with override('en'): - assert m.title == '' # '' is the default + assert m.title == "foo" + with override("en"): + assert m.title == "" # '' is the default def test_fallback_undefined(self): """ @@ -765,61 +765,61 @@ class FallbackTests(ModeltranslationTestBase): """ with reload_override_settings(MODELTRANSLATION_FALLBACK_LANGUAGES=self.test_fallback): # Non-nullable CharField falls back on empty strings. - m = models.FallbackModel(title_en='value', title_de='') - with override('en'): - assert m.title == 'value' - with override('de'): - assert m.title == 'value' + m = models.FallbackModel(title_en="value", title_de="") + with override("en"): + assert m.title == "value" + with override("de"): + assert m.title == "value" # Nullable CharField does not fall back on empty strings. - m = models.FallbackModel(description_en='value', description_de='') - with override('en'): - assert m.description == 'value' - with override('de'): - assert m.description == '' + m = models.FallbackModel(description_en="value", description_de="") + with override("en"): + assert m.description == "value" + with override("de"): + assert m.description == "" # Nullable CharField does fall back on None. - m = models.FallbackModel(description_en='value', description_de=None) - with override('en'): - assert m.description == 'value' - with override('de'): - assert m.description == 'value' + m = models.FallbackModel(description_en="value", description_de=None) + with override("en"): + assert m.description == "value" + with override("de"): + assert m.description == "value" # The undefined value may be overridden. - m = models.FallbackModel2(title_en='value', title_de='') - with override('en'): - assert m.title == 'value' - with override('de'): - assert m.title == '' - m = models.FallbackModel2(title_en='value', title_de='no title') - with override('en'): - assert m.title == 'value' - with override('de'): - assert m.title == 'value' + m = models.FallbackModel2(title_en="value", title_de="") + with override("en"): + assert m.title == "value" + with override("de"): + assert m.title == "" + m = models.FallbackModel2(title_en="value", title_de="no title") + with override("en"): + assert m.title == "value" + with override("de"): + assert m.title == "value" class FileFieldsTest(ModeltranslationTestBase): def tearDown(self): - if default_storage.exists('modeltranslation_tests'): + if default_storage.exists("modeltranslation_tests"): # With FileSystemStorage uploading files creates a new directory, # that's not automatically removed upon their deletion. - tests_dir = default_storage.path('modeltranslation_tests') + tests_dir = default_storage.path("modeltranslation_tests") if os.path.isdir(tests_dir): shutil.rmtree(tests_dir) super().tearDown() def test_translated_models(self): field_names = dir(models.FileFieldsModel()) - assert 'id' in field_names - assert 'title' in field_names - assert 'title_de' in field_names - assert 'title_en' in field_names - assert 'file' in field_names - assert 'file_de' in field_names - assert 'file_en' in field_names - assert 'image' in field_names - assert 'image_de' in field_names - assert 'image_en' in field_names + assert "id" in field_names + assert "title" in field_names + assert "title_de" in field_names + assert "title_en" in field_names + assert "file" in field_names + assert "file_de" in field_names + assert "file_en" in field_names + assert "image" in field_names + assert "image_de" in field_names + assert "image_en" in field_names def _file_factory(self, name, content): try: @@ -833,25 +833,25 @@ class FileFieldsTest(ModeltranslationTestBase): inst = models.FileFieldsModel(title="Testtitle") trans_real.activate("en") - inst.title = 'title_en' - inst.file = 'a_en' - inst.file.save('b_en', ContentFile('file in english')) - inst.image = self._file_factory('i_en.jpg', 'image in english') # Direct assign + inst.title = "title_en" + inst.file = "a_en" + inst.file.save("b_en", ContentFile("file in english")) + inst.image = self._file_factory("i_en.jpg", "image in english") # Direct assign trans_real.activate("de") - inst.title = 'title_de' - inst.file = 'a_de' - inst.file.save('b_de', ContentFile('file in german')) - inst.image = self._file_factory('i_de.jpg', 'image in german') + inst.title = "title_de" + inst.file = "a_de" + inst.file.save("b_de", ContentFile("file in german")) + inst.image = self._file_factory("i_de.jpg", "image in german") inst.save() trans_real.activate("en") - assert inst.title == 'title_en' - assert inst.file.name.count('b_en') > 0 - assert inst.file.read() == b'file in english' - assert inst.image.name.count('i_en') > 0 - assert inst.image.read() == b'image in english' + assert inst.title == "title_en" + assert inst.file.name.count("b_en") > 0 + assert inst.file.read() == b"file in english" + assert inst.image.name.count("i_en") > 0 + assert inst.image.read() == b"image in english" # Check if file was actually created in the global storage. assert default_storage.exists(inst.file.path) @@ -860,11 +860,11 @@ class FileFieldsTest(ModeltranslationTestBase): assert inst.image.size > 0 trans_real.activate("de") - assert inst.title == 'title_de' - assert inst.file.name.count('b_de') > 0 - assert inst.file.read() == b'file in german' - assert inst.image.name.count('i_de') > 0 - assert inst.image.read() == b'image in german' + assert inst.title == "title_de" + assert inst.file.name.count("b_de") > 0 + assert inst.file.read() == b"file in german" + assert inst.image.name.count("i_de") > 0 + assert inst.image.read() == b"image in german" inst.file_en.delete() inst.image_en.delete() @@ -885,23 +885,23 @@ class FileFieldsTest(ModeltranslationTestBase): def test_fallback(self): from django.db.models.fields.files import FieldFile - with reload_override_settings(MODELTRANSLATION_FALLBACK_LANGUAGES=('en',)): - assert get_language() == 'de' + with reload_override_settings(MODELTRANSLATION_FALLBACK_LANGUAGES=("en",)): + assert get_language() == "de" inst = models.FileFieldsModel() - inst.file_de = '' - inst.file_en = 'foo' - inst.file2_de = '' - inst.file2_en = 'bar' + inst.file_de = "" + inst.file_en = "foo" + inst.file2_de = "" + inst.file2_en = "bar" assert isinstance(inst.file, FieldFile) assert isinstance(inst.file2, FieldFile) - assert inst.file.name == 'foo' - assert inst.file2.name == 'bar' + assert inst.file.name == "foo" + assert inst.file2.name == "bar" inst.save() inst = models.FileFieldsModel.objects.all()[0] assert isinstance(inst.file, FieldFile) assert isinstance(inst.file2, FieldFile) - assert inst.file.name == 'foo' - assert inst.file2.name == 'bar' + assert inst.file.name == "foo" + assert inst.file2.name == "bar" class ForeignKeyFieldsTest(ModeltranslationTestBase): @@ -914,31 +914,31 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): def test_translated_models(self): field_names = dir(self.model()) - assert 'id' in field_names - for f in ('test', 'test_de', 'test_en', 'optional', 'optional_en', 'optional_de'): + assert "id" in field_names + for f in ("test", "test_de", "test_en", "optional", "optional_en", "optional_de"): assert f in field_names - assert '%s_id' % f in field_names + assert "%s_id" % f in field_names def test_db_column_names(self): meta = self.model._meta # Make sure the correct database columns always get used: - attname, col = meta.get_field('test').get_attname_column() - assert attname == 'test_id' + attname, col = meta.get_field("test").get_attname_column() + assert attname == "test_id" assert attname == col - attname, col = meta.get_field('test_en').get_attname_column() - assert attname == 'test_en_id' + attname, col = meta.get_field("test_en").get_attname_column() + assert attname == "test_en_id" assert attname == col - attname, col = meta.get_field('test_de').get_attname_column() - assert attname == 'test_de_id' + attname, col = meta.get_field("test_de").get_attname_column() + assert attname == "test_de_id" assert attname == col def test_translated_models_instance(self): - test_inst1 = models.TestModel(title_en='title1_en', title_de='title1_de') + test_inst1 = models.TestModel(title_en="title1_en", title_de="title1_de") test_inst1.save() - test_inst2 = models.TestModel(title_en='title2_en', title_de='title2_de') + test_inst2 = models.TestModel(title_en="title2_en", title_de="title2_de") test_inst2.save() inst = self.model() @@ -953,9 +953,9 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): trans_real.activate("de") assert inst.test_id == test_inst1.pk - assert inst.test.title == 'title1_de' + assert inst.test.title == "title1_de" assert inst.test_de_id == test_inst1.pk - assert inst.test_de.title == 'title1_de' + assert inst.test_de.title == "title1_de" assert inst.optional is None # Test fallbacks: @@ -963,13 +963,13 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): with default_fallback(): assert inst.test_id == test_inst1.pk assert inst.test.pk == test_inst1.pk - assert inst.test.title == 'title1_en' + assert inst.test.title == "title1_en" # Test English: assert inst.optional_id == test_inst2.pk - assert inst.optional.title == 'title2_en' + assert inst.optional.title == "title2_en" assert inst.optional_en_id == test_inst2.pk - assert inst.optional_en.title == 'title2_en' + assert inst.optional_en.title == "title2_en" # Test caching inst.test_en = test_inst2 @@ -988,9 +988,9 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): assert manager.filter(test=test_inst2).count() == 0 assert manager.filter(test_en=test_inst2).count() == 1 assert manager.filter(test_de=test_inst2).count() == 0 - assert manager.filter(test__title='title1_de').count() == 1 - assert manager.filter(test__title='title1_en').count() == 0 - assert manager.filter(test__title_en='title1_en').count() == 1 + assert manager.filter(test__title="title1_de").count() == 1 + assert manager.filter(test__title="title1_en").count() == 0 + assert manager.filter(test__title_en="title1_en").count() == 1 trans_real.activate("en") assert manager.filter(test=test_inst1).count() == 0 assert manager.filter(test_en=test_inst1).count() == 0 @@ -998,24 +998,24 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): assert manager.filter(test=test_inst2).count() == 1 assert manager.filter(test_en=test_inst2).count() == 1 assert manager.filter(test_de=test_inst2).count() == 0 - assert manager.filter(test__title='title2_en').count() == 1 - assert manager.filter(test__title='title2_de').count() == 0 - assert manager.filter(test__title_de='title2_de').count() == 1 + assert manager.filter(test__title="title2_en").count() == 1 + assert manager.filter(test__title="title2_de").count() == 0 + assert manager.filter(test__title_de="title2_de").count() == 1 def test_reverse_relations(self): - test_inst = models.TestModel(title_en='title_en', title_de='title_de') + test_inst = models.TestModel(title_en="title_en", title_de="title_de") test_inst.save() # Instantiate many 'ForeignKeyModel' instances: fk_inst_both = self.model( - title_en='f_title_en', title_de='f_title_de', test_de=test_inst, test_en=test_inst + title_en="f_title_en", title_de="f_title_de", test_de=test_inst, test_en=test_inst ) fk_inst_both.save() fk_inst_de = self.model( - title_en='f_title_en', title_de='f_title_de', test_de_id=test_inst.pk + title_en="f_title_en", title_de="f_title_de", test_de_id=test_inst.pk ) fk_inst_de.save() - fk_inst_en = self.model(title_en='f_title_en', title_de='f_title_de', test_en=test_inst) + fk_inst_en = self.model(title_en="f_title_en", title_de="f_title_de", test_en=test_inst) fk_inst_en.save() fk_option_de = self.model.objects.create(optional_de=test_inst) @@ -1025,19 +1025,19 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): # Explicit related_name testmodel_fields = get_field_names(models.TestModel) testmodel_methods = dir(models.TestModel) - assert 'test_fks' in testmodel_fields - assert 'test_fks_de' in testmodel_fields - assert 'test_fks_en' in testmodel_fields - assert 'test_fks' in testmodel_methods - assert 'test_fks_de' in testmodel_methods - assert 'test_fks_en' in testmodel_methods + assert "test_fks" in testmodel_fields + assert "test_fks_de" in testmodel_fields + assert "test_fks_en" in testmodel_fields + assert "test_fks" in testmodel_methods + assert "test_fks_de" in testmodel_methods + assert "test_fks_en" in testmodel_methods # Implicit related_name: manager descriptor name != query field name - assert 'foreignkeymodel' in testmodel_fields - assert 'foreignkeymodel_de' in testmodel_fields - assert 'foreignkeymodel_en' in testmodel_fields - assert 'foreignkeymodel_set' in testmodel_methods - assert 'foreignkeymodel_set_de' in testmodel_methods - assert 'foreignkeymodel_set_en' in testmodel_methods + assert "foreignkeymodel" in testmodel_fields + assert "foreignkeymodel_de" in testmodel_fields + assert "foreignkeymodel_en" in testmodel_fields + assert "foreignkeymodel_set" in testmodel_methods + assert "foreignkeymodel_set_de" in testmodel_methods + assert "foreignkeymodel_set_en" in testmodel_methods # Check the German reverse accessor: assert fk_inst_both in test_inst.test_fks_de.all() @@ -1072,9 +1072,9 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): assert manager.filter(foreignkeymodel=fk_option_de).count() == 1 assert manager.filter(foreignkeymodel=fk_option_en).count() == 0 assert manager.filter(foreignkeymodel_en=fk_option_en).count() == 1 - assert manager.filter(test_fks__title='f_title_de').distinct().count() == 1 - assert manager.filter(test_fks__title='f_title_en').distinct().count() == 0 - assert manager.filter(test_fks__title_en='f_title_en').distinct().count() == 1 + assert manager.filter(test_fks__title="f_title_de").distinct().count() == 1 + assert manager.filter(test_fks__title="f_title_en").distinct().count() == 0 + assert manager.filter(test_fks__title_en="f_title_en").distinct().count() == 1 trans_real.activate("en") assert manager.filter(test_fks=fk_inst_both).count() == 1 assert manager.filter(test_fks=fk_inst_en).count() == 1 @@ -1084,13 +1084,13 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): assert manager.filter(foreignkeymodel=fk_option_en).count() == 1 assert manager.filter(foreignkeymodel=fk_option_de).count() == 0 assert manager.filter(foreignkeymodel_de=fk_option_de).count() == 1 - assert manager.filter(test_fks__title='f_title_en').distinct().count() == 1 - assert manager.filter(test_fks__title='f_title_de').distinct().count() == 0 - assert manager.filter(test_fks__title_de='f_title_de').distinct().count() == 1 + assert manager.filter(test_fks__title="f_title_en").distinct().count() == 1 + assert manager.filter(test_fks__title="f_title_de").distinct().count() == 0 + assert manager.filter(test_fks__title_de="f_title_de").distinct().count() == 1 # Check assignment trans_real.activate("de") - test_inst2 = models.TestModel(title_en='title_en', title_de='title_de') + test_inst2 = models.TestModel(title_en="title_en", title_de="title_de") test_inst2.save() test_inst2.test_fks.set((fk_inst_de, fk_inst_both)) test_inst2.test_fks_en.set((fk_inst_en, fk_inst_both)) @@ -1115,7 +1115,7 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): """ from modeltranslation.tests.models import FilteredManager - test_inst = models.FilteredTestModel(title_en='title_en', title_de='title_de') + test_inst = models.FilteredTestModel(title_en="title_en", title_de="title_de") test_inst.save() assert not models.FilteredTestModel.objects.all().exists() @@ -1124,7 +1124,7 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): # # create objects with relations to test_inst fk_inst = models.ForeignKeyFilteredModel( - test=test_inst, title_en='f_title_en', title_de='f_title_de' + test=test_inst, title_en="f_title_en", title_de="f_title_de" ) fk_inst.save() fk_inst.refresh_from_db() # force to reset cached values @@ -1134,11 +1134,11 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): assert fk_inst.test == test_inst def test_non_translated_relation(self): - non_de = models.NonTranslated.objects.create(title='title_de') - non_en = models.NonTranslated.objects.create(title='title_en') + non_de = models.NonTranslated.objects.create(title="title_de") + non_en = models.NonTranslated.objects.create(title="title_en") fk_inst_both = self.model.objects.create( - title_en='f_title_en', title_de='f_title_de', non_de=non_de, non_en=non_en + title_en="f_title_en", title_de="f_title_de", non_de=non_de, non_en=non_en ) fk_inst_de = self.model.objects.create(non_de=non_de) fk_inst_en = self.model.objects.create(non_en=non_en) @@ -1149,16 +1149,16 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): assert manager.filter(non=non_de).count() == 2 assert manager.filter(non=non_en).count() == 0 assert manager.filter(non_en=non_en).count() == 2 - assert manager.filter(non__title='title_de').count() == 2 - assert manager.filter(non__title='title_en').count() == 0 - assert manager.filter(non_en__title='title_en').count() == 2 + assert manager.filter(non__title="title_de").count() == 2 + assert manager.filter(non__title="title_en").count() == 0 + assert manager.filter(non_en__title="title_en").count() == 2 trans_real.activate("en") assert manager.filter(non=non_en).count() == 2 assert manager.filter(non=non_de).count() == 0 assert manager.filter(non_de=non_de).count() == 2 - assert manager.filter(non__title='title_en').count() == 2 - assert manager.filter(non__title='title_de').count() == 0 - assert manager.filter(non_de__title='title_de').count() == 2 + assert manager.filter(non__title="title_en").count() == 2 + assert manager.filter(non__title="title_de").count() == 0 + assert manager.filter(non_de__title="title_de").count() == 2 # Reverse relation + spanning manager = models.NonTranslated.objects @@ -1167,21 +1167,21 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): assert manager.filter(test_fks=fk_inst_de).count() == 1 assert manager.filter(test_fks=fk_inst_en).count() == 0 assert manager.filter(test_fks_en=fk_inst_en).count() == 1 - assert manager.filter(test_fks__title='f_title_de').count() == 1 - assert manager.filter(test_fks__title='f_title_en').count() == 0 - assert manager.filter(test_fks__title_en='f_title_en').count() == 1 + assert manager.filter(test_fks__title="f_title_de").count() == 1 + assert manager.filter(test_fks__title="f_title_en").count() == 0 + assert manager.filter(test_fks__title_en="f_title_en").count() == 1 trans_real.activate("en") assert manager.filter(test_fks=fk_inst_both).count() == 1 assert manager.filter(test_fks=fk_inst_en).count() == 1 assert manager.filter(test_fks=fk_inst_de).count() == 0 assert manager.filter(test_fks_de=fk_inst_de).count() == 1 - assert manager.filter(test_fks__title='f_title_en').count() == 1 - assert manager.filter(test_fks__title='f_title_de').count() == 0 - assert manager.filter(test_fks__title_de='f_title_de').count() == 1 + assert manager.filter(test_fks__title="f_title_en").count() == 1 + assert manager.filter(test_fks__title="f_title_de").count() == 0 + assert manager.filter(test_fks__title_de="f_title_de").count() == 1 def test_indonesian(self): - field = models.ForeignKeyModel._meta.get_field('test') - assert field.attname != build_localized_fieldname(field.name, 'id') + field = models.ForeignKeyModel._meta.get_field("test") + assert field.attname != build_localized_fieldname(field.name, "id") class ManyToManyFieldsTest(ModeltranslationTestBase): @@ -1194,67 +1194,67 @@ class ManyToManyFieldsTest(ModeltranslationTestBase): def test_translated_models(self): field_names = dir(self.model()) - assert 'id' in field_names - for f in ('test', 'test_de', 'test_en', 'self_call_1', 'self_call_1_en', 'self_call_1_de'): + assert "id" in field_names + for f in ("test", "test_de", "test_en", "self_call_1", "self_call_1_en", "self_call_1_de"): assert f in field_names def test_db_column_names(self): meta = self.model._meta # Make sure the correct database columns always get used: - field = meta.get_field('test') + field = meta.get_field("test") assert field.remote_field.through._meta.db_table == "tests_manytomanyfieldmodel_test" - field = meta.get_field('test_en') + field = meta.get_field("test_en") assert field.remote_field.through._meta.db_table == "tests_manytomanyfieldmodel_test_en" - field = meta.get_field('test_de') + field = meta.get_field("test_de") assert field.remote_field.through._meta.db_table == "tests_manytomanyfieldmodel_test_de" - field = meta.get_field('self_call_1') + field = meta.get_field("self_call_1") assert field.remote_field.through._meta.db_table == "tests_manytomanyfieldmodel_self_call_1" - field = meta.get_field('self_call_1_en') + field = meta.get_field("self_call_1_en") assert ( field.remote_field.through._meta.db_table == "tests_manytomanyfieldmodel_self_call_1_en" ) - field = meta.get_field('self_call_1_de') + field = meta.get_field("self_call_1_de") assert ( field.remote_field.through._meta.db_table == "tests_manytomanyfieldmodel_self_call_1_de" ) - field = meta.get_field('through_model') + field = meta.get_field("through_model") assert field.remote_field.through._meta.db_table == "tests_customthroughmodel" - field = meta.get_field('through_model_en') + field = meta.get_field("through_model_en") assert field.remote_field.through._meta.db_table == "tests_customthroughmodel_en" - field = meta.get_field('through_model_de') + field = meta.get_field("through_model_de") assert field.remote_field.through._meta.db_table == "tests_customthroughmodel_de" def test_translated_models_instance(self): models.TestModel.objects.bulk_create( - models.TestModel(title_en='m2m_test_%s_en' % i, title_de='m2m_test_%s_de' % i) + models.TestModel(title_en="m2m_test_%s_en" % i, title_de="m2m_test_%s_de" % i) for i in range(10) ) self.model.objects.bulk_create( - self.model(title_en='m2m_test_%s_en' % i, title_de='m2m_test_%s_de' % i) + self.model(title_en="m2m_test_%s_en" % i, title_de="m2m_test_%s_de" % i) for i in range(10) ) models.NonTranslated.objects.bulk_create( - models.NonTranslated(title='m2m_test_%s' % i) for i in range(10) + models.NonTranslated(title="m2m_test_%s" % i) for i in range(10) ) testmodel_qs = models.TestModel.objects.all() - testmodel_qs_1 = testmodel_qs.filter(title_en__in=['m2m_test_%s_en' % i for i in range(4)]) + testmodel_qs_1 = testmodel_qs.filter(title_en__in=["m2m_test_%s_en" % i for i in range(4)]) testmodel_qs_2 = testmodel_qs.filter( - title_en__in=['m2m_test_%s_en' % i for i in range(4, 10)] + title_en__in=["m2m_test_%s_en" % i for i in range(4, 10)] ) untranslated_qs = models.NonTranslated.objects.all() self_qs = self.model.objects.all() - self_qs_1 = self_qs.filter(title_en__in=['m2m_test_%s_en' % i for i in range(6)]) - self_qs_2 = self_qs.filter(title_en__in=['m2m_test_%s_en' % i for i in range(6, 10)]) + self_qs_1 = self_qs.filter(title_en__in=["m2m_test_%s_en" % i for i in range(6)]) + self_qs_2 = self_qs.filter(title_en__in=["m2m_test_%s_en" % i for i in range(6, 10)]) inst = self.model() inst.save() @@ -1273,8 +1273,8 @@ class ManyToManyFieldsTest(ModeltranslationTestBase): inst.trans_through_model.through.objects.bulk_create( ( inst.trans_through_model.through( - title_en='m2m_test_%s_en' % (i + 1), - title_de='m2m_test_%s_de' % (i + 1), + title_en="m2m_test_%s_en" % (i + 1), + title_de="m2m_test_%s_de" % (i + 1), rel_1_id=int(inst.pk), rel_2_id=tst_model.pk, ) @@ -1359,15 +1359,15 @@ class ManyToManyFieldsTest(ModeltranslationTestBase): def test_reverse_relations(self): models.TestModel.objects.bulk_create( - models.TestModel(title_en='m2m_test_%s_en' % i, title_de='m2m_test_%s_de' % i) + models.TestModel(title_en="m2m_test_%s_en" % i, title_de="m2m_test_%s_de" % i) for i in range(10) ) self.model.objects.bulk_create( - self.model(title_en='m2m_test_%s_en' % i, title_de='m2m_test_%s_de' % i) + self.model(title_en="m2m_test_%s_en" % i, title_de="m2m_test_%s_de" % i) for i in range(10) ) models.NonTranslated.objects.bulk_create( - models.NonTranslated(title='m2m_test_%s' % i) for i in range(10) + models.NonTranslated(title="m2m_test_%s" % i) for i in range(10) ) inst_both = self.model(title_en="inst_both_en", title_de="inst_both_de") inst_both.save() @@ -1386,19 +1386,19 @@ class ManyToManyFieldsTest(ModeltranslationTestBase): testmodel_fields = get_field_names(models.TestModel) testmodel_methods = dir(models.TestModel) - assert 'm2m_test_ref' in testmodel_fields - assert 'm2m_test_ref_de' in testmodel_fields - assert 'm2m_test_ref_en' in testmodel_fields - assert 'm2m_test_ref' in testmodel_methods - assert 'm2m_test_ref_de' in testmodel_methods - assert 'm2m_test_ref_en' in testmodel_methods + assert "m2m_test_ref" in testmodel_fields + assert "m2m_test_ref_de" in testmodel_fields + assert "m2m_test_ref_en" in testmodel_fields + assert "m2m_test_ref" in testmodel_methods + assert "m2m_test_ref_de" in testmodel_methods + assert "m2m_test_ref_en" in testmodel_methods # Implicit related_name: manager descriptor name != query field name - assert 'customthroughmodel' in testmodel_fields - assert 'customthroughmodel_en' in testmodel_fields - assert 'customthroughmodel_de' in testmodel_fields - assert 'manytomanyfieldmodel_set' in testmodel_methods - assert 'manytomanyfieldmodel_en_set' in testmodel_methods - assert 'manytomanyfieldmodel_de_set' in testmodel_methods + assert "customthroughmodel" in testmodel_fields + assert "customthroughmodel_en" in testmodel_fields + assert "customthroughmodel_de" in testmodel_fields + assert "manytomanyfieldmodel_set" in testmodel_methods + assert "manytomanyfieldmodel_en_set" in testmodel_methods + assert "manytomanyfieldmodel_de_set" in testmodel_methods test_inst = models.TestModel.objects.first() # Check the German reverse accessor: @@ -1434,10 +1434,10 @@ class ManyToManyFieldsTest(ModeltranslationTestBase): assert manager.filter(m2m_test_ref_en__in=[inst_en]).count() == 10 assert manager.filter(manytomanyfieldmodel__in=[inst_en]).count() == 0 assert manager.filter(manytomanyfieldmodel_en__in=[inst_en]).count() == 10 - assert manager.filter(m2m_test_ref__title='inst_de_de').distinct().count() == 10 - assert manager.filter(m2m_test_ref__title='inst_de_en').distinct().count() == 0 - assert manager.filter(m2m_test_ref__title_en='inst_de_en').distinct().count() == 10 - assert manager.filter(m2m_test_ref_en__title='inst_en_de').distinct().count() == 10 + assert manager.filter(m2m_test_ref__title="inst_de_de").distinct().count() == 10 + assert manager.filter(m2m_test_ref__title="inst_de_en").distinct().count() == 0 + assert manager.filter(m2m_test_ref__title_en="inst_de_en").distinct().count() == 10 + assert manager.filter(m2m_test_ref_en__title="inst_en_de").distinct().count() == 10 trans_real.activate("en") assert manager.filter(m2m_test_ref__in=[inst_both]).count() == 10 @@ -1448,10 +1448,10 @@ class ManyToManyFieldsTest(ModeltranslationTestBase): assert manager.filter(manytomanyfieldmodel__in=[inst_en]).count() == 10 assert manager.filter(manytomanyfieldmodel__in=[inst_de]).count() == 0 assert manager.filter(manytomanyfieldmodel_de__in=[inst_de]).count() == 0 - assert manager.filter(m2m_test_ref__title='inst_en_en').distinct().count() == 10 - assert manager.filter(m2m_test_ref__title='inst_en_de').distinct().count() == 0 - assert manager.filter(m2m_test_ref__title_de='inst_en_de').distinct().count() == 10 - assert manager.filter(m2m_test_ref_de__title='inst_de_en').distinct().count() == 10 + assert manager.filter(m2m_test_ref__title="inst_en_en").distinct().count() == 10 + assert manager.filter(m2m_test_ref__title="inst_en_de").distinct().count() == 0 + assert manager.filter(m2m_test_ref__title_de="inst_en_de").distinct().count() == 10 + assert manager.filter(m2m_test_ref_de__title="inst_de_en").distinct().count() == 10 class OneToOneFieldsTest(ForeignKeyFieldsTest): @@ -1463,7 +1463,7 @@ class OneToOneFieldsTest(ForeignKeyFieldsTest): cls.model = models.OneToOneFieldModel def test_uniqueness(self): - test_inst1 = models.TestModel(title_en='title1_en', title_de='title1_de') + test_inst1 = models.TestModel(title_en="title1_en", title_de="title1_de") test_inst1.save() inst = self.model() @@ -1481,15 +1481,15 @@ class OneToOneFieldsTest(ForeignKeyFieldsTest): inst2.save() def test_reverse_relations(self): - test_inst = models.TestModel(title_en='title_en', title_de='title_de') + test_inst = models.TestModel(title_en="title_en", title_de="title_de") test_inst.save() # Instantiate many 'OneToOneFieldModel' instances: fk_inst_de = self.model( - title_en='f_title_en', title_de='f_title_de', test_de_id=test_inst.pk + title_en="f_title_en", title_de="f_title_de", test_de_id=test_inst.pk ) fk_inst_de.save() - fk_inst_en = self.model(title_en='f_title_en', title_de='f_title_de', test_en=test_inst) + fk_inst_en = self.model(title_en="f_title_en", title_de="f_title_de", test_en=test_inst) fk_inst_en.save() fk_option_de = self.model.objects.create(optional_de=test_inst) @@ -1499,19 +1499,19 @@ class OneToOneFieldsTest(ForeignKeyFieldsTest): # Explicit related_name testmodel_fields = get_field_names(models.TestModel) testmodel_methods = dir(models.TestModel) - assert 'test_o2o' in testmodel_fields - assert 'test_o2o_de' in testmodel_fields - assert 'test_o2o_en' in testmodel_fields - assert 'test_o2o' in testmodel_methods - assert 'test_o2o_de' in testmodel_methods - assert 'test_o2o_en' in testmodel_methods + assert "test_o2o" in testmodel_fields + assert "test_o2o_de" in testmodel_fields + assert "test_o2o_en" in testmodel_fields + assert "test_o2o" in testmodel_methods + assert "test_o2o_de" in testmodel_methods + assert "test_o2o_en" in testmodel_methods # Implicit related_name - assert 'onetoonefieldmodel' in testmodel_fields - assert 'onetoonefieldmodel_de' in testmodel_fields - assert 'onetoonefieldmodel_en' in testmodel_fields - assert 'onetoonefieldmodel' in testmodel_methods - assert 'onetoonefieldmodel_de' in testmodel_methods - assert 'onetoonefieldmodel_en' in testmodel_methods + assert "onetoonefieldmodel" in testmodel_fields + assert "onetoonefieldmodel_de" in testmodel_fields + assert "onetoonefieldmodel_en" in testmodel_fields + assert "onetoonefieldmodel" in testmodel_methods + assert "onetoonefieldmodel_de" in testmodel_methods + assert "onetoonefieldmodel_en" in testmodel_methods # Check the German reverse accessor: assert fk_inst_de == test_inst.test_o2o_de @@ -1538,9 +1538,9 @@ class OneToOneFieldsTest(ForeignKeyFieldsTest): assert manager.filter(onetoonefieldmodel=fk_option_de).count() == 1 assert manager.filter(onetoonefieldmodel=fk_option_en).count() == 0 assert manager.filter(onetoonefieldmodel_en=fk_option_en).count() == 1 - assert manager.filter(test_o2o__title='f_title_de').distinct().count() == 1 - assert manager.filter(test_o2o__title='f_title_en').distinct().count() == 0 - assert manager.filter(test_o2o__title_en='f_title_en').distinct().count() == 1 + assert manager.filter(test_o2o__title="f_title_de").distinct().count() == 1 + assert manager.filter(test_o2o__title="f_title_en").distinct().count() == 0 + assert manager.filter(test_o2o__title_en="f_title_en").distinct().count() == 1 trans_real.activate("en") assert manager.filter(test_o2o=fk_inst_en).count() == 1 assert manager.filter(test_o2o__id=fk_inst_en.pk).count() == 1 @@ -1549,13 +1549,13 @@ class OneToOneFieldsTest(ForeignKeyFieldsTest): assert manager.filter(onetoonefieldmodel=fk_option_en).count() == 1 assert manager.filter(onetoonefieldmodel=fk_option_de).count() == 0 assert manager.filter(onetoonefieldmodel_de=fk_option_de).count() == 1 - assert manager.filter(test_o2o__title='f_title_en').distinct().count() == 1 - assert manager.filter(test_o2o__title='f_title_de').distinct().count() == 0 - assert manager.filter(test_o2o__title_de='f_title_de').distinct().count() == 1 + assert manager.filter(test_o2o__title="f_title_en").distinct().count() == 1 + assert manager.filter(test_o2o__title="f_title_de").distinct().count() == 0 + assert manager.filter(test_o2o__title_de="f_title_de").distinct().count() == 1 # Check assignment trans_real.activate("de") - test_inst2 = models.TestModel(title_en='title_en', title_de='title_de') + test_inst2 = models.TestModel(title_en="title_en", title_de="title_de") test_inst2.save() test_inst2.test_o2o = fk_inst_de test_inst2.test_o2o_en = fk_inst_en @@ -1573,14 +1573,14 @@ class OneToOneFieldsTest(ForeignKeyFieldsTest): assert fk_inst_en == test_inst2.test_o2o def test_non_translated_relation(self): - non_de = models.NonTranslated.objects.create(title='title_de') - non_en = models.NonTranslated.objects.create(title='title_en') + non_de = models.NonTranslated.objects.create(title="title_de") + non_en = models.NonTranslated.objects.create(title="title_en") fk_inst_de = self.model.objects.create( - title_en='f_title_en', title_de='f_title_de', non_de=non_de + title_en="f_title_en", title_de="f_title_de", non_de=non_de ) fk_inst_en = self.model.objects.create( - title_en='f_title_en2', title_de='f_title_de2', non_en=non_en + title_en="f_title_en2", title_de="f_title_de2", non_en=non_en ) # Forward relation + spanning @@ -1589,16 +1589,16 @@ class OneToOneFieldsTest(ForeignKeyFieldsTest): assert manager.filter(non=non_de).count() == 1 assert manager.filter(non=non_en).count() == 0 assert manager.filter(non_en=non_en).count() == 1 - assert manager.filter(non__title='title_de').count() == 1 - assert manager.filter(non__title='title_en').count() == 0 - assert manager.filter(non_en__title='title_en').count() == 1 + assert manager.filter(non__title="title_de").count() == 1 + assert manager.filter(non__title="title_en").count() == 0 + assert manager.filter(non_en__title="title_en").count() == 1 trans_real.activate("en") assert manager.filter(non=non_en).count() == 1 assert manager.filter(non=non_de).count() == 0 assert manager.filter(non_de=non_de).count() == 1 - assert manager.filter(non__title='title_en').count() == 1 - assert manager.filter(non__title='title_de').count() == 0 - assert manager.filter(non_de__title='title_de').count() == 1 + assert manager.filter(non__title="title_en").count() == 1 + assert manager.filter(non__title="title_de").count() == 0 + assert manager.filter(non_de__title="title_de").count() == 1 # Reverse relation + spanning manager = models.NonTranslated.objects @@ -1606,47 +1606,47 @@ class OneToOneFieldsTest(ForeignKeyFieldsTest): assert manager.filter(test_o2o=fk_inst_de).count() == 1 assert manager.filter(test_o2o=fk_inst_en).count() == 0 assert manager.filter(test_o2o_en=fk_inst_en).count() == 1 - assert manager.filter(test_o2o__title='f_title_de').count() == 1 - assert manager.filter(test_o2o__title='f_title_en').count() == 0 - assert manager.filter(test_o2o__title_en='f_title_en').count() == 1 + assert manager.filter(test_o2o__title="f_title_de").count() == 1 + assert manager.filter(test_o2o__title="f_title_en").count() == 0 + assert manager.filter(test_o2o__title_en="f_title_en").count() == 1 trans_real.activate("en") assert manager.filter(test_o2o=fk_inst_en).count() == 1 assert manager.filter(test_o2o=fk_inst_de).count() == 0 assert manager.filter(test_o2o_de=fk_inst_de).count() == 1 - assert manager.filter(test_o2o__title='f_title_en2').count() == 1 - assert manager.filter(test_o2o__title='f_title_de2').count() == 0 - assert manager.filter(test_o2o__title_de='f_title_de2').count() == 1 + assert manager.filter(test_o2o__title="f_title_en2").count() == 1 + assert manager.filter(test_o2o__title="f_title_de2").count() == 0 + assert manager.filter(test_o2o__title_de="f_title_de2").count() == 1 class OtherFieldsTest(ModeltranslationTestBase): def test_translated_models(self): inst = models.OtherFieldsModel.objects.create() field_names = dir(inst) - assert 'id' in field_names - assert 'int' in field_names - assert 'int_de' in field_names - assert 'int_en' in field_names - assert 'boolean' in field_names - assert 'boolean_de' in field_names - assert 'boolean_en' in field_names - assert 'genericip' in field_names - assert 'genericip_de' in field_names - assert 'genericip_en' in field_names - assert 'float' in field_names - assert 'float_de' in field_names - assert 'float_en' in field_names - assert 'decimal' in field_names - assert 'decimal_de' in field_names - assert 'decimal_en' in field_names - assert 'json' in field_names - assert 'json_de' in field_names - assert 'json_en' in field_names + assert "id" in field_names + assert "int" in field_names + assert "int_de" in field_names + assert "int_en" in field_names + assert "boolean" in field_names + assert "boolean_de" in field_names + assert "boolean_en" in field_names + assert "genericip" in field_names + assert "genericip_de" in field_names + assert "genericip_en" in field_names + assert "float" in field_names + assert "float_de" in field_names + assert "float_en" in field_names + assert "decimal" in field_names + assert "decimal_de" in field_names + assert "decimal_en" in field_names + assert "json" in field_names + assert "json_de" in field_names + assert "json_en" in field_names inst.delete() def test_translated_models_integer_instance(self): inst = models.OtherFieldsModel() inst.int = 7 - assert 'de' == get_language() + assert "de" == get_language() assert 7 == inst.int assert 7 == inst.int_de assert 42 == inst.int_en # default value is honored @@ -1657,7 +1657,7 @@ class OtherFieldsTest(ModeltranslationTestBase): assert 9 == inst.int_de assert 42 == inst.int_en - trans_real.activate('en') + trans_real.activate("en") inst.int -= 1 assert 41 == inst.int assert 9 == inst.int_de @@ -1671,7 +1671,7 @@ class OtherFieldsTest(ModeltranslationTestBase): def test_translated_models_boolean_instance(self): inst = models.OtherFieldsModel() inst.boolean = True - assert 'de' == get_language() + assert "de" == get_language() assert inst.boolean is True assert inst.boolean_de is True assert inst.boolean_en is False @@ -1682,7 +1682,7 @@ class OtherFieldsTest(ModeltranslationTestBase): assert inst.boolean_de is False assert inst.boolean_en is False - trans_real.activate('en') + trans_real.activate("en") inst.boolean = True assert inst.boolean is True assert inst.boolean_de is False @@ -1690,33 +1690,33 @@ class OtherFieldsTest(ModeltranslationTestBase): def test_translated_models_genericipaddress_instance(self): inst = models.OtherFieldsModel() - inst.genericip = '2a02:42fe::4' - assert 'de' == get_language() - assert '2a02:42fe::4' == inst.genericip - assert '2a02:42fe::4' == inst.genericip_de + inst.genericip = "2a02:42fe::4" + assert "de" == get_language() + assert "2a02:42fe::4" == inst.genericip + assert "2a02:42fe::4" == inst.genericip_de assert inst.genericip_en is None - inst.genericip = '2a02:23fe::4' + inst.genericip = "2a02:23fe::4" inst.save() - assert '2a02:23fe::4' == inst.genericip - assert '2a02:23fe::4' == inst.genericip_de + assert "2a02:23fe::4" == inst.genericip + assert "2a02:23fe::4" == inst.genericip_de assert inst.genericip_en is None - trans_real.activate('en') - inst.genericip = '2a02:42fe::4' - assert '2a02:42fe::4' == inst.genericip - assert '2a02:23fe::4' == inst.genericip_de - assert '2a02:42fe::4' == inst.genericip_en + trans_real.activate("en") + inst.genericip = "2a02:42fe::4" + assert "2a02:42fe::4" == inst.genericip + assert "2a02:23fe::4" == inst.genericip_de + assert "2a02:42fe::4" == inst.genericip_en # Check if validation is preserved - inst.genericip = '1;2' + inst.genericip = "1;2" with pytest.raises(ValidationError): inst.full_clean() def test_translated_models_float_instance(self): inst = models.OtherFieldsModel() inst.float = 0.42 - assert 'de' == get_language() + assert "de" == get_language() assert 0.42 == inst.float assert 0.42 == inst.float_de assert inst.float_en is None @@ -1732,7 +1732,7 @@ class OtherFieldsTest(ModeltranslationTestBase): assert 0.31 == inst.float_de assert inst.float_en is None - trans_real.activate('en') + trans_real.activate("en") inst.float = 0.42 assert 0.42 == inst.float assert 0.31 == inst.float_de @@ -1740,34 +1740,34 @@ class OtherFieldsTest(ModeltranslationTestBase): def test_translated_models_decimal_instance(self): inst = models.OtherFieldsModel() - inst.decimal = Decimal('0.42') - assert 'de' == get_language() - assert Decimal('0.42') == inst.decimal - assert Decimal('0.42') == inst.decimal_de + inst.decimal = Decimal("0.42") + assert "de" == get_language() + assert Decimal("0.42") == inst.decimal + assert Decimal("0.42") == inst.decimal_de assert inst.decimal_en is None - inst.decimal = inst.decimal - Decimal('0.19') + inst.decimal = inst.decimal - Decimal("0.19") inst.save() - assert Decimal('0.23') == inst.decimal - assert Decimal('0.23') == inst.decimal_de + assert Decimal("0.23") == inst.decimal + assert Decimal("0.23") == inst.decimal_de assert inst.decimal_en is None - trans_real.activate('en') + trans_real.activate("en") with pytest.raises(TypeError): - inst.decimal + Decimal('0.19') + inst.decimal + Decimal("0.19") assert inst.decimal is None - assert Decimal('0.23') == inst.decimal_de + assert Decimal("0.23") == inst.decimal_de assert inst.decimal_en is None - inst.decimal = Decimal('0.42') - assert Decimal('0.42') == inst.decimal - assert Decimal('0.23') == inst.decimal_de - assert Decimal('0.42') == inst.decimal_en + inst.decimal = Decimal("0.42") + assert Decimal("0.42") == inst.decimal + assert Decimal("0.23") == inst.decimal_de + assert Decimal("0.42") == inst.decimal_en def test_translated_models_date_instance(self): inst = models.OtherFieldsModel() inst.date = datetime.date(2012, 12, 31) - assert 'de' == get_language() + assert "de" == get_language() assert datetime.date(2012, 12, 31) == inst.date assert datetime.date(2012, 12, 31) == inst.date_de assert inst.date_en is None @@ -1778,11 +1778,11 @@ class OtherFieldsTest(ModeltranslationTestBase): assert datetime.date(1999, 1, 1) == inst.date_de assert inst.date_en is None - qs = models.OtherFieldsModel.objects.filter(date='1999-1-1') + qs = models.OtherFieldsModel.objects.filter(date="1999-1-1") assert len(qs) == 1 assert qs[0].date == datetime.date(1999, 1, 1) - trans_real.activate('en') + trans_real.activate("en") inst.date = datetime.date(2012, 12, 31) assert datetime.date(2012, 12, 31) == inst.date assert datetime.date(1999, 1, 1) == inst.date_de @@ -1791,7 +1791,7 @@ class OtherFieldsTest(ModeltranslationTestBase): def test_translated_models_datetime_instance(self): inst = models.OtherFieldsModel() inst.datetime = datetime.datetime(2012, 12, 31, 23, 42) - assert 'de' == get_language() + assert "de" == get_language() assert datetime.datetime(2012, 12, 31, 23, 42) == inst.datetime assert datetime.datetime(2012, 12, 31, 23, 42) == inst.datetime_de assert inst.datetime_en is None @@ -1802,11 +1802,11 @@ class OtherFieldsTest(ModeltranslationTestBase): assert datetime.datetime(1999, 1, 1, 23, 42) == inst.datetime_de assert inst.datetime_en is None - qs = models.OtherFieldsModel.objects.filter(datetime='1999-1-1 23:42') + qs = models.OtherFieldsModel.objects.filter(datetime="1999-1-1 23:42") assert len(qs) == 1 assert qs[0].datetime == datetime.datetime(1999, 1, 1, 23, 42) - trans_real.activate('en') + trans_real.activate("en") inst.datetime = datetime.datetime(2012, 12, 31, 23, 42) assert datetime.datetime(2012, 12, 31, 23, 42) == inst.datetime assert datetime.datetime(1999, 1, 1, 23, 42) == inst.datetime_de @@ -1815,7 +1815,7 @@ class OtherFieldsTest(ModeltranslationTestBase): def test_translated_models_time_instance(self): inst = models.OtherFieldsModel() inst.time = datetime.time(23, 42, 0) - assert 'de' == get_language() + assert "de" == get_language() assert datetime.time(23, 42, 0) == inst.time assert datetime.time(23, 42, 0) == inst.time_de assert inst.time_en is None @@ -1826,11 +1826,11 @@ class OtherFieldsTest(ModeltranslationTestBase): assert datetime.time(1, 2, 3) == inst.time_de assert inst.time_en is None - qs = models.OtherFieldsModel.objects.filter(time='01:02:03') + qs = models.OtherFieldsModel.objects.filter(time="01:02:03") assert len(qs) == 1 assert qs[0].time == datetime.time(1, 2, 3) - trans_real.activate('en') + trans_real.activate("en") inst.time = datetime.time(23, 42, 0) assert datetime.time(23, 42, 0) == inst.time assert datetime.time(1, 2, 3) == inst.time_de @@ -1843,7 +1843,7 @@ class OtherFieldsTest(ModeltranslationTestBase): Model.objects.create(datetime=datetime.datetime(2014, 8, 3, 0, 0)) Model.objects.create(datetime=datetime.datetime(2013, 7, 4, 0, 0)) - qs = Model.objects.dates('datetime', 'year', 'DESC') + qs = Model.objects.dates("datetime", "year", "DESC") assert list(qs) == [ datetime.date(2015, 1, 1), @@ -1856,40 +1856,40 @@ class OtherFieldsTest(ModeltranslationTestBase): inst = models.DescriptorModel() # Demonstrate desired behaviour inst.normal = 2 - assert 'aa' == inst.normal - inst.normal = 'abc' - assert 'aaa' == inst.normal + assert "aa" == inst.normal + inst.normal = "abc" + assert "aaa" == inst.normal # Descriptor on translated field works too - assert 'de' == get_language() + assert "de" == get_language() inst.trans = 5 - assert 'aaaaa' == inst.trans + assert "aaaaa" == inst.trans inst.save() - db_values = models.DescriptorModel.objects.raw_values('normal', 'trans_en', 'trans_de')[0] - assert 3 == db_values['normal'] - assert 5 == db_values['trans_de'] - assert 0 == db_values['trans_en'] + db_values = models.DescriptorModel.objects.raw_values("normal", "trans_en", "trans_de")[0] + assert 3 == db_values["normal"] + assert 5 == db_values["trans_de"] + assert 0 == db_values["trans_en"] # Retrieval from db inst = models.DescriptorModel.objects.all()[0] - assert 'aaa' == inst.normal - assert 'aaaaa' == inst.trans - assert 'aaaaa' == inst.trans_de - assert '' == inst.trans_en + assert "aaa" == inst.normal + assert "aaaaa" == inst.trans + assert "aaaaa" == inst.trans_de + assert "" == inst.trans_en # Other language - trans_real.activate('en') - assert '' == inst.trans - inst.trans = 'q' - assert 'a' == inst.trans + trans_real.activate("en") + assert "" == inst.trans + inst.trans = "q" + assert "a" == inst.trans inst.trans_de = 4 - assert 'aaaa' == inst.trans_de + assert "aaaa" == inst.trans_de inst.save() - db_values = models.DescriptorModel.objects.raw_values('normal', 'trans_en', 'trans_de')[0] - assert 3 == db_values['normal'] - assert 4 == db_values['trans_de'] - assert 1 == db_values['trans_en'] + db_values = models.DescriptorModel.objects.raw_values("normal", "trans_en", "trans_de")[0] + assert 3 == db_values["normal"] + assert 4 == db_values["trans_de"] + assert 1 == db_values["trans_en"] class ModeltranslationTestRule1(ModeltranslationTestBase): @@ -1899,13 +1899,13 @@ class ModeltranslationTestRule1(ModeltranslationTestBase): """ def _test_field(self, field_name, value_de, value_en, deactivate=True): - field_name_de = '%s_de' % field_name - field_name_en = '%s_en' % field_name + field_name_de = "%s_de" % field_name + field_name_en = "%s_en" % field_name params = {field_name_de: value_de, field_name_en: value_en} n = models.TestModel.objects.create(**params) # Language is set to 'de' at this point - assert get_language() == 'de' + assert get_language() == "de" assert getattr(n, field_name) == value_de assert getattr(n, field_name_de) == value_de assert getattr(n, field_name_en) == value_en @@ -1925,8 +1925,8 @@ class ModeltranslationTestRule1(ModeltranslationTestBase): assert getattr(n, field_name) == value_en assert getattr(n, field_name_de) == value_de assert getattr(n, field_name_en) == value_en - trans_real.activate('de') - assert get_language() == 'de' + trans_real.activate("de") + assert get_language() == "de" assert getattr(n, field_name) == value_de if deactivate: @@ -1941,19 +1941,19 @@ class ModeltranslationTestRule1(ModeltranslationTestBase): text_de = "Dies ist ein deutscher Satz" text_en = "This is an english sentence" - self._test_field(field_name='title', value_de=title1_de, value_en=title1_en) - self._test_field(field_name='text', value_de=text_de, value_en=text_en) + self._test_field(field_name="title", value_de=title1_de, value_en=title1_en) + self._test_field(field_name="text", value_de=text_de, value_en=text_en) def test_rule1_url_field(self): self._test_field( - field_name='url', value_de='http://www.google.de', value_en='http://www.google.com' + field_name="url", value_de="http://www.google.de", value_en="http://www.google.com" ) def test_rule1_email_field(self): self._test_field( - field_name='email', - value_de='django-modeltranslation@googlecode.de', - value_en='django-modeltranslation@googlecode.com', + field_name="email", + value_de="django-modeltranslation@googlecode.de", + value_en="django-modeltranslation@googlecode.com", ) @@ -1964,11 +1964,11 @@ class ModeltranslationTestRule2(ModeltranslationTestBase): """ def _test_field(self, field_name, value1_de, value1_en, value2, value3, deactivate=True): - field_name_de = '%s_de' % field_name - field_name_en = '%s_en' % field_name + field_name_de = "%s_de" % field_name + field_name_en = "%s_en" % field_name params = {field_name_de: value1_de, field_name_en: value1_en} - assert get_language() == 'de' + assert get_language() == "de" n = models.TestModel.objects.create(**params) assert getattr(n, field_name) == value1_de assert getattr(n, field_name_de) == value1_de @@ -1998,29 +1998,29 @@ class ModeltranslationTestRule2(ModeltranslationTestBase): Basic CharField/TextField test. """ self._test_field( - field_name='title', - value1_de='title de', - value1_en='title en', - value2='Neuer Titel', - value3='new title', + field_name="title", + value1_de="title de", + value1_en="title en", + value2="Neuer Titel", + value3="new title", ) def test_rule2_url_field(self): self._test_field( - field_name='url', - value1_de='http://www.google.de', - value1_en='http://www.google.com', - value2='http://www.google.at', - value3='http://www.google.co.uk', + field_name="url", + value1_de="http://www.google.de", + value1_en="http://www.google.com", + value2="http://www.google.at", + value3="http://www.google.co.uk", ) def test_rule2_email_field(self): self._test_field( - field_name='email', - value1_de='django-modeltranslation@googlecode.de', - value1_en='django-modeltranslation@googlecode.com', - value2='django-modeltranslation@googlecode.at', - value3='django-modeltranslation@googlecode.co.uk', + field_name="email", + value1_de="django-modeltranslation@googlecode.de", + value1_en="django-modeltranslation@googlecode.com", + value2="django-modeltranslation@googlecode.at", + value3="django-modeltranslation@googlecode.co.uk", ) @@ -2032,23 +2032,23 @@ class ModeltranslationTestRule3(ModeltranslationTestBase): """ def test_rule3(self): - assert get_language() == 'de' - title = 'title de' + assert get_language() == "de" + title = "title de" # Normal behaviour - n = models.TestModel(title='foo') - assert n.title == 'foo' - assert n.title_de == 'foo' + n = models.TestModel(title="foo") + assert n.title == "foo" + assert n.title_de == "foo" assert n.title_en is None # constructor - n = models.TestModel(title_de=title, title='foo') + n = models.TestModel(title_de=title, title="foo") assert n.title == title assert n.title_de == title assert n.title_en is None # object.create - n = models.TestModel.objects.create(title_de=title, title='foo') + n = models.TestModel.objects.create(title_de=title, title="foo") assert n.title == title assert n.title_de == title assert n.title_en is None @@ -2062,9 +2062,9 @@ class ModeltranslationTestRule3(ModeltranslationTestBase): # This is not subject to Rule 3, because updates are not *at the ame time* n = models.TestModel() n.title_de = title - n.title = 'foo' - assert n.title == 'foo' - assert n.title_de == 'foo' + n.title = "foo" + assert n.title == "foo" + assert n.title_de == "foo" assert n.title_en is None @staticmethod @@ -2077,9 +2077,9 @@ class ModeltranslationTestRule3(ModeltranslationTestBase): def test_rule3_internals(self): # Rule 3 work because translation fields are added to model field list # later than original field. - original = models.TestModel._meta.get_field('title') - translated_de = models.TestModel._meta.get_field('title_de') - translated_en = models.TestModel._meta.get_field('title_en') + original = models.TestModel._meta.get_field("title") + translated_de = models.TestModel._meta.get_field("title_de") + translated_en = models.TestModel._meta.get_field("title_en") fields = models.TestModel._meta.fields # Here we cannot use simple list.index, because Field has overloaded __cmp__ assert self._index(fields, original) < self._index(fields, translated_de) @@ -2096,16 +2096,16 @@ class ModelValidationTest(ModeltranslationTestBase): func() except ValidationError as e: return e.message_dict - self.fail('ValidationError not raised.') + self.fail("ValidationError not raised.") def _test_model_validation(self, field_name, invalid_value, valid_value): """ Generic model field validation test. """ - field_name_de = '%s_de' % field_name - field_name_en = '%s_en' % field_name + field_name_de = "%s_de" % field_name + field_name_en = "%s_en" % field_name # Title need to be passed here - otherwise it would not validate - params = {'title_de': 'title de', 'title_en': 'title en', field_name: invalid_value} + params = {"title_de": "title de", "title_en": "title en", field_name: invalid_value} n = models.TestModel.objects.create(**params) @@ -2116,7 +2116,7 @@ class ModelValidationTest(ModeltranslationTestBase): # Set translation field to a valid value # Language is set to 'de' at this point - assert get_language() == 'de' + assert get_language() == "de" setattr(n, field_name_de, valid_value) n.full_clean() @@ -2127,7 +2127,7 @@ class ModelValidationTest(ModeltranslationTestBase): assert field_name_en in errors # When language is changed to en, the original field also doesn't validate - with override('en'): + with override("en"): setattr(n, field_name_en, invalid_value) errors = self.assertRaisesValidation(n.full_clean) assert field_name in errors @@ -2146,27 +2146,27 @@ class ModelValidationTest(ModeltranslationTestBase): General test for CharField: if required/blank is handled properly. """ # Create an object without title (which is required) - n = models.TestModel.objects.create(text='Testtext') + n = models.TestModel.objects.create(text="Testtext") # First check the original field # Expect that the validation object contains an error for title errors = self.assertRaisesValidation(n.full_clean) - assert 'title' in errors + assert "title" in errors n.save() # Check the translation field # Language is set to 'de' at this point - assert get_language() == 'de' + assert get_language() == "de" # Set translation field to a valid title - n.title_de = 'Title' + n.title_de = "Title" n.full_clean() # Change language to en # Now validation fails, because current language (en) title is empty # So requirement validation depends on current language - with override('en'): + with override("en"): errors = self.assertRaisesValidation(n.full_clean) - assert 'title' in errors + assert "title" in errors # However, with fallback language (most cases), it validates (because empty title # falls back to title_de): @@ -2180,21 +2180,21 @@ class ModelValidationTest(ModeltranslationTestBase): # object contains no error for title_de. # However, title still raises error, since it points to empty title_de errors = self.assertRaisesValidation(n.full_clean) - assert 'title_de' not in errors - assert 'title' in errors + assert "title_de" not in errors + assert "title" in errors def test_model_validation_url_field(self): self._test_model_validation( - field_name='url', - invalid_value='foo en', - valid_value='http://code.google.com/p/django-modeltranslation/', + field_name="url", + invalid_value="foo en", + valid_value="http://code.google.com/p/django-modeltranslation/", ) def test_model_validation_email_field(self): self._test_model_validation( - field_name='email', - invalid_value='foo en', - valid_value='django-modeltranslation@googlecode.com', + field_name="email", + invalid_value="foo en", + valid_value="django-modeltranslation@googlecode.com", ) @@ -2203,49 +2203,49 @@ class ModelInheritanceTest(ModeltranslationTestBase): def test_abstract_inheritance(self): field_names_b = get_field_names(models.AbstractModelB) - assert 'titlea' in field_names_b - assert 'titlea_de' in field_names_b - assert 'titlea_en' in field_names_b - assert 'titleb' in field_names_b - assert 'titleb_de' in field_names_b - assert 'titleb_en' in field_names_b - assert 'titled' not in field_names_b - assert 'titled_de' not in field_names_b - assert 'titled_en' not in field_names_b + assert "titlea" in field_names_b + assert "titlea_de" in field_names_b + assert "titlea_en" in field_names_b + assert "titleb" in field_names_b + assert "titleb_de" in field_names_b + assert "titleb_en" in field_names_b + assert "titled" not in field_names_b + assert "titled_de" not in field_names_b + assert "titled_en" not in field_names_b def test_multitable_inheritance(self): field_names_a = get_field_names(models.MultitableModelA) - assert 'titlea' in field_names_a - assert 'titlea_de' in field_names_a - assert 'titlea_en' in field_names_a + assert "titlea" in field_names_a + assert "titlea_de" in field_names_a + assert "titlea_en" in field_names_a field_names_b = get_field_names(models.MultitableModelB) - assert 'titlea' in field_names_b - assert 'titlea_de' in field_names_b - assert 'titlea_en' in field_names_b - assert 'titleb' in field_names_b - assert 'titleb_de' in field_names_b - assert 'titleb_en' in field_names_b + assert "titlea" in field_names_b + assert "titlea_de" in field_names_b + assert "titlea_en" in field_names_b + assert "titleb" in field_names_b + assert "titleb_de" in field_names_b + assert "titleb_en" in field_names_b field_names_c = get_field_names(models.MultitableModelC) - assert 'titlea' in field_names_c - assert 'titlea_de' in field_names_c - assert 'titlea_en' in field_names_c - assert 'titleb' in field_names_c - assert 'titleb_de' in field_names_c - assert 'titleb_en' in field_names_c - assert 'titlec' in field_names_c - assert 'titlec_de' in field_names_c - assert 'titlec_en' in field_names_c + assert "titlea" in field_names_c + assert "titlea_de" in field_names_c + assert "titlea_en" in field_names_c + assert "titleb" in field_names_c + assert "titleb_de" in field_names_c + assert "titleb_en" in field_names_c + assert "titlec" in field_names_c + assert "titlec_de" in field_names_c + assert "titlec_en" in field_names_c field_names_d = get_field_names(models.MultitableModelD) - assert 'titlea' in field_names_d - assert 'titlea_de' in field_names_d - assert 'titlea_en' in field_names_d - assert 'titleb' in field_names_d - assert 'titleb_de' in field_names_d - assert 'titleb_en' in field_names_d - assert 'titled' in field_names_d + assert "titlea" in field_names_d + assert "titlea_de" in field_names_d + assert "titlea_en" in field_names_d + assert "titleb" in field_names_d + assert "titleb_de" in field_names_d + assert "titleb_en" in field_names_d + assert "titled" in field_names_d def test_inheritance(self): def assertLocalFields(model, local_fields): @@ -2271,45 +2271,45 @@ class ModelInheritanceTest(ModeltranslationTestBase): assert translation_field in model_fields # Translation fields can be declared on abstract classes. - assertLocalFields(models.Slugged, ('slug',)) - assertLocalFields(models.MetaData, ('keywords',)) - assertLocalFields(models.RichText, ('content',)) + assertLocalFields(models.Slugged, ("slug",)) + assertLocalFields(models.MetaData, ("keywords",)) + assertLocalFields(models.RichText, ("content",)) # Local fields are inherited from abstract superclasses. assertLocalFields( models.Displayable, ( - 'slug', - 'keywords', + "slug", + "keywords", ), ) assertLocalFields( models.Page, ( - 'slug', - 'keywords', - 'title', + "slug", + "keywords", + "title", ), ) # But not from concrete superclasses. - assertLocalFields(models.RichTextPage, ('content',)) + assertLocalFields(models.RichTextPage, ("content",)) # Fields inherited from concrete models are also available. - assertFields(models.Slugged, ('slug',)) + assertFields(models.Slugged, ("slug",)) assertFields( models.Page, ( - 'slug', - 'keywords', - 'title', + "slug", + "keywords", + "title", ), ) assertFields( models.RichTextPage, ( - 'slug', - 'keywords', - 'title', - 'content', + "slug", + "keywords", + "title", + "content", ), ) @@ -2322,19 +2322,19 @@ class ModelInheritanceFieldAggregationTest(ModeltranslationTestBase): def test_field_aggregation(self): clsb = translation.FieldInheritanceCTranslationOptions - assert 'titlea' in clsb.fields - assert 'titleb' in clsb.fields - assert 'titlec' in clsb.fields + assert "titlea" in clsb.fields + assert "titleb" in clsb.fields + assert "titlec" in clsb.fields assert 3 == len(clsb.fields) assert isinstance(clsb.fields, tuple) def test_multi_inheritance(self): clsb = translation.FieldInheritanceETranslationOptions - assert 'titlea' in clsb.fields - assert 'titleb' in clsb.fields - assert 'titlec' in clsb.fields - assert 'titled' in clsb.fields - assert 'titlee' in clsb.fields + assert "titlea" in clsb.fields + assert "titleb" in clsb.fields + assert "titlec" in clsb.fields + assert "titled" in clsb.fields + assert "titlee" in clsb.fields assert 5 == len(clsb.fields) # there are no repetitions @@ -2344,72 +2344,72 @@ class UpdateCommandTest(ModeltranslationTestBase): # fixtures loader doesn't use raw sql but rather creates objects, # so translation descriptor affects result and we cannot set the # 'original' field value. - pk1 = models.TestModel.objects.create(title_de='').pk - pk2 = models.TestModel.objects.create(title_de='already').pk + pk1 = models.TestModel.objects.create(title_de="").pk + pk2 = models.TestModel.objects.create(title_de="already").pk # Due to ``rewrite(False)`` here, original field will be affected. - models.TestModel.objects.all().rewrite(False).update(title='initial') + models.TestModel.objects.all().rewrite(False).update(title="initial") # Check raw data using ``values`` obj1 = models.TestModel.objects.filter(pk=pk1).raw_values()[0] obj2 = models.TestModel.objects.filter(pk=pk2).raw_values()[0] - assert '' == obj1['title_de'] - assert 'initial' == obj1['title'] - assert 'already' == obj2['title_de'] - assert 'initial' == obj2['title'] + assert "" == obj1["title_de"] + assert "initial" == obj1["title"] + assert "already" == obj2["title_de"] + assert "initial" == obj2["title"] - call_command('update_translation_fields', 'tests', verbosity=0) + call_command("update_translation_fields", "tests", verbosity=0) obj1 = models.TestModel.objects.get(pk=pk1) obj2 = models.TestModel.objects.get(pk=pk2) - assert 'initial' == obj1.title_de - assert 'already' == obj2.title_de + assert "initial" == obj1.title_de + assert "already" == obj2.title_de def test_update_command_language_param(self): - trans_real.activate('en') - pk1 = models.TestModel.objects.create(title_en='').pk - pk2 = models.TestModel.objects.create(title_en='already').pk + trans_real.activate("en") + pk1 = models.TestModel.objects.create(title_en="").pk + pk2 = models.TestModel.objects.create(title_en="already").pk # Due to ``rewrite(False)`` here, original field will be affected. - models.TestModel.objects.all().rewrite(False).update(title='initial') + models.TestModel.objects.all().rewrite(False).update(title="initial") - call_command('update_translation_fields', 'tests', language='en', verbosity=0) + call_command("update_translation_fields", "tests", language="en", verbosity=0) obj1 = models.TestModel.objects.get(pk=pk1) obj2 = models.TestModel.objects.get(pk=pk2) - assert 'initial' == obj1.title_en - assert 'already' == obj2.title_en + assert "initial" == obj1.title_en + assert "already" == obj2.title_en def test_update_command_invalid_language_param(self): with pytest.raises(CommandError): - call_command('update_translation_fields', language='xx', verbosity=0) + call_command("update_translation_fields", language="xx", verbosity=0) def test_update_command_with_json_field(self): """ Test that the update_translation_fields command works with JSON fields. """ - instance_pk = models.OtherFieldsModel.objects.create(json={'foo': 'bar'}).pk + instance_pk = models.OtherFieldsModel.objects.create(json={"foo": "bar"}).pk models.OtherFieldsModel.objects.all().rewrite(False).update(json_de=None) instance = models.OtherFieldsModel.objects.filter(pk=instance_pk).raw_values()[0] - assert instance['json'] == {'foo': 'bar'} - assert instance['json_de'] is None - assert instance['json_en'] is None + assert instance["json"] == {"foo": "bar"} + assert instance["json_de"] is None + assert instance["json_en"] is None call_command( - 'update_translation_fields', 'tests', model_name='OtherFieldsModel', verbosity=0 + "update_translation_fields", "tests", model_name="OtherFieldsModel", verbosity=0 ) instance = models.OtherFieldsModel.objects.filter(pk=instance_pk).raw_values()[0] - assert instance['json'] == {'foo': 'bar'} - assert instance['json_de'] == {'foo': 'bar'} - assert instance['json_en'] is None + assert instance["json"] == {"foo": "bar"} + assert instance["json_de"] == {"foo": "bar"} + assert instance["json_en"] is None class TranslationAdminTest(ModeltranslationTestBase): def setUp(self): super().setUp() - self.test_obj = models.TestModel.objects.create(title='Testtitle', text='Testtext') + self.test_obj = models.TestModel.objects.create(title="Testtitle", text="Testtext") self.site = AdminSite() def tearDown(self): @@ -2422,16 +2422,16 @@ class TranslationAdminTest(ModeltranslationTestBase): ma = TestModelAdmin(models.TestModel, self.site) assert tuple(ma.get_form(request).base_fields.keys()) == ( - 'title_de', - 'title_en', - 'text_de', - 'text_en', - 'url_de', - 'url_en', - 'email_de', - 'email_en', - 'dynamic_default_de', - 'dynamic_default_en', + "title_de", + "title_en", + "text_de", + "text_en", + "url_de", + "url_en", + "email_de", + "email_en", + "dynamic_default_de", + "dynamic_default_en", ) def test_default_fieldsets(self): @@ -2442,42 +2442,42 @@ class TranslationAdminTest(ModeltranslationTestBase): # We expect that the original field is excluded and only the # translation fields are included in fields fields = [ - 'title_de', - 'title_en', - 'text_de', - 'text_en', - 'url_de', - 'url_en', - 'email_de', - 'email_en', - 'dynamic_default_de', - 'dynamic_default_en', + "title_de", + "title_en", + "text_de", + "text_en", + "url_de", + "url_en", + "email_de", + "email_en", + "dynamic_default_de", + "dynamic_default_en", ] - assert ma.get_fieldsets(request) == [(None, {'fields': fields})] - assert ma.get_fieldsets(request, self.test_obj) == [(None, {'fields': fields})] + assert ma.get_fieldsets(request) == [(None, {"fields": fields})] + assert ma.get_fieldsets(request, self.test_obj) == [(None, {"fields": fields})] def test_field_arguments(self): class TestModelAdmin(admin.TranslationAdmin): - fields = ['title'] + fields = ["title"] ma = TestModelAdmin(models.TestModel, self.site) - fields = ['title_de', 'title_en'] + fields = ["title_de", "title_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) def test_field_arguments_restricted_on_form(self): # Using `fields`. class TestModelAdmin(admin.TranslationAdmin): - fields = ['title'] + fields = ["title"] ma = TestModelAdmin(models.TestModel, self.site) - fields = ['title_de', 'title_en'] + fields = ["title_de", "title_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) # Using `fieldsets`. class TestModelAdmin(admin.TranslationAdmin): - fieldsets = [(None, {'fields': ['title']})] + fieldsets = [(None, {"fields": ["title"]})] ma = TestModelAdmin(models.TestModel, self.site) assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) @@ -2485,15 +2485,15 @@ class TranslationAdminTest(ModeltranslationTestBase): # Using `exclude`. class TestModelAdmin(admin.TranslationAdmin): - exclude = ['url', 'email', 'dynamic_default'] + exclude = ["url", "email", "dynamic_default"] ma = TestModelAdmin(models.TestModel, self.site) - fields = ['title_de', 'title_en', 'text_de', 'text_en'] + fields = ["title_de", "title_en", "text_de", "text_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) # You can also pass a tuple to `exclude`. class TestModelAdmin(admin.TranslationAdmin): - exclude = ('url', 'email', 'dynamic_default') + exclude = ("url", "email", "dynamic_default") ma = TestModelAdmin(models.TestModel, self.site) assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) @@ -2501,61 +2501,61 @@ class TranslationAdminTest(ModeltranslationTestBase): # Using `fields` and `exclude`. class TestModelAdmin(admin.TranslationAdmin): - fields = ['title', 'url'] - exclude = ['url'] + fields = ["title", "url"] + exclude = ["url"] ma = TestModelAdmin(models.TestModel, self.site) - assert tuple(ma.get_form(request).base_fields.keys()) == ('title_de', 'title_en') + assert tuple(ma.get_form(request).base_fields.keys()) == ("title_de", "title_en") # Using `fields` and `readonly_fields`. class TestModelAdmin(admin.TranslationAdmin): - fields = ['title', 'url'] - readonly_fields = ['url'] + fields = ["title", "url"] + readonly_fields = ["url"] ma = TestModelAdmin(models.TestModel, self.site) - assert tuple(ma.get_form(request).base_fields.keys()) == ('title_de', 'title_en') + assert tuple(ma.get_form(request).base_fields.keys()) == ("title_de", "title_en") # Using `readonly_fields`. # Note: readonly fields are not included in the form. class TestModelAdmin(admin.TranslationAdmin): - readonly_fields = ['title'] + readonly_fields = ["title"] ma = TestModelAdmin(models.TestModel, self.site) assert tuple(ma.get_form(request).base_fields.keys()) == ( - 'text_de', - 'text_en', - 'url_de', - 'url_en', - 'email_de', - 'email_en', - 'dynamic_default_de', - 'dynamic_default_en', + "text_de", + "text_en", + "url_de", + "url_en", + "email_de", + "email_en", + "dynamic_default_de", + "dynamic_default_en", ) # Using grouped fields. # Note: Current implementation flattens the nested fields. class TestModelAdmin(admin.TranslationAdmin): fields = ( - ('title', 'url'), - 'email', + ("title", "url"), + "email", ) ma = TestModelAdmin(models.TestModel, self.site) assert tuple(ma.get_form(request).base_fields.keys()) == ( - 'title_de', - 'title_en', - 'url_de', - 'url_en', - 'email_de', - 'email_en', + "title_de", + "title_en", + "url_de", + "url_en", + "email_de", + "email_en", ) # Using grouped fields in `fieldsets`. class TestModelAdmin(admin.TranslationAdmin): - fieldsets = [(None, {'fields': ('email', ('title', 'url'))})] + fieldsets = [(None, {"fields": ("email", ("title", "url"))})] ma = TestModelAdmin(models.TestModel, self.site) - fields = ['email_de', 'email_en', 'title_de', 'title_en', 'url_de', 'url_en'] + fields = ["email_de", "email_en", "title_de", "title_en", "url_de", "url_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) @@ -2564,13 +2564,13 @@ class TranslationAdminTest(ModeltranslationTestBase): class TestModelForm(forms.ModelForm): class Meta: model = models.TestModel - fields = ['url', 'email'] + fields = ["url", "email"] class TestModelAdmin(admin.TranslationAdmin): form = TestModelForm ma = TestModelAdmin(models.TestModel, self.site) - fields = ['url_de', 'url_en', 'email_de', 'email_en'] + fields = ["url_de", "url_en", "email_de", "email_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) @@ -2578,13 +2578,13 @@ class TranslationAdminTest(ModeltranslationTestBase): class TestModelForm(forms.ModelForm): class Meta: model = models.TestModel - exclude = ['url', 'email', 'dynamic_default'] + exclude = ["url", "email", "dynamic_default"] class TestModelAdmin(admin.TranslationAdmin): form = TestModelForm ma = TestModelAdmin(models.TestModel, self.site) - fields = ['title_de', 'title_en', 'text_de', 'text_en'] + fields = ["title_de", "title_en", "text_de", "text_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) @@ -2592,10 +2592,10 @@ class TranslationAdminTest(ModeltranslationTestBase): # option, the ModelAdmin wins. This is Django behaviour. class TestModelAdmin(admin.TranslationAdmin): form = TestModelForm - exclude = ['url', 'dynamic_default'] + exclude = ["url", "dynamic_default"] ma = TestModelAdmin(models.TestModel, self.site) - fields = ['title_de', 'title_en', 'text_de', 'text_en', 'email_de', 'email_en'] + fields = ["title_de", "title_en", "text_de", "text_en", "email_de", "email_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) @@ -2603,14 +2603,14 @@ class TranslationAdminTest(ModeltranslationTestBase): class TestModelForm(forms.ModelForm): class Meta: model = models.TestModel - fields = ['text', 'title'] + fields = ["text", "title"] class TestModelAdmin(admin.TranslationAdmin): form = TestModelForm - fields = ['email'] + fields = ["email"] ma = TestModelAdmin(models.TestModel, self.site) - fields = ['email_de', 'email_en'] + fields = ["email_de", "email_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) @@ -2619,46 +2619,46 @@ class TranslationAdminTest(ModeltranslationTestBase): class Meta: model = models.TestModel fields = [ - 'text', + "text", ] widgets = { - 'text': forms.Textarea(attrs={'myprop': 'myval'}), + "text": forms.Textarea(attrs={"myprop": "myval"}), } class TestModelAdmin(admin.TranslationAdmin): form = TestModelForm ma = TestModelAdmin(models.TestModel, self.site) - fields = ['text_de', 'text_en'] + fields = ["text_de", "text_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) for field in fields: - assert 'myprop' in ma.get_form(request).base_fields.get(field).widget.attrs.keys() + assert "myprop" in ma.get_form(request).base_fields.get(field).widget.attrs.keys() assert ( - 'myval' + "myval" in ma.get_form(request, self.test_obj).base_fields.get(field).widget.attrs.values() ) def test_widget_ordering_via_formfield_for_dbfield(self): class TestModelAdmin(admin.TranslationAdmin): - fields = ['text'] + fields = ["text"] def formfield_for_dbfield(self, db_field, request, **kwargs): if isinstance(db_field, TextField): - kwargs["widget"] = forms.Textarea(attrs={'myprop': 'myval'}) + kwargs["widget"] = forms.Textarea(attrs={"myprop": "myval"}) return db_field.formfield(**kwargs) return super().formfield_for_dbfield(db_field, request, **kwargs) ma = TestModelAdmin(models.TestModel, self.site) - fields = ['text_de', 'text_en'] + fields = ["text_de", "text_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) for field in fields: - assert 'myprop' in ma.get_form(request).base_fields.get(field).widget.attrs.keys() + assert "myprop" in ma.get_form(request).base_fields.get(field).widget.attrs.keys() assert ( - 'myval' + "myval" in ma.get_form(request, self.test_obj).base_fields.get(field).widget.attrs.values() ) @@ -2668,37 +2668,37 @@ class TranslationAdminTest(ModeltranslationTestBase): """ class ForeignKeyModelModelAdmin(admin.TranslationAdmin): - fields = ['test'] + fields = ["test"] class OneToOneFieldModelAdmin(admin.TranslationAdmin): - fields = ['test'] + fields = ["test"] ma = ForeignKeyModelModelAdmin(models.ForeignKeyModel, self.site) - fields = ['test_de', 'test_en'] + fields = ["test_de", "test_en"] for field in fields: assert {} == ma.get_form(request).base_fields.get(field).widget.attrs - assert 'class' in ma.get_form(request).base_fields.get(field).widget.widget.attrs.keys() - assert 'mt' in ma.get_form(request).base_fields.get(field).widget.widget.attrs['class'] + assert "class" in ma.get_form(request).base_fields.get(field).widget.widget.attrs.keys() + assert "mt" in ma.get_form(request).base_fields.get(field).widget.widget.attrs["class"] def test_inline_fieldsets(self): class DataInline(admin.TranslationStackedInline): model = models.DataModel - fieldsets = [('Test', {'fields': ('data',)})] + fieldsets = [("Test", {"fields": ("data",)})] class TestModelAdmin(admin.TranslationAdmin): exclude = ( - 'title', - 'text', + "title", + "text", ) inlines = [DataInline] class DataTranslationOptions(translator.TranslationOptions): - fields = ('data',) + fields = ("data",) translator.translator.register(models.DataModel, DataTranslationOptions) ma = TestModelAdmin(models.TestModel, self.site) - fieldsets = [('Test', {'fields': ['data_de', 'data_en']})] + fieldsets = [("Test", {"fields": ["data_de", "data_en"]})] try: ma_fieldsets = ma.get_inline_instances(request)[0].get_fieldsets(request) @@ -2719,35 +2719,35 @@ class TranslationAdminTest(ModeltranslationTestBase): def test_list_editable(self): class TestModelAdmin(admin.TranslationAdmin): - list_editable = ['title'] - list_display = ['id', 'title'] - list_display_links = ['id'] + list_editable = ["title"] + list_display = ["id", "title"] + list_display_links = ["id"] ma = TestModelAdmin(models.TestModel, self.site) - list_editable = ['title_de', 'title_en'] - list_display = ['id', 'title_de', 'title_en'] + list_editable = ["title_de", "title_en"] + list_display = ["id", "title_de", "title_en"] assert tuple(ma.list_editable) == tuple(list_editable) assert tuple(ma.list_display) == tuple(list_display) def test_build_css_class(self): with reload_override_settings( LANGUAGES=( - ('de', 'German'), - ('en', 'English'), - ('es-ar', 'Argentinian Spanish'), + ("de", "German"), + ("en", "English"), + ("es-ar", "Argentinian Spanish"), ) ): fields = { - 'foo_en': 'foo-en', - 'foo_es_ar': 'foo-es_ar', - 'foo_en_us': 'foo-en_us', - 'foo_bar_de': 'foo_bar-de', - '_foo_en': '_foo-en', - '_foo_es_ar': '_foo-es_ar', - '_foo_bar_de': '_foo_bar-de', - 'foo__en': 'foo_-en', - 'foo__es_ar': 'foo_-es_ar', - 'foo_bar__de': 'foo_bar_-de', + "foo_en": "foo-en", + "foo_es_ar": "foo-es_ar", + "foo_en_us": "foo-en_us", + "foo_bar_de": "foo_bar-de", + "_foo_en": "_foo-en", + "_foo_es_ar": "_foo-es_ar", + "_foo_bar_de": "_foo_bar-de", + "foo__en": "foo_-en", + "foo__es_ar": "foo_-es_ar", + "foo_bar__de": "foo_bar_-de", } for field, css in fields.items(): assert build_css_class(field) == css @@ -2762,22 +2762,22 @@ class TranslationAdminTest(ModeltranslationTestBase): maa = MultitableModelAAdmin(models.MultitableModelA, self.site) mab = MultitableModelBAdmin(models.MultitableModelB, self.site) - assert tuple(maa.get_form(request).base_fields.keys()) == ('titlea_de', 'titlea_en') + assert tuple(maa.get_form(request).base_fields.keys()) == ("titlea_de", "titlea_en") assert tuple(mab.get_form(request).base_fields.keys()) == ( - 'titlea_de', - 'titlea_en', - 'titleb_de', - 'titleb_en', + "titlea_de", + "titlea_en", + "titleb_de", + "titleb_en", ) def test_group_fieldsets(self): # Declared fieldsets take precedence over group_fieldsets class GroupFieldsetsModelAdmin(admin.TranslationAdmin): - fieldsets = [(None, {'fields': ['title']})] + fieldsets = [(None, {"fields": ["title"]})] group_fieldsets = True ma = GroupFieldsetsModelAdmin(models.GroupFieldsetsModel, self.site) - fields = ['title_de', 'title_en'] + fields = ["title_de", "title_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) @@ -2790,9 +2790,9 @@ class TranslationAdminTest(ModeltranslationTestBase): # three fieldsets. The first which gathers all untranslated field # (email only) and one for each translation field (text and title). fieldsets = [ - ('', {'fields': ['email']}), - ('Title', {'classes': ('mt-fieldset',), 'fields': ['title_de', 'title_en']}), - ('Text', {'classes': ('mt-fieldset',), 'fields': ['text_de', 'text_en']}), + ("", {"fields": ["email"]}), + ("Title", {"classes": ("mt-fieldset",), "fields": ["title_de", "title_en"]}), + ("Text", {"classes": ("mt-fieldset",), "fields": ["text_de", "text_en"]}), ] assert ma.get_fieldsets(request) == fieldsets assert ma.get_fieldsets(request, self.test_obj) == fieldsets @@ -2802,12 +2802,12 @@ class TranslationAdminTest(ModeltranslationTestBase): # Exclude an untranslated field class GroupFieldsetsModelAdmin(admin.TranslationAdmin): group_fieldsets = True - exclude = ('email',) + exclude = ("email",) ma = GroupFieldsetsModelAdmin(models.GroupFieldsetsModel, self.site) fieldsets = [ - ('Title', {'classes': ('mt-fieldset',), 'fields': ['title_de', 'title_en']}), - ('Text', {'classes': ('mt-fieldset',), 'fields': ['text_de', 'text_en']}), + ("Title", {"classes": ("mt-fieldset",), "fields": ["title_de", "title_en"]}), + ("Text", {"classes": ("mt-fieldset",), "fields": ["text_de", "text_en"]}), ] assert ma.get_fieldsets(request) == fieldsets assert ma.get_fieldsets(request, self.test_obj) == fieldsets @@ -2815,93 +2815,93 @@ class TranslationAdminTest(ModeltranslationTestBase): # Exclude a translation field class GroupFieldsetsModelAdmin(admin.TranslationAdmin): group_fieldsets = True - exclude = ('text',) + exclude = ("text",) ma = GroupFieldsetsModelAdmin(models.GroupFieldsetsModel, self.site) fieldsets = [ - ('', {'fields': ['email']}), - ('Title', {'classes': ('mt-fieldset',), 'fields': ['title_de', 'title_en']}), + ("", {"fields": ["email"]}), + ("Title", {"classes": ("mt-fieldset",), "fields": ["title_de", "title_en"]}), ] assert ma.get_fieldsets(request) == fieldsets assert ma.get_fieldsets(request, self.test_obj) == fieldsets def test_prepopulated_fields(self): - trans_real.activate('de') - assert get_language() == 'de' + trans_real.activate("de") + assert get_language() == "de" # Non-translated slug based on translated field (using active language) class NameModelAdmin(admin.TranslationAdmin): - prepopulated_fields = {'slug': ('firstname',)} + prepopulated_fields = {"slug": ("firstname",)} ma = NameModelAdmin(models.NameModel, self.site) - assert ma.prepopulated_fields == {'slug': ('firstname_de',)} + assert ma.prepopulated_fields == {"slug": ("firstname_de",)} # Checking multi-field class NameModelAdmin(admin.TranslationAdmin): prepopulated_fields = { - 'slug': ( - 'firstname', - 'lastname', + "slug": ( + "firstname", + "lastname", ) } ma = NameModelAdmin(models.NameModel, self.site) assert ma.prepopulated_fields == { - 'slug': ( - 'firstname_de', - 'lastname_de', + "slug": ( + "firstname_de", + "lastname_de", ) } # Non-translated slug based on non-translated field (no change) class NameModelAdmin(admin.TranslationAdmin): - prepopulated_fields = {'slug': ('age',)} + prepopulated_fields = {"slug": ("age",)} ma = NameModelAdmin(models.NameModel, self.site) - assert ma.prepopulated_fields == {'slug': ('age',)} + assert ma.prepopulated_fields == {"slug": ("age",)} # Translated slug based on non-translated field (all populated on the same value) class NameModelAdmin(admin.TranslationAdmin): - prepopulated_fields = {'slug2': ('age',)} + prepopulated_fields = {"slug2": ("age",)} ma = NameModelAdmin(models.NameModel, self.site) - assert ma.prepopulated_fields == {'slug2_en': ('age',), 'slug2_de': ('age',)} + assert ma.prepopulated_fields == {"slug2_en": ("age",), "slug2_de": ("age",)} # Translated slug based on translated field (corresponding) class NameModelAdmin(admin.TranslationAdmin): - prepopulated_fields = {'slug2': ('firstname',)} + prepopulated_fields = {"slug2": ("firstname",)} ma = NameModelAdmin(models.NameModel, self.site) assert ma.prepopulated_fields == { - 'slug2_en': ('firstname_en',), - 'slug2_de': ('firstname_de',), + "slug2_en": ("firstname_en",), + "slug2_de": ("firstname_de",), } # Check that current active language is used - trans_real.activate('en') - assert get_language() == 'en' + trans_real.activate("en") + assert get_language() == "en" class NameModelAdmin(admin.TranslationAdmin): - prepopulated_fields = {'slug': ('firstname',)} + prepopulated_fields = {"slug": ("firstname",)} ma = NameModelAdmin(models.NameModel, self.site) - assert ma.prepopulated_fields == {'slug': ('firstname_en',)} + assert ma.prepopulated_fields == {"slug": ("firstname_en",)} # Prepopulation language can be overriden by MODELTRANSLATION_PREPOPULATE_LANGUAGE - with reload_override_settings(MODELTRANSLATION_PREPOPULATE_LANGUAGE='de'): + with reload_override_settings(MODELTRANSLATION_PREPOPULATE_LANGUAGE="de"): class NameModelAdmin(admin.TranslationAdmin): - prepopulated_fields = {'slug': ('firstname',)} + prepopulated_fields = {"slug": ("firstname",)} ma = NameModelAdmin(models.NameModel, self.site) - assert ma.prepopulated_fields == {'slug': ('firstname_de',)} + assert ma.prepopulated_fields == {"slug": ("firstname_de",)} def test_proxymodel_field_argument(self): class ProxyTestModelAdmin(admin.TranslationAdmin): - fields = ['title'] + fields = ["title"] ma = ProxyTestModelAdmin(models.ProxyTestModel, self.site) - fields = ['title_de', 'title_en'] + fields = ["title_de", "title_en"] assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields) assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields) @@ -2926,12 +2926,12 @@ class ThirdPartyAppIntegrationTest(ModeltranslationTestBase): class CreationForm(forms.ModelForm): class Meta: model = self.model - fields = '__all__' + fields = "__all__" - creation_form = CreationForm({'name': 'abc'}) + creation_form = CreationForm({"name": "abc"}) inst = creation_form.save() - assert 'de' == get_language() - assert 'abc' == inst.name + assert "de" == get_language() + assert "abc" == inst.name assert 1 == self.model.objects.count() @@ -2948,76 +2948,76 @@ class TestManager(ModeltranslationTestBase): def setUp(self): # In this test case the default language is en, not de. super().setUp() - trans_real.activate('en') + trans_real.activate("en") def test_filter_update(self): """Test if filtering and updating is language-aware.""" - n = models.ManagerTestModel(title='') - n.title_en = 'en' - n.title_de = 'de' + n = models.ManagerTestModel(title="") + n.title_en = "en" + n.title_de = "de" n.save() - m = models.ManagerTestModel(title='') - m.title_en = 'title en' - m.title_de = 'de' + m = models.ManagerTestModel(title="") + m.title_en = "title en" + m.title_de = "de" m.save() - assert 'en' == get_language() + assert "en" == get_language() - assert 0 == models.ManagerTestModel.objects.filter(title='de').count() - assert 1 == models.ManagerTestModel.objects.filter(title='en').count() + assert 0 == models.ManagerTestModel.objects.filter(title="de").count() + assert 1 == models.ManagerTestModel.objects.filter(title="en").count() # Spanning works - assert 2 == models.ManagerTestModel.objects.filter(title__contains='en').count() + assert 2 == models.ManagerTestModel.objects.filter(title__contains="en").count() - with override('de'): - assert 2 == models.ManagerTestModel.objects.filter(title='de').count() - assert 0 == models.ManagerTestModel.objects.filter(title='en').count() + with override("de"): + assert 2 == models.ManagerTestModel.objects.filter(title="de").count() + assert 0 == models.ManagerTestModel.objects.filter(title="en").count() # Spanning works - assert 2 == models.ManagerTestModel.objects.filter(title__endswith='e').count() + assert 2 == models.ManagerTestModel.objects.filter(title__endswith="e").count() # Still possible to use explicit language version - assert 1 == models.ManagerTestModel.objects.filter(title_en='en').count() - assert 2 == models.ManagerTestModel.objects.filter(title_en__contains='en').count() + assert 1 == models.ManagerTestModel.objects.filter(title_en="en").count() + assert 2 == models.ManagerTestModel.objects.filter(title_en__contains="en").count() - models.ManagerTestModel.objects.update(title='new') - assert 2 == models.ManagerTestModel.objects.filter(title='new').count() + models.ManagerTestModel.objects.update(title="new") + assert 2 == models.ManagerTestModel.objects.filter(title="new").count() n = models.ManagerTestModel.objects.get(pk=n.pk) m = models.ManagerTestModel.objects.get(pk=m.pk) - assert 'en' == n.title_en - assert 'new' == n.title_de - assert 'title en' == m.title_en - assert 'new' == m.title_de + assert "en" == n.title_en + assert "new" == n.title_de + assert "title en" == m.title_en + assert "new" == m.title_de # Test Python3 "dictionary changed size during iteration" - assert 1 == models.ManagerTestModel.objects.filter(title='en', title_en='en').count() + assert 1 == models.ManagerTestModel.objects.filter(title="en", title_en="en").count() def test_q(self): """Test if Q queries are rewritten.""" - n = models.ManagerTestModel(title='') - n.title_en = 'en' - n.title_de = 'de' + n = models.ManagerTestModel(title="") + n.title_en = "en" + n.title_de = "de" n.save() - assert 'en' == get_language() - assert 0 == models.ManagerTestModel.objects.filter(Q(title='de') | Q(pk=42)).count() - assert 1 == models.ManagerTestModel.objects.filter(Q(title='en') | Q(pk=42)).count() + assert "en" == get_language() + assert 0 == models.ManagerTestModel.objects.filter(Q(title="de") | Q(pk=42)).count() + assert 1 == models.ManagerTestModel.objects.filter(Q(title="en") | Q(pk=42)).count() - with override('de'): - assert 1 == models.ManagerTestModel.objects.filter(Q(title='de') | Q(pk=42)).count() - assert 0 == models.ManagerTestModel.objects.filter(Q(title='en') | Q(pk=42)).count() + with override("de"): + assert 1 == models.ManagerTestModel.objects.filter(Q(title="de") | Q(pk=42)).count() + assert 0 == models.ManagerTestModel.objects.filter(Q(title="en") | Q(pk=42)).count() def test_f(self): """Test if F queries are rewritten.""" n = models.ManagerTestModel.objects.create(visits_en=1, visits_de=2) - assert 'en' == get_language() - models.ManagerTestModel.objects.update(visits=F('visits') + 10) + assert "en" == get_language() + models.ManagerTestModel.objects.update(visits=F("visits") + 10) n = models.ManagerTestModel.objects.all()[0] assert n.visits_en == 11 assert n.visits_de == 2 - with override('de'): - models.ManagerTestModel.objects.update(visits=F('visits') + 20) + with override("de"): + models.ManagerTestModel.objects.update(visits=F("visits") + 20) n = models.ManagerTestModel.objects.all()[0] assert n.visits_en == 11 assert n.visits_de == 22 @@ -3025,232 +3025,232 @@ class TestManager(ModeltranslationTestBase): def test_order_by(self): """Check that field names are rewritten in order_by keys.""" manager = models.ManagerTestModel.objects - manager.create(title='a') - m = manager.create(title='b') - manager.create(title='c') - with override('de'): + manager.create(title="a") + m = manager.create(title="b") + manager.create(title="c") + with override("de"): # Make the order of the 'title' column different. - m.title = 'd' + m.title = "d" m.save() - titles_asc = tuple(m.title for m in manager.order_by('title')) - titles_desc = tuple(m.title for m in manager.order_by('-title')) - assert titles_asc == ('a', 'b', 'c') - assert titles_desc == ('c', 'b', 'a') + titles_asc = tuple(m.title for m in manager.order_by("title")) + titles_desc = tuple(m.title for m in manager.order_by("-title")) + assert titles_asc == ("a", "b", "c") + assert titles_desc == ("c", "b", "a") def test_order_by_meta(self): """Check that meta ordering is rewritten.""" manager = models.ManagerTestModel.objects - manager.create(title='more_de', visits_en=1, visits_de=2) - manager.create(title='more_en', visits_en=2, visits_de=1) - manager.create(title='most', visits_en=3, visits_de=3) - manager.create(title='least', visits_en=0, visits_de=0) + manager.create(title="more_de", visits_en=1, visits_de=2) + manager.create(title="more_en", visits_en=2, visits_de=1) + manager.create(title="most", visits_en=3, visits_de=3) + manager.create(title="least", visits_en=0, visits_de=0) # Ordering descending with visits_en titles_for_en = tuple(m.title_en for m in manager.all()) - with override('de'): + with override("de"): # Ordering descending with visits_de titles_for_de = tuple(m.title_en for m in manager.all()) - assert titles_for_en == ('most', 'more_en', 'more_de', 'least') - assert titles_for_de == ('most', 'more_de', 'more_en', 'least') + assert titles_for_en == ("most", "more_en", "more_de", "least") + assert titles_for_de == ("most", "more_de", "more_en", "least") def test_order_by_reset(self): qs = models.ManagerTestModel.objects.all() assert qs.ordered assert not qs.order_by().ordered - assert not qs.values('title').order_by().ordered - assert not qs.order_by().values('title').ordered, "queryset is unexpectedly ordered" + assert not qs.values("title").order_by().ordered + assert not qs.order_by().values("title").ordered, "queryset is unexpectedly ordered" def test_latest(self): manager = models.ManagerTestModel.objects - manager.create(title='more_de', visits_en=1, visits_de=2) - instance_2 = manager.create(title='more_en', visits_en=2, visits_de=1) + manager.create(title="more_de", visits_en=1, visits_de=2) + instance_2 = manager.create(title="more_en", visits_en=2, visits_de=1) latest_instance = manager.latest("id") assert latest_instance == instance_2 def assert_fallback(self, method, expected1, *args, **kwargs): - transform = kwargs.pop('transform', lambda x: x) - expected2 = kwargs.pop('expected_de', expected1) + transform = kwargs.pop("transform", lambda x: x) + expected2 = kwargs.pop("expected_de", expected1) with default_fallback(): # Fallback is ('de',) obj = method(*args, **kwargs)[0] - with override('de'): + with override("de"): obj2 = method(*args, **kwargs)[0] assert transform(obj) == expected1 assert transform(obj2) == expected2 def test_values_fallback(self): manager = models.ManagerTestModel.objects - manager.create(title_en='', title_de='de') - assert 'en' == get_language() + manager.create(title_en="", title_de="de") + assert "en" == get_language() - self.assert_fallback(manager.values, 'de', 'title', transform=lambda x: x['title']) - self.assert_fallback(manager.values_list, 'de', 'title', flat=True) - self.assert_fallback(manager.values_list, ('de', '', 'de'), 'title', 'title_en', 'title_de') + self.assert_fallback(manager.values, "de", "title", transform=lambda x: x["title"]) + self.assert_fallback(manager.values_list, "de", "title", flat=True) + self.assert_fallback(manager.values_list, ("de", "", "de"), "title", "title_en", "title_de") # Settings are taken into account - fallback can be disabled with override_settings(MODELTRANSLATION_ENABLE_FALLBACKS=False): self.assert_fallback( - manager.values, '', 'title', expected_de='de', transform=lambda x: x['title'] + manager.values, "", "title", expected_de="de", transform=lambda x: x["title"] ) # Test fallback values manager = models.FallbackModel.objects manager.create() - self.assert_fallback(manager.values, 'fallback', 'title', transform=lambda x: x['title']) - self.assert_fallback(manager.values_list, ('fallback', 'fallback'), 'title', 'text') + self.assert_fallback(manager.values, "fallback", "title", transform=lambda x: x["title"]) + self.assert_fallback(manager.values_list, ("fallback", "fallback"), "title", "text") def test_values(self): manager = models.ManagerTestModel.objects - id1 = manager.create(title_en='en', title_de='de').pk + id1 = manager.create(title_en="en", title_de="de").pk - raw_obj = manager.raw_values('title')[0] - obj = manager.values('title')[0] - with override('de'): - raw_obj2 = manager.raw_values('title')[0] - obj2 = manager.values('title')[0] + raw_obj = manager.raw_values("title")[0] + obj = manager.values("title")[0] + with override("de"): + raw_obj2 = manager.raw_values("title")[0] + obj2 = manager.values("title")[0] # Raw_values returns real database values regardless of current language - assert raw_obj['title'] == raw_obj2['title'] + assert raw_obj["title"] == raw_obj2["title"] # Values present language-aware data, from the moment of retrieval - assert obj['title'] == 'en' - assert obj2['title'] == 'de' + assert obj["title"] == "en" + assert obj2["title"] == "de" # Values_list behave similarly - assert list(manager.values_list('title', flat=True)) == ['en'] - with override('de'): - assert list(manager.values_list('title', flat=True)) == ['de'] + assert list(manager.values_list("title", flat=True)) == ["en"] + with override("de"): + assert list(manager.values_list("title", flat=True)) == ["de"] # Values_list with named fields behave similarly. # Also, it should preserve requested ordering. (actual,) = manager.annotate(annotated=Value(True)).values_list( - 'title', 'annotated', 'visits', named=True + "title", "annotated", "visits", named=True ) - expected = ('en', True, 0) + expected = ("en", True, 0) assert actual == expected assert (actual.title, actual.annotated, actual.visits) == expected - with override('de'): - assert list(manager.values_list('title', 'visits', named=True)) == [('de', 0)] + with override("de"): + assert list(manager.values_list("title", "visits", named=True)) == [("de", 0)] # One can always turn rewrite off - a = list(manager.rewrite(False).values_list('title', flat=True)) - with override('de'): - b = list(manager.rewrite(False).values_list('title', flat=True)) + a = list(manager.rewrite(False).values_list("title", flat=True)) + with override("de"): + b = list(manager.rewrite(False).values_list("title", flat=True)) assert a == b - i2 = manager.create(title_en='en2', title_de='de2') + i2 = manager.create(title_en="en2", title_de="de2") id2 = i2.pk # This is somehow repetitive... - assert 'en' == get_language() - assert list(manager.values('title')) == [{'title': 'en'}, {'title': 'en2'}] - with override('de'): - assert list(manager.values('title')) == [{'title': 'de'}, {'title': 'de2'}] + assert "en" == get_language() + assert list(manager.values("title")) == [{"title": "en"}, {"title": "en2"}] + with override("de"): + assert list(manager.values("title")) == [{"title": "de"}, {"title": "de2"}] # When no fields are passed, list all fields in current language. actual = list(manager.annotate(annotated=Value(True)).values()) assert actual == [ - {'id': id1, 'title': 'en', 'visits': 0, 'description': None, 'annotated': True}, - {'id': id2, 'title': 'en2', 'visits': 0, 'description': None, 'annotated': True}, + {"id": id1, "title": "en", "visits": 0, "description": None, "annotated": True}, + {"id": id2, "title": "en2", "visits": 0, "description": None, "annotated": True}, ] # Similar for values_list - assert list(manager.values_list()) == [(id1, 'en', 0, None), (id2, 'en2', 0, None)] - with override('de'): - assert list(manager.values_list()) == [(id1, 'de', 0, None), (id2, 'de2', 0, None)] + assert list(manager.values_list()) == [(id1, "en", 0, None), (id2, "en2", 0, None)] + with override("de"): + assert list(manager.values_list()) == [(id1, "de", 0, None), (id2, "de2", 0, None)] # Raw_values assert list(manager.raw_values()) == list(manager.rewrite(False).values()) i2.delete() assert list(manager.raw_values()) == [ { - 'id': id1, - 'title': 'en', - 'title_en': 'en', - 'title_de': 'de', - 'visits': 0, - 'visits_en': 0, - 'visits_de': 0, - 'description': None, - 'description_en': None, - 'description_de': None, + "id": id1, + "title": "en", + "title_en": "en", + "title_de": "de", + "visits": 0, + "visits_en": 0, + "visits_de": 0, + "description": None, + "description_en": None, + "description_de": None, }, ] # annotation issue (#374) - assert list(manager.values_list('title', flat=True).annotate(Count('title'))) == ['en'] + assert list(manager.values_list("title", flat=True).annotate(Count("title"))) == ["en"] # custom annotation - assert list(manager.filter(id=id1).annotate(custom_id=F('id')).values_list())[0][-1] == id1 + assert list(manager.filter(id=id1).annotate(custom_id=F("id")).values_list())[0][-1] == id1 assert ( - list(manager.filter(id=id1).annotate(custom_id=F('id')).values())[0].get('custom_id') + list(manager.filter(id=id1).annotate(custom_id=F("id")).values())[0].get("custom_id") == id1 ) # custom annotation with fields specified - assert list(manager.filter(id=id1).annotate(custom_id=F('id')).values_list('id'))[0] == ( + assert list(manager.filter(id=id1).annotate(custom_id=F("id")).values_list("id"))[0] == ( id1, ) assert ( - list(manager.filter(id=id1).annotate(custom_id=F('id')).values('id'))[0].get( - 'custom_id' + list(manager.filter(id=id1).annotate(custom_id=F("id")).values("id"))[0].get( + "custom_id" ) is None ) def test_values_list_annotation(self): - models.TestModel(title='foo').save() - models.TestModel(title='foo').save() - assert list(models.TestModel.objects.all().values_list('title').annotate(Count('id'))) == [ - ('foo', 2) + models.TestModel(title="foo").save() + models.TestModel(title="foo").save() + assert list(models.TestModel.objects.all().values_list("title").annotate(Count("id"))) == [ + ("foo", 2) ] def test_values_with_expressions(self): manager = models.ManagerTestModel.objects - id1 = manager.create(title_en='en', title_de='de').pk + id1 = manager.create(title_en="en", title_de="de").pk - raw_obj = manager.raw_values('title', str_pk=Cast("pk", output_field=CharField()))[0] - obj = manager.values('title', str_pk=Cast("pk", output_field=CharField()))[0] - with override('de'): - raw_obj2 = manager.raw_values('title', str_pk=Cast("pk", output_field=CharField()))[0] - obj2 = manager.values('title', str_pk=Cast("pk", output_field=CharField()))[0] + raw_obj = manager.raw_values("title", str_pk=Cast("pk", output_field=CharField()))[0] + obj = manager.values("title", str_pk=Cast("pk", output_field=CharField()))[0] + with override("de"): + raw_obj2 = manager.raw_values("title", str_pk=Cast("pk", output_field=CharField()))[0] + obj2 = manager.values("title", str_pk=Cast("pk", output_field=CharField()))[0] # Raw_values returns real database values regardless of current language - assert raw_obj['title'] == raw_obj2['title'] - assert raw_obj['str_pk'] == raw_obj2['str_pk'] + assert raw_obj["title"] == raw_obj2["title"] + assert raw_obj["str_pk"] == raw_obj2["str_pk"] # Values present language-aware data, from the moment of retrieval - assert obj['title'] == 'en' - assert obj['str_pk'] == str(id1) - assert obj2['title'] == 'de' + assert obj["title"] == "en" + assert obj["str_pk"] == str(id1) + assert obj2["title"] == "de" # Values_list behave similarly - assert list(manager.values_list('title', Cast("pk", output_field=CharField()))) == [ - ('en', str(id1)) + assert list(manager.values_list("title", Cast("pk", output_field=CharField()))) == [ + ("en", str(id1)) ] - with override('de'): - assert list(manager.values_list('title', Cast("pk", output_field=CharField()))) == [ - ('de', str(id1)) + with override("de"): + assert list(manager.values_list("title", Cast("pk", output_field=CharField()))) == [ + ("de", str(id1)) ] def test_custom_manager(self): """Test if user-defined manager is still working""" - n = models.CustomManagerTestModel(title='') - n.title_en = 'enigma' - n.title_de = 'foo' + n = models.CustomManagerTestModel(title="") + n.title_en = "enigma" + n.title_de = "foo" n.save() - m = models.CustomManagerTestModel(title='') - m.title_en = 'enigma' - m.title_de = 'bar' + m = models.CustomManagerTestModel(title="") + m.title_en = "enigma" + m.title_de = "bar" m.save() # Custom method - assert 'bar' == models.CustomManagerTestModel.objects.foo() + assert "bar" == models.CustomManagerTestModel.objects.foo() # Ensure that get_queryset is working - filter objects to those with 'a' in title - assert 'en' == get_language() + assert "en" == get_language() assert 2 == models.CustomManagerTestModel.objects.count() - with override('de'): + with override("de"): assert 1 == models.CustomManagerTestModel.objects.count() def test_custom_manager_custom_method_name(self): @@ -3266,14 +3266,14 @@ class TestManager(ModeltranslationTestBase): from modeltranslation.manager import MultilingualManager testmodel_fields = get_field_names(Group) - assert 'name' in testmodel_fields - assert 'name_de' in testmodel_fields - assert 'name_en' in testmodel_fields - assert 'name_en' in testmodel_fields + assert "name" in testmodel_fields + assert "name_de" in testmodel_fields + assert "name_en" in testmodel_fields + assert "name_en" in testmodel_fields assert isinstance(Group.objects, MultilingualManager) assert isinstance(Group.objects, GroupManager) - assert 'get_by_natural_key' in dir(Group.objects) + assert "get_by_natural_key" in dir(Group.objects) def test_multilingual_queryset_pickling(self): import pickle @@ -3281,7 +3281,7 @@ class TestManager(ModeltranslationTestBase): from modeltranslation.manager import MultilingualQuerySet # typical - models.CustomManagerTestModel.objects.create(title='a') + models.CustomManagerTestModel.objects.create(title="a") qs = models.CustomManagerTestModel.objects.all() serialized = pickle.dumps(qs) deserialized = pickle.loads(serialized) @@ -3307,13 +3307,13 @@ class TestManager(ModeltranslationTestBase): def test_default_manager_for_inherited_models_with_custom_manager(self): """Test if default manager is still set from local managers""" manager = models.CustomManagerChildTestModel._meta.default_manager - assert 'objects' == manager.name + assert "objects" == manager.name assert isinstance(manager, MultilingualManager) assert isinstance(models.CustomManagerChildTestModel.translations, MultilingualManager) def test_default_manager_for_inherited_models(self): manager = models.PlainChildTestModel._meta.default_manager - assert 'objects' == manager.name + assert "objects" == manager.name assert isinstance(models.PlainChildTestModel.translations, MultilingualManager) def test_custom_manager2(self): @@ -3329,94 +3329,94 @@ class TestManager(ModeltranslationTestBase): def test_creation(self): """Test if field are rewritten in create.""" - assert 'en' == get_language() - n = models.ManagerTestModel.objects.create(title='foo') - assert 'foo' == n.title_en + assert "en" == get_language() + n = models.ManagerTestModel.objects.create(title="foo") + assert "foo" == n.title_en assert n.title_de is None - assert 'foo' == n.title + assert "foo" == n.title # The same result - n = models.ManagerTestModel.objects.create(title_en='foo') - assert 'foo' == n.title_en + n = models.ManagerTestModel.objects.create(title_en="foo") + assert "foo" == n.title_en assert n.title_de is None - assert 'foo' == n.title + assert "foo" == n.title # Language suffixed version wins - n = models.ManagerTestModel.objects.create(title='bar', title_en='foo') - assert 'foo' == n.title_en + n = models.ManagerTestModel.objects.create(title="bar", title_en="foo") + assert "foo" == n.title_en assert n.title_de is None - assert 'foo' == n.title + assert "foo" == n.title def test_creation_population(self): """Test if language fields are populated with default value on creation.""" - n = models.ManagerTestModel.objects.populate(True).create(title='foo') - assert 'foo' == n.title_en - assert 'foo' == n.title_de - assert 'foo' == n.title + n = models.ManagerTestModel.objects.populate(True).create(title="foo") + assert "foo" == n.title_en + assert "foo" == n.title_de + assert "foo" == n.title # You can specify some language... - n = models.ManagerTestModel.objects.populate(True).create(title='foo', title_de='bar') - assert 'foo' == n.title_en - assert 'bar' == n.title_de - assert 'foo' == n.title + n = models.ManagerTestModel.objects.populate(True).create(title="foo", title_de="bar") + assert "foo" == n.title_en + assert "bar" == n.title_de + assert "foo" == n.title # ... but remember that still original attribute points to current language - assert 'en' == get_language() - n = models.ManagerTestModel.objects.populate(True).create(title='foo', title_en='bar') - assert 'bar' == n.title_en - assert 'foo' == n.title_de - assert 'bar' == n.title # points to en - with override('de'): - assert 'foo' == n.title # points to de - assert 'en' == get_language() + assert "en" == get_language() + n = models.ManagerTestModel.objects.populate(True).create(title="foo", title_en="bar") + assert "bar" == n.title_en + assert "foo" == n.title_de + assert "bar" == n.title # points to en + with override("de"): + assert "foo" == n.title # points to de + assert "en" == get_language() # This feature (for backward-compatibility) require populate method... - n = models.ManagerTestModel.objects.create(title='foo') - assert 'foo' == n.title_en + n = models.ManagerTestModel.objects.create(title="foo") + assert "foo" == n.title_en assert n.title_de is None - assert 'foo' == n.title + assert "foo" == n.title # ... or MODELTRANSLATION_AUTO_POPULATE setting with reload_override_settings(MODELTRANSLATION_AUTO_POPULATE=True): assert mt_settings.AUTO_POPULATE is True - n = models.ManagerTestModel.objects.create(title='foo') - assert 'foo' == n.title_en - assert 'foo' == n.title_de - assert 'foo' == n.title + n = models.ManagerTestModel.objects.create(title="foo") + assert "foo" == n.title_en + assert "foo" == n.title_de + assert "foo" == n.title # populate method has highest priority - n = models.ManagerTestModel.objects.populate(False).create(title='foo') - assert 'foo' == n.title_en + n = models.ManagerTestModel.objects.populate(False).create(title="foo") + assert "foo" == n.title_en assert n.title_de is None - assert 'foo' == n.title + assert "foo" == n.title # Populate ``default`` fills just the default translation. # TODO: Having more languages would make these tests more meaningful. qs = models.ManagerTestModel.objects - m = qs.populate('default').create(title='foo', description='bar') - assert 'foo' == m.title_de - assert 'foo' == m.title_en - assert 'bar' == m.description_de - assert 'bar' == m.description_en - with override('de'): - m = qs.populate('default').create(title='foo', description='bar') - assert 'foo' == m.title_de + m = qs.populate("default").create(title="foo", description="bar") + assert "foo" == m.title_de + assert "foo" == m.title_en + assert "bar" == m.description_de + assert "bar" == m.description_en + with override("de"): + m = qs.populate("default").create(title="foo", description="bar") + assert "foo" == m.title_de assert m.title_en is None - assert 'bar' == m.description_de + assert "bar" == m.description_de assert m.description_en is None # Populate ``required`` fills just non-nullable default translations. qs = models.ManagerTestModel.objects - m = qs.populate('required').create(title='foo', description='bar') - assert 'foo' == m.title_de - assert 'foo' == m.title_en + m = qs.populate("required").create(title="foo", description="bar") + assert "foo" == m.title_de + assert "foo" == m.title_en assert m.description_de is None - assert 'bar' == m.description_en - with override('de'): - m = qs.populate('required').create(title='foo', description='bar') - assert 'foo' == m.title_de + assert "bar" == m.description_en + with override("de"): + m = qs.populate("required").create(title="foo", description="bar") + assert "foo" == m.title_de assert m.title_en is None - assert 'bar' == m.description_de + assert "bar" == m.description_de assert m.description_en is None def test_get_or_create_population(self): @@ -3424,13 +3424,13 @@ class TestManager(ModeltranslationTestBase): Populate may be used with ``get_or_create``. """ qs = models.ManagerTestModel.objects - m1, created1 = qs.populate(True).get_or_create(title='aaa') - m2, created2 = qs.populate(True).get_or_create(title='aaa') + m1, created1 = qs.populate(True).get_or_create(title="aaa") + m2, created2 = qs.populate(True).get_or_create(title="aaa") assert created1 assert not created2 assert m1 == m2 - assert 'aaa' == m1.title_en - assert 'aaa' == m1.title_de + assert "aaa" == m1.title_en + assert "aaa" == m1.title_de def test_fixture_population(self): """ @@ -3438,51 +3438,51 @@ class TestManager(ModeltranslationTestBase): does not result in missing default translations for (original) non-nullable fields. """ - with auto_populate('required'): - call_command('loaddata', 'fixture.json', verbosity=0) + with auto_populate("required"): + call_command("loaddata", "fixture.json", verbosity=0) m = models.TestModel.objects.get() - assert m.title_en == 'foo' - assert m.title_de == 'foo' - assert m.text_en == 'bar' + assert m.title_en == "foo" + assert m.title_de == "foo" + assert m.text_en == "bar" assert m.text_de is None def test_fixture_population_via_command(self): """ Test that the loaddata command takes new option. """ - call_command('loaddata', 'fixture.json', verbosity=0, populate='required') + call_command("loaddata", "fixture.json", verbosity=0, populate="required") m = models.TestModel.objects.get() - assert m.title_en == 'foo' - assert m.title_de == 'foo' - assert m.text_en == 'bar' + assert m.title_en == "foo" + assert m.title_de == "foo" + assert m.text_en == "bar" assert m.text_de is None - call_command('loaddata', 'fixture.json', verbosity=0, populate='all') + call_command("loaddata", "fixture.json", verbosity=0, populate="all") m = models.TestModel.objects.get() - assert m.title_en == 'foo' - assert m.title_de == 'foo' - assert m.text_en == 'bar' - assert m.text_de == 'bar' + assert m.title_en == "foo" + assert m.title_de == "foo" + assert m.text_en == "bar" + assert m.text_de == "bar" # Test if option overrides current context - with auto_populate('all'): - call_command('loaddata', 'fixture.json', verbosity=0, populate=False) + with auto_populate("all"): + call_command("loaddata", "fixture.json", verbosity=0, populate=False) m = models.TestModel.objects.get() - assert m.title_en == 'foo' + assert m.title_en == "foo" assert m.title_de is None - assert m.text_en == 'bar' + assert m.text_en == "bar" assert m.text_de is None def assertDeferred(self, use_defer, *fields): manager = models.TestModel.objects.defer if use_defer else models.TestModel.objects.only inst1 = manager(*fields)[0] - with override('de'): + with override("de"): inst2 = manager(*fields)[0] - assert 'title_en' == inst1.title - assert 'title_en' == inst2.title - with override('de'): - assert 'title_de' == inst1.title - assert 'title_de' == inst2.title + assert "title_en" == inst1.title + assert "title_en" == inst2.title + with override("de"): + assert "title_de" == inst1.title + assert "title_de" == inst2.title def assertDeferredClass(self, item): assert len(item.get_deferred_fields()) > 0 @@ -3491,178 +3491,178 @@ class TestManager(ModeltranslationTestBase): """ Check if ``only`` and ``defer`` are working. """ - models.TestModel.objects.create(title_de='title_de', title_en='title_en') - inst = models.TestModel.objects.only('title_en')[0] + models.TestModel.objects.create(title_de="title_de", title_en="title_en") + inst = models.TestModel.objects.only("title_en")[0] assert isinstance(inst, models.TestModel) - self.assertDeferred(False, 'title_en') + self.assertDeferred(False, "title_en") - with auto_populate('all'): - self.assertDeferred(False, 'title') - self.assertDeferred(False, 'title_de') - self.assertDeferred(False, 'title_en') - self.assertDeferred(False, 'title_en', 'title_de') - self.assertDeferred(False, 'title', 'title_en') - self.assertDeferred(False, 'title', 'title_de') + with auto_populate("all"): + self.assertDeferred(False, "title") + self.assertDeferred(False, "title_de") + self.assertDeferred(False, "title_en") + self.assertDeferred(False, "title_en", "title_de") + self.assertDeferred(False, "title", "title_en") + self.assertDeferred(False, "title", "title_de") # Check if fields are deferred properly with ``only`` - self.assertDeferred(False, 'text') + self.assertDeferred(False, "text") # Defer - self.assertDeferred(True, 'title') - self.assertDeferred(True, 'title_de') - self.assertDeferred(True, 'title_en') - self.assertDeferred(True, 'title_en', 'title_de') - self.assertDeferred(True, 'title', 'title_en') - self.assertDeferred(True, 'title', 'title_de') - self.assertDeferred(True, 'text', 'email', 'url') + self.assertDeferred(True, "title") + self.assertDeferred(True, "title_de") + self.assertDeferred(True, "title_en") + self.assertDeferred(True, "title_en", "title_de") + self.assertDeferred(True, "title", "title_en") + self.assertDeferred(True, "title", "title_de") + self.assertDeferred(True, "text", "email", "url") def test_deferred_fk(self): """ Check if ``select_related`` is rewritten and also if ``only`` and ``defer`` are working with deferred classes """ - test = models.TestModel.objects.create(title_de='title_de', title_en='title_en') - with auto_populate('all'): + test = models.TestModel.objects.create(title_de="title_de", title_en="title_en") + with auto_populate("all"): models.ForeignKeyModel.objects.create(test=test) item = models.ForeignKeyModel.objects.select_related("test").defer("test__text")[0] self.assertDeferredClass(item.test) - assert 'title_en' == item.test.title - assert 'title_en' == item.test.__class__.objects.only('title')[0].title - with override('de'): + assert "title_en" == item.test.title + assert "title_en" == item.test.__class__.objects.only("title")[0].title + with override("de"): item = models.ForeignKeyModel.objects.select_related("test").defer("test__text")[0] self.assertDeferredClass(item.test) - assert 'title_de' == item.test.title - assert 'title_de' == item.test.__class__.objects.only('title')[0].title + assert "title_de" == item.test.title + assert "title_de" == item.test.__class__.objects.only("title")[0].title def test_deferred_spanning(self): - test = models.TestModel.objects.create(title_de='title_de', title_en='title_en') - with auto_populate('all'): + test = models.TestModel.objects.create(title_de="title_de", title_en="title_en") + with auto_populate("all"): models.ForeignKeyModel.objects.create(test=test) item1 = models.ForeignKeyModel.objects.select_related("test").defer("test__text")[0].test item2 = models.TestModel.objects.defer("text")[0] assert item1.__class__ is item2.__class__ # DeferredAttribute descriptors are present - assert 'text_en' in dir(item1.__class__) - assert 'text_de' in dir(item1.__class__) + assert "text_en" in dir(item1.__class__) + assert "text_de" in dir(item1.__class__) def test_deferred_rule2(self): - models.TestModel.objects.create(title_de='title_de', title_en='title_en') - o = models.TestModel.objects.only('title')[0] + models.TestModel.objects.create(title_de="title_de", title_en="title_en") + o = models.TestModel.objects.only("title")[0] assert o.title == "title_en" o.title = "bla" assert o.title == "bla" def test_select_related(self): - test = models.TestModel.objects.create(title_de='title_de', title_en='title_en') - with auto_populate('all'): + test = models.TestModel.objects.create(title_de="title_de", title_en="title_en") + with auto_populate("all"): models.ForeignKeyModel.objects.create(untrans=test) fk_qs = models.ForeignKeyModel.objects.all() - assert 'untrans' not in fk_qs[0]._state.fields_cache - assert 'untrans' in fk_qs.select_related('untrans')[0]._state.fields_cache + assert "untrans" not in fk_qs[0]._state.fields_cache + assert "untrans" in fk_qs.select_related("untrans")[0]._state.fields_cache assert ( - 'untrans' - not in fk_qs.select_related('untrans').select_related(None)[0]._state.fields_cache + "untrans" + not in fk_qs.select_related("untrans").select_related(None)[0]._state.fields_cache ) # untrans is nullable so not included when select_related=True - assert 'untrans' not in fk_qs.select_related()[0]._state.fields_cache + assert "untrans" not in fk_qs.select_related()[0]._state.fields_cache def test_translation_fields_appending(self): from modeltranslation.manager import append_lookup_key, append_lookup_keys - assert {'untrans'} == append_lookup_key(models.ForeignKeyModel, 'untrans') - assert {'title', 'title_en', 'title_de'} == append_lookup_key( - models.ForeignKeyModel, 'title' + assert {"untrans"} == append_lookup_key(models.ForeignKeyModel, "untrans") + assert {"title", "title_en", "title_de"} == append_lookup_key( + models.ForeignKeyModel, "title" ) - assert {'test', 'test_en', 'test_de'} == append_lookup_key(models.ForeignKeyModel, 'test') - assert {'title__eq', 'title_en__eq', 'title_de__eq'} == append_lookup_key( - models.ForeignKeyModel, 'title__eq' + assert {"test", "test_en", "test_de"} == append_lookup_key(models.ForeignKeyModel, "test") + assert {"title__eq", "title_en__eq", "title_de__eq"} == append_lookup_key( + models.ForeignKeyModel, "title__eq" ) - assert {'test__smt', 'test_en__smt', 'test_de__smt'} == append_lookup_key( - models.ForeignKeyModel, 'test__smt' + assert {"test__smt", "test_en__smt", "test_de__smt"} == append_lookup_key( + models.ForeignKeyModel, "test__smt" ) big_set = { - 'test__url', - 'test__url_en', - 'test__url_de', - 'test_en__url', - 'test_en__url_en', - 'test_en__url_de', - 'test_de__url', - 'test_de__url_en', - 'test_de__url_de', + "test__url", + "test__url_en", + "test__url_de", + "test_en__url", + "test_en__url_en", + "test_en__url_de", + "test_de__url", + "test_de__url_en", + "test_de__url_de", } - assert big_set == append_lookup_key(models.ForeignKeyModel, 'test__url') - assert {'untrans__url', 'untrans__url_en', 'untrans__url_de'} == append_lookup_key( - models.ForeignKeyModel, 'untrans__url' + assert big_set == append_lookup_key(models.ForeignKeyModel, "test__url") + assert {"untrans__url", "untrans__url_en", "untrans__url_de"} == append_lookup_key( + models.ForeignKeyModel, "untrans__url" ) - assert big_set.union(['title', 'title_en', 'title_de']) == append_lookup_keys( - models.ForeignKeyModel, ['test__url', 'title'] + assert big_set.union(["title", "title_en", "title_de"]) == append_lookup_keys( + models.ForeignKeyModel, ["test__url", "title"] ) def test_constructor_inheritance(self): inst = models.AbstractModelB() # Check if fields assigned in constructor hasn't been ignored. - assert inst.titlea == 'title_a' - assert inst.titleb == 'title_b' + assert inst.titlea == "title_a" + assert inst.titleb == "title_b" def test_distinct(self): """Check that field names are rewritten in distinct keys.""" manager = models.ManagerTestModel.objects manager.create( - title_en='title_1_en', - title_de='title_1_de', - description_en='desc_1_en', - description_de='desc_1_de', + title_en="title_1_en", + title_de="title_1_de", + description_en="desc_1_en", + description_de="desc_1_de", ) manager.create( - title_en='title_1_en', - title_de='title_1_de', - description_en='desc_2_en', - description_de='desc_2_de', + title_en="title_1_en", + title_de="title_1_de", + description_en="desc_2_en", + description_de="desc_2_de", ) manager.create( - title_en='title_2_en', - title_de='title_2_de', - description_en='desc_1_en', - description_de='desc_1_de', + title_en="title_2_en", + title_de="title_2_de", + description_en="desc_1_en", + description_de="desc_1_de", ) manager.create( - title_en='title_2_en', - title_de='title_2_de', - description_en='desc_2_en', - description_de='desc_2_de', + title_en="title_2_en", + title_de="title_2_de", + description_en="desc_2_en", + description_de="desc_2_de", ) # Without field arguments to distinct() all fields are used to determine # distinctness, therefore when only looking at a subset of fields in the # queryset it can appear that there are duplicates (the titles in this case) - titles_for_en = tuple(m.title for m in manager.order_by('title').distinct()) - with override('de'): - titles_for_de = tuple(m.title for m in manager.order_by('title').distinct()) + titles_for_en = tuple(m.title for m in manager.order_by("title").distinct()) + with override("de"): + titles_for_de = tuple(m.title for m in manager.order_by("title").distinct()) - assert titles_for_en == ('title_1_en', 'title_1_en', 'title_2_en', 'title_2_en') - assert titles_for_de == ('title_1_de', 'title_1_de', 'title_2_de', 'title_2_de') + assert titles_for_en == ("title_1_en", "title_1_en", "title_2_en", "title_2_en") + assert titles_for_de == ("title_1_de", "title_1_de", "title_2_de", "title_2_de") # On PostgreSQL only, distinct() can have field arguments (*fields) to specify which fields # the distinct applies to (this generates a DISTINCT ON (*fields) sql expression). # NB: DISTINCT ON expressions must be accompanied by an order_by() that starts with the # same fields in the same order - if django_settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql': + if django_settings.DATABASES["default"]["ENGINE"] == "django.db.backends.postgresql": titles_for_en = tuple( (m.title, m.description) - for m in manager.order_by('title', 'description').distinct('title') + for m in manager.order_by("title", "description").distinct("title") ) - with override('de'): + with override("de"): titles_for_de = tuple( (m.title, m.description) - for m in manager.order_by('title', 'description').distinct('title') + for m in manager.order_by("title", "description").distinct("title") ) - assert titles_for_en == (('title_1_en', 'desc_1_en'), ('title_2_en', 'desc_1_en')) - assert titles_for_de == (('title_1_de', 'desc_1_de'), ('title_2_de', 'desc_1_de')) + assert titles_for_en == (("title_1_en", "desc_1_en"), ("title_2_en", "desc_1_en")) + assert titles_for_de == (("title_1_de", "desc_1_de"), ("title_2_de", "desc_1_de")) class TranslationModelFormTest(ModeltranslationTestBase): @@ -3670,27 +3670,27 @@ class TranslationModelFormTest(ModeltranslationTestBase): class TestModelForm(TranslationModelForm): class Meta: model = models.TestModel - fields = '__all__' + fields = "__all__" form = TestModelForm() assert list(form.base_fields) == [ - 'title', - 'title_de', - 'title_en', - 'text', - 'text_de', - 'text_en', - 'url', - 'url_de', - 'url_en', - 'email', - 'email_de', - 'email_en', - 'dynamic_default', - 'dynamic_default_de', - 'dynamic_default_en', + "title", + "title_de", + "title_en", + "text", + "text_de", + "text_en", + "url", + "url_de", + "url_en", + "email", + "email_de", + "email_en", + "dynamic_default", + "dynamic_default_de", + "dynamic_default_en", ] - assert list(form.fields) == ['title', 'text', 'url', 'email', 'dynamic_default'] + assert list(form.fields) == ["title", "text", "url", "email", "dynamic_default"] def test_updating_with_empty_value(self): """ @@ -3701,21 +3701,21 @@ class TranslationModelFormTest(ModeltranslationTestBase): class Form(forms.ModelForm): class Meta: model = models.TestModel - exclude = ('text', 'dynamic_default') + exclude = ("text", "dynamic_default") - instance = models.TestModel.objects.create(text_de='something') + instance = models.TestModel.objects.create(text_de="something") form = Form( - {'text_de': '', 'title': 'a', 'email_de': '', 'email_en': ''}, instance=instance + {"text_de": "", "title": "a", "email_de": "", "email_en": ""}, instance=instance ) instance = form.save() - assert 'de' == get_language() - assert '' == instance.text_de + assert "de" == get_language() + assert "" == instance.text_de class ProxyModelTest(ModeltranslationTestBase): def test_equality(self): - n = models.TestModel.objects.create(title='Title') - m = models.ProxyTestModel.objects.get(title='Title') + n = models.TestModel.objects.create(title="Title") + m = models.ProxyTestModel.objects.get(title="Title") assert n.title == m.title assert n.title_de == m.title_de assert n.title_en == m.title_en @@ -3732,36 +3732,36 @@ class TestRequired(ModeltranslationTestBase): self.opts = models.RequiredModel._meta # All non required - self.assertNotRequired('non_req') - self.assertNotRequired('non_req_en') - self.assertNotRequired('non_req_de') + self.assertNotRequired("non_req") + self.assertNotRequired("non_req_en") + self.assertNotRequired("non_req_de") # Original required, but translated fields not - default behaviour - self.assertRequired('req') - self.assertNotRequired('req_en') - self.assertNotRequired('req_de') + self.assertRequired("req") + self.assertNotRequired("req_en") + self.assertNotRequired("req_de") # Set all translated field required - self.assertRequired('req_reg') - self.assertRequired('req_reg_en') - self.assertRequired('req_reg_de') + self.assertRequired("req_reg") + self.assertRequired("req_reg_en") + self.assertRequired("req_reg_de") # Set some translated field required - self.assertRequired('req_en_reg') - self.assertRequired('req_en_reg_en') - self.assertNotRequired('req_en_reg_de') + self.assertRequired("req_en_reg") + self.assertRequired("req_en_reg_en") + self.assertNotRequired("req_en_reg_de") # Test validation inst = models.RequiredModel() - inst.req = 'abc' - inst.req_reg = 'def' + inst.req = "abc" + inst.req_reg = "def" try: inst.full_clean() except ValidationError as e: error_fields = set(e.message_dict.keys()) - assert {'req_reg_en', 'req_en_reg', 'req_en_reg_en'} == error_fields + assert {"req_reg_en", "req_en_reg", "req_en_reg_en"} == error_fields else: - self.fail('ValidationError not raised!') + self.fail("ValidationError not raised!") class M2MTest(ModeltranslationTestBase): @@ -3770,7 +3770,7 @@ class M2MTest(ModeltranslationTestBase): # English and German names. x1 = models.ModelX.objects.create(name_en="foo", name_de="bar") x2 = models.ModelX.objects.create(name_en="bar", name_de="baz") - y = models.ModelY.objects.create(title='y1') + y = models.ModelY.objects.create(title="y1") models.ModelXY.objects.create(model_x=x1, model_y=y) models.ModelXY.objects.create(model_x=x2, model_y=y) @@ -3815,5 +3815,5 @@ class InheritedPermissionTestCase(ModeltranslationTestBase): assert not isinstance( Permission.objects, MultilingualManager ), "Permission is using MultilingualManager" - user = User.objects.create(username='123', is_active=True) - user.has_perm('test_perm') + user = User.objects.create(username="123", is_active=True) + user.has_perm("test_perm") diff --git a/modeltranslation/tests/translation.py b/modeltranslation/tests/translation.py index 1b558dd..587a721 100644 --- a/modeltranslation/tests/translation.py +++ b/modeltranslation/tests/translation.py @@ -10,18 +10,18 @@ from modeltranslation.translator import TranslationOptions, register, translator @register(models.TestModel) class TestTranslationOptions(TranslationOptions): fields = ( - 'title', - 'text', - 'url', - 'email', - 'dynamic_default', + "title", + "text", + "url", + "email", + "dynamic_default", ) - empty_values = '' + empty_values = "" @register(models.UniqueNullableModel) class UniqueNullableTranslationOptions(TranslationOptions): - fields = ('title',) + fields = ("title",) # ######### Proxy model testing @@ -30,10 +30,10 @@ class UniqueNullableTranslationOptions(TranslationOptions): @register(models.ProxyTestModel) class ProxyTestTranslationOptions(TranslationOptions): fields = ( - 'title', - 'text', - 'url', - 'email', + "title", + "text", + "url", + "email", ) @@ -42,20 +42,20 @@ class ProxyTestTranslationOptions(TranslationOptions): @register(models.FallbackModel) class FallbackModelTranslationOptions(TranslationOptions): - fields = ('title', 'text', 'url', 'email', 'description') + fields = ("title", "text", "url", "email", "description") fallback_values = "fallback" @register(models.FallbackModel2) class FallbackModel2TranslationOptions(TranslationOptions): fields = ( - 'title', - 'text', - 'url', - 'email', + "title", + "text", + "url", + "email", ) - fallback_values = {'text': gettext_lazy('Sorry, translation is not available.')} - fallback_undefined = {'title': 'no title'} + fallback_values = {"text": gettext_lazy("Sorry, translation is not available.")} + fallback_undefined = {"title": "no title"} # ######### File fields testing @@ -64,10 +64,10 @@ class FallbackModel2TranslationOptions(TranslationOptions): @register(models.FileFieldsModel) class FileFieldsModelTranslationOptions(TranslationOptions): fields = ( - 'title', - 'file', - 'file2', - 'image', + "title", + "file", + "file2", + "image", ) @@ -77,32 +77,32 @@ class FileFieldsModelTranslationOptions(TranslationOptions): @register(models.ForeignKeyModel) class ForeignKeyModelTranslationOptions(TranslationOptions): fields = ( - 'title', - 'test', - 'optional', - 'hidden', - 'non', + "title", + "test", + "optional", + "hidden", + "non", ) @register(models.OneToOneFieldModel) class OneToOneFieldModelTranslationOptions(TranslationOptions): fields = ( - 'title', - 'test', - 'optional', - 'non', + "title", + "test", + "optional", + "non", ) @register(models.FilteredTestModel) class FilteredTestModelTranslationOptions(TranslationOptions): - fields = ('title',) + fields = ("title",) @register(models.ForeignKeyFilteredModel) class ForeignKeyFilteredModelTranslationOptions(TranslationOptions): - fields = ('title',) + fields = ("title",) @register(models.ManyToManyFieldModel) @@ -120,7 +120,7 @@ class ManyToManyFieldModelTranslationOptions(TranslationOptions): @register(models.RegisteredThroughModel) class RegisteredThroughModelTranslationOptions(TranslationOptions): - fields = ('title',) + fields = ("title",) # ######### Custom fields testing @@ -129,21 +129,21 @@ class RegisteredThroughModelTranslationOptions(TranslationOptions): @register(models.OtherFieldsModel) class OtherFieldsModelTranslationOptions(TranslationOptions): fields = ( - 'int', - 'boolean', - 'float', - 'decimal', - 'genericip', - 'date', - 'datetime', - 'time', - 'json', + "int", + "boolean", + "float", + "decimal", + "genericip", + "date", + "datetime", + "time", + "json", ) @register(models.DescriptorModel) class DescriptorModelTranslationOptions(TranslationOptions): - fields = ('trans',) + fields = ("trans",) # ######### Multitable inheritance testing @@ -151,17 +151,17 @@ class DescriptorModelTranslationOptions(TranslationOptions): @register(models.MultitableModelA) class MultitableModelATranslationOptions(TranslationOptions): - fields = ('titlea',) + fields = ("titlea",) @register(models.MultitableModelB) class MultitableModelBTranslationOptions(TranslationOptions): - fields = ('titleb',) + fields = ("titleb",) @register(models.MultitableModelC) class MultitableModelCTranslationOptions(TranslationOptions): - fields = ('titlec',) + fields = ("titlec",) # ######### Abstract inheritance testing @@ -169,31 +169,31 @@ class MultitableModelCTranslationOptions(TranslationOptions): @register(models.AbstractModelA) class AbstractModelATranslationOptions(TranslationOptions): - fields = ('titlea',) + fields = ("titlea",) @register(models.AbstractModelB) class AbstractModelBTranslationOptions(TranslationOptions): - fields = ('titleb',) + fields = ("titleb",) # ######### Fields inheritance testing class SluggedTranslationOptions(TranslationOptions): - fields = ('slug',) + fields = ("slug",) class MetaDataTranslationOptions(TranslationOptions): - fields = ('keywords',) + fields = ("keywords",) class RichTextTranslationOptions(TranslationOptions): - fields = ('content',) + fields = ("content",) class PageTranslationOptions(TranslationOptions): - fields = ('title',) + fields = ("title",) # BasePage left unregistered intentionally. @@ -210,7 +210,7 @@ translator.register(models.RichTextPage) @register(models.ManagerTestModel) class ManagerTestModelTranslationOptions(TranslationOptions): - fields = ('title', 'visits', 'description') + fields = ("title", "visits", "description") @register( @@ -222,32 +222,32 @@ class ManagerTestModelTranslationOptions(TranslationOptions): ] ) class CustomManagerTestModelTranslationOptions(TranslationOptions): - fields = ('title',) + fields = ("title",) # ######### TranslationOptions field inheritance testing class FieldInheritanceATranslationOptions(TranslationOptions): - fields = ['titlea'] + fields = ["titlea"] class FieldInheritanceBTranslationOptions(FieldInheritanceATranslationOptions): - fields = ['titleb'] + fields = ["titleb"] class FieldInheritanceCTranslationOptions(FieldInheritanceBTranslationOptions): - fields = ['titlec'] + fields = ["titlec"] class FieldInheritanceDTranslationOptions(FieldInheritanceBTranslationOptions): - fields = ('titled',) + fields = ("titled",) class FieldInheritanceETranslationOptions( FieldInheritanceCTranslationOptions, FieldInheritanceDTranslationOptions ): - fields = ('titlee',) + fields = ("titlee",) # ######### Integration testing @@ -255,7 +255,7 @@ class FieldInheritanceETranslationOptions( @register(models.ThirdPartyRegisteredModel) class ThirdPartyTranslationOptions(TranslationOptions): - fields = ('name',) + fields = ("name",) # ######### Admin testing @@ -264,14 +264,14 @@ class ThirdPartyTranslationOptions(TranslationOptions): @register(models.GroupFieldsetsModel) class GroupFieldsetsTranslationOptions(TranslationOptions): fields = ( - 'title', - 'text', + "title", + "text", ) @register(models.NameModel) class NameTranslationOptions(TranslationOptions): - fields = ('firstname', 'lastname', 'slug2') + fields = ("firstname", "lastname", "slug2") # ######### Required fields testing @@ -279,13 +279,13 @@ class NameTranslationOptions(TranslationOptions): @register(models.RequiredModel) class RequiredTranslationOptions(TranslationOptions): - fields = ('non_req', 'req', 'req_reg', 'req_en_reg') + fields = ("non_req", "req", "req_reg", "req_en_reg") required_languages = { - 'en': ( - 'req_reg', - 'req_en_reg', + "en": ( + "req_reg", + "req_en_reg", ), - 'default': ('req_reg',), # for all other languages + "default": ("req_reg",), # for all other languages } @@ -294,12 +294,12 @@ class RequiredTranslationOptions(TranslationOptions): @register(models.ModelX) class ModelXOptions(TranslationOptions): - fields = ('name',) + fields = ("name",) @register(models.ModelY) class ModelYOptions(TranslationOptions): - fields = ('title',) + fields = ("title",) # ######### 3-rd party with custom manager @@ -307,10 +307,10 @@ class ModelYOptions(TranslationOptions): @register(Group) class GroupTranslationOptions(TranslationOptions): - fields = ('name',) + fields = ("name",) @register(InheritedPermission) class InheritedPermissionOptions(TranslationOptions): - fields = ('translated_var',) + fields = ("translated_var",) required_languages = [x[0] for x in settings.LANGUAGES] diff --git a/modeltranslation/translator.py b/modeltranslation/translator.py index 49afd10..2fee5ca 100644 --- a/modeltranslation/translator.py +++ b/modeltranslation/translator.py @@ -45,11 +45,11 @@ class FieldsAggregationMetaClass(type): """ def __new__(cls, name, bases, attrs): - attrs['fields'] = set(attrs.get('fields', ())) + attrs["fields"] = set(attrs.get("fields", ())) for base in bases: if isinstance(base, FieldsAggregationMetaClass): - attrs['fields'].update(base.fields) - attrs['fields'] = tuple(attrs['fields']) + attrs["fields"].update(base.fields) + attrs["fields"] = tuple(attrs["fields"]) return super().__new__(cls, name, bases, attrs) @@ -97,18 +97,18 @@ class TranslationOptions(metaclass=FieldsAggregationMetaClass): if isinstance(self.required_languages, (tuple, list)): self._check_languages(self.required_languages) else: - self._check_languages(self.required_languages.keys(), extra=('default',)) + self._check_languages(self.required_languages.keys(), extra=("default",)) for fieldnames in self.required_languages.values(): if any(f not in self.fields for f in fieldnames): raise ImproperlyConfigured( - 'Fieldname in required_languages which is not in fields option.' + "Fieldname in required_languages which is not in fields option." ) def _check_languages(self, languages, extra=()): correct = list(mt_settings.AVAILABLE_LANGUAGES) + list(extra) if any(lang not in correct for lang in languages): raise ImproperlyConfigured( - 'Language in required_languages which is not in AVAILABLE_LANGUAGES.' + "Language in required_languages which is not in AVAILABLE_LANGUAGES." ) def update(self, other): @@ -135,7 +135,7 @@ class TranslationOptions(metaclass=FieldsAggregationMetaClass): def __str__(self): local = tuple(self.local_fields.keys()) inherited = tuple(set(self.fields.keys()) - set(local)) - return '%s: %s + %s' % (self.__class__.__name__, local, inherited) + return "%s: %s + %s" % (self.__class__.__name__, local, inherited) class MultilingualOptions(options.Options): @@ -153,7 +153,7 @@ def add_translation_fields(model, opts): Adds newly created translation fields to the given translation options. """ - model_empty_values = getattr(opts, 'empty_values', NONE) + model_empty_values = getattr(opts, "empty_values", NONE) for field_name in opts.local_fields.keys(): field_empty_value = parse_field(model_empty_values, field_name, NONE) for lang in mt_settings.AVAILABLE_LANGUAGES: @@ -168,7 +168,7 @@ def add_translation_fields(model, opts): if hasattr(model, localized_field_name): # Check if are not dealing with abstract field inherited. for cls in model.__mro__: - if hasattr(cls, '_meta') and cls.__dict__.get(localized_field_name, None): + if hasattr(cls, "_meta") and cls.__dict__.get(localized_field_name, None): cls_opts = translator._get_options_for_model(cls) if not cls._meta.abstract or field_name not in cls_opts.local_fields: raise ValueError( @@ -204,7 +204,7 @@ def patch_manager_class(manager): def deconstruct(self): return ( False, # as_manager - '%s.%s' % (self._old_module, self._old_class), # manager_class + "%s.%s" % (self._old_module, self._old_class), # manager_class None, # qs_class self._constructor_args[0], # args self._constructor_args[1], # kwargs @@ -281,7 +281,7 @@ def patch_constructor(model): def delete_mt_init(sender, instance, **kwargs): - if hasattr(instance, '_mt_init'): + if hasattr(instance, "_mt_init"): del instance._mt_init @@ -292,7 +292,7 @@ def patch_clean_fields(model): old_clean_fields = model.clean_fields def new_clean_fields(self, exclude=None): - if hasattr(self, '_mt_form_pending_clear'): + if hasattr(self, "_mt_form_pending_clear"): # Some form translation fields has been marked as clearing value. # Check if corresponding translated field was also saved (not excluded): # - if yes, it seems like form for MT-unaware app. Ignore clearing (left value from @@ -303,12 +303,12 @@ def patch_clean_fields(model): orig_field_name = field.translated_field.name if orig_field_name in exclude: field.save_form_data(self, value, check=False) - delattr(self, '_mt_form_pending_clear') + delattr(self, "_mt_form_pending_clear") try: - setattr(self, '_mt_disable', True) + setattr(self, "_mt_disable", True) old_clean_fields(self, exclude) finally: - setattr(self, '_mt_disable', False) + setattr(self, "_mt_disable", False) model.clean_fields = new_clean_fields @@ -317,13 +317,13 @@ def patch_get_deferred_fields(model): """ Django >= 1.8: patch detecting deferred fields. Crucial for only/defer to work. """ - if not hasattr(model, 'get_deferred_fields'): + if not hasattr(model, "get_deferred_fields"): return old_get_deferred_fields = model.get_deferred_fields def new_get_deferred_fields(self): sup = old_get_deferred_fields(self) - if hasattr(self, '_fields_were_deferred'): + if hasattr(self, "_fields_were_deferred"): sup.update(self._fields_were_deferred) return sup @@ -334,7 +334,7 @@ def patch_refresh_from_db(model): """ Django >= 1.10: patch refreshing deferred fields. Crucial for only/defer to work. """ - if not hasattr(model, 'refresh_from_db'): + if not hasattr(model, "refresh_from_db"): return old_refresh_from_db = model.refresh_from_db @@ -349,12 +349,12 @@ def patch_refresh_from_db(model): def delete_cache_fields(model): opts = model._meta cached_attrs = ( - '_field_cache', - '_field_name_cache', - '_name_map', - 'fields', - 'concrete_fields', - 'local_concrete_fields', + "_field_cache", + "_field_name_cache", + "_name_map", + "fields", + "concrete_fields", + "local_concrete_fields", ) for attr in cached_attrs: try: @@ -362,7 +362,7 @@ def delete_cache_fields(model): except AttributeError: pass - if hasattr(model._meta, '_expire_cache'): + if hasattr(model._meta, "_expire_cache"): model._meta._expire_cache() @@ -396,19 +396,19 @@ def populate_translation_fields(sender, kwargs): return if populate is True: # What was meant by ``True`` is now called ``all``. - populate = 'all' + populate = "all" opts = translator.get_options_for_model(sender) for key, val in list(kwargs.items()): if key in opts.fields: - if populate == 'all': + if populate == "all": # Set the value for every language. for translation_field in opts.fields[key]: kwargs.setdefault(translation_field.name, val) - elif populate == 'default': + elif populate == "default": default = build_localized_fieldname(key, mt_settings.DEFAULT_LANGUAGE) kwargs.setdefault(default, val) - elif populate == 'required': + elif populate == "required": default = build_localized_fieldname(key, mt_settings.DEFAULT_LANGUAGE) if not sender._meta.get_field(key).null: kwargs.setdefault(default, val) @@ -532,9 +532,9 @@ class Translator: patch_refresh_from_db(model) # Substitute original field with descriptor - model_fallback_languages = getattr(opts, 'fallback_languages', None) - model_fallback_values = getattr(opts, 'fallback_values', NONE) - model_fallback_undefined = getattr(opts, 'fallback_undefined', NONE) + model_fallback_languages = getattr(opts, "fallback_languages", None) + model_fallback_values = getattr(opts, "fallback_values", NONE) + model_fallback_undefined = getattr(opts, "fallback_undefined", NONE) for field_name in opts.local_fields.keys(): field = model._meta.get_field(field_name) field_fallback_value = parse_field(model_fallback_values, field_name, NONE) @@ -628,7 +628,7 @@ class Translator: # Fields for translation may be inherited from abstract # superclasses, so we need to look at all parents. for base in model.__bases__: - if not hasattr(base, '_meta'): + if not hasattr(base, "_meta"): # Things without _meta aren't functional models, so they're # uninteresting parents. continue @@ -648,7 +648,7 @@ class Translator: opts = self._get_options_for_model(model) if not opts.registered and not opts.related: raise NotRegistered( - 'The model "%s" is not registered for ' 'translation' % model.__name__ + 'The model "%s" is not registered for ' "translation" % model.__name__ ) return opts diff --git a/modeltranslation/utils.py b/modeltranslation/utils.py index 0ac6be7..011cafb 100644 --- a/modeltranslation/utils.py +++ b/modeltranslation/utils.py @@ -22,8 +22,8 @@ def get_language(): lang = _get_language() if lang is None: # Django >= 1.8 return settings.DEFAULT_LANGUAGE - if lang not in settings.AVAILABLE_LANGUAGES and '-' in lang: - lang = lang.split('-')[0] + if lang not in settings.AVAILABLE_LANGUAGES and "-" in lang: + lang = lang.split("-")[0] if lang in settings.AVAILABLE_LANGUAGES: return lang return settings.DEFAULT_LANGUAGE @@ -34,7 +34,7 @@ def get_language_bidi(lang): Check if a language is bi-directional. """ lang_info = get_language_info(lang) - return lang_info['bidi'] + return lang_info["bidi"] def get_translation_fields(field): @@ -45,37 +45,37 @@ def get_translation_fields(field): def build_localized_fieldname(field_name, lang): - if lang == 'id': + if lang == "id": # The 2-letter Indonesian language code is problematic with the # current naming scheme as Django foreign keys also add "id" suffix. - lang = 'ind' - return str('%s_%s' % (field_name, lang.replace('-', '_'))) + lang = "ind" + return str("%s_%s" % (field_name, lang.replace("-", "_"))) def _build_localized_verbose_name(verbose_name, lang): - if lang == 'id': - lang = 'ind' - return force_str('%s [%s]') % (force_str(verbose_name), lang) + if lang == "id": + lang = "ind" + return force_str("%s [%s]") % (force_str(verbose_name), lang) build_localized_verbose_name = lazy(_build_localized_verbose_name, str) def _join_css_class(bits, offset): - if '-'.join(bits[-offset:]) in settings.AVAILABLE_LANGUAGES + ['en-us']: - return '%s-%s' % ('_'.join(bits[: len(bits) - offset]), '_'.join(bits[-offset:])) - return '' + if "-".join(bits[-offset:]) in settings.AVAILABLE_LANGUAGES + ["en-us"]: + return "%s-%s" % ("_".join(bits[: len(bits) - offset]), "_".join(bits[-offset:])) + return "" -def build_css_class(localized_fieldname, prefix=''): +def build_css_class(localized_fieldname, prefix=""): """ Returns a css class based on ``localized_fieldname`` which is easily splittable and capable of regionalized language codes. Takes an optional ``prefix`` which is prepended to the returned string. """ - bits = localized_fieldname.split('_') - css_class = '' + bits = localized_fieldname.split("_") + css_class = "" if len(bits) == 1: css_class = str(localized_fieldname) elif len(bits) == 2: @@ -83,7 +83,7 @@ def build_css_class(localized_fieldname, prefix=''): # Examples: # 'foo_de' --> 'foo-de', # 'bar_en' --> 'bar-en' - css_class = '-'.join(bits) + css_class = "-".join(bits) elif len(bits) > 2: # Try regionalized language code # Examples: @@ -96,7 +96,7 @@ def build_css_class(localized_fieldname, prefix=''): # 'foo_bar_de' --> 'foo_bar-de', # 'foo_bar_baz_de' --> 'foo_bar_baz-de' css_class = _join_css_class(bits, 1) - return '%s-%s' % (prefix, css_class) if prefix else css_class + return "%s-%s" % (prefix, css_class) if prefix else css_class def unique(seq): @@ -124,13 +124,13 @@ def resolution_order(lang, override=None): if override is None: override = {} fallback_for_lang = override.get(lang, settings.FALLBACK_LANGUAGES.get(lang, ())) - fallback_def = override.get('default', settings.FALLBACK_LANGUAGES['default']) + fallback_def = override.get("default", settings.FALLBACK_LANGUAGES["default"]) order = (lang,) + fallback_for_lang + fallback_def return tuple(unique(order)) @contextmanager -def auto_populate(mode='all'): +def auto_populate(mode="all"): """ Overrides translation fields population mode (population mode decides which unprovided translations will be filled during model construction / loading). diff --git a/modeltranslation/widgets.py b/modeltranslation/widgets.py index 702c372..994fa87 100644 --- a/modeltranslation/widgets.py +++ b/modeltranslation/widgets.py @@ -28,7 +28,7 @@ class ClearableWidgetWrapper(Widget): # template = '{} {}' class Media: - js = ('modeltranslation/js/clearable_inputs.js',) + js = ("modeltranslation/js/clearable_inputs.js",) def __init__(self, widget, empty_value=None): """ @@ -36,7 +36,7 @@ class ClearableWidgetWrapper(Widget): Allows overriding the empty value. """ self.widget = widget - self.checkbox = CheckboxInput(attrs={'tabindex': '-1'}) + self.checkbox = CheckboxInput(attrs={"tabindex": "-1"}) self.empty_value = empty_value def __getattr__(self, name): @@ -44,7 +44,7 @@ class ClearableWidgetWrapper(Widget): If we don't have a property or a method, chances are the wrapped widget does. """ - if name != 'widget': + if name != "widget": return getattr(self.widget, name) raise AttributeError @@ -66,7 +66,7 @@ class ClearableWidgetWrapper(Widget): checkbox_id = self.clear_checkbox_id(checkbox_name) checkbox_label = self.clear_checkbox_label checkbox = self.checkbox.render( - checkbox_name, value == self.empty_value, attrs={'id': checkbox_id}, renderer=renderer + checkbox_name, value == self.empty_value, attrs={"id": checkbox_id}, renderer=renderer ) return mark_safe( self.template.format( @@ -91,10 +91,10 @@ class ClearableWidgetWrapper(Widget): """ Given the name of the input, returns the name of the clear checkbox. """ - return name + '-clear' + return name + "-clear" def clear_checkbox_id(self, name): """ Given the name of the clear checkbox input, returns the HTML id for it. """ - return name + '_id' + return name + "_id"