@@ -0,0 +1,6 @@ +from django.utils.translation import gettext as _ + + +class TokenNotFound(Exception): + def __str__(self): + return _('Email token not found. Please contact support') @@ -1,6 +1,7 @@ from decimal import Decimal from typing import Any, Tuple +from django.db import IntegrityError from django.utils.translation import gettext_lazy as _ from rest_framework.request import Request @@ -90,9 +91,9 @@ class BusinessHostService: ) -> BusinessAccountService: try: user = UserSelector.get_by_email(email.lower()) - if AccountStatusSelector(user).is_business_host(): + if AccountStatusSelector(user).is_business_host() and not user.is_deleted: raise AlreadyHost(user) - if AccountStatusSelector(user).is_business_account(): + if AccountStatusSelector(user).is_business_account() and not user.is_deleted: raise AlreadyAccount(user) if PaymentPlanSelector(user).is_plan_paid(): raise AlreadyHasPlan(user) @@ -102,15 +103,24 @@ class BusinessHostService: token_limit=token_limit, account_privileges=account_privileges, ) - - account_service = BusinessAccountService.create( - user, - self.user.host_account, - account_privileges=account_privileges, - ) + try: + account_service = BusinessAccountService.create( + user, + self.user.host_account, + account_privileges=account_privileges, + ) + except IntegrityError: + account_service = BusinessAccountService.from_user(user) if token_limit is not None: account_service.update_limit(token_limit) - EmailService(self.user).send_corporate_invitation_email(account_service.account) + if not user.is_deleted: + EmailService(self.user).send_corporate_invitation_email(account_service.account) + else: + password = generate_token(15) + user.set_password(password) + user.is_deleted = False + user.save() + EmailService(self.user).send_corporate_greeting_email(account_service.account, password) return account_service @@ -1,23 +1,24 @@ +import logging + +from authentication.exceptions.email_exceptions.token_not_found import TokenNotFound from authentication.models.email_token import EmailToken from authentication.models.user import CustomUserModel -from authentication.selectors.email_token_selector import EmailTokenSelector from authentication.utils import generate_token +logger = logging.getLogger(__name__) + class EmailTokenService: def __init__(self, user: CustomUserModel): self.user = user def generate_user_token(self) -> EmailToken: - curr_token = EmailTokenSelector(self.user).get_user_token() - - if curr_token is not None: - curr_token.delete() - - token = EmailToken.objects.create(user=self.user, key=generate_token(22)) - - return token + return EmailToken.objects.create(user=self.user, key=generate_token(22)) @classmethod def get_token(self, key: str) -> EmailToken: - return EmailToken.objects.get(key=key) + try: + return EmailToken.objects.get(key=key) + except EmailToken.DoesNotExist: + logger.error(key) + raise TokenNotFound @@ -28,6 +28,7 @@ from authentication.exceptions.business_host_exceptions.not_allowed_ip import ( NotAllowedIP, ) from authentication.exceptions.email_exceptions import LetterNotFound, LetterUnknownException +from authentication.exceptions.email_exceptions.token_not_found import TokenNotFound from authentication.exceptions.email_token import EmailTokenNotFound from authentication.exceptions.user import ( DomainNotFound, @@ -642,6 +643,8 @@ class AccountInvitationAPIView(APIView): token = EmailTokenService.get_token(request.query_params.get('token')) BusinessAccountService.from_user(token.user).update(data=dict(status=InvitationStatus.ACCEPTED)) return redirect(settings.MAIN_SITE_URL) + except TokenNotFound as exc: + return Response({'detail': f'{exc}'}, status=status.HTTP_404_NOT_FOUND) except Exception as err: return Response({'detail': f'{err}'}, status=status.HTTP_400_BAD_REQUEST) @@ -1254,3 +1254,6 @@ msgstr "Отсутствует обязательный параметр: 'messa msgid "The neuron model does not exist" msgstr "Нейронная модель не существует" + +msgid "Email token not found. Please contact support" +msgstr "E-mail токен не найден. Пожалуйста, свяжитесь со службой поддержки"