diff --git a/users/constants.py b/users/constants.py new file mode 100644 index 00000000..46233a1c --- /dev/null +++ b/users/constants.py @@ -0,0 +1,26 @@ +from django.conf import settings + +ADMIN = 0 +MEMBER = 1 +MENTOR = 2 +EXPERT = 3 +INVESTOR = 4 + +VERBOSE_USER_TYPES = ( + (MEMBER, "Участник"), + (MENTOR, "Ментор"), + (EXPERT, "Эксперт"), + (INVESTOR, "Инвестор"), +) + +VERBOSE_ROLE_TYPES = ( + (MENTOR, "Ментор"), + (EXPERT, "Эксперт"), + (INVESTOR, "Инвестор"), +) + +VERIFY_EMAIL_REDIRECT_URL = "https://app.procollab.ru/auth/verification/" + +PROTOCOL = "https" +if settings.DEBUG: + PROTOCOL = "http" diff --git a/users/helpers.py b/users/helpers.py index a33ce9ad..4ddc97a8 100644 --- a/users/helpers.py +++ b/users/helpers.py @@ -1,35 +1,9 @@ -from django.conf import settings from rest_framework_simplejwt.tokens import RefreshToken from django.contrib.sites.shortcuts import get_current_site from django.urls import reverse from core.utils import Email - -ADMIN = 0 -MEMBER = 1 -MENTOR = 2 -EXPERT = 3 -INVESTOR = 4 - -VERBOSE_USER_TYPES = ( - (MEMBER, "Участник"), - (MENTOR, "Ментор"), - (EXPERT, "Эксперт"), - (INVESTOR, "Инвестор"), -) - -VERBOSE_ROLE_TYPES = ( - (MENTOR, "Ментор"), - (EXPERT, "Эксперт"), - (INVESTOR, "Инвестор"), -) - -REDIRECT_URL = "https://app.procollab.ru/auth/verification/" - -PROTOCOL = "https" - -if settings.DEBUG: - PROTOCOL = "http" +from users.constants import PROTOCOL def reset_email(user, request): diff --git a/users/managers.py b/users/managers.py index ce3e2a8d..6fcbdcd4 100644 --- a/users/managers.py +++ b/users/managers.py @@ -2,7 +2,7 @@ from django.contrib.auth.models import UserManager from django.db.models import Manager -from users.helpers import MEMBER +from users.constants import MEMBER class CustomUserManager(UserManager): diff --git a/users/models.py b/users/models.py index 773827f5..3315bf18 100644 --- a/users/models.py +++ b/users/models.py @@ -3,7 +3,7 @@ from django.db.models.signals import post_save from django.dispatch import receiver -from users.helpers import ( +from users.constants import ( ADMIN, EXPERT, INVESTOR, diff --git a/users/urls.py b/users/urls.py index 21aa9419..98f866b6 100644 --- a/users/urls.py +++ b/users/urls.py @@ -17,6 +17,7 @@ LikedProjectList, RegisteredEventsList, SetUserOnboardingStage, + ResendVerifyEmail, ) app_name = "users" @@ -38,6 +39,11 @@ path("users/achievements/", AchievementList.as_view()), path("users/achievements//", AchievementDetail.as_view()), path("logout/", LogoutView.as_view()), + path( + "resend_email/", + ResendVerifyEmail.as_view(), + name="account_email_verification_resent", + ), re_path( r"^account-confirm-email/", VerifyEmail.as_view(), diff --git a/users/views.py b/users/views.py index 3f847059..4aa334d1 100644 --- a/users/views.py +++ b/users/views.py @@ -27,11 +27,14 @@ from events.serializers import EventsListSerializer from projects.serializers import ProjectListSerializer from users.helpers import ( - VERBOSE_ROLE_TYPES, - VERBOSE_USER_TYPES, reset_email, verify_email, ) +from users.constants import ( + VERBOSE_ROLE_TYPES, + VERBOSE_USER_TYPES, + VERIFY_EMAIL_REDIRECT_URL, +) from users.models import UserAchievement, LikesOnProject from users.permissions import IsAchievementOwnerOrReadOnly from users.serializers import ( @@ -160,7 +163,7 @@ class VerifyEmail(GenericAPIView): def get(self, request): token = request.GET.get("token") - REDIRECT_URL = "https://app.procollab.ru/auth/verification/" + try: payload = jwt.decode(jwt=token, key=settings.SECRET_KEY, algorithms=["HS256"]) user = User.objects.get(id=payload["user_id"]) @@ -172,20 +175,20 @@ def get(self, request): user.save() return redirect( - f"{REDIRECT_URL}?access_token={access_token}&refresh_token={refresh_token}", + f"{VERIFY_EMAIL_REDIRECT_URL}?access_token={access_token}&refresh_token={refresh_token}", status=status.HTTP_200_OK, message="Succeed", ) except jwt.ExpiredSignatureError: return redirect( - REDIRECT_URL, + VERIFY_EMAIL_REDIRECT_URL, status=status.HTTP_400_BAD_REQUEST, message="Activate Expired", ) except jwt.DecodeError: return redirect( - REDIRECT_URL, + VERIFY_EMAIL_REDIRECT_URL, status=status.HTTP_400_BAD_REQUEST, message="Decode error", ) @@ -360,3 +363,26 @@ def put(self, request: Request, pk): return Response( status=status.HTTP_400_BAD_REQUEST, data={"error": "Something went wrong"} ) + + +class ResendVerifyEmail(GenericAPIView): + permission_classes = [AllowAny] + serializer_class = UserDetailSerializer + queryset = User.objects.all() + + def post(self, request, *args, **kwargs): + try: + email = request.data["email"] + user = User.objects.get(email=email) + + if not user.is_active: + verify_email(user, request) + return Response("Email sent!", status=status.HTTP_200_OK) + + return Response("User already verified!", status=status.HTTP_200_OK) + except User.DoesNotExist: + return Response( + "User with given email does not exists!", status=status.HTTP_404_NOT_FOUND + ) + except Exception: + return Response(status=status.HTTP_400_BAD_REQUEST)