From 4abd77d70ac3626dea343f9d562aaf55f1f6edf4 Mon Sep 17 00:00:00 2001 From: Yakser Date: Wed, 14 Feb 2024 23:18:59 +0300 Subject: [PATCH 01/15] fix required_skills serializer --- vacancy/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vacancy/serializers.py b/vacancy/serializers.py index ecc17c99..f2964057 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -22,7 +22,7 @@ class Meta: class VacancyDetailSerializer(serializers.ModelSerializer): project = ProjectForVacancySerializer(many=False, read_only=True) - required_skills = serializers.ListSerializer(child=serializers.CharField()) + required_skills = CustomListField(child=serializers.CharField()) class Meta: model = Vacancy From 77a416ce1325ed4adacc827a27060724118306c0 Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Thu, 29 Feb 2024 16:34:51 +0300 Subject: [PATCH 02/15] add type-hints vacancy --- vacancy/models.py | 9 +++++---- vacancy/serializers.py | 42 ++++++++++++++---------------------------- vacancy/views.py | 4 ++-- 3 files changed, 21 insertions(+), 34 deletions(-) diff --git a/vacancy/models.py b/vacancy/models.py index 1932d75f..29de8c7a 100644 --- a/vacancy/models.py +++ b/vacancy/models.py @@ -1,4 +1,5 @@ from django.db import models +from django_stubs_ext.db.models import TypedModelMeta from projects.models import Project from vacancy.managers import VacancyManager, VacancyResponseManager @@ -39,10 +40,10 @@ class Vacancy(models.Model): objects = VacancyManager() - 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"] @@ -88,10 +89,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 ac1d13f5..6bf34433 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -3,17 +3,13 @@ from core.fields import CustomListField from projects.models import Project -from users.serializers import UserDetailSerializer, CustomListField +from users.serializers import UserDetailSerializer from vacancy.models import Vacancy, VacancyResponse User = get_user_model() -class RequiredSkillsSerializerMixin(serializers.Serializer): - required_skills = CustomListField(child=serializers.CharField()) - - -class ProjectForVacancySerializer(serializers.ModelSerializer): +class ProjectForVacancySerializer(serializers.ModelSerializer[Project]): class Meta: model = Project fields = [ @@ -24,8 +20,9 @@ class Meta: ] -class VacancyDetailSerializer(serializers.ModelSerializer, RequiredSkillsSerializerMixin): +class VacancyDetailSerializer(serializers.ModelSerializer[Vacancy]): project = ProjectForVacancySerializer(many=False, read_only=True) + required_skills = serializers.ListSerializer(child=serializers.CharField()) class Meta: model = Vacancy @@ -39,10 +36,14 @@ class Meta: "datetime_created", "datetime_updated", ] - read_only_fields = ["project"] + read_only_fields = [ + "project", + ] + +class VacancyListSerializer(serializers.ModelSerializer[Vacancy]): + required_skills = CustomListField(child=serializers.CharField()) -class VacancyListSerializer(serializers.ModelSerializer, RequiredSkillsSerializerMixin): class Meta: model = Vacancy fields = [ @@ -57,24 +58,9 @@ class Meta: ] -class ProjectVacancyListSerializer( - serializers.ModelSerializer, RequiredSkillsSerializerMixin -): - class Meta: - model = Vacancy - fields = [ - "id", - "role", - "required_skills", - "description", - "project", - "is_active", - ] - +class ProjectVacancyListSerializer(serializers.ModelSerializer[Vacancy]): + required_skills = CustomListField(child=serializers.CharField()) -class ProjectVacancyCreateListSerializer( - serializers.ModelSerializer, RequiredSkillsSerializerMixin -): class Meta: model = Vacancy fields = [ @@ -87,7 +73,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) @@ -128,7 +114,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) diff --git a/vacancy/views.py b/vacancy/views.py index 8b6936af..2652e3bd 100644 --- a/vacancy/views.py +++ b/vacancy/views.py @@ -12,17 +12,17 @@ IsVacancyProjectLeader, ) from vacancy.serializers import ( + ProjectVacancyListSerializer, VacancyDetailSerializer, VacancyResponseAcceptSerializer, VacancyResponseDetailSerializer, VacancyResponseListSerializer, - ProjectVacancyCreateListSerializer, ) class VacancyList(generics.ListCreateAPIView): queryset = Vacancy.objects.get_vacancy_for_list_view() - serializer_class = ProjectVacancyCreateListSerializer + serializer_class = ProjectVacancyListSerializer permission_classes = [permissions.IsAuthenticatedOrReadOnly] filter_backends = (filters.DjangoFilterBackend,) filterset_class = VacancyFilter From 7f69ddf8509692517fde6eaee671a7d6654f48bf Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Tue, 19 Mar 2024 00:06:32 +0300 Subject: [PATCH 03/15] add type-hints vacancy --- vacancy/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vacancy/models.py b/vacancy/models.py index 29de8c7a..d82edbf1 100644 --- a/vacancy/models.py +++ b/vacancy/models.py @@ -16,7 +16,7 @@ class Vacancy(models.Model): project: A ForeignKey referring to the Company model. is_active: A boolean indicating if Vacancy is active. datetime_created: A DateTimeField indicating date of creation. - datetime_updated: A DateTimeField indicating date of update. + datetime_updated: A DateTimeField indicating date of update.. """ role = models.CharField(max_length=256, null=False) From f706ae3e677b504948cbc2d6f0b113d1870650da Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Tue, 19 Mar 2024 00:12:44 +0300 Subject: [PATCH 04/15] add type-hints vacancy --- vacancy/filters.py | 8 +++--- vacancy/models.py | 10 +++---- vacancy/serializers.py | 65 +++++++++++++++++++++++------------------- 3 files changed, 45 insertions(+), 38 deletions(-) diff --git a/vacancy/filters.py b/vacancy/filters.py index 44c4d928..86b53ef6 100644 --- a/vacancy/filters.py +++ b/vacancy/filters.py @@ -3,7 +3,7 @@ from vacancy.models import Vacancy -def project_id_filter(queryset, name, value): +def project_id_filter(queryset, name, value) -> queryset: return queryset.filter( **{ "project_id": value[0], @@ -25,9 +25,9 @@ class VacancyFilter(filters.FilterSet): ?is_active=false equals to .filter(is_active=False) """ - def __init__(self, *args, **kwargs): + def init(self, *args, **kwargs): """if is_active filter is not passed, default to True""" - super().__init__(*args, **kwargs) + super().init(*args, **kwargs) if self.data.get("is_active") is None: self.data = dict(self.data) self.data["is_active"] = True @@ -37,4 +37,4 @@ def __init__(self, *args, **kwargs): class Meta: model = Vacancy - fields = ("project_id", "is_active") + fields = ("project_id", "is_active") \ No newline at end of file diff --git a/vacancy/models.py b/vacancy/models.py index d82edbf1..80204fd0 100644 --- a/vacancy/models.py +++ b/vacancy/models.py @@ -1,8 +1,8 @@ from django.db import models -from django_stubs_ext.db.models import TypedModelMeta from projects.models import Project from vacancy.managers import VacancyManager, VacancyResponseManager +from django_stubs_ext.db.models import TypedModelMeta class Vacancy(models.Model): @@ -16,7 +16,7 @@ class Vacancy(models.Model): project: A ForeignKey referring to the Company model. is_active: A boolean indicating if Vacancy is active. datetime_created: A DateTimeField indicating date of creation. - datetime_updated: A DateTimeField indicating date of update.. + datetime_updated: A DateTimeField indicating date of update. """ role = models.CharField(max_length=256, null=False) @@ -40,7 +40,7 @@ class Vacancy(models.Model): objects = VacancyManager() - def __str__(self) -> str: + def str(self) -> str: return f"Vacancy<{self.id}> - {self.role}" class Meta(TypedModelMeta): @@ -89,10 +89,10 @@ class VacancyResponse(models.Model): objects = VacancyResponseManager() - def __str__(self) -> str: + def str(self) -> str: return f"VacancyResponse<{self.id}> - {self.user} - {self.vacancy}" class Meta(TypedModelMeta): verbose_name = "Отклик на вакансию" verbose_name_plural = "Отклик на вакансии" - ordering = ["-datetime_created"] + ordering = ["-datetime_created"] \ No newline at end of file diff --git a/vacancy/serializers.py b/vacancy/serializers.py index 6bf34433..d28648e8 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -1,14 +1,17 @@ from django.contrib.auth import get_user_model from rest_framework import serializers -from core.fields import CustomListField from projects.models import Project -from users.serializers import UserDetailSerializer +from users.serializers import UserDetailSerializer, CustomListField from vacancy.models import Vacancy, VacancyResponse User = get_user_model() +class RequiredSkillsSerializerMixin(serializers.Serializer): + required_skills = CustomListField(child=serializers.CharField()) + + class ProjectForVacancySerializer(serializers.ModelSerializer[Project]): class Meta: model = Project @@ -20,9 +23,8 @@ class Meta: ] -class VacancyDetailSerializer(serializers.ModelSerializer[Vacancy]): +class VacancyDetailSerializer(serializers.ModelSerializer, RequiredSkillsSerializerMixin[Vacancy]): project = ProjectForVacancySerializer(many=False, read_only=True) - required_skills = serializers.ListSerializer(child=serializers.CharField()) class Meta: model = Vacancy @@ -36,14 +38,10 @@ class Meta: "datetime_created", "datetime_updated", ] - read_only_fields = [ - "project", - ] - + read_only_fields = ["project"] -class VacancyListSerializer(serializers.ModelSerializer[Vacancy]): - required_skills = CustomListField(child=serializers.CharField()) +class VacancyListSerializer(serializers.ModelSerializer, RequiredSkillsSerializerMixin[Vacancy]): class Meta: model = Vacancy fields = [ @@ -58,9 +56,24 @@ class Meta: ] -class ProjectVacancyListSerializer(serializers.ModelSerializer[Vacancy]): - required_skills = CustomListField(child=serializers.CharField()) +class ProjectVacancyListSerializer( + serializers.ModelSerializer, RequiredSkillsSerializerMixin[Project] +): + class Meta: + model = Vacancy + fields = [ + "id", + "role", + "required_skills", + "description", + "project", + "is_active", + ] + +class ProjectVacancyCreateListSerializer( + serializers.ModelSerializer, RequiredSkillsSerializerMixin[Project] +): class Meta: model = Vacancy fields = [ @@ -72,6 +85,16 @@ class Meta: "is_active", ] + def create(self, validated_data): + if validated_data["project"].draft: + validated_data["is_active"] = False + else: + validated_data["is_active"] = True + + instance = super().create(validated_data) + + return instance + class VacancyResponseListSerializer(serializers.ModelSerializer[VacancyResponse]): is_approved = serializers.BooleanField(read_only=True) @@ -117,20 +140,4 @@ def create(self, validated_data): 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) - - class Meta: - model = VacancyResponse - fields = [ - "id", - "user", - "vacancy", - "why_me", - "is_approved", - "datetime_created", - "datetime_updated", - ] - - -class VacancyResponseAcceptSerializer(VacancyResponseDetailSerializer): - is_approved = serializers.BooleanField(required=True, read_only=False) + is_approve \ No newline at end of file From be8f3efa038c0374ab50d2cddd08e97787d5a837 Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Thu, 21 Mar 2024 22:33:13 +0300 Subject: [PATCH 05/15] add norm type-hints vacancy --- vacancy/filters.py | 2 +- vacancy/models.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vacancy/filters.py b/vacancy/filters.py index 86b53ef6..1c1c9538 100644 --- a/vacancy/filters.py +++ b/vacancy/filters.py @@ -25,7 +25,7 @@ class VacancyFilter(filters.FilterSet): ?is_active=false equals to .filter(is_active=False) """ - def init(self, *args, **kwargs): + def __init__(self, *args, **kwargs): """if is_active filter is not passed, default to True""" super().init(*args, **kwargs) if self.data.get("is_active") is None: diff --git a/vacancy/models.py b/vacancy/models.py index 80204fd0..6e26e4e7 100644 --- a/vacancy/models.py +++ b/vacancy/models.py @@ -40,7 +40,7 @@ class Vacancy(models.Model): objects = VacancyManager() - def str(self) -> str: + def __str__(self) -> str: return f"Vacancy<{self.id}> - {self.role}" class Meta(TypedModelMeta): @@ -89,7 +89,7 @@ class VacancyResponse(models.Model): objects = VacancyResponseManager() - def str(self) -> str: + def __str__(self) -> str: return f"VacancyResponse<{self.id}> - {self.user} - {self.vacancy}" class Meta(TypedModelMeta): From 7250222ad3588e4f61a295f6a0e1206ff826fade Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Sun, 31 Mar 2024 19:53:23 +0300 Subject: [PATCH 06/15] add type-hints vacancy --- vacancy/filters.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vacancy/filters.py b/vacancy/filters.py index 1c1c9538..d4da105b 100644 --- a/vacancy/filters.py +++ b/vacancy/filters.py @@ -3,7 +3,7 @@ from vacancy.models import Vacancy -def project_id_filter(queryset, name, value) -> queryset: +def project_id_filter(queryset, name, value) -> QuerySet[Project]: return queryset.filter( **{ "project_id": value[0], From 974940de8316980c6339d96a47ebcb03e5beadce Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Sun, 31 Mar 2024 19:59:05 +0300 Subject: [PATCH 07/15] hmhmhm --- vacancy/serializers.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/vacancy/serializers.py b/vacancy/serializers.py index e937c339..42a10ad8 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -176,4 +176,20 @@ def create(self, validated_data): class VacancyResponseDetailSerializer(serializers.ModelSerializer[VacancyResponse]): user = UserDetailSerializer(many=False, read_only=True) vacancy = VacancyListSerializer(many=False, read_only=True) - is_approve \ No newline at end of file + is_approved = serializers.BooleanField(read_only=True) + + class Meta: + model = VacancyResponse + fields = [ + "id", + "user", + "vacancy", + "why_me", + "is_approved", + "datetime_created", + "datetime_updated", + ] + + +class VacancyResponseAcceptSerializer(VacancyResponseDetailSerializer): + is_approved = serializers.BooleanField(required=True, read_only=False) \ No newline at end of file From a5a88aa2f9ac2b52106840e42e4ea332b1c6cd8d Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Sun, 31 Mar 2024 20:06:39 +0300 Subject: [PATCH 08/15] small fix 1 --- vacancy/filters.py | 6 ++++-- vacancy/models.py | 3 ++- vacancy/serializers.py | 3 ++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/vacancy/filters.py b/vacancy/filters.py index d4da105b..d2e361eb 100644 --- a/vacancy/filters.py +++ b/vacancy/filters.py @@ -3,7 +3,8 @@ from vacancy.models import Vacancy -def project_id_filter(queryset, name, value) -> QuerySet[Project]: + +def project_id_filter(queryset, name, value) -> queryset[Project]: return queryset.filter( **{ "project_id": value[0], @@ -37,4 +38,5 @@ def __init__(self, *args, **kwargs): class Meta: model = Vacancy - fields = ("project_id", "is_active") \ No newline at end of file + fields = ("project_id", "is_active") + \ No newline at end of file diff --git a/vacancy/models.py b/vacancy/models.py index e7a1c37c..f14a3270 100644 --- a/vacancy/models.py +++ b/vacancy/models.py @@ -101,4 +101,5 @@ def __str__(self) -> str: class Meta(TypedModelMeta): verbose_name = "Отклик на вакансию" verbose_name_plural = "Отклик на вакансии" - ordering = ["-datetime_created"] \ No newline at end of file + ordering = ["-datetime_created"] + \ No newline at end of file diff --git a/vacancy/serializers.py b/vacancy/serializers.py index 42a10ad8..ec940b94 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -192,4 +192,5 @@ class Meta: class VacancyResponseAcceptSerializer(VacancyResponseDetailSerializer): - is_approved = serializers.BooleanField(required=True, read_only=False) \ No newline at end of file + is_approved = serializers.BooleanField(required=True, read_only=False) + \ No newline at end of file From c9294e5cc737d05dc6e8788d0786c6b6bdeecc4b Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Sun, 31 Mar 2024 20:08:56 +0300 Subject: [PATCH 09/15] small fix 2 --- vacancy/filters.py | 3 +-- vacancy/models.py | 1 - vacancy/serializers.py | 1 - 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/vacancy/filters.py b/vacancy/filters.py index d2e361eb..ac63f3d9 100644 --- a/vacancy/filters.py +++ b/vacancy/filters.py @@ -4,7 +4,7 @@ -def project_id_filter(queryset, name, value) -> queryset[Project]: +def project_id_filter(queryset, name, value): return queryset.filter( **{ "project_id": value[0], @@ -39,4 +39,3 @@ def __init__(self, *args, **kwargs): class Meta: model = Vacancy fields = ("project_id", "is_active") - \ No newline at end of file diff --git a/vacancy/models.py b/vacancy/models.py index f14a3270..5c3ae637 100644 --- a/vacancy/models.py +++ b/vacancy/models.py @@ -102,4 +102,3 @@ class Meta(TypedModelMeta): verbose_name = "Отклик на вакансию" verbose_name_plural = "Отклик на вакансии" ordering = ["-datetime_created"] - \ No newline at end of file diff --git a/vacancy/serializers.py b/vacancy/serializers.py index ec940b94..fa47f063 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -193,4 +193,3 @@ class Meta: class VacancyResponseAcceptSerializer(VacancyResponseDetailSerializer): is_approved = serializers.BooleanField(required=True, read_only=False) - \ No newline at end of file From 6b604d7989995fdb60bad2ffec59c72c5cef39ec Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Sun, 31 Mar 2024 20:21:59 +0300 Subject: [PATCH 10/15] rollback --- vacancy/filters.py | 3 +-- vacancy/models.py | 13 +++++++++---- vacancy/serializers.py | 26 +++++++++----------------- vacancy/views.py | 4 ++-- 4 files changed, 21 insertions(+), 25 deletions(-) diff --git a/vacancy/filters.py b/vacancy/filters.py index ac63f3d9..44c4d928 100644 --- a/vacancy/filters.py +++ b/vacancy/filters.py @@ -3,7 +3,6 @@ from vacancy.models import Vacancy - def project_id_filter(queryset, name, value): return queryset.filter( **{ @@ -28,7 +27,7 @@ class VacancyFilter(filters.FilterSet): def __init__(self, *args, **kwargs): """if is_active filter is not passed, default to True""" - super().init(*args, **kwargs) + super().__init__(*args, **kwargs) if self.data.get("is_active") is None: self.data = dict(self.data) self.data["is_active"] = True diff --git a/vacancy/models.py b/vacancy/models.py index 5c3ae637..3c6e9b76 100644 --- a/vacancy/models.py +++ b/vacancy/models.py @@ -3,7 +3,6 @@ from projects.models import Project from vacancy.managers import VacancyManager, VacancyResponseManager -from django_stubs_ext.db.models import TypedModelMeta class Vacancy(models.Model): @@ -46,10 +45,16 @@ class Vacancy(models.Model): objects = VacancyManager() + def get_required_skills(self): + required_skills = [] + for sto in self.required_skills.all(): + required_skills.append(sto.skill) + return required_skills + def __str__(self): return f"Vacancy<{self.id}> - {self.role}" - class Meta(TypedModelMeta): + class Meta: verbose_name = "Вакансия" verbose_name_plural = "Вакансии" ordering = ["-datetime_created"] @@ -95,10 +100,10 @@ class VacancyResponse(models.Model): objects = VacancyResponseManager() - def __str__(self) -> str: + def __str__(self): return f"VacancyResponse<{self.id}> - {self.user} - {self.vacancy}" - class Meta(TypedModelMeta): + class Meta: verbose_name = "Отклик на вакансию" verbose_name_plural = "Отклик на вакансии" ordering = ["-datetime_created"] diff --git a/vacancy/serializers.py b/vacancy/serializers.py index fa47f063..2b1007cf 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -21,7 +21,7 @@ class RequiredSkillsWriteSerializerMixin(RequiredSkillsSerializerMixin): ) -class ProjectForVacancySerializer(serializers.ModelSerializer[Project]): +class ProjectForVacancySerializer(serializers.ModelSerializer): class Meta: model = Project fields = [ @@ -32,7 +32,9 @@ class Meta: ] -class VacancyDetailSerializer(serializers.ModelSerializer, RequiredSkillsSerializerMixin): +class VacancyDetailSerializer( + serializers.ModelSerializer, RequiredSkillsWriteSerializerMixin +): project = ProjectForVacancySerializer(many=False, read_only=True) class Meta: @@ -51,7 +53,7 @@ class Meta: read_only_fields = ["project"] -class VacancyListSerializer(serializers.ModelSerializer, RequiredSkillsSerializerMixin[Vacancy]): +class VacancyListSerializer(serializers.ModelSerializer, RequiredSkillsSerializerMixin): class Meta: model = Vacancy fields = [ @@ -67,7 +69,7 @@ class Meta: class ProjectVacancyListSerializer( - serializers.ModelSerializer, RequiredSkillsSerializerMixin[Project] + serializers.ModelSerializer, RequiredSkillsSerializerMixin ): class Meta: model = Vacancy @@ -82,7 +84,7 @@ class Meta: class ProjectVacancyCreateListSerializer( - serializers.ModelSerializer, RequiredSkillsSerializerMixin + serializers.ModelSerializer, RequiredSkillsWriteSerializerMixin ): def create(self, validated_data): project = validated_data["project"] @@ -121,18 +123,8 @@ class Meta: "is_active", ] - def create(self, validated_data): - if validated_data["project"].draft: - validated_data["is_active"] = False - else: - validated_data["is_active"] = True - - instance = super().create(validated_data) - - return instance - -class VacancyResponseListSerializer(serializers.ModelSerializer[VacancyResponse]): +class VacancyResponseListSerializer(serializers.ModelSerializer): is_approved = serializers.BooleanField(read_only=True) user = UserDetailSerializer(read_only=True) user_id = serializers.IntegerField(write_only=True) @@ -173,7 +165,7 @@ def create(self, validated_data): return vacancy_response -class VacancyResponseDetailSerializer(serializers.ModelSerializer[VacancyResponse]): +class VacancyResponseDetailSerializer(serializers.ModelSerializer): user = UserDetailSerializer(many=False, read_only=True) vacancy = VacancyListSerializer(many=False, read_only=True) is_approved = serializers.BooleanField(read_only=True) diff --git a/vacancy/views.py b/vacancy/views.py index 858d938d..6a588fc5 100644 --- a/vacancy/views.py +++ b/vacancy/views.py @@ -14,17 +14,17 @@ IsVacancyProjectLeader, ) from vacancy.serializers import ( - ProjectVacancyListSerializer, VacancyDetailSerializer, VacancyResponseAcceptSerializer, VacancyResponseDetailSerializer, VacancyResponseListSerializer, + ProjectVacancyCreateListSerializer, ) class VacancyList(generics.ListCreateAPIView): queryset = Vacancy.objects.get_vacancy_for_list_view() - serializer_class = ProjectVacancyListSerializer + serializer_class = ProjectVacancyCreateListSerializer permission_classes = [permissions.IsAuthenticatedOrReadOnly] filter_backends = (filters.DjangoFilterBackend,) filterset_class = VacancyFilter From 575e2f2a714ced36146d7499d2ae7cfb2839db3c Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Sun, 31 Mar 2024 20:33:13 +0300 Subject: [PATCH 11/15] first type-hints vacancy --- vacancy/models.py | 9 +++++---- vacancy/serializers.py | 18 +++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) 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..3b43213b 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -15,13 +15,13 @@ class RequiredSkillsSerializerMixin(serializers.Serializer): required_skills = SkillToObjectSerializer(many=True, read_only=True) -class RequiredSkillsWriteSerializerMixin(RequiredSkillsSerializerMixin): +class RequiredSkillsWriteSerializerMixin(RequiredSkillsSerializerMixin[Project]): required_skills_ids = serializers.ListField( child=serializers.IntegerField(), write_only=True, required=False ) -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[Project] ): class Meta: model = Vacancy @@ -84,7 +84,7 @@ class Meta: class ProjectVacancyCreateListSerializer( - serializers.ModelSerializer, RequiredSkillsWriteSerializerMixin + serializers.ModelSerializer, RequiredSkillsWriteSerializerMixin[Project] ): 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) From 3d8f285ac5879d60781800e80146a02d26d1db0e Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Sun, 31 Mar 2024 21:09:12 +0300 Subject: [PATCH 12/15] type-hints vacancy --- vacancy/filters.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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], From 8fa264ca552fd61f25a8e9cc50229da7b4855ce1 Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Sat, 6 Apr 2024 23:09:40 +0300 Subject: [PATCH 13/15] small fix type-hints --- vacancy/serializers.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vacancy/serializers.py b/vacancy/serializers.py index 3b43213b..b88f26e2 100644 --- a/vacancy/serializers.py +++ b/vacancy/serializers.py @@ -15,7 +15,7 @@ class RequiredSkillsSerializerMixin(serializers.Serializer): required_skills = SkillToObjectSerializer(many=True, read_only=True) -class RequiredSkillsWriteSerializerMixin(RequiredSkillsSerializerMixin[Project]): +class RequiredSkillsWriteSerializerMixin(RequiredSkillsSerializerMixin): required_skills_ids = serializers.ListField( child=serializers.IntegerField(), write_only=True, required=False ) @@ -69,7 +69,7 @@ class Meta: class ProjectVacancyListSerializer( - serializers.ModelSerializer, RequiredSkillsSerializerMixin[Project] + serializers.ModelSerializer, RequiredSkillsSerializerMixin[Vacancy] ): class Meta: model = Vacancy @@ -84,7 +84,7 @@ class Meta: class ProjectVacancyCreateListSerializer( - serializers.ModelSerializer, RequiredSkillsWriteSerializerMixin[Project] + serializers.ModelSerializer, RequiredSkillsWriteSerializerMixin[Vacancy] ): def create(self, validated_data): project = validated_data["project"] From fa94f00d2fe3100e7aa277e9c93ea429c4df3669 Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Mon, 8 Apr 2024 23:41:44 +0300 Subject: [PATCH 14/15] add type-hints core --- core/fields.py | 4 ++-- core/models.py | 33 +++++++++++++++++---------------- core/serializers.py | 4 ++-- 3 files changed, 21 insertions(+), 20 deletions(-) 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..89c9e4fc 100644 --- a/core/serializers.py +++ b/core/serializers.py @@ -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") From 7779dbfed8da1877753fe586192bc6e9ab4dadff Mon Sep 17 00:00:00 2001 From: DaniilSvinsov Date: Thu, 11 Apr 2024 23:27:18 +0300 Subject: [PATCH 15/15] fix anyway --- core/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/serializers.py b/core/serializers.py index 89c9e4fc..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()