Skip to content

Commit cf46c6e

Browse files
committed
Edit user type fields, fixed password hashing
1 parent 751b7a2 commit cf46c6e

3 files changed

Lines changed: 88 additions & 95 deletions

File tree

users/admin.py

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -91,32 +91,6 @@ class CustomUserAdmin(admin.ModelAdmin):
9191
"id",
9292
)
9393

94-
95-
# TODO display additional fields
96-
97-
# @admin.register(Member)
98-
# class MemberAdmin(admin.ModelAdmin):
99-
# inlines = (CustomUserInlined,)
100-
# fieldsets = (
101-
# (
102-
# "Дополнительные поля",
103-
# {
104-
# "fields": (
105-
# "key_skills",
106-
# "useful_to_project",
107-
# "speciality",
108-
# )
109-
# },
110-
# ),
111-
# )
112-
113-
# list_display = (
114-
# "id",
115-
# )
116-
# search_fields = (
117-
# "id",
118-
# )
119-
120-
# list_filter = (
121-
# "id",
122-
# )
94+
def save_model(self, request, obj, form, change):
95+
obj.set_password(form.cleaned_data["password"])
96+
obj.save()

users/serializers.py

Lines changed: 84 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,51 @@
1+
from django.forms.models import model_to_dict
12
from 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

644
class 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

users/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
from users.serializers import (
2323
EmailSerializer,
2424
PasswordSerializer,
25-
UserListSerializer,
2625
UserDetailSerializer,
26+
UserListSerializer,
2727
VerifyEmailSerializer,
2828
)
2929

0 commit comments

Comments
 (0)