1+ from django .forms .models import model_to_dict
12from rest_framework import serializers
23
3- from .models import CustomUser , Member , Mentor , Expert , Investor
4+ from .models import CustomUser , Expert , Investor , Member , Mentor
5+
6+
7+ class MemberSerializer (serializers .ModelSerializer ):
8+ class Meta :
9+ model = Member
10+ fields = [
11+ "key_skills" ,
12+ "useful_to_project" ,
13+ "speciality" ,
14+ ]
15+
16+
17+ class MentorSerializer (serializers .ModelSerializer ):
18+ class Meta :
19+ model = Mentor
20+ fields = [
21+ "job" ,
22+ "useful_to_project" ,
23+ ]
24+
25+
26+ class ExpertSerializer (serializers .ModelSerializer ):
27+ class Meta :
28+ model = Expert
29+ fields = [
30+ "preferred_industries" ,
31+ "useful_to_project" ,
32+ ]
33+
34+
35+ class InvestorSerializer (serializers .ModelSerializer ):
36+ class Meta :
37+ model = Investor
38+ fields = [
39+ "interaction_process_description" ,
40+ "preferred_industries" ,
41+ ]
442
543
644class UserDetailSerializer (serializers .ModelSerializer ):
7- user_type_fields = serializers .SerializerMethodField ()
45+ member = MemberSerializer (required = False )
46+ investor = InvestorSerializer (required = False )
47+ expert = ExpertSerializer (required = False )
48+ mentor = MentorSerializer (required = False )
849
950 class Meta :
1051 model = CustomUser
@@ -17,43 +58,57 @@ class Meta:
1758 "patronymic" ,
1859 "avatar" ,
1960 "city" ,
20- "password" ,
2161 "is_active" ,
22- "user_type_fields" ,
62+ "member" ,
63+ "investor" ,
64+ "expert" ,
65+ "mentor" ,
2366 ]
2467
25- def get_user_type_fields (self , obj ):
26- # maybe thats not the best way to do it, but it also works
27-
28- # user_type_to_serializer = {
29- # "member": MemberSerializer,
30- # "expert": ExpertSerializer,
31- # "investor": InvestorSerializer,
32- # "mentor": MentorSerializer,
33- # }
34- # for user_type in user_type_to_serializer.keys():
35- # if hasattr(obj, user_type):
36- # serializer = user_type_to_serializer[user_type](getattr(obj, user_type))
37- # return serializer.data
38-
39- if obj .user_type == CustomUser .MEMBER :
40- return MemberSerializer (obj .member ).data
41- elif obj .user_type == CustomUser .MENTOR :
42- return MentorSerializer (obj .mentor ).data
43- elif obj .user_type == CustomUser .EXPERT :
44- return ExpertSerializer (obj .expert ).data
45- elif obj .user_type == CustomUser .INVESTOR :
46- return InvestorSerializer (obj .investor ).data
68+ def update (self , instance , validated_data ):
69+ if instance .user_type == CustomUser .MEMBER :
70+ instance .member .__dict__ .update (
71+ validated_data .get ("member" , model_to_dict (instance .member ))
72+ )
73+ instance .member .save ()
74+ elif instance .user_type == CustomUser .INVESTOR :
75+ instance .investor .__dict__ .update (
76+ validated_data .get ("investor" , model_to_dict (instance .investor ))
77+ )
78+ instance .investor .save ()
79+ elif instance .user_type == CustomUser .EXPERT :
80+ instance .expert .__dict__ .update (
81+ validated_data .get ("expert" , model_to_dict (instance .expert ))
82+ )
83+ instance .expert .save ()
84+ elif instance .user_type == CustomUser .MENTOR :
85+ instance .mentor .__dict__ .update (
86+ validated_data .get ("mentor" , model_to_dict (instance .mentor ))
87+ )
88+ instance .mentor .save ()
89+
90+ # maybe it's better to write ALLOWED_UPDATABLE_FIELDS = ["first_name", "last_name", ...]
91+ IMMUTABLE_FIELDS = ("email" , "user_type" , "is_active" , "password" )
92+ USER_TYPE_FIELDS = ("member" , "investor" , "expert" , "mentor" )
93+
94+ for attr , value in validated_data .items ():
95+ if attr in IMMUTABLE_FIELDS + USER_TYPE_FIELDS :
96+ continue
97+ setattr (instance , attr , value )
98+
99+ instance .save ()
100+
101+ return instance
47102
103+
104+ class UserListSerializer (serializers .ModelSerializer ):
48105 def create (self , validated_data ):
49106 user = CustomUser (** validated_data )
50107 user .set_password (validated_data ["password" ])
51108 user .save ()
52109
53110 return user
54111
55-
56- class UserListSerializer (serializers .ModelSerializer ):
57112 class Meta :
58113 model = CustomUser
59114 fields = [
@@ -65,43 +120,7 @@ class Meta:
65120 "patronymic" ,
66121 "avatar" ,
67122 "is_active" ,
68- ]
69-
70-
71- class MemberSerializer (serializers .ModelSerializer ):
72- class Meta :
73- model = Member
74- fields = [
75- "key_skills" ,
76- "useful_to_project" ,
77- "speciality" ,
78- ]
79-
80-
81- class MentorSerializer (serializers .ModelSerializer ):
82- class Meta :
83- model = Mentor
84- fields = [
85- "job" ,
86- "useful_to_project" ,
87- ]
88-
89-
90- class ExpertSerializer (serializers .ModelSerializer ):
91- class Meta :
92- model = Expert
93- fields = [
94- "preferred_industries" ,
95- "useful_to_project" ,
96- ]
97-
98-
99- class InvestorSerializer (serializers .ModelSerializer ):
100- class Meta :
101- model = Investor
102- fields = [
103- "interaction_process_description" ,
104- "preferred_industries" ,
123+ "password" ,
105124 ]
106125
107126
0 commit comments