@@ -103,7 +103,12 @@ class Meta:
103103 ]
104104
105105 def update (self , instance , validated_data ):
106+ IMMUTABLE_FIELDS = ("email" , "is_active" , "password" )
107+ USER_TYPE_FIELDS = ("member" , "investor" , "expert" , "mentor" )
108+ RELATED_FIELDS = ("achievements" ,)
109+
106110 if instance .user_type == CustomUser .MEMBER :
111+ IMMUTABLE_FIELDS = ("email" , "user_type" , "is_active" , "password" )
107112 instance .member .__dict__ .update (
108113 validated_data .get ("member" , model_to_dict (instance .member ))
109114 )
@@ -123,21 +128,45 @@ def update(self, instance, validated_data):
123128 instance .expert .preferred_industries = validated_data .get ("expert" , {}).get (
124129 "preferred_industries" , []
125130 )
126- print ("expert" , instance .expert .preferred_industries )
127131 instance .expert .save ()
128132 elif instance .user_type == CustomUser .MENTOR :
129133 instance .mentor .__dict__ .update (
130134 validated_data .get ("mentor" , model_to_dict (instance .mentor ))
131135 )
132136 instance .mentor .save ()
133137
134- IMMUTABLE_FIELDS = ("email" , "user_type" , "is_active" , "password" )
135- USER_TYPE_FIELDS = ("member" , "investor" , "expert" , "mentor" )
136- RELATED_FIELDS = ("achievements" ,)
138+ user_types_to_attr = {
139+ CustomUser .MEMBER : "member" ,
140+ CustomUser .INVESTOR : "investor" ,
141+ CustomUser .EXPERT : "expert" ,
142+ CustomUser .MENTOR : "mentor" ,
143+ }
144+ user_types_to_model = {
145+ CustomUser .MEMBER : Member ,
146+ CustomUser .INVESTOR : Investor ,
147+ CustomUser .EXPERT : Expert ,
148+ CustomUser .MENTOR : Mentor ,
149+ }
137150
138151 for attr , value in validated_data .items ():
139152 if attr in IMMUTABLE_FIELDS + USER_TYPE_FIELDS + RELATED_FIELDS :
140153 continue
154+ if attr == "user_type" :
155+ if value == instance .user_type or value not in user_types_to_attr .keys ():
156+ continue
157+ # we can't change user type to Member
158+ if value == CustomUser .MEMBER :
159+ continue
160+
161+ # delete old user type object and attribute
162+ getattr (instance , user_types_to_attr [instance .user_type ]).delete ()
163+ setattr (instance , user_types_to_attr [instance .user_type ], None )
164+
165+ instance .user_type = value
166+
167+ # create new user type object, attribute sets automatically
168+ new_user_type = user_types_to_model [value ](user = instance )
169+ new_user_type .save ()
141170 setattr (instance , attr , value )
142171
143172 instance .save ()
0 commit comments