Skip to content

Commit bfc1339

Browse files
committed
AGAIN fixed fuck1ng user type objects creation
1 parent 00dd55a commit bfc1339

3 files changed

Lines changed: 43 additions & 12 deletions

File tree

users/admin.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -92,24 +92,24 @@ def save_model(self, request, obj, form, change):
9292
old_user = CustomUser.objects.get(id=obj.id)
9393
if obj.user_type != old_user.user_type:
9494
try:
95-
if old_user.user_type == 1:
95+
if old_user.user_type == CustomUser.MEMBER:
9696
old_user.member.delete()
97-
elif old_user.user_type == 2:
97+
elif old_user.user_type == CustomUser.MENTOR:
9898
old_user.mentor.delete()
99-
elif old_user.user_type == 3:
99+
elif old_user.user_type == CustomUser.EXPERT:
100100
old_user.expert.delete()
101-
elif old_user.user_type == 4:
101+
elif old_user.user_type == CustomUser.INVESTOR:
102102
old_user.investor.delete()
103103
except Exception:
104104
pass
105105

106-
if obj.user_type == 1:
106+
if obj.user_type == CustomUser.MEMBER:
107107
Member.objects.create(user=old_user)
108-
elif obj.user_type == 2:
108+
elif obj.user_type == CustomUser.MENTOR:
109109
Mentor.objects.create(user=old_user)
110-
elif obj.user_type == 3:
110+
elif obj.user_type == CustomUser.EXPERT:
111111
Expert.objects.create(user=old_user)
112-
elif obj.user_type == 4:
112+
elif obj.user_type == CustomUser.INVESTOR:
113113
Investor.objects.create(user=old_user)
114114

115115
super().save_model(request, obj, form, change)

users/serializers.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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()

users/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from django.conf import settings
66
from django.contrib.auth import get_user_model
77
from django.contrib.sites.shortcuts import get_current_site
8+
from django.db import transaction
89
from django.db.models import Q
910
from django.shortcuts import redirect
1011
from django.urls import reverse
@@ -108,6 +109,7 @@ class UserDetail(RetrieveUpdateDestroyAPIView):
108109
permission_classes = [IsOwnerOrReadOnly, IsAuthenticated]
109110
serializer_class = UserDetailSerializer
110111

112+
@transaction.atomic
111113
def put(self, request, pk):
112114
# bootleg version of updating achievements via user
113115
if request.data.get("achievements") is not None:

0 commit comments

Comments
 (0)