|  | @@ -1,5 +1,4 @@
 | 
	
		
			
				|  |  |  import base64
 | 
	
		
			
				|  |  | -import json
 | 
	
		
			
				|  |  |  import logging
 | 
	
		
			
				|  |  |  import secrets
 | 
	
		
			
				|  |  |  import uuid
 | 
	
	
		
			
				|  | @@ -36,15 +35,6 @@ from services.errors.account import (
 | 
	
		
			
				|  |  |  from tasks.mail_invite_member_task import send_invite_member_mail_task
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -def _create_tenant_for_account(account) -> Tenant:
 | 
	
		
			
				|  |  | -    tenant = TenantService.create_tenant(f"{account.name}'s Workspace")
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    TenantService.create_tenant_member(tenant, account, role='owner')
 | 
	
		
			
				|  |  | -    account.current_tenant = tenant
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -    return tenant
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  class AccountService:
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @staticmethod
 | 
	
	
		
			
				|  | @@ -59,15 +49,14 @@ class AccountService:
 | 
	
		
			
				|  |  |          current_tenant = TenantAccountJoin.query.filter_by(account_id=account.id, current=True).first()
 | 
	
		
			
				|  |  |          if current_tenant:
 | 
	
		
			
				|  |  |              account.current_tenant_id = current_tenant.tenant_id
 | 
	
		
			
				|  |  | -            account.current_tenant_id = current_tenant.tenant_id
 | 
	
		
			
				|  |  |          else:
 | 
	
		
			
				|  |  | -            available_tenant = TenantAccountJoin.query.filter_by(account_id=account.id) \
 | 
	
		
			
				|  |  | +            available_ta = TenantAccountJoin.query.filter_by(account_id=account.id) \
 | 
	
		
			
				|  |  |                  .order_by(TenantAccountJoin.id.asc()).first()
 | 
	
		
			
				|  |  | -            if not available_tenant:
 | 
	
		
			
				|  |  | -                raise Forbidden('No available tenant for the user.')
 | 
	
		
			
				|  |  | +            if not available_ta:
 | 
	
		
			
				|  |  | +                return None
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            account.current_tenant_id = available_tenant.tenant_id
 | 
	
		
			
				|  |  | -            available_tenant.current = True
 | 
	
		
			
				|  |  | +            account.current_tenant_id = available_ta.tenant_id
 | 
	
		
			
				|  |  | +            available_ta.current = True
 | 
	
		
			
				|  |  |              db.session.commit()
 | 
	
		
			
				|  |  |         
 | 
	
		
			
				|  |  |          if datetime.utcnow() - account.last_active_at > timedelta(minutes=10):
 | 
	
	
		
			
				|  | @@ -226,6 +215,21 @@ class TenantService:
 | 
	
		
			
				|  |  |          db.session.commit()
 | 
	
		
			
				|  |  |          return tenant
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @staticmethod
 | 
	
		
			
				|  |  | +    def create_owner_tenant_if_not_exist(account: Account):
 | 
	
		
			
				|  |  | +        """Create owner tenant if not exist"""
 | 
	
		
			
				|  |  | +        available_ta = TenantAccountJoin.query.filter_by(account_id=account.id) \
 | 
	
		
			
				|  |  | +            .order_by(TenantAccountJoin.id.asc()).first()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if available_ta:
 | 
	
		
			
				|  |  | +            return
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        tenant = TenantService.create_tenant(f"{account.name}'s Workspace")
 | 
	
		
			
				|  |  | +        TenantService.create_tenant_member(tenant, account, role='owner')
 | 
	
		
			
				|  |  | +        account.current_tenant = tenant
 | 
	
		
			
				|  |  | +        db.session.commit()
 | 
	
		
			
				|  |  | +        tenant_was_created.send(tenant)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @staticmethod
 | 
	
		
			
				|  |  |      def create_tenant_member(tenant: Tenant, account: Account, role: str = 'normal') -> TenantAccountJoin:
 | 
	
		
			
				|  |  |          """Create tenant member"""
 | 
	
	
		
			
				|  | @@ -362,12 +366,6 @@ class TenantService:
 | 
	
		
			
				|  |  |              raise MemberNotInTenantError("Member not in tenant.")
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          db.session.delete(ta)
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        account.initialized_at = None
 | 
	
		
			
				|  |  | -        account.status = AccountStatus.PENDING.value
 | 
	
		
			
				|  |  | -        account.password = None
 | 
	
		
			
				|  |  | -        account.password_salt = None
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |          db.session.commit()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @staticmethod
 | 
	
	
		
			
				|  | @@ -418,12 +416,18 @@ class RegisterService:
 | 
	
		
			
				|  |  |          return f'member_invite:token:{token}'
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @classmethod
 | 
	
		
			
				|  |  | -    def register(cls, email, name, password: str = None, open_id: str = None, provider: str = None) -> Account:
 | 
	
		
			
				|  |  | +    def register(cls, email, name, password: str = None, open_id: str = None, provider: str = None,
 | 
	
		
			
				|  |  | +                 language: str = None, status: AccountStatus = None) -> Account:
 | 
	
		
			
				|  |  |          db.session.begin_nested()
 | 
	
		
			
				|  |  |          """Register account"""
 | 
	
		
			
				|  |  |          try:
 | 
	
		
			
				|  |  | -            account = AccountService.create_account(email, name, interface_language=languages[0], password=password)
 | 
	
		
			
				|  |  | -            account.status = AccountStatus.ACTIVE.value
 | 
	
		
			
				|  |  | +            account = AccountService.create_account(
 | 
	
		
			
				|  |  | +                email=email,
 | 
	
		
			
				|  |  | +                name=name,
 | 
	
		
			
				|  |  | +                interface_language=language if language else languages[0],
 | 
	
		
			
				|  |  | +                password=password
 | 
	
		
			
				|  |  | +            )
 | 
	
		
			
				|  |  | +            account.status = AccountStatus.ACTIVE.value if not status else status.value
 | 
	
		
			
				|  |  |              account.initialized_at = datetime.utcnow()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if open_id is not None or provider is not None:
 | 
	
	
		
			
				|  | @@ -452,11 +456,12 @@ class RegisterService:
 | 
	
		
			
				|  |  |          if not account:
 | 
	
		
			
				|  |  |              TenantService.check_member_permission(tenant, inviter, None, 'add')
 | 
	
		
			
				|  |  |              name = email.split('@')[0]
 | 
	
		
			
				|  |  | -            account = AccountService.create_account(email, name, interface_language=language)
 | 
	
		
			
				|  |  | -            account.status = AccountStatus.PENDING.value
 | 
	
		
			
				|  |  | -            db.session.commit()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            account = cls.register(email=email, name=name, language=language, status=AccountStatus.PENDING)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            # Create new tenant member for invited tenant
 | 
	
		
			
				|  |  |              TenantService.create_tenant_member(tenant, account, role)
 | 
	
		
			
				|  |  | +            TenantService.switch_tenant(account, tenant.id)
 | 
	
		
			
				|  |  |          else:
 | 
	
		
			
				|  |  |              TenantService.check_member_permission(tenant, inviter, account, 'add')
 | 
	
		
			
				|  |  |              ta = TenantAccountJoin.query.filter_by(
 |