@@ -46,7 +46,6 @@ from authentication.services.business_account_service import ( from authentication.services.email_service import EmailService from authentication.utils import generate_token from ml_model.models import NeuronModel -from ml_model.utils import random_with_N_digits from payments.models.payment_plan import PaymentPlan from payments.selectors.payment_plan_selector import PaymentPlanSelector from payments.services.payment_plan_service import PaymentPlanService @@ -59,6 +58,7 @@ class BusinessHostService: def create_account( self, email: str, + host: BusinessUserHost, token_limit: Decimal | None = None, account_privileges: Tuple[str, Any] | None = None, ) -> BusinessAccountService: @@ -70,12 +70,12 @@ class BusinessHostService: account_service = BusinessAccountService.create( user, - self.user.host_account, + host, account_privileges=account_privileges, ) if token_limit is not None: account_service.update_limit(token_limit) - EmailService(self.user).send_corporate_greeting_email(account_service.account, password) + EmailService.send_corporate_greeting_email(account_service.account, password) return account_service def create_existing( @@ -84,24 +84,26 @@ class BusinessHostService: token_limit: Decimal | None = None, account_privileges: Tuple[str, Any] | None = None, ) -> BusinessAccountService: + company = self.user.host or self.user.employee.parent_company try: user = UserSelector.get_by_email(email.lower()) if user.host: raise AlreadyHost - if user.employee and user.employee.parent_company != self.user.host: + if user.employee and user.employee.parent_company != company: raise AlreadyAccount if PaymentPlanSelector(user).is_plan_paid(): raise InviteeHasPlan except CustomUserModel.DoesNotExist: return self.create_account( email=email, + host=company, token_limit=token_limit, account_privileges=account_privileges, ) try: account_service = BusinessAccountService.create( user, - self.user.host_account, + company, account_privileges=account_privileges, ) except IntegrityError: @@ -109,13 +111,13 @@ class BusinessHostService: if token_limit is not None: account_service.update_limit(token_limit) if not user.is_deleted: - EmailService(self.user).send_corporate_invitation_email(account_service.account) + EmailService.send_corporate_invitation_email(account_service.account, company) 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) + EmailService.send_corporate_greeting_email(account_service.account, password) return account_service @@ -109,11 +109,10 @@ class EmailService: user_emails=('a.ippolitov@air.fail', 't.bikbov@air.fail'), ) - 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')) + @classmethod + def send_corporate_greeting_email(cls, account: BusinessAccount, password: str | None = None): token = EmailTokenService(account.user).generate_user_token() - html_message = self._render_letter_template( + html_message = cls._render_letter_template( template_name='authentication/corporate_greeting_email', context={ 'business_account': account, @@ -122,7 +121,7 @@ class EmailService: 'password': password, }, ) - self.send_email( + cls.send_email( subject='Ваш аккаунт на платформе AIR', message=html_message, user_emails=(account.user.email,) ) @@ -141,20 +140,19 @@ class EmailService: subject='Ваш аккаунт на платформе AIR', message=html_message, user_emails=(account.user.email,) ) - def send_corporate_invitation_email(self, account: BusinessAccount) -> None: - if self.user.host_account is None: - raise Exception(_('Regular users cannot send invitation letters')) + @classmethod + def send_corporate_invitation_email(cls, account: BusinessAccount, host: BusinessUserHost) -> None: token = EmailTokenService(account.user).generate_user_token() - html_message = self._render_letter_template( + html_message = cls._render_letter_template( template_name='authentication/corporate_invitation_email', context={ 'email': account.user.email, - 'host': self.user.host_account, + 'host': host, 'invite_url': settings.INVITATION_RESPONSE_URL, 'token': token.key, }, ) - self.send_email('Приглашение на платформу AIR', html_message, (account.user.email,)) + cls.send_email('Приглашение на платформу AIR', html_message, (account.user.email,)) @classmethod def send_low_balance_email(cls, host: BusinessUserHost) -> None: @@ -53,17 +53,14 @@ class IsVKMiniApp(BaseException): class HasBusinessAdminPermissions(BasePermission): def has_permission(self, request, view): - if request.user.is_anonymous: + user = request.user + if user.is_anonymous: return False - account_status = AccountStatusSelector(request.user) - if account_status.is_business_host(): + elif user.host: return True - if not account_status.is_business_account(): - return False - - account_type = request.user.business_account.account_privileges - - return account_type == AccountPrivileges.ADMIN + elif b_acc := user.employee: + return b_acc.account_privileges == AccountPrivileges.ADMIN + return False class ChangeEmployeePassPermission(BasePermission):