-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathviews.py
More file actions
196 lines (164 loc) · 7.01 KB
/
views.py
File metadata and controls
196 lines (164 loc) · 7.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
from django.contrib.auth import get_user_model
from django.db import IntegrityError
from django.utils import timezone
from rest_framework import generics, permissions, status
from rest_framework.permissions import AllowAny, IsAuthenticated
from rest_framework.response import Response
from core.serializers import SetLikedSerializer, SetViewedSerializer
from core.services import add_view, set_like
from partner_programs.helpers import date_to_iso
from partner_programs.models import PartnerProgram, PartnerProgramUserProfile
from partner_programs.pagination import PartnerProgramPagination
from partner_programs.serializers import (
PartnerProgramDataSchemaSerializer,
PartnerProgramForMemberSerializer,
PartnerProgramForUnregisteredUserSerializer,
PartnerProgramListSerializer,
PartnerProgramNewUserSerializer,
PartnerProgramUserSerializer,
)
User = get_user_model()
class PartnerProgramList(generics.ListCreateAPIView):
queryset = PartnerProgram.objects.all()
serializer_class = PartnerProgramListSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
pagination_class = PartnerProgramPagination
class PartnerProgramDetail(generics.RetrieveAPIView):
queryset = PartnerProgram.objects.all()
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
serializer_class = PartnerProgramForUnregisteredUserSerializer
def get(self, request, *args, **kwargs):
try:
program = self.get_object()
is_user_member = program.users.filter(pk=request.user.pk).exists()
serializer_class = (
PartnerProgramForMemberSerializer
if is_user_member
else PartnerProgramForUnregisteredUserSerializer
)
data = serializer_class(program).data
data["is_user_member"] = is_user_member
if request.user.is_authenticated:
add_view(program, request.user)
return Response(data=data, status=status.HTTP_200_OK)
except PartnerProgram.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
class PartnerProgramCreateUserAndRegister(generics.GenericAPIView):
"""
Create new user and register him to program and save additional data
"""
permission_classes = [AllowAny]
serializer_class = PartnerProgramNewUserSerializer
queryset = PartnerProgram.objects.none()
def post(self, request, *args, **kwargs):
data = request.data
# tilda cringe
if data.get("test") == "test":
return Response(status=status.HTTP_200_OK)
try:
program = self.get_object()
except PartnerProgram.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
# tilda cringe
email = data.get("email") if data.get("email") else data.get("email_")
if not email:
return Response(
data={"detail": "You need to pass an email address."},
status=status.HTTP_400_BAD_REQUEST,
)
password = data.get("password")
if not password:
return Response(
data={"detail": "You need to pass a password."},
status=status.HTTP_400_BAD_REQUEST,
)
user_fields = (
"first_name",
"last_name",
"patronymic",
"city",
)
try:
user = User.objects.create(
**{field_name: data.get(field_name, "") for field_name in user_fields},
birthday=date_to_iso(data.get("birthday", "01-01-1900")),
is_active=True, # bypass email verification
onboarding_stage=None, # bypass onboarding
verification_date=timezone.now(), # bypass ClickUp verification
email=email,
)
except IntegrityError:
return Response(
data={"detail": "User with this email already exists."},
status=status.HTTP_400_BAD_REQUEST,
)
user.set_password(password)
user.save()
user_profile_program_data = {
k: v for k, v in data.items() if k not in user_fields and k != "password"
}
PartnerProgramUserProfile.objects.create(
partner_program_data=user_profile_program_data,
user=user,
partner_program=program,
)
return Response(status=status.HTTP_201_CREATED)
def get(self, request, *args, **kwargs):
return Response(status=status.HTTP_200_OK)
class PartnerProgramRegister(generics.GenericAPIView):
"""
Register user to program and save additional program data
"""
queryset = PartnerProgram.objects.none()
permission_classes = [IsAuthenticated]
serializer_class = PartnerProgramUserSerializer
def post(self, request, *args, **kwargs):
try:
program = self.get_object()
if program.datetime_registration_ends < timezone.now():
return Response(
data={"detail": "Registration period has ended."},
status=status.HTTP_400_BAD_REQUEST,
)
user_to_add = request.user
user_profile_program_data = request.data
added_user_profile = PartnerProgramUserProfile(
partner_program_data=user_profile_program_data,
user=user_to_add,
partner_program=program,
)
added_user_profile.save()
return Response(status=status.HTTP_201_CREATED)
except PartnerProgram.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
except IntegrityError:
return Response(
data={"detail": "User already registered to this program."},
status=status.HTTP_400_BAD_REQUEST,
)
class PartnerProgramSetViewed(generics.GenericAPIView):
queryset = PartnerProgram.objects.none()
serializer_class = SetViewedSerializer
permission_classes = [IsAuthenticated]
def post(self, request, *args, **kwargs):
try:
program = self.get_object()
add_view(program, request.user)
return Response(status=status.HTTP_200_OK)
except PartnerProgram.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
class PartnerProgramSetLiked(generics.CreateAPIView):
queryset = PartnerProgram.objects.none()
serializer_class = SetLikedSerializer
permission_classes = [IsAuthenticated]
def post(self, request, *args, **kwargs):
try:
program = self.get_object()
set_like(program, request.user, request.data.get("is_liked"))
return Response(status=status.HTTP_200_OK)
except PartnerProgram.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
class PartnerProgramDataSchema(generics.RetrieveAPIView):
queryset = PartnerProgram.objects.all()
serializer_class = PartnerProgramDataSchemaSerializer
permission_classes = [permissions.IsAuthenticated]