From 055c1997a3a577eb3006be156d87f764aef306fe Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Wed, 6 Mar 2024 10:37:35 +0100 Subject: [PATCH] lint and add back pyright config --- modeltranslation/admin.py | 50 ++++++++++++++----- .../management/commands/loaddata.py | 3 +- .../commands/sync_translation_fields.py | 4 +- modeltranslation/manager.py | 18 +++++-- modeltranslation/translator.py | 13 ++++- modeltranslation/utils.py | 2 +- pyrightconfig.json | 12 +++++ 7 files changed, 80 insertions(+), 22 deletions(-) create mode 100644 pyrightconfig.json diff --git a/modeltranslation/admin.py b/modeltranslation/admin.py index 672dceab..97e3eadf 100644 --- a/modeltranslation/admin.py +++ b/modeltranslation/admin.py @@ -35,7 +35,9 @@ def __init__(self, *args: Any, **kwargs: Any) -> None: self.trans_opts = translator.get_options_for_model(self.model) self._patch_prepopulated_fields() - def _get_declared_fieldsets(self, request: HttpRequest, obj: Any | None = None) -> _ListOrTuple[tuple[str | None, dict[str, Any]]] | None: + def _get_declared_fieldsets( + self, request: HttpRequest, obj: Any | None = None + ) -> _ListOrTuple[tuple[str | None, dict[str, Any]]] | None: # Take custom modelform fields option into account if not self.fields and hasattr(self.form, "_meta") and self.form._meta.fields: self.fields = self.form._meta.fields @@ -51,12 +53,16 @@ def _get_declared_fieldsets(self, request: HttpRequest, obj: Any | None = None) return [(None, {"fields": self.replace_orig_field(self.get_fields(request, obj))})] return None - def formfield_for_dbfield(self, db_field: Field, request: HttpRequest, **kwargs: Any) -> forms.Field: + def formfield_for_dbfield( + self, db_field: Field, request: HttpRequest, **kwargs: Any + ) -> forms.Field: field = super().formfield_for_dbfield(db_field, request, **kwargs) self.patch_translation_field(db_field, field, request, **kwargs) # type: ignore[arg-type] return field # type: ignore[return-value] - def patch_translation_field(self, db_field: Field, field: forms.Field, request: HttpRequest, **kwargs: Any) -> None: + def patch_translation_field( + self, db_field: Field, field: forms.Field, request: HttpRequest, **kwargs: Any + ) -> None: if db_field.name in self.trans_opts.fields: if field.required: field.required = False @@ -176,7 +182,9 @@ def replace_orig_field(self, option: Iterable[str | Sequence[str]]) -> _ListOrTu option = option_new return option # type: ignore[return-value] - def _patch_fieldsets(self, fieldsets: _ListOrTuple[tuple[str | None, dict[str, Any]]]) -> _ListOrTuple[tuple[str | None, dict[str, Any]]]: + def _patch_fieldsets( + self, fieldsets: _ListOrTuple[tuple[str | None, dict[str, Any]]] + ) -> _ListOrTuple[tuple[str | None, dict[str, Any]]]: if fieldsets: fieldsets_new = list(fieldsets) for name, dct in fieldsets: @@ -186,7 +194,7 @@ def _patch_fieldsets(self, fieldsets: _ListOrTuple[tuple[str | None, dict[str, A return fieldsets def _patch_prepopulated_fields(self) -> None: - def localize(sources: Sequence[str], lang: str) -> tuple[str, ...]: + def localize(sources: Sequence[str], lang: str) -> tuple[str, ...]: "Append lang suffix (if applicable) to field list" def append_lang(source: str) -> str: @@ -207,7 +215,9 @@ def append_lang(source: str) -> str: prepopulated_fields[dest] = localize(sources, lang) self.prepopulated_fields = prepopulated_fields - def _get_form_or_formset(self, request: HttpRequest, obj: Any | None, **kwargs: Any) -> dict[str, Any]: + def _get_form_or_formset( + self, request: HttpRequest, obj: Any | None, **kwargs: Any + ) -> dict[str, Any]: """ Generic code shared by get_form and get_formset. """ @@ -229,14 +239,18 @@ def _get_form_or_formset(self, request: HttpRequest, obj: Any | None, **kwargs: return kwargs - def _get_fieldsets_pre_form_or_formset(self, request: HttpRequest, obj: Any | None = None) -> _ListOrTuple[tuple[str | None, dict[str, Any]]] | None: + def _get_fieldsets_pre_form_or_formset( + self, request: HttpRequest, obj: Any | None = None + ) -> _ListOrTuple[tuple[str | None, dict[str, Any]]] | None: """ Generic get_fieldsets code, shared by TranslationAdmin and TranslationInlineModelAdmin. """ return self._get_declared_fieldsets(request, obj) - def _get_fieldsets_post_form_or_formset(self, request: HttpRequest, form: type[forms.ModelForm], obj: Any | None = None) -> list: + def _get_fieldsets_post_form_or_formset( + self, request: HttpRequest, form: type[forms.ModelForm], obj: Any | None = None + ) -> list: """ Generic get_fieldsets code, shared by TranslationAdmin and TranslationInlineModelAdmin. @@ -245,7 +259,9 @@ def _get_fieldsets_post_form_or_formset(self, request: HttpRequest, form: type[f fields = list(base_fields) + list(self.get_readonly_fields(request, obj)) return [(None, {"fields": self.replace_orig_field(fields)})] - def get_translation_field_excludes(self, exclude_languages: list[str] | None = None) -> tuple[TranslationField, ...]: + def get_translation_field_excludes( + self, exclude_languages: list[str] | None = None + ) -> tuple[TranslationField, ...]: """ Returns a tuple of translation field names to exclude based on `exclude_languages` arg. @@ -263,7 +279,9 @@ def get_translation_field_excludes(self, exclude_languages: list[str] | None = N exclude.append(tfield) return tuple(exclude) - def get_readonly_fields(self, request: HttpRequest, obj: Any | None = None) -> _ListOrTuple[str]: + def get_readonly_fields( + self, request: HttpRequest, obj: Any | None = None + ) -> _ListOrTuple[str]: """ Hook to specify custom readonly fields. """ @@ -355,11 +373,15 @@ def _group_fieldsets(self, fieldsets: list) -> list: return fieldsets - def get_form(self, request: HttpRequest, obj: Any | None = None, **kwargs: Any) -> type[forms.ModelForm]: + def get_form( + self, request: HttpRequest, obj: Any | None = None, **kwargs: Any + ) -> type[forms.ModelForm]: kwargs = self._get_form_or_formset(request, obj, **kwargs) return super().get_form(request, obj, **kwargs) - def get_fieldsets(self, request: HttpRequest, obj: Any | None = None) -> _ListOrTuple[tuple[str | None, dict[str, Any]]]: + def get_fieldsets( + self, request: HttpRequest, obj: Any | None = None + ) -> _ListOrTuple[tuple[str | None, dict[str, Any]]]: return self._get_fieldsets_pre_form_or_formset(request, obj) or self._group_fieldsets( self._get_fieldsets_post_form_or_formset( request, self.get_form(request, obj, fields=None), obj @@ -368,7 +390,9 @@ def get_fieldsets(self, request: HttpRequest, obj: Any | None = None) -> _ListOr class TranslationInlineModelAdmin(TranslationBaseModelAdmin, InlineModelAdmin): - def get_formset(self, request: HttpRequest, obj: Any | None = None, **kwargs: Any) -> type[BaseInlineFormSet]: + def get_formset( + self, request: HttpRequest, obj: Any | None = None, **kwargs: Any + ) -> type[BaseInlineFormSet]: kwargs = self._get_form_or_formset(request, obj, **kwargs) return super().get_formset(request, obj, **kwargs) diff --git a/modeltranslation/management/commands/loaddata.py b/modeltranslation/management/commands/loaddata.py index 91ee233d..d754c452 100644 --- a/modeltranslation/management/commands/loaddata.py +++ b/modeltranslation/management/commands/loaddata.py @@ -1,4 +1,3 @@ - from __future__ import annotations from typing import Any @@ -41,7 +40,7 @@ def __call__( parser: CommandParser, # type: ignore[override] namespace: Namespace, value: str, # type: ignore[override] - option_string: str | None = None + option_string: str | None = None, ) -> None: check_mode(self, option_string, value, parser, namespace) diff --git a/modeltranslation/management/commands/sync_translation_fields.py b/modeltranslation/management/commands/sync_translation_fields.py index fea544a5..a2ffe1c2 100644 --- a/modeltranslation/management/commands/sync_translation_fields.py +++ b/modeltranslation/management/commands/sync_translation_fields.py @@ -141,7 +141,9 @@ def get_missing_languages(self, field_name: str, db_table: str) -> Iterator[str] if build_localized_fieldname(field_name, lang_code) not in db_table_fields: yield lang_code - def get_sync_sql(self, field_name: str, missing_langs: list[str], model: type[Model]) -> list[str]: + def get_sync_sql( + self, field_name: str, missing_langs: list[str], model: type[Model] + ) -> list[str]: """ Returns SQL needed for sync schema for a new translatable field. """ diff --git a/modeltranslation/manager.py b/modeltranslation/manager.py index 1dc26505..153f2e49 100644 --- a/modeltranslation/manager.py +++ b/modeltranslation/manager.py @@ -177,8 +177,10 @@ def get_field_by_colum_name(model: type[Model], col: str) -> Field: return field assert False, "No field found for column %s" % col + _T = TypeVar("_T", bound=Model, covariant=True) + class MultilingualQuerySet(QuerySet[_T]): def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) @@ -514,6 +516,7 @@ def dates(self, field_name: str, *args: Any, **kwargs: Any) -> Self: class FallbackValuesIterable(ValuesIterable): queryset: MultilingualQuerySet[Model] + class X: # This stupid class is needed as object use __slots__ and has no __dict__. pass @@ -554,13 +557,22 @@ def __iter__(self) -> Iterator[Any]: @overload -def multilingual_queryset_factory(old_cls: type[Any], instantiate: Literal[False]) -> type[MultilingualQuerySet]: ... +def multilingual_queryset_factory( + old_cls: type[Any], instantiate: Literal[False] +) -> type[MultilingualQuerySet]: + ... + @overload -def multilingual_queryset_factory(old_cls: type[Any], instantiate: Literal[True] = ...) -> MultilingualQuerySet: ... +def multilingual_queryset_factory( + old_cls: type[Any], instantiate: Literal[True] = ... +) -> MultilingualQuerySet: + ... -def multilingual_queryset_factory(old_cls: type[Any], instantiate: bool = True) -> type[MultilingualQuerySet] | MultilingualQuerySet: +def multilingual_queryset_factory( + old_cls: type[Any], instantiate: bool = True +) -> type[MultilingualQuerySet] | MultilingualQuerySet: if old_cls == models.query.QuerySet: NewClass = MultilingualQuerySet else: diff --git a/modeltranslation/translator.py b/modeltranslation/translator.py index 4052cc68..0c95e911 100644 --- a/modeltranslation/translator.py +++ b/modeltranslation/translator.py @@ -5,7 +5,15 @@ import django from django.core.exceptions import ImproperlyConfigured -from django.db.models import Field, ForeignKey, Manager, ManyToManyField, Model, OneToOneField, options +from django.db.models import ( + Field, + ForeignKey, + Manager, + ManyToManyField, + Model, + OneToOneField, + options, +) from django.db.models.base import ModelBase from django.db.models.signals import post_init from django.utils.functional import cached_property @@ -585,7 +593,8 @@ def _register_single_model(self, model: type[Model], opts: TranslationOptions) - if isinstance(field, OneToOneField): # Fix translated_field caching for SingleRelatedObjectDescriptor sro_descriptor = getattr( - field.remote_field.model, field.remote_field.get_accessor_name() # type: ignore[arg-type] + field.remote_field.model, + field.remote_field.get_accessor_name(), # type: ignore[arg-type] ) patch_related_object_descriptor_caching(sro_descriptor) diff --git a/modeltranslation/utils.py b/modeltranslation/utils.py index f25a29c2..2023ccd3 100644 --- a/modeltranslation/utils.py +++ b/modeltranslation/utils.py @@ -27,7 +27,7 @@ def get_language() -> str: settings.LANGUAGES (Django does not seem to guarantee this for us). """ lang = _get_language() - if lang is None: # Django >= 1.8 + 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] diff --git a/pyrightconfig.json b/pyrightconfig.json new file mode 100644 index 00000000..18ca1e99 --- /dev/null +++ b/pyrightconfig.json @@ -0,0 +1,12 @@ +{ + "include": ["."], + "pythonVersion": "3.7", + "pythonPlatform": "Linux", + "useLibraryCodeForTypes": true, + "strictListInference": true, + "reportMissingImports": "error", + "reportUnusedImport": "error", + "reportUnusedExpression": "error", + "reportOptionalMemberAccess": "information" +} +