|
|
|
@@ -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( |