Files
boc/landvex-admin-backend/app/services/__pycache__/tenant_service.cpython-39.pyc
T

116 lines
11 KiB
Plaintext
Raw Normal View History

a
²6GjHã@dZddlmZmZmZddlmZmZmZmZddl m
Z
ddl m Z m
Z
mZmZmZmZddlmZddlmZmZddlmZdd lmZmZdd
lmZmZmZm Z dd l!m"Z"m#Z#m$Z$m%Z%m&Z&dd l'm(Z(eƒZ)Gd
ddƒZ*dS)uN
Business logic för tenant-hantering med audit-logging och schema-isolering.
é)ÚdatetimeÚtimezoneÚ timedelta)ÚOptionalÚDictÚAnyÚList)ÚUUID)ÚselectÚfuncÚand_Úor_ÚdescÚasc)Ú AsyncSession)Ú
HTTPExceptionÚstatus)Ú get_settings)Úcreate_tenant_schemaÚ
schema_exists)ÚTenantÚ
TenantTypeÚ TenantStatusÚ AuditAction)Ú TenantCreateÚ TenantUpdateÚTenantListParamsÚTenantActivateRequestÚTenantSuspendRequest)Ú AuditServicec@eZdZedœddZd'eeeedœddZ e
eedœd d
Z e
eed œd d
Z e
eeeefdœddZd(eee
eee
efedœddZd)eeee
eee
efedœddZd*eee
eee
efedœddZd+eee
eee
efddœddZd,eeee
eee
efedœddZd-eeee
eee
efedœdd „Zd.eee
ee
eee
efed!œd"d#„Zee
efd$œd%d&„ZdS)/Ú
TenantService)ÚdbcCs||_t|ƒ|_dS)N)r!rÚaudit)Úselfr!©r$úT/home/bernt/.openclaw/workspace/landvex-admin-backend/app/services/tenant_service.pyÚ__init__szTenantService.__init__F)Ú tenant_idÚinclude_deletedÚreturncÃsBttƒ tj|k¡}|s(| tjdk¡}|j |¡IdH}| ¡S©N)r
rÚwhereÚidÚ
is_deletedr!ÚexecuteÚscalar_one_or_none)r#r'r(ÚqueryÚresultr$r$r%Ú get_by_ids
zTenantService.get_by_id)Úslugr)cÃs>|j ttƒ tj| ¡ ¡k¡ tjdk¡¡IdH}|  ¡Sr*)
r!r/r
rr,r4ÚlowerÚstripr.r0)r#r4r2r$r$r%Ú get_by_slug&s&ÿ
zTenantService.get_by_slug)Ú
org_numberr)cÃsJ| dd¡ dd¡}|j ttƒ tj|k¡ tjdk¡¡IdH}| ¡S) Úú-r+) Úreplacer!r/r
rr,r8r.r0)r#r8Úcleanedr2r$r$r%Úget_by_org_number,s
ÿ
zTenantService.get_by_org_number)Úparamsr)c Ãs\ttƒ tjdk¡}tt tj¡ƒ tjdk¡}|jrZ| tj|jk¡}| tj|jk¡}|jr„| tj|jk¡}| tj|jk¡}|j r®| tj |j k¡}| tj |j k¡}|j
rì| tj
  d|j
d¡¡}| tj
  d|j
d¡¡}|j durJ|j r&| tjt
jk¡}| tjt
jk¡}n$| tjt
jk¡}| tjt
jk¡}|jr¼ttj  d|jd¡tj  d|jd¡tj
  d|jd¡tj  d|jd¡ƒ}| |¡}| |¡}tt|jtjƒ}|jdkrè| t|ƒ¡}n| t|ƒ¡}|jd|j}| |¡ |j¡}|j  |¡IdH}|  }|j  |¡IdH} |  }
t$|ƒ|
fS)Nr+ú%ré)%r
rr,r.r Úcountr-rÚ tenant_typeÚcountryÚcityÚilikeÚ is_activerÚACTIVEÚsearchr
Únamer4r8ÚgetattrÚsort_byÚ
created_atÚ
sort_orderÚorder_byrrÚpageÚ page_sizeÚoffsetÚlimitr!r/ÚscalarsÚallÚscalarÚlist) r#r?r1Ú count_queryZ
search_filterZ sort_columnrRr2ÚtenantsZ count_resultÚtotalr$r$r%Ú list_tenants3sP ü

  zTenantService.list_tenantsN)ÚdataÚactor_idÚrequest_contextr)c
Ãsj| |j¡IdH}|r.ttjd|jdd|jrb| |j¡IdH}|rbttjd|jddtj|j}t |ƒIdHrttj
d|ddt |j |j 
¡ ¡|j|jtj||j|j|j|j|j|j|j|j|j|j|j|j|j|j|j |j!|j"pþi|jpi|j#pi|j$|j%|d}|jrT|j&rTt' (t)j*¡t+|j&d|_,tj-|_|j. /|¡|j. IdH|j. 1|¡IdHzt2|ƒIdHWnNt3}z4|j. IdHttj5d t6|ƒdWYd}~n
d}~00|pìi} |j7j8ft9j:d
t6|j;ƒ||j<d d t6|j;ƒ|d
œ| ¤ŽIdH|j7j8ft9j=dt6|j;ƒ|d|it6|j;ƒ|d
œ| ¤ŽIdH|S)NzTenant with slug 'z' already exists©Ú status_codeÚdetailzTenant with org number 'zSchema 'z' already exists in database)rJr4r8rCrÚ schema_nameÚ
contact_emailÚ
contact_phoneÚ
billing_emailÚaddressÚ postal_coderErDÚmunicipality_codeÚ county_codeÚlatitudeÚ longitudeÚplanÚis_trialÚ max_usersÚ max_projectsÚstorage_quota_mbÚfeaturesÚsettingsÚbrandingÚ descriptionÚwebsiteÚ
created_by)Údaysz Failed to create tenant schema: ÚtenantT©Úinclude_sensitive)ÚactionÚ entity_typeÚ entity_idr]Ú
new_valuesr'Ú
tenant_schemarrb)>r7r4rrÚHTTP_409_CONFLICTr8r>rrÚTENANT_SCHEMA_PREFIXrÚHTTP_422_UNPROCESSABLE_ENTITYrrJr5r6rCrÚPENDINGrcrdrerfrgrErDrhrirjrkrlrmrnrorprqrsrtruÚ
trial_daysrÚnowrÚutcrÚ
trial_ends_atZTRIALr!ÚaddÚflushÚrefreshrÚ ExceptionÚrollbackÚHTTP_500_INTERNAL_SERVER_ERRORÚstrr"ÚlogrÚCREATEr-Úto_dictZ
SCHEMA_CREATE)
r#r\r]r^ÚexistingZ existing_orgrbrxÚrcr$r$r%Ú
create_tenantl þ þ
þ 

ä  þ

ùø
ùø zTenantService.create_tenant)r'r\r]r^r)c Ãs| |¡IdH}|dur&ttjdd|jdd}g}|jdd}| ¡D]6\} }
t|| ƒrJt|| ƒ|
krJt || |
ƒ| 
| ¡qJ|sŠ|S||_ |j  
¡IdH|j  |¡IdH|p¸i} |jjftjdt|jƒ|||jdd|t|jƒ|jdœ | ¤ŽIdH|S)Tenant not foundr_Try)Ú
exclude_unsetrx© r{r|r}r]Úprevious_valuesr~Úchanged_fieldsr'r)r3rrÚHTTP_404_NOT_FOUNDrÚ
model_dumpÚitemsÚhasattrrKÚsetattrÚappendÚ
updated_byr!r‰r"rrÚUPDATErŽr-rb) r#r'r\r]r^rxr™Z update_dataÚfieldÚvaluer”r$r$r%Ú
update_tenant×s<    
÷
ö
zTenantService.update_tenant)r'r]r^r)c Ã| |¡IdH}|dur&ttjdd|jdkr>ttjdd|jdd}d|_t t j
¡|_ ||_ t
j|_|j ¡IdH|pi}|jjftjdt|jƒ||d|j  ¡dœgd ¢t|jƒ|jd
œ |¤ŽIdH|S) Nrr_ÚYzTenant is already deletedTryrx)r.Ú
deleted_at)r.rr˜)r3rrrr.ÚHTTP_400_BAD_REQUESTrrr…rr†Z
deleted_byrÚ CANCELLEDr!r‰r"rrÚDELETErŽr-Ú isoformatrb)r#r'r]r^rxr™r”r$r$r%Ú
delete_tenants4
 ÷
ö
zTenantService.delete_tenantc
Ãs˜|j|ddIdH}|dur*ttjdd|p0i}|jjftjdt|j ƒ||j
ddt|j ƒ|j dœ|¤ŽIdH|j  
|¡IdH|j  ¡IdHdS)NT)r(rr_rxry)r{r|r}r]r™r'r)r3rrrr"rrr-rrbr!Údeleter‰)r#r'r]r^rxr”r$r$r%Úhard_delete_tenant*s"
ùø z TenantService.hard_delete_tenantc Ã| |¡IdH}|dur&ttjdd|jtjkr@ttjdd|jtjkrZttjdd|jdd}|j |dt
  t j
¡|_|j ¡IdH|j |¡IdH|p¨i}|jjftjdt|jƒ|||jddgd ¢t|jƒ|jd
œ |¤ŽIdH|S) Nrr_zTenant is already activez"Cannot activate a cancelled tenantTry)Ú activated_byrx)rÚ activated_atr¯Úplan_started_atr˜)r3rrrrrHrZactivaterr…rr†r!r‰r"rrZACTIVATErŽr-rb©r#r'r\r]r^rxr™r”r$r$r%Úactivate_tenantEs6