diff --git a/modeltranslation/admin.py b/modeltranslation/admin.py index c89eea8..166b4ff 100644 --- a/modeltranslation/admin.py +++ b/modeltranslation/admin.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from copy import deepcopy from django.contrib import admin @@ -26,7 +25,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin): both_empty_values_fields = () def __init__(self, *args, **kwargs): - super(TranslationBaseModelAdmin, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.trans_opts = translator.get_options_for_model(self.model) self._patch_prepopulated_fields() @@ -47,7 +46,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin): return None def formfield_for_dbfield(self, db_field, request, **kwargs): - field = super(TranslationBaseModelAdmin, self).formfield_for_dbfield( + field = super().formfield_for_dbfield( db_field, request, **kwargs ) self.patch_translation_field(db_field, field, request, **kwargs) @@ -271,7 +270,7 @@ class TranslationAdmin(TranslationBaseModelAdmin, admin.ModelAdmin): group_fieldsets = False def __init__(self, *args, **kwargs): - super(TranslationAdmin, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self._patch_list_editable() def _patch_list_editable(self): @@ -297,7 +296,7 @@ class TranslationAdmin(TranslationBaseModelAdmin, admin.ModelAdmin): flattened_fieldsets = flatten_fieldsets(fieldsets) # Create a fieldset to group each translated field's localized fields - fields = sorted((f for f in self.opts.get_fields() if f.concrete)) + fields = sorted(f for f in self.opts.get_fields() if f.concrete) untranslated_fields = [ f.name for f in fields @@ -352,7 +351,7 @@ class TranslationAdmin(TranslationBaseModelAdmin, admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): kwargs = self._get_form_or_formset(request, obj, **kwargs) - return super(TranslationAdmin, self).get_form(request, obj, **kwargs) + return super().get_form(request, obj, **kwargs) def get_fieldsets(self, request, obj=None): return self._get_fieldsets_pre_form_or_formset(request, obj) or self._group_fieldsets( @@ -365,7 +364,7 @@ class TranslationAdmin(TranslationBaseModelAdmin, admin.ModelAdmin): class TranslationInlineModelAdmin(TranslationBaseModelAdmin, InlineModelAdmin): def get_formset(self, request, obj=None, **kwargs): kwargs = self._get_form_or_formset(request, obj, **kwargs) - return super(TranslationInlineModelAdmin, self).get_formset(request, obj, **kwargs) + return super().get_formset(request, obj, **kwargs) def get_fieldsets(self, request, obj=None): # FIXME: If fieldsets are declared on an inline some kind of ghost diff --git a/modeltranslation/apps.py b/modeltranslation/apps.py index abd8758..e944123 100644 --- a/modeltranslation/apps.py +++ b/modeltranslation/apps.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from django.apps import AppConfig diff --git a/modeltranslation/fields.py b/modeltranslation/fields.py index 561b71b..a47ee88 100644 --- a/modeltranslation/fields.py +++ b/modeltranslation/fields.py @@ -247,7 +247,7 @@ class TranslationField: return self.creation_counter == other.creation_counter and self.language == getattr( other, 'language', None ) - return super(TranslationField, self).__eq__(other) + return super().__eq__(other) def __ne__(self, other): return not self.__eq__(other) @@ -278,7 +278,7 @@ class TranslationField: The ``forms.CharField`` somewhat surprising behaviour is documented as a "won't fix": https://code.djangoproject.com/ticket/9590. """ - formfield = super(TranslationField, self).formfield(*args, **kwargs) + formfield = super().formfield(*args, **kwargs) if isinstance(formfield, forms.CharField): if self.empty_value is None: from modeltranslation.forms import NullCharField @@ -287,7 +287,7 @@ class TranslationField: kwargs['form_class'] = type( 'Null%s' % form_class.__name__, (NullCharField, form_class), {} ) - formfield = super(TranslationField, self).formfield(*args, **kwargs) + formfield = super().formfield(*args, **kwargs) elif self.empty_value == 'both': from modeltranslation.forms import NullableField @@ -295,7 +295,7 @@ class TranslationField: kwargs['form_class'] = type( 'Nullable%s' % form_class.__name__, (NullableField, form_class), {} ) - formfield = super(TranslationField, self).formfield(*args, **kwargs) + formfield = super().formfield(*args, **kwargs) if isinstance(formfield.widget, (forms.TextInput, forms.Textarea)): formfield.widget = ClearableWidgetWrapper(formfield.widget) return formfield @@ -315,7 +315,7 @@ class TranslationField: instance._mt_form_pending_clear = {} instance._mt_form_pending_clear[self.name] = data else: - super(TranslationField, self).save_form_data(instance, data) + super().save_form_data(instance, data) def deconstruct(self): name, path, args, kwargs = self.translated_field.deconstruct() diff --git a/modeltranslation/forms.py b/modeltranslation/forms.py index efc50b9..8d2396a 100644 --- a/modeltranslation/forms.py +++ b/modeltranslation/forms.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from django import forms from django.core import validators @@ -7,7 +6,7 @@ from modeltranslation.fields import TranslationField class TranslationModelForm(forms.ModelForm): def __init__(self, *args, **kwargs): - super(TranslationModelForm, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) for f in self._meta.model._meta.fields: if f.name in self.fields and isinstance(f, TranslationField): del self.fields[f.name] @@ -21,7 +20,7 @@ class NullCharField(forms.CharField): def to_python(self, value): if value in validators.EMPTY_VALUES: return None - return super(NullCharField, self).to_python(value) + return super().to_python(value) class NullableField(forms.Field): @@ -33,7 +32,7 @@ class NullableField(forms.Field): def to_python(self, value): if value is None: return value - return super(NullableField, self).to_python(value) + return super().to_python(value) # Django 1.6 def _has_changed(self, initial, data): @@ -42,7 +41,7 @@ class NullableField(forms.Field): def has_changed(self, initial, data): if (initial is None and data is not None) or (initial is not None and data is None): return True - obj = super(NullableField, self) + obj = super() if hasattr(obj, 'has_changed'): return obj.has_changed(initial, data) else: # Django < 1.9 compat diff --git a/modeltranslation/management/commands/loaddata.py b/modeltranslation/management/commands/loaddata.py index a0dddf5..395ab2c 100644 --- a/modeltranslation/management/commands/loaddata.py +++ b/modeltranslation/management/commands/loaddata.py @@ -27,7 +27,7 @@ class Command(LoadDataCommand): check_mode(self, option_string, value, parser, namespace) def add_arguments(self, parser): - super(Command, self).add_arguments(parser) + super().add_arguments(parser) parser.add_argument( '--populate', action=self.CheckAction, @@ -44,6 +44,6 @@ class Command(LoadDataCommand): mode = options.get('populate') if mode is not None: with auto_populate(mode): - return super(Command, self).handle(*fixture_labels, **options) + return super().handle(*fixture_labels, **options) else: - return super(Command, self).handle(*fixture_labels, **options) + return super().handle(*fixture_labels, **options) diff --git a/modeltranslation/management/commands/update_translation_fields.py b/modeltranslation/management/commands/update_translation_fields.py index 668d9f8..a281676 100644 --- a/modeltranslation/management/commands/update_translation_fields.py +++ b/modeltranslation/management/commands/update_translation_fields.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from django.db.models import F, Q, ManyToManyField from django.core.management.base import BaseCommand, CommandError diff --git a/modeltranslation/manager.py b/modeltranslation/manager.py index bfa17fb..d2faf4f 100644 --- a/modeltranslation/manager.py +++ b/modeltranslation/manager.py @@ -107,9 +107,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 = set('__'.join(pr) for pr in itertools.product(fields, rest)) + fields = {'__'.join(pr) for pr in itertools.product(fields, rest)} else: - fields = set('%s__%s' % (f, pieces[1]) for f in fields) + fields = {'%s__%s' % (f, pieces[1]) for f in fields} return fields @@ -174,7 +174,7 @@ def get_field_by_colum_name(model, col): class MultilingualQuerySet(QuerySet): def __init__(self, *args, **kwargs): - super(MultilingualQuerySet, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self._post_init() def _post_init(self): @@ -205,7 +205,7 @@ class MultilingualQuerySet(QuerySet): kwargs.setdefault('translation_fields', self.translation_fields) if hasattr(self, 'original_fields'): kwargs.setdefault('original_fields', self.original_fields) - cloned = super(MultilingualQuerySet, self)._clone() + cloned = super()._clone() cloned.__dict__.update(kwargs) return cloned @@ -230,7 +230,7 @@ class MultilingualQuerySet(QuerySet): # This method was not present in django-linguo def select_related(self, *fields, **kwargs): if not self._rewrite: - return super(MultilingualQuerySet, self).select_related(*fields, **kwargs) + return super().select_related(*fields, **kwargs) # TO CONSIDER: whether this should rewrite only current language, or all languages? # fk -> [fk, fk_en] (with en=active) VS fk -> [fk, fk_en, fk_de, fk_fr ...] (for all langs) @@ -241,7 +241,7 @@ class MultilingualQuerySet(QuerySet): new_args.append(None) else: new_args.append(rewrite_lookup_key(self.model, key)) - return super(MultilingualQuerySet, self).select_related(*new_args, **kwargs) + return super().select_related(*new_args, **kwargs) def update_or_create(self, defaults=None, **kwargs): """ @@ -335,13 +335,13 @@ class MultilingualQuerySet(QuerySet): def _filter_or_exclude(self, negate, args, kwargs): args, kwargs = self._rewrite_filter_or_exclude(args, kwargs) - return super(MultilingualQuerySet, self)._filter_or_exclude(negate, args, kwargs) + return super()._filter_or_exclude(negate, args, kwargs) else: def _filter_or_exclude(self, negate, *args, **kwargs): args, kwargs = self._rewrite_filter_or_exclude(args, kwargs) - return super(MultilingualQuerySet, self)._filter_or_exclude(negate, *args, **kwargs) + return super()._filter_or_exclude(negate, *args, **kwargs) def _get_original_fields(self): source = ( @@ -357,11 +357,11 @@ class MultilingualQuerySet(QuerySet): to translation fields for the current language. """ if not self._rewrite: - return super(MultilingualQuerySet, self).order_by(*field_names) + return super().order_by(*field_names) new_args = [] for key in field_names: new_args.append(rewrite_order_lookup_key(self.model, key)) - return super(MultilingualQuerySet, self).order_by(*new_args) + return super().order_by(*new_args) def distinct(self, *field_names): """ @@ -369,20 +369,20 @@ class MultilingualQuerySet(QuerySet): to translation fields for the current language. """ if not self._rewrite: - return super(MultilingualQuerySet, self).distinct(*field_names) + return super().distinct(*field_names) new_args = [] for key in field_names: new_args.append(rewrite_order_lookup_key(self.model, key)) - return super(MultilingualQuerySet, self).distinct(*new_args) + return super().distinct(*new_args) def update(self, **kwargs): if not self._rewrite: - return super(MultilingualQuerySet, self).update(**kwargs) + return super().update(**kwargs) for key, val in list(kwargs.items()): new_key = rewrite_lookup_key(self.model, key) del kwargs[key] kwargs[new_key] = self._rewrite_f(val) - return super(MultilingualQuerySet, self).update(**kwargs) + return super().update(**kwargs) update.alters_data = True @@ -400,7 +400,7 @@ class MultilingualQuerySet(QuerySet): Allows to override population mode with a ``populate`` method. """ with auto_populate(self._populate_mode): - return super(MultilingualQuerySet, self).create(**kwargs) + return super().create(**kwargs) # This method was not present in django-linguo def get_or_create(self, *args, **kwargs): @@ -408,30 +408,30 @@ class MultilingualQuerySet(QuerySet): Allows to override population mode with a ``populate`` method. """ with auto_populate(self._populate_mode): - return super(MultilingualQuerySet, self).get_or_create(*args, **kwargs) + return super().get_or_create(*args, **kwargs) # This method was not present in django-linguo def defer(self, *fields): fields = append_lookup_keys(self.model, fields) - return super(MultilingualQuerySet, self).defer(*fields) + return super().defer(*fields) # This method was not present in django-linguo def only(self, *fields): fields = append_lookup_keys(self.model, fields) - return super(MultilingualQuerySet, self).only(*fields) + return super().only(*fields) # This method was not present in django-linguo def raw_values(self, *fields, **expressions): - return super(MultilingualQuerySet, self).values(*fields, **expressions) + return super().values(*fields, **expressions) def _values(self, *original, **kwargs): selects_all = kwargs.pop('selects_all', False) if not kwargs.pop('prepare', False): - return super(MultilingualQuerySet, self)._values(*original, **kwargs) + 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() new_fields.update(annotation_keys) - clone = super(MultilingualQuerySet, self)._values(*list(new_fields), **kwargs) + clone = super()._values(*list(new_fields), **kwargs) clone.original_fields = tuple(original) clone.translation_fields = translation_fields return clone @@ -439,7 +439,7 @@ class MultilingualQuerySet(QuerySet): # This method was not present in django-linguo def values(self, *fields, **expressions): if not self._rewrite: - return super(MultilingualQuerySet, self).values(*fields, **expressions) + return super().values(*fields, **expressions) selects_all = not fields if not fields: # Emulate original queryset behaviour: get all fields that are not translation fields @@ -452,7 +452,7 @@ class MultilingualQuerySet(QuerySet): # This method was not present in django-linguo def values_list(self, *fields, flat=False, named=False): if not self._rewrite: - return super(MultilingualQuerySet, self).values_list(*fields, flat=flat, named=named) + return super().values_list(*fields, flat=flat, named=named) if flat and named: raise TypeError("'flat' and 'named' can't be used together.") if flat and len(fields) > 1: @@ -494,13 +494,13 @@ class MultilingualQuerySet(QuerySet): # This method was not present in django-linguo def dates(self, field_name, *args, **kwargs): if not self._rewrite: - return super(MultilingualQuerySet, self).dates(field_name, *args, **kwargs) + return super().dates(field_name, *args, **kwargs) new_key = rewrite_lookup_key(self.model, field_name) - return super(MultilingualQuerySet, self).dates(new_key, *args, **kwargs) + return super().dates(new_key, *args, **kwargs) class FallbackValuesIterable(ValuesIterable): - class X(object): + class X: # This stupid class is needed as object use __slots__ and has no __dict__. pass @@ -535,7 +535,7 @@ class FallbackNamedValuesListIterable(FallbackValuesIterable): class FallbackFlatValuesListIterable(FallbackValuesListIterable): def __iter__(self): - for row in super(FallbackFlatValuesListIterable, self).__iter__(): + for row in super().__iter__(): yield row[0] @@ -558,7 +558,7 @@ class MultilingualQuerysetManager(models.Manager): """ def get_queryset(self): - qs = super(MultilingualQuerysetManager, self).get_queryset() + qs = super().get_queryset() return self._patch_queryset(qs) def _patch_queryset(self, qs): @@ -583,7 +583,7 @@ class MultilingualManager(MultilingualQuerysetManager): This method is repeated because some managers that don't use super() or alter queryset class may return queryset that is not subclass of MultilingualQuerySet. """ - qs = super(MultilingualManager, self).get_queryset() + qs = super().get_queryset() if isinstance(qs, MultilingualQuerySet): # Is already patched by MultilingualQuerysetManager - in most of the cases # when custom managers use super() properly in get_queryset. diff --git a/modeltranslation/models.py b/modeltranslation/models.py index 9a9d926..c9a7f71 100644 --- a/modeltranslation/models.py +++ b/modeltranslation/models.py @@ -1,6 +1,3 @@ -# -*- coding: utf-8 -*- - - def autodiscover(): """ Auto-discover INSTALLED_APPS translation.py modules and fail silently when diff --git a/modeltranslation/tests/models.py b/modeltranslation/tests/models.py index 69db9ed..f988e3f 100644 --- a/modeltranslation/tests/models.py +++ b/modeltranslation/tests/models.py @@ -171,7 +171,7 @@ class OtherFieldsModel(models.Model): genericip = models.GenericIPAddressField(blank=True, null=True) -class FancyDescriptor(object): +class FancyDescriptor: """ Stupid demo descriptor, that store int in database and return string of that length on get. """ @@ -197,14 +197,14 @@ class FancyDescriptor(object): class FancyField(models.PositiveIntegerField): def __init__(self, *args, **kwargs): kwargs.setdefault('default', '') - super(FancyField, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) def contribute_to_class(self, cls, name): - super(FancyField, self).contribute_to_class(cls, name) + super().contribute_to_class(cls, name) setattr(cls, self.name, FancyDescriptor(self)) def pre_save(self, model_instance, add): - value = super(FancyField, self).pre_save(model_instance, add) + value = super().pre_save(model_instance, add) # In this part value should be retrieved using descriptor and be a string assert isinstance(value, str) # We put an int to database @@ -242,7 +242,7 @@ class AbstractModelA(models.Model): titlea = models.CharField(gettext_lazy('title a'), max_length=255) def __init__(self, *args, **kwargs): - super(AbstractModelA, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.titlea = 'title_a' class Meta: @@ -253,7 +253,7 @@ class AbstractModelB(AbstractModelA): titleb = models.CharField(gettext_lazy('title b'), max_length=255) def __init__(self, *args, **kwargs): - super(AbstractModelB, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.titleb = 'title_b' @@ -335,7 +335,7 @@ class ThirdPartyRegisteredModel(models.Model): class FilteredManager(MultilingualManager): def get_queryset(self): # always return empty queryset - return super(FilteredManager, self).get_queryset().filter(pk=None) + return super().get_queryset().filter(pk=None) class FilteredTestModel(models.Model): @@ -365,14 +365,14 @@ class ManagerTestModel(models.Model): class CustomManager(models.Manager): def get_queryset(self): return ( - super(CustomManager, self) + super() .get_queryset() .filter(title__contains='a') .exclude(description__contains='x') ) def custom_qs(self): - return super(CustomManager, self).get_queryset() + return super().get_queryset() def foo(self): return 'bar' diff --git a/modeltranslation/tests/tests.py b/modeltranslation/tests/tests.py index 8f94330..9eebab6 100644 --- a/modeltranslation/tests/tests.py +++ b/modeltranslation/tests/tests.py @@ -49,11 +49,11 @@ class reload_override_settings(override_settings): """Context manager that not only override settings, but also reload modeltranslation conf.""" def __enter__(self): - super(reload_override_settings, self).__enter__() + super().__enter__() importlib.reload(mt_settings) def __exit__(self, exc_type, exc_value, traceback): - super(reload_override_settings, self).__exit__(exc_type, exc_value, traceback) + super().__exit__(exc_type, exc_value, traceback) importlib.reload(mt_settings) @@ -120,7 +120,7 @@ class TestAutodiscover(ModeltranslationTestBase): # class B settings would be overwritten by class A settings (if some keys clash). # To solve this, override some settings after parents ``_pre_setup`` is called. def _pre_setup(self): - super(TestAutodiscover, self)._pre_setup() + super()._pre_setup() # Add test_app to INSTALLED_APPS new_installed_apps = django_settings.INSTALLED_APPS + ('modeltranslation.tests.test_app',) self.__override = override_settings(INSTALLED_APPS=new_installed_apps) @@ -129,7 +129,7 @@ class TestAutodiscover(ModeltranslationTestBase): def _post_teardown(self): self.__override.disable() importlib.reload(mt_settings) # restore mt_settings.FALLBACK_LANGUAGES - super(TestAutodiscover, self)._post_teardown() + super()._post_teardown() def tearDown(self): # Rollback model classes @@ -140,7 +140,7 @@ class TestAutodiscover(ModeltranslationTestBase): # Delete translation modules from import cache sys.modules.pop('modeltranslation.tests.test_app.translation', None) sys.modules.pop('modeltranslation.tests.project_translation', None) - super(TestAutodiscover, self).tearDown() + super().tearDown() def check_news(self): from .test_app.models import News @@ -286,13 +286,13 @@ class ModeltranslationTest(ModeltranslationTestBase): assert hash(orig) != hash(en) assert hash(orig) != hash(de) assert hash(en) != hash(de) - assert 3 == len(set([orig, en, de])) + assert 3 == len({orig, en, de}) # TranslationFields can compare equal if they have the same language de.language = 'en' assert orig != de assert en == de assert hash(en) == hash(de) - assert 2 == len(set([orig, en, de])) + assert 2 == len({orig, en, de}) de.language = 'de' def test_set_translation(self): @@ -653,7 +653,7 @@ class FileFieldsTest(ModeltranslationTestBase): tests_dir = default_storage.path('modeltranslation_tests') if os.path.isdir(tests_dir): shutil.rmtree(tests_dir) - super(FileFieldsTest, self).tearDown() + super().tearDown() def test_translated_models(self): field_names = dir(models.FileFieldsModel()) @@ -756,7 +756,7 @@ class ForeignKeyFieldsTest(ModeltranslationTestBase): def setUpClass(cls): # 'model' attribute cannot be assigned to class in its definition, # because ``models`` module will be reloaded and hence class would use old model classes. - super(ForeignKeyFieldsTest, cls).setUpClass() + super().setUpClass() cls.model = models.ForeignKeyModel def test_translated_models(self): @@ -1036,7 +1036,7 @@ class ManyToManyFieldsTest(ModeltranslationTestBase): def setUpClass(cls): # 'model' attribute cannot be assigned to class in its definition, # because ``models`` module will be reloaded and hence class would use old model classes. - super(ManyToManyFieldsTest, cls).setUpClass() + super().setUpClass() cls.model = models.ManyToManyFieldModel def test_translated_models(self): @@ -1082,19 +1082,15 @@ class ManyToManyFieldsTest(ModeltranslationTestBase): 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) 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) 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() @@ -1210,19 +1206,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) 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) 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() @@ -1314,7 +1306,7 @@ class OneToOneFieldsTest(ForeignKeyFieldsTest): def setUpClass(cls): # 'model' attribute cannot be assigned to class in its definition, # because ``models`` module will be reloaded and hence class would use old model classes. - super(OneToOneFieldsTest, cls).setUpClass() + super().setUpClass() cls.model = models.OneToOneFieldModel def test_uniqueness(self): @@ -2237,13 +2229,13 @@ class UpdateCommandTest(ModeltranslationTestBase): class TranslationAdminTest(ModeltranslationTestBase): def setUp(self): - super(TranslationAdminTest, self).setUp() + super().setUp() self.test_obj = models.TestModel.objects.create(title='Testtitle', text='Testtext') self.site = AdminSite() def tearDown(self): self.test_obj.delete() - super(TranslationAdminTest, self).tearDown() + super().tearDown() def test_default_fields(self): class TestModelAdmin(admin.TranslationAdmin): @@ -2471,7 +2463,7 @@ class TranslationAdminTest(ModeltranslationTestBase): if isinstance(db_field, TextField): kwargs["widget"] = forms.Textarea(attrs={'myprop': 'myval'}) return db_field.formfield(**kwargs) - return super(TestModelAdmin, self).formfield_for_dbfield( + return super().formfield_for_dbfield( db_field, request, **kwargs ) @@ -2744,7 +2736,7 @@ class ThirdPartyAppIntegrationTest(ModeltranslationTestBase): def setUpClass(cls): # 'model' attribute cannot be assigned to class in its definition, # because ``models`` module will be reloaded and hence class would use old model classes. - super(ThirdPartyAppIntegrationTest, cls).setUpClass() + super().setUpClass() cls.model = models.ThirdPartyModel def test_form(self): @@ -2765,14 +2757,14 @@ class ThirdPartyAppIntegrationRegisteredTest(ThirdPartyAppIntegrationTest): @classmethod def setUpClass(cls): - super(ThirdPartyAppIntegrationRegisteredTest, cls).setUpClass() + super().setUpClass() cls.model = models.ThirdPartyRegisteredModel class TestManager(ModeltranslationTestBase): def setUp(self): # In this test case the default language is en, not de. - super(TestManager, self).setUp() + super().setUp() trans_real.activate('en') def test_filter_update(self): @@ -3396,21 +3388,20 @@ class TestManager(ModeltranslationTestBase): def test_translation_fields_appending(self): from modeltranslation.manager import append_lookup_key, append_lookup_keys - assert set(['untrans']) == append_lookup_key(models.ForeignKeyModel, 'untrans') - assert set(['title', 'title_en', 'title_de']) == append_lookup_key( + assert {'untrans'} == append_lookup_key(models.ForeignKeyModel, 'untrans') + assert {'title', 'title_en', 'title_de'} == append_lookup_key( models.ForeignKeyModel, 'title' ) - assert set(['test', 'test_en', 'test_de']) == append_lookup_key( + assert {'test', 'test_en', 'test_de'} == append_lookup_key( models.ForeignKeyModel, 'test' ) - assert set(['title__eq', 'title_en__eq', 'title_de__eq']) == append_lookup_key( + assert {'title__eq', 'title_en__eq', 'title_de__eq'} == append_lookup_key( models.ForeignKeyModel, 'title__eq' ) - assert set(['test__smt', 'test_en__smt', 'test_de__smt']) == append_lookup_key( + assert {'test__smt', 'test_en__smt', 'test_de__smt'} == append_lookup_key( models.ForeignKeyModel, 'test__smt' ) - big_set = set( - [ + big_set = { 'test__url', 'test__url_en', 'test__url_de', @@ -3420,10 +3411,9 @@ class TestManager(ModeltranslationTestBase): 'test_de__url', 'test_de__url_en', 'test_de__url_de', - ] - ) + } assert big_set == append_lookup_key(models.ForeignKeyModel, 'test__url') - assert set(['untrans__url', 'untrans__url_en', 'untrans__url_de']) == append_lookup_key( + assert {'untrans__url', 'untrans__url_en', 'untrans__url_de'} == append_lookup_key( models.ForeignKeyModel, 'untrans__url' ) @@ -3585,7 +3575,7 @@ class TestRequired(ModeltranslationTestBase): inst.full_clean() except ValidationError as e: error_fields = set(e.message_dict.keys()) - assert set(('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!') diff --git a/modeltranslation/thread_context.py b/modeltranslation/thread_context.py index 4b89d4e..a4801ae 100644 --- a/modeltranslation/thread_context.py +++ b/modeltranslation/thread_context.py @@ -1,6 +1,6 @@ import threading from typing import Union -from typing_extensions import Literal +from typing import Literal from modeltranslation import settings diff --git a/modeltranslation/translator.py b/modeltranslation/translator.py index acc93c7..202123a 100644 --- a/modeltranslation/translator.py +++ b/modeltranslation/translator.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- from functools import partial from typing import Callable, Iterable @@ -51,7 +50,7 @@ class FieldsAggregationMetaClass(type): if isinstance(base, FieldsAggregationMetaClass): attrs['fields'].update(base.fields) attrs['fields'] = tuple(attrs['fields']) - return super(FieldsAggregationMetaClass, cls).__new__(cls, name, bases, attrs) + return super().__new__(cls, name, bases, attrs) class TranslationOptions(metaclass=FieldsAggregationMetaClass): @@ -84,8 +83,8 @@ class TranslationOptions(metaclass=FieldsAggregationMetaClass): self.model = model self.registered = False self.related = False - self.local_fields = dict((f, set()) for f in self.fields) - self.fields = dict((f, set()) for f in self.fields) + self.local_fields = {f: set() for f in self.fields} + self.fields = {f: set() for f in self.fields} self.related_fields = [] def validate(self): @@ -142,7 +141,7 @@ class TranslationOptions(metaclass=FieldsAggregationMetaClass): class MultilingualOptions(options.Options): @cached_property def base_manager(self): - manager = super(MultilingualOptions, self).base_manager + manager = super().base_manager patch_manager_class(manager) return manager @@ -436,7 +435,7 @@ def patch_related_object_descriptor_caching(ro_descriptor): ro_descriptor.__class__ = NewSingleObjectDescriptor -class Translator(object): +class Translator: """ A Translator object encapsulates an instance of a translator. Models are registered with the Translator using the register() method. diff --git a/modeltranslation/widgets.py b/modeltranslation/widgets.py index 80c7d4b..06ddc23 100644 --- a/modeltranslation/widgets.py +++ b/modeltranslation/widgets.py @@ -1,5 +1,3 @@ -from __future__ import unicode_literals - from django.forms.widgets import Media, Widget, CheckboxInput from django.utils.html import conditional_escape from django.utils.safestring import mark_safe