@@ -74,6 +74,8 @@ class BusinessAccountService: self.reject() else: raise Exception(_('Invited account can either accept or reject an invitation')) + self.account.user.is_confirmed = True + self.account.user.save() return self.account def accept(self): @@ -105,6 +107,9 @@ class BusinessAccountService: if self.account.user.account_type not in ('business_account', 'business_security'): raise Exception(_("You do not have sufficient rights to perform this action")) + if self.account.acceptance_status != InvitationStatus.ACCEPTED: + raise Exception(_('You cannot change the password of an unconfirmed e-mail user.')) + self.account.user.set_password(serializer.validated_data['password_1']) self.account.user.save() @@ -68,7 +68,6 @@ class BusinessHostService: username = f'{self.user.host_account.company_name}_{random_with_N_digits(6)}' password = generate_token(15) user = CustomUserModel.objects.create_user(username=username, email=email, password=password) - user.is_confirmed = True user.save() PaymentPlanService(user).subscribe_user_to_plan(PaymentPlan.objects.get(price=0, is_corporate=False)) @@ -76,7 +75,6 @@ class BusinessHostService: account_service = BusinessAccountService.create( user, self.user.host_account, - status=InvitationStatus.ACCEPTED, account_privileges=account_privileges, ) if token_limit is not None: @@ -123,24 +123,25 @@ class EmailService: def send_corporate_greeting_email(self, account: BusinessAccount, password: str | None = None): if self.user.host_account is None: raise Exception(_('Regular users cannot send introductory letters')) - message = f""" - Добро пожаловать на платформу AIR! - Этот аккаунт был создан для вас {self.user.host_account.company_name} в рабочих целях. - Вы можете использовать все ресурсы корпоративного аккаунта - оплачивать - подписку нет необходимости. - - Ваши данные для входа: - - email: {account.user.email} - password: {password} - """ - mail = EmailMessage( + token = EmailTokenService(account.user).generate_user_token() + try: + template = get_template('authentication/corporate_greeting_email.html') + html_message = template.render(context={ + 'company_name': self.user.host_account.company_name, + 'invitation_url': settings.INVITATION_RESPONSE_URL, + 'token': token.key, + 'email': account.user.email, + 'password': password + }) + except TemplateDoesNotExist: + raise LetterNotFound + except Exception as exc: + raise LetterUnknownException from exc + self.send_email( subject='Ваш аккаунт на платформе AIR', - body=message, - from_email=settings.EMAIL_HOST_USER, - to=(account.user.email,), + message=html_message, + user_email=account.user.email ) - mail.send(fail_silently=True) def send_reinvited_email(self, account: BusinessAccount, password: str | None = None) -> None: try: @@ -0,0 +1,25 @@ + + +
+ +Добро пожаловать на платформу AIR!
+
+ Этот аккаунт был создан для вас {{ company_name }} в рабочих целях.
+ Вы можете использовать все ресурсы корпоративного аккаунта — оплачивать
+ подписку нет необходимости.
+
+ Чтобы ответить на приглашение — перейдите по ссылке ниже:
+ [Нажмите для подтверждения]
+ Если ссылка не открывается по кнопке, попробуйте вставить ссылку в адресную строку:
+ {{ invitation_url }}?token={{ token }}
+
Ваши данные для входа:
+ E-mail: {{ email }}
+ Пароль: {{ password }}
Всегда с вами, команда AIR
+ + @@ -1129,4 +1129,7 @@ msgid "Letter template not found" msgstr "Шаблон письма не найден" msgid "There was an unknown error while sending an email" -msgstr "При отправке письма произошла неизвестная ошибка" \ No newline at end of file +msgstr "При отправке письма произошла неизвестная ошибка" + +msgid "You cannot change the password of an unconfirmed e-mail user." +msgstr "Вы не можете изменить пароль неподтвержденного по e-mail пользователя." @@ -54,7 +54,7 @@ services: - traefik.http.routers.backend-admin-http.entrypoints=web - traefik.http.routers.backend-admin-http.tls=false - traefik.http.routers.backend-admin-http.service=backend - - traefik.http.routers.backend-admin-http.middlewares=sts-header@swarm,https-redirect@swarm + - traefik.http.routers.backend-admin-http.middlewares=sts-header@file,https-redirect@file - traefik.http.routers.backend-admin-https.rule=Host(`$DOMAIN`) && PathPrefix(`/djangoadmin`) - traefik.http.routers.backend-admin-https.entrypoints=websecure