Skip to content

Commit

Permalink
Merge pull request #257 from PROCOLLAB-github/featue/v2-speciality
Browse files Browse the repository at this point in the history
Поле с специальностями из датасета + фильтр
  • Loading branch information
Yakser authored Jan 14, 2024
2 parents 55e8bf9 + 930bc46 commit b26e2fc
Show file tree
Hide file tree
Showing 6 changed files with 74 additions and 20 deletions.
3 changes: 3 additions & 0 deletions users/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ class CustomUserAdmin(admin.ModelAdmin):
"region",
"organization",
"speciality",
"v2_speciality",
"key_skills",
)
},
Expand Down Expand Up @@ -108,6 +109,8 @@ class CustomUserAdmin(admin.ModelAdmin):
"city",
)

raw_id_fields = ("v2_speciality",)

readonly_fields = ("ordering_score",)
change_form_template = "users/admin/users_change_form.html"

Expand Down
3 changes: 3 additions & 0 deletions users/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,9 @@ def filter_by_fullname(cls, queryset, name, value):
speciality__icontains = filters.Filter(
field_name="speciality", lookup_expr="icontains"
)
v2_speciality = filters.NumberFilter(
field_name="v2_speciality",
)
useful_to_project__contains = filters.Filter(
field_name="useful_to_project", lookup_expr="contains"
)
Expand Down
25 changes: 25 additions & 0 deletions users/migrations/0043_customuser_v2_speciality.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 4.2.3 on 2024-01-13 08:13

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
("core", "0008_auto_20231223_1331"),
("users", "0042_alter_expert_options_alter_investor_options_and_more"),
]

operations = [
migrations.AddField(
model_name="customuser",
name="v2_speciality",
field=models.OneToOneField(
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="users",
to="core.specialization",
),
),
]
9 changes: 7 additions & 2 deletions users/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from django.db import models
from django.db.models import QuerySet
from django_stubs_ext.db.models import TypedModelMeta

from users.constants import (
ADMIN,
EXPERT,
Expand Down Expand Up @@ -86,8 +87,12 @@ class CustomUser(AbstractUser):
city = models.CharField(max_length=255, null=True, blank=True)
organization = models.CharField(max_length=255, null=True, blank=True)
speciality = models.CharField(max_length=255, null=True, blank=True)
# contacts = models.JSONField(null=True, blank=True)
# fixme: mb replace to ChoiceField or FSMField(Finite State Machine)
v2_speciality = models.OneToOneField(
"core.Specialization", # avoid circular imports
on_delete=models.SET_NULL,
null=True,
related_name="users",
)
onboarding_stage = models.PositiveSmallIntegerField(
null=True,
blank=True,
Expand Down
41 changes: 24 additions & 17 deletions users/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from projects.models import Project, Collaborator
from projects.validators import validate_project
from .models import CustomUser, Expert, Investor, Member, Mentor, UserAchievement
from .validators import specialization_exists_validator


class AchievementListSerializer(serializers.ModelSerializer[UserAchievement]):
Expand Down Expand Up @@ -80,6 +81,23 @@ class Meta:
]


class SpecializationSerializer(serializers.ModelSerializer[Specialization]):
class Meta:
model = SpecializationCategory
fields = [
"id",
"name",
]


class SpecializationsSerializer(serializers.ModelSerializer[SpecializationCategory]):
specializations = SpecializationSerializer(many=True)

class Meta:
model = SpecializationCategory
fields = ["id", "name", "specializations"]


class UserProjectsSerializer(serializers.ModelSerializer[Project]):
short_description = serializers.SerializerMethodField()
views_count = serializers.SerializerMethodField()
Expand Down Expand Up @@ -160,6 +178,10 @@ class UserDetailSerializer(serializers.ModelSerializer[CustomUser]):
links = serializers.SerializerMethodField()
is_online = serializers.SerializerMethodField()
projects = serializers.SerializerMethodField()
v2_speciality = SpecializationSerializer(read_only=True)
v2_speciality_id = serializers.IntegerField(
write_only=True, validators=[specialization_exists_validator]
)

def get_projects(self, user: CustomUser):
return UserProjectsSerializer(
Expand Down Expand Up @@ -194,6 +216,8 @@ class Meta:
"key_skills",
"birthday",
"speciality",
"v2_speciality",
"v2_speciality_id",
"organization",
"about_me",
"avatar",
Expand Down Expand Up @@ -391,20 +415,3 @@ def is_valid(self, *, raise_exception=False):
def validate(self, data):
super().validate(data)
return validate_project(data)


class SpecializationSerializer(serializers.ModelSerializer[Specialization]):
class Meta:
model = SpecializationCategory
fields = [
"id",
"name",
]


class SpecializationsSerializer(serializers.ModelSerializer[SpecializationCategory]):
specializations = SpecializationSerializer(many=True)

class Meta:
model = SpecializationCategory
fields = ["id", "name", "specializations"]
13 changes: 12 additions & 1 deletion users/validators.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.utils import timezone
from django.core.exceptions import ValidationError
from rest_framework import serializers
from rest_framework.exceptions import ValidationError


def user_birthday_validator(birthday):
Expand All @@ -25,3 +26,13 @@ def user_name_validator(name):
if len(name) < 2:
raise ValidationError("Имя слишком короткое")
return True


def specialization_exists_validator(pk: int):
# avoid circular imports
from core.models import Specialization

if not Specialization.objects.filter(pk=pk).exists():
raise serializers.ValidationError(
{"v2_speciality_id": "Specialization with given id does not exist"}
)

0 comments on commit b26e2fc

Please sign in to comment.