diff --git a/core/fields.py b/core/fields.py index 878fa92f..6dadd909 100644 --- a/core/fields.py +++ b/core/fields.py @@ -2,8 +2,8 @@ class CustomListField(serializers.ListField): - def to_representation(self, data): + def to_representation(self, data) -> list: return [value.strip() for value in data.split(",") if value.strip()] - def to_internal_value(self, data): + def to_internal_value(self, data) -> str: return ",".join(data) diff --git a/core/models.py b/core/models.py index 221a1a60..e2580fe6 100644 --- a/core/models.py +++ b/core/models.py @@ -3,6 +3,7 @@ from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models import Model +from django_stubs_ext.db.models import TypedModelMeta User = get_user_model() @@ -23,7 +24,7 @@ class Link(Model): object_id = models.PositiveIntegerField() content_object = GenericForeignKey("content_type", "object_id") - class Meta: + class Meta(TypedModelMeta): unique_together = ( "link", "content_type", @@ -32,7 +33,7 @@ class Meta: verbose_name = "Ссылка" verbose_name_plural = "Ссылки" - def __str__(self): + def __str__(self) -> str: return f"Link for {self.content_object} - {self.link}" @@ -54,7 +55,7 @@ class Like(Model): object_id = models.PositiveIntegerField() content_object = GenericForeignKey("content_type", "object_id") - class Meta: + class Meta(TypedModelMeta): unique_together = ( "user", "content_type", @@ -63,7 +64,7 @@ class Meta: verbose_name = "Лайк" verbose_name_plural = "Лайки" - def __str__(self): + def __str__(self) -> str: return f"Like<{self.user} - {self.content_object}>" @@ -88,7 +89,7 @@ class View(Model): object_id = models.PositiveIntegerField() content_object = GenericForeignKey("content_type", "object_id") - class Meta: + class Meta(TypedModelMeta): unique_together = ( "user", "content_type", @@ -97,7 +98,7 @@ class Meta: verbose_name = "Просмотр" verbose_name_plural = "Просмотры" - def __str__(self): + def __str__(self) -> str: return f"View<{self.user} - {self.content_object}>" @@ -108,10 +109,10 @@ class SkillCategory(models.Model): name = models.CharField(max_length=256, null=False) - def __str__(self): + def __str__(self) -> str: return self.name - class Meta: + class Meta(TypedModelMeta): verbose_name = "Категория навыка" verbose_name_plural = "Категории навыков" ordering = ["name"] @@ -129,13 +130,13 @@ class Skill(models.Model): related_name="skills", ) - def __str__(self): + def __str__(self) -> str: return self.name - def __repr__(self): + def __repr__(self) -> str: return f"Skill" - class Meta: + class Meta(TypedModelMeta): verbose_name = "Навык" verbose_name_plural = "Навыки" ordering = ["id", "category", "name"] @@ -160,7 +161,7 @@ class SkillToObject(models.Model): object_id = models.PositiveIntegerField() content_object = GenericForeignKey("content_type", "object_id") - class Meta: + class Meta(TypedModelMeta): verbose_name = "Ссылка на навык" verbose_name_plural = "Ссылки на навыки" @@ -168,10 +169,10 @@ class Meta: class SpecializationCategory(models.Model): name = models.TextField() - def __str__(self): + def __str__(self) -> str: return self.name - class Meta: + class Meta(TypedModelMeta): verbose_name = "Категория специализации" verbose_name_plural = "Категории специализаций" @@ -182,10 +183,10 @@ class Specialization(models.Model): SpecializationCategory, related_name="specializations", on_delete=models.CASCADE ) - def __str__(self): + def __str__(self) -> str: return self.name - class Meta: + class Meta(TypedModelMeta): verbose_name = "Специализация" verbose_name_plural = "Специализации" diff --git a/core/serializers.py b/core/serializers.py index 6fff7685..a74093ce 100644 --- a/core/serializers.py +++ b/core/serializers.py @@ -7,7 +7,7 @@ class SetLikedSerializer(serializers.Serializer): is_liked = serializers.BooleanField() -class SetViewedSerializer(serializers.Serializer): +class SetViewedSerializer(serializers.Serializer[SkillCategory]): is_viewed = serializers.BooleanField() @@ -20,7 +20,7 @@ class Meta: ] -class SkillSerializer(serializers.ModelSerializer): +class SkillSerializer(serializers.ModelSerializer[Skill]): category = SkillCategorySerializer() class Meta: @@ -28,7 +28,7 @@ class Meta: fields = ["id", "name", "category"] -class SkillToObjectSerializer(serializers.ModelSerializer): +class SkillToObjectSerializer(serializers.ModelSerializer[SkillToObject]): id = serializers.IntegerField(source="skill.id") name = serializers.CharField(source="skill.name") category = SkillCategorySerializer(source="skill.category") diff --git a/vacancy/filters.py b/vacancy/filters.py index 44c4d928..eb6b5db7 100644 --- a/vacancy/filters.py +++ b/vacancy/filters.py @@ -1,9 +1,10 @@ from django_filters import rest_framework as filters from vacancy.models import Vacancy +from django.db.models import QuerySet -def project_id_filter(queryset, name, value): +def project_id_filter(queryset, name, value) -> QuerySet: return queryset.filter( **{ "project_id": value[0], diff --git a/vacancy/models.py b/vacancy/models.py index 3c6e9b76..7a6a8e69 100644 --- a/vacancy/models.py +++ b/vacancy/models.py @@ -3,6 +3,7 @@ from projects.models import Project from vacancy.managers import VacancyManager, VacancyResponseManager +from django_stubs_ext.db.models import TypedModelMeta class Vacancy(models.Model): @@ -51,10 +52,10 @@ def get_required_skills(self): required_skills.append(sto.skill) return required_skills - def __str__(self): + def __str__(self) -> str: return f"Vacancy<{self.id}> - {self.role}" - class Meta: + class Meta(TypedModelMeta): verbose_name = "Вакансия" verbose_name_plural = "Вакансии" ordering = ["-datetime_created"] @@ -100,10 +101,10 @@ class VacancyResponse(models.Model): objects = VacancyResponseManager() - def __str__(self): + def __str__(self) -> str: return f"VacancyResponse<{self.id}> - {self.user} - {self.vacancy}" - class Meta: + class Meta(TypedModelMeta): verbose_name = "Отклик на вакансию" verbose_name_plural = "Отклик на вакансии" ordering = ["-datetime_created"] diff --git a/vacancy/serializers.py b/vacancy/serializers.py index 2b1007cf..b88f26e2 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -21,7 +21,7 @@ class RequiredSkillsWriteSerializerMixin(RequiredSkillsSerializerMixin): ) -class ProjectForVacancySerializer(serializers.ModelSerializer): +class ProjectForVacancySerializer(serializers.ModelSerializer[Project]): class Meta: model = Project fields = [ @@ -33,7 +33,7 @@ class Meta: class VacancyDetailSerializer( - serializers.ModelSerializer, RequiredSkillsWriteSerializerMixin + serializers.ModelSerializer, RequiredSkillsWriteSerializerMixin[Vacancy] ): project = ProjectForVacancySerializer(many=False, read_only=True) @@ -53,7 +53,7 @@ class Meta: read_only_fields = ["project"] -class VacancyListSerializer(serializers.ModelSerializer, RequiredSkillsSerializerMixin): +class VacancyListSerializer(serializers.ModelSerializer, RequiredSkillsSerializerMixin[Vacancy]): class Meta: model = Vacancy fields = [ @@ -69,7 +69,7 @@ class Meta: class ProjectVacancyListSerializer( - serializers.ModelSerializer, RequiredSkillsSerializerMixin + serializers.ModelSerializer, RequiredSkillsSerializerMixin[Vacancy] ): class Meta: model = Vacancy @@ -84,7 +84,7 @@ class Meta: class ProjectVacancyCreateListSerializer( - serializers.ModelSerializer, RequiredSkillsWriteSerializerMixin + serializers.ModelSerializer, RequiredSkillsWriteSerializerMixin[Vacancy] ): def create(self, validated_data): project = validated_data["project"] @@ -124,7 +124,7 @@ class Meta: ] -class VacancyResponseListSerializer(serializers.ModelSerializer): +class VacancyResponseListSerializer(serializers.ModelSerializer[VacancyResponse]): is_approved = serializers.BooleanField(read_only=True) user = UserDetailSerializer(read_only=True) user_id = serializers.IntegerField(write_only=True) @@ -165,7 +165,7 @@ def create(self, validated_data): return vacancy_response -class VacancyResponseDetailSerializer(serializers.ModelSerializer): +class VacancyResponseDetailSerializer(serializers.ModelSerializer[VacancyResponse]): user = UserDetailSerializer(many=False, read_only=True) vacancy = VacancyListSerializer(many=False, read_only=True) is_approved = serializers.BooleanField(read_only=True) @@ -183,5 +183,5 @@ class Meta: ] -class VacancyResponseAcceptSerializer(VacancyResponseDetailSerializer): +class VacancyResponseAcceptSerializer(VacancyResponseDetailSerializer[VacancyResponse]): is_approved = serializers.BooleanField(required=True, read_only=False)