B
    f                @   s  d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	 e	j
 dZdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zdbd&d'Zdcd(d)Zddd*d+Zded,d-Zd.d/ Zdfd0d1Z d2d3 Z!d4d5 Z"d6d7d8d9Z#d:d; Z$d<d= Z%d>d? Z&d@dA Z'dBdC Z(dDdE Z)dFdG Z*dHdI Z+dJdK Z,dLdM Z-dNdO Z.dPdQ Z/dRdS Z0dTdU Z1dVdW Z2dXdY Z3dZd[ Z4d\d] Z5d^d_ Z6d`da Z7dS )gu   
!!! Делаем идемпотентные инициализации:
    можно запускать много раз на Рабочей БД с ожидаемым результатом.
    N)Any)g)configz/contrib/system_data.jsonc           	   C   s"   t t} t|  S Q R X d S )N)openSYSTEM_DATA_PATHjsonloadsread)fd r   ./cmf/system_data.pyget_data   s    
r   c          	   C   sB   ddl m} |jjdd}|r"|S |jdddd| | | djddS )	Nr   )modelszanonymous@evateam.ru)codeZ	anonymousT)loginnamer   system	cmf_owner
cmf_authorcmf_modified_by)	only_data)cmf.includer   	CmfPersongetsave)system_personr   Zanonr   r   r   create_anonymous_user   s    r   c          	   C   s,   ddl m} |jdddd| | | djddS )Nr   )r   zsharelink-anonymous@evateam.ruzsharelink-anonymousT)r   r   r   r   r   r   r   )r   )r   r   r   r   )r   r   r   r   r   create_sharelink_anonymous_user!   s
    r   c          
   C   sL   ddl m} |jdddd| | | dd}|j }|j| |jdd |S )	Nr   )r   ztest-guest@evateam.ruz
test-guestTF)r   r   r   r   r   r   r   
user_local)r   )r   r   r   CmfPersonGroupZguest_groupZrg_member_ofappendr   )r   r   personZguest_person_groupr   r   r   create_test_guest_user)   s    
r"   c              C   s6   ddl m}  | jjdds2| jddddjdd	 d S )
Nr   )r   global)r   u#   Глобальные правилаT)r   r   r   F)notify)r   r   ZCmfAccessListr   r   )r   r   r   r   init_acl8   s    r%   c              C   s4   ddl m} m} | j s0| j|jdjdd d S )Nr   )r   r   )r   F)r$   )r   r   r   CmfGlobalSettingsr   r   r   )r   r   r   r   r   init_global_settings=   s    
r'   c              C   s0   ddl m} m} | j s,| j|jd  d S )Nr   )r   r   )r   )r   r   r   ZCmfGlobalVarr   r   r   )r   r   r   r   r   init_global_varC   s    
r(   c              C   s2  ddl m}  tj }| j }|sJ| jdddd||dd}|jddd	 |t_t	| | j
jd
ddgd}|s| j
ddddddjdd | j
jd
ddgd}|s| j
ddddddjdd | j
jd
ddgd}|s| j
dddddjdd}| j
jd
ddgd}|s&| j
dddddjdd}|j  ||jkrT|j| |jdd | j
jd
ddgd}|s| j
dddddjdd | j
jd
ddgd}|s| j
dddddjdd | j
jd
ddgd}	|	s| j
dd d ddjdd | j
jd
dd!gd}	|	s$| j
dd"d"d!djdd | j
jd
dd#gd}	|	sX| j
dd$d$d#djdd | j
jd%dd&}	|	s| j
d%dd'd(jdd | j
jd)dd&}	|	s| j
d)dd*d(}	|	jdd | j
jd
ddgd|	_|	jdd | j
jd+dd&}	|	s.| j
d+dd,d(}	|	jdd | j
jd
ddgd|	_|	jdd xd-d.d/gd0d1d2gd3d4d5gd6d7d8gd9d:d gd;d<d=gd>d?d@gdAdBdCgdDdEdFgdGdHdIgdJdKdLgdMdNdOgdPdQdRgdSdTd gdUdVd ggD ]~\}
}}| jjd
d|
gd}|s|r| jjd
d|gd}|s| j|
dW}|
|_d|_d|_||_dX|_|jddd	 qW d S )YNr   )r   z.CmfPerson:00000000-0000-0000-0000-000000000001Tu   СистемаuK   Это не реальный человек, это сама система)idr   r   textcmf_created_atZcmf_modified_atr   F)r   r$   r   z==ZAdmins)filterz3CmfPersonGroup:00000000-0000-0000-0000-000000000013u   Администраторы)r)   r   r   r*   r   )r$   Usersz3CmfPersonGroup:00000000-0000-0000-0000-000000000028u   ПользователиZProjectCreatorsu#   Создатели проектов)r   r   r*   r   ZProjectAdminsu-   Администраторы проектов)r   ZIBAdminsu5   Администраторы безопасностиZSupportu1   Техническая поддержка EvateamZGuestuJ   Зарегистрированные пользователи (гости)Z	ShareLinku-   Группа доступа по ссылкеZServiceDeskClientu*   Группа клиентов Service DeskZAllowInvite)r   r   up   Группа которой разрешено приглашать пользователей в систему)r   r   r   ZSuAvailableuv   Группа которой разрешено переключаться на других пользователейZ	SuExcludeuZ   Пользователи на которых запрещено переключатьсяzvar:responsibleu   var:ИсполнительvarResponsiblezvar:executorsu   var:СоисполнителиvarExecutorszvar:spectatorsu   var:НаблюдателиvarSpectatorsz	var:owneru   var:ВладелецvarOwnerzvar:owner_assistantsu-   var:Заместители владельцаzvar:project_owneru#   var:Владелец проектаZvarProjectOwnerzvar:project_owner_assistantsu<   var:Заместители владельца проектаZvarProjectOwnerAssistantsz
var:authoru   var:АвторZ	varAuthorzvar:waiting_foru   var:Ждем ответаvarWaitingForzvar:component_owneru1   var:Руководитель компонентаZvarComponentOwnerzvar:current_useru+   var:Текущий пользовательZvarCurrentUserzvar:all_related_usersu6   var:Все связанные пользователиZvarAllRelatedUserszvar:followersu   var:Подпискиzvar:followerzvar:project_usersu,   var:Все участники проектаzvar:approversu   var:Утверждающие)r   uM   Шаблонный пользователь для автоматизации)r   r   datetimenowr   r   r   r   Z_current_personr   r   r   Z
rg_membersloadr    listr   Z
cmf_hiddenr   r   r*   )r   r4   r   Zadmins_groupZusers_groupZproject_creators_groupZproject_admin_groupZib_admins_groupZsupport_grpZgrpZvar_user_codeZvar_user_nameZvar_user_old_codeuserr   r   r   init_system_usersI   s    


r8   c              C   s`   ddl m}  t }|d }x@|D ]8}| jj|d dd}|s | j|d d}|jdd q W d S )	Nr   )r   Zclient_jobsr   T)r   include_deleted)r   )r   )r   r   r   ZCmfClientJobr   r   )r   dataZall_cjZcj_dataZcjr   r   r   init_client_jobs   s    
r;   c              C   s`   ddl m}  t }|d }x@|D ]8}| jj|d dd}|s | j|d d}|jdd q W d S )	Nr   )r   Zbusiness_sectorsr   T)r   r9   )r   )r   )r   r   r   ZCmfBusinessSectorr   r   )r   r:   Zall_bsZbs_databsr   r   r   init_business_sectors   s    
r=   c        	      C   s  ddl m} m}m} |  dtjd< t  t  t	  t
  t  t  | jj  t dkrtjdstdt  d td	 d S t  t  t  t  t  t  t  t  t  t  t  t  t  t   t!  t"  t#  t$  t%  t&  t'  t(  t)  | j*d
ddddd+  | j,ddddddd+  | j-dddd}| j./ }|j01| |+  | j2dddddd}|+  | j3dddd d}|+  | j4|d|j5d }|+  | j2d!d"d#dd$}|+  | j6|d|j5d }|+  t7  | jj  d S )%Nr   )r   	CMF_CACHEcmfutil1ZNO_CACHEz/opt/eva-appZ
run_pytestz"Only CRM need a system data init, z	 skipped.z3If you thing it's wrong contact skype://carbon.olegz,CmfUnit:00000000-0000-0000-0000-000000000029Tu
   Штукиu   штZ796)r)   r   r   
short_namer   z0CmfCurrency:00000000-0000-0000-0000-000000000030u
   рублиu   рубZ643)r)   r   r   rA   r   mainu   Общий чатr-   )r   r   r   Zmailu,   Локальный почтовый ящикzsmtp-sender.local.evacrm.ru:25F)typer   Zext_smtpr   Z
verify_sslfilter_is_noneu   Без списка)r   r   r   parent)pluginr   r   Zsmsgateu"   Локальный СМС шлюзzZhttp://smsgate.carbonsoft.ru/?login=000-000-000-000-001&pass=empty&tel={phone}&text={text})rC   r   Zext_urlr   )8r   r   r>   r?   Zflushdbosenvironr8   r%   r'   r(   r;   r=   r   dpcommitgetcwdr   printscaffold_event_typescaffold_project_notify_schemescaffold_licensescaffold_activitiesscaffold_tag_categoryscaffold_tagsscaffold_status_codesscaffold_workflowscaffold_logic_typescaffold_scheme_wfscaffold_relation_typescaffold_menu_tree_itemscaffold_filter_report_folderscaffold_project_rolescaffold_project_permscaffold_calendarscaffold_ui_formscaffold_security_levelsscaffold_task_filtersscaffold_html_schemesscaffold_assetsscaffold_task_resolution"scaffold_cust_field_config_schemesZCmfUnitr   ZCmfCurrencyZCmfChatGroupr   Z
user_groupZ	executorsr    Z	CmfPluginZCmfListZCmfPluginMailBoxr   ZCmfPluginSMSGateinit_synonyms)	r   r>   r?   ZchatZuser_grprF   rD   Zmail_boxZsms_gater   r   r   init_system_data   s    



re   c           	   C   s   ddl m}  t }|d }t }x|D ]}|d |ksDtd| ||d  | jjddd|d gdd|d	ggd
dgd}|s|  }|d |_|d |_	|d |_
d
|_|dd |_|jd
d q&W d S )Nr   )r   Zstatus_codesr   u0   Ошибка уникальности по code ORILIKE=oldcodeTr+   )r,   r9   order_byr   status_typer*   )r   )r   r   r   r6   AssertionErrorr    CmfStatusCoder   r   r   rk   r   r*   r   )r   r:   Zall_stZ	processedZst_datastr   r   r   rS   ]  s(    



rS   c              C   s   ddl m}  t d }x|D ]}|d }|d }|d }| jjdd|ggdd	}|rVq|  }||_||_|d
d|_|dd|_d|_	d|_
|jdd t||d qW d S )Nr   )r   workflowr   r   statusesz==T)r,   r9   publish_approved_onlyFpublish_by_owner_only)r   )ro   
status_key)r   r   r   CmfWorkflowr   r   r   rq   rr   Zsl_allow_quick_closing_tasksr   r   create_status)r   Zworkflow_data_listZworkflow_datar   r   rp   ro   r   r   r   rT   u  s(    


rT   c           	   C   s   ddl m}  t d }xp| D ]d\}}| jjddd|gdd|d ggdd	gd
}|sb|  }|d |_||_d|_|j	dd q W d S )Nr   )r   Z
activitiesrf   r   z==ri   Tr+   )r,   r9   rj   r   )r   )
r   r   r   itemsCmfActivityr   r   r   r   r   )r   r:   r   Zactivity_dataactivityr   r   r   rP     s    

rP   c              C   s   ddl m}  t }|d }xb|D ]Z}| jjdd|d gddgd}|sN|  }|d	 |_|d |_d
|_d|_|j	dd q W d S )Nr   )r   licenser   z==Tr+   )r,   r9   rj   r   Zdemoclosed)r   )
r   r   r   Z
CmfLicenser   r   r   statusZonboarding_statusr   )r   r:   Zall_licenseZlicense_datary   r   r   r   rO     s    


rO   Fc             C   sB  ddl m} t }|d }x |D ]}|jjdd|d gddgd}|rLq"|sX| }|d	 |_d|_|d
d |_|dd|_d|kr|d |_	|dr|j
  |j
jst |j
_|j
j|d  tt|j
|_
|jj|d d|_|d |_d|kr(|jjdd|d ggd}||_nd |_|jdd q"W d S )Nr   )r   
logic_typer   rh   Tr+   )r,   r9   rj   r   obj_code_prefixui_colorz#3f82d8aliasrx   )r   cmf_model_namedefault_workflow)r,   )r   )r   r   r   CmfLogicTyper   r   r   r}   r~   r   r   r5   valuer6   extendsetrw   Zfilter_activityr   rt   r   r   )only_updater   r:   Zall_ltZlt_dataltwfr   r   r   rU     s>    






rU   c             C   s   ddl m} t }|d }x|D ]}t|| d q W |d d }xd|jjdddgdD ]L}|jd	krfqV|j d
}||d< d|j |d< |jj	|d< t|| d qVW d S )Nr   )r   	scheme_wf)r   r   rh   T)r,   )ZsoftdevZservicedeskz:defaultr   u   Системная r   rx   )
r   r   r   _create_scheme_wf_from_jsonrw   r6   r   r   r)   r   )r   r   r:   Zall_swsw_dataZbase_scheme_wf_datarx   r   r   r   r   rV     s    

rV   c             C   s  ddl m} |jjdddgddd| d gd	d| d	 gggdd
gd}|rLd S | }| d	 |_| d |_| d |_| d |_| d |_| d |_	| d |_
| d |_| d |_| d |_| d |_| d |_| d |_| d |_d|_|jdd | drt|| d  d S )Nr   )r   r   z==Trf   r   rh   r   r+   )r,   r9   rj   default_task_workflowdefault_list_workflowdefault_epic_workflowdefault_subproject_workflowdefault_release_workflowdefault_sprint_workflowdefault_document_workflowdefault_document_approve_wfdefault_subtask_workflowdefault_task_logic_typedefault_subtask_logic_typerx   )r   rules)r   r   ZCmfSchemeWfr   r   r   r   r   r   r   r   r   r   r   r   r   r   rx   r   r   _create_scheme_wf_rules)r   r   r   swr   r   r   r     s6    













r   c       
      C   s   ddl m} x|D ]}|jj|d d}xr|d D ]f}|jj|d}|jjdd| gdd|gd	d|ggd
}|s2| |||d d}	|jf |	}|jdd q2W qW d S )Nr   )r   ro   )r   logic_typesr   z==target_workflowr|   )r,   r   )r   r   r|   r   T)r   )r   r   rt   r   r   ZCmfSchemeWfRuler   )
r   r   r   r   ruler   r|   r   Zscheme_wf_rule	rule_dictr   r   r   r     s     
r   c              C   s   ddl m}  t }|d }xl|D ]d}| jjdd|d gddgd}|sN|  }|d |_d	|krj|d	 |_|d
d|_|jdd q W d S )Nr   )r   tag_categoryr   z==Tr+   )r,   r9   rj   r   single_choiceF)r   )	r   r   r   CmfTagCategoryr   r   r   r   r   )r   r:   Zall_tag_categoriesZcat_datacatr   r   r   rQ   -  s    


rQ   c       
   	   C   s  ddl m} t }|d }x|D ]}|jjddd|d gdd|dggd	d
gd}|s|dr|dd k	r|jjd	d
gd}x^|dD ]P}|rP xD|D ]<}| |jj ks|j	r| dd |j	D kr|}P qW qW |s| rq"| }|d |_|dd|_
d|kr$|d |_d }	|dr`|jj|d d}	|	s`|j|d d }	|	|_|dr|j	jst |j	_|j	j|d  tt|j	|_	|jj|d d|_|jd	d q"W d S )Nr   )r   tagsrf   r   rg   rh   ZoldnameTr+   )r,   r9   rj   r   )r9   rj   c             S   s   g | ]}|  qS r   )casefold).0xr   r   r   
<listcomp>R  s    z!scaffold_tags.<locals>.<listcomp>colorz#3f82d8r   r   )r   rx   )r   )Znochecksyname)r   r   r   ZCmfTagr   r6   r   r   r   r   r   r   r   r   r   r   r   rw   rx   )
r   r   r:   Zall_tagsZtag_datatagr   Zaltr   r   r   r   rR   @  sP    






rR   c             C   s  ddl m} i }i }t }|d | d }d|d | krJ|d | d }d}x| D ]\}}|d7 }|jj|d d}	|	std|d  |jjd	d
| gdd
|	ggddgd}
|
s|jjdd
|	gd	d
d ggd	gd}
|
s| }
|d}|r||
_n||
_|	|
_	|d |
_
|dd|
_|d|
_|d|
_||
_|d|
_| |
_d| jjkrld|
_nd|
_|dd|
_t|
j|
jj|
j|
j|
j	 |
  |
jdd |
jrF|dd}|jj|d|
d}|s| }||_||_d|_|
|_x6|dg D ]&}|jj|d}|r
|j| q
W d|_|jdd d |
i||
j< qZW g }x~| D ]r\}}g }x&|d!D ]}||| d   q~W |||d"|||d# d  | |d$d|d%d& qfW |rt |}|d'}|r4x8|j!D ].}|jr||j d  }
||
_"|
jdd qW |d(}|r~x8|j!D ].}|jrL||j d  }
||
_#|
jdd qLW |d)}|rx0|j!D ]&}||j d  }
||
_$|
jdd qW d S )*Nr   )r   rp   transitionsi  r   )r   u(   Не найден код статуса ro   z==status_codeTr+   )r,   r9   rj   )r,   fieldsordernor*   r   z#666
next_alarmneed_approve	card_namez.systemFallow_empty_transition)r   Zag_required_signsZcustom)required_signsr   rE      Zag_approvers_codesr{   from
trans_typetotrans_sdesk_portal_allowtransition_filters)r   r   r   r   ro   r   r   trans_approvedtrans_rejectedtrans_updated)%r   r   r   rv   rm   r   rl   Z	CmfStatusr   r   r*   r   r   r   r   r   ro   r   r   r   r   rL   rk   Z_calc_status_coder   ZCmfApproveGroupr   Zmin_approversrE   r   Z	approversr    create_transitionsstatus_fromr   r   r   )ro   rs   r   rp   Ztransitions_datar:   Zstatuses_dataZorder_noZstatus_datar   r{   Zdata_order_nor   Zapp_grZapprover_codeZapproverr   Z	trans_keyZ
trans_dataZstatuses_listr   Zcreated_transitionstransitemr   r   r   ru   o  s    








ru   c          	   C   s   ddl m} i }x| D ]}|jjdd|dgdd|dgd	d|d	ggd
dgd}|sd| }|d|_|d|_|d|_|d	|_d
|_|j	d
d |d}|rx |D ]}|j
|d	|d qW t| |||d< qW |S )Nr   )r   r   INr   	status_toz==r   ro   Tr+   )r,   r9   rj   r   )r   r   )ro   
transitionr   )r   r   ZCmfTransr   r   r   r   ro   r   r   updatecreate_transition_filters)r   r   resultr   r   Ztrans_filters_datatrans_filterr   r   r   r     s2    


r   zlist[dict[str, Any]])transition_filters_datac          	   C   s   ddl m} x~| D ]v}|jjdd|dgdd|dgdd|dggdd}|s\| }|d|_|d|_|d|_|  qW d S )	Nr   )r   ro   rh   r   r|   T)r,   r9   )r   r   ZCmfTransFilterr   ro   r   r|   r   )r   r   Ztrans_filter_datar   r   r   r   r     s    
r   c              C   s  ddl m}  | jjdd}|s*| jdd}| j}d|_|j d|_|j |_	|j
 |_|j d|_d|_d|_|jp||j|_|  | jjd	d}|s| jd	d}| j}d|_|j d|_|j |_	|j
 |_|j d|_d|_d|_|jp|j|_|  dS )
uj   
    Создаёт в MenuTreeItem пункты меню дерева
    Идемпотентная
    r   )r   z
MNU-000001)r   i  z:ClassNzCmfSaleMenuGroup:Classz
MNU-000002)r   r   ZCmfMenuTreeItemr   Z
CmfCompanyr   
class_nameZ	obj_id_idZui_nameZobj_ui_nameZ	ui_moduleZob_ui_moduleZobj_codeZ
obj_parentZtree_parent_idZverbose_name_pluralZverbose_namer   r   r   )r   ZcompanyZcompany_classr!   Zperson_classr   r   r   rX   1  s:    



rX   c              C   s   ddl m}  t d }x|D ]|}| jjdd|d gdd}|sXtd|d   |  }|d |_|d	 |_|d
 |_|d |_	|d |_
d|_|  qW d S )Nr   )r   relation_typer   z==T)r,   r9   zadd obj relation_type r   out_type_namein_type_nameZ	type_auto)r   r   r   ZCmfRelationTyper   rL   r   r   r   r   Zchoice_typer   r   )r   Zrelation_type_datadata_objr   r   r   r   rW   \  s    






rW   c              C   sn  ddl m}  | jjj}ddddgg}| jj|d}x4|D ]*}| jjd|d	}|sl| jd||d
}|	  g }ddg}| j
j|d}x|D ]}	||	jj qW x,|D ]$}
|
|kr| j
|
||d
}|	  qW | jjd|d	}|s| jd||d
}|	  g }| jj|d}x|D ]}||j qW x:|D ]2}
||
 |kr0| j||
 |||
d}|	  q0W q:W dS )u   
    Добавляет во все проекты с logic_type = ['project.base', 'project.agile']
    папки: Фильтры, Отчеты
    r   )r   Zlogic_prefixr   zproject.basezproject.agile)r,   u   Фильтры)r   rE   )r   rE   tree_parentu   Фильтр 1u   Фильтр 2)r   u   Отчеты)r   rE   r   report_typeN)r   r   ZCmfTaskReportr   choicesZ
CmfProjectr6   Z	CmfFolderr   r   CmfTaskFilterr    r   r   )r   r   Z	filter_ltZprojectsZprojectZfilter_folderZfoundedZaddedfiltersfr   Z
new_filterZreport_folderZreportsZreportZ
new_reportr   r   r   rY   n  sV    




rY   c               C   s   d S )Nr   r   r   r   r   scaffold_task_filter  s    r   c               C   s   d S )Nr   r   r   r   r   scaffold_task_report  s    r   c        	   	      s  ddl m  t d } d}x| D ]} jjdd|d gdd}|s\td	|d     }|d |_|d
 |_|d |_|d |_	||_
|d7 }d|_|jdd q W t d }x|D ]} jjdd|d gdd}|std|d     }|d |_|d
 |_|d |_	|d |_
d|_|jdd x|d D ]~} jj|d dgd} jj||d}|rtd| d q>|s j||d}|dd }|sg |_n fdd|D |_|dd|_|dd|_|dd|_|dd|_|dd|_|d d|_|d!d|_|d"d|_|d#d|_|d$d|_|d%d|_|d&d|_|d'd|_|d(d|_|d)d|_|d*d|_|j
|_
d|_|  q>W qW t d } x| D ]} jjdd|d gddgd+}x j  D ]} jj||ds
td,| d-| d.|j!  d/|kr\t"d0|d
  d1|d/ } j||d}|dd }|sg |_n fd2d|D |_|dd|_|dd|_|dd|_|dd|_|dd|_|d d|_|d!d|_|d"d|_|d#d|_|d$d|_|d%d|_|d&d|_|d'd|_|d(d|_|d)d|_|d*d|_|j
|_
|  q
W qW d S )3Nr   )r   Zproject_perm_permissioni  r   z==T)r,   r9   z!add obj CmfProjectPermPermission r   categoryr*   )r   Zproject_perm_schemezadd obj CmfProjectPermScheme r   r   project_permission)r   r   )rE   r   u   Правила uu    уже существуют и могут быть изменены пользователем, не трогаем.access_project_rolec                s   g | ]} j j|d qS ))r   )CmfProjectRoler   )r   i)r   r   r   r     s    z)scaffold_project_perm.<locals>.<listcomp>access_local_userFaccess_sdesk_clientaccess_owneraccess_owner_assistantaccess_authoraccess_project_owneraccess_responsibleaccess_anonymousaccess_guestaccess_sharelink_anonymousaccess_executorsaccess_spectatorsaccess_project_owner_assistantaccess_project_spectatorsaccess_project_executorsaccess_list_owner)r,   r9   r   u-   Создаем проектное право u    в схеме  Zupdate_default_rulesu'   Для проектного права u    нужно добавить значения по-умолчанию, применяемые при обновлении к существующим схемам.c                s   g | ]} j j|d qS ))r   )r   r   )r   r   )r   r   r   r     s    )#r   r   r   ZCmfProjectPermPermissionr   rL   r   r   r   r*   r   r   r   ZCmfProjectPermSchemeZCmfProjectPermSchemeRuler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r6   r)   	Exception)	Zproject_perm_permission_datar   r   ZpermZproject_perm_scheme_dataschemeZscheme_rule_dataZscheme_ruler   r   )r   r   r[     s    












r[   c              C   s   ddl m}  t d }xr|D ]j}| jjdd|d gdd}|s`td|d   | j|d d	}|d
 |_|d |_d|_|j	dd qW d S )Nr   )r   Zproject_rolesr   z==T)r,   r9   zadd obj CmfProjectRole )r   r   r*   )r   )
r   r   r   r   r   rL   r   r*   r   r   )r   Zproject_roles_datar   Zroler   r   r   rZ   '  s    



rZ   c           	   C   s`  ddl m}  t d }x<|D ]2}|d }|d }|d }|d }| jjdd|gd	}|s|  }||_||_||_d
|_|j	d
d |dt
 }x|d D ]}	| jj|	d |d
d}
|
s| j|	d |d
|	dd}
|	dr|	d |
_|	dr
|	d |
_|
	  x8|	d D ]*}dd|gdd|
gg}|drd|dd }|dd|g n|dd|g | jj|d
ds|dr| j|dd d|dd idd}n| j|d}|
|_||_||	dg k|_||	dg k|_|d r| jj|d}||_||i d!r@||i d!|_|	  qW qW qW t  d S )"Nr   )r   ui_formr   r   r   ui_form_jsonz==)r,   T)r   	ui_fieldsZui_group_fields)r   rE   r   rC   )r   rE   r   rC   actionparamsr   rE   ui_form_groupzlink::)r,   r9   linkr   )r   r   rC   )r   Zhidden_fieldsZhide_empty_fieldsZcf_ZrequiredChanged)r   r   r   	CmfUiFormr   r   r   r   r   r   dictZCmfUiFormGroupr   r   
startswithsplitr    ZCmfUiFormFieldsgetr   rE   ZhiddenZ
hide_emptyZCmfCustField
cust_fieldZrequired_change_scaffold_ui_form_scheme)r   Zui_form_listZui_form_itemr   r   r   r   r   r   Zui_groupr   Z
field_nameZ_filterZui_form_fieldr   r   r   r   r]   7  sd    




r]   c              C   s   ddl m}  t d }x|D ]|}| jj|d d}|s| j|d |d dd}|  x@|d	 D ]4}| jj|d
 d}| j|||d |d d  q`W qW d S )Nr   )r   ui_form_schemer   )r   r   T)r   r   r   r   r   r   r   )r   targetr   r   )r   r   r   ZCmfUiFormSchemer   r   r   ZCmfUiFormSchemeRule)r   Zui_form_scheme_listZui_form_scheme_dictr   r   r   r   r   r   r   s  s    

r   c           
   C   sd  ddl m } m}m} ddlm} |   j}t d }x$|D ]}|j	j
dd|d gd}|std|d   |j	|d d	}|
d
d|_|d |_|d |_t| |  |_d|_|jdd |d }|jj
dd|d gd}	|	s"td|d  d|d   |j|d d	}	||	_|d |	_|d |	_d|	_g }
|d d}x6|d  D ]$\}}d}xt|
dg D ]\}}|
dd }|
dd }d}|r|r| |d}| |d}|dd| kr||dd7 }||  d }| }| }|d  d| d| d|||t||d d}|
| ||7 }qW d | }t|	| d!|d  t|	| d"| qdW |	jdd x|
D ]}|jj
dd|d gd}|std#|d  d$|d   |j|d d	}|	|_|d% |_|d |_|d |_ |d& |_!|d' |_"|jdd qW |	|_#|jdd |j$r@|j%d(d) q@W d S )*Nr   )r3   	timedeltatime)r   calendarr   z==)r,   zAdd calendar )r   
is_defaultFr   T)r   default_workweekzAdd default workweek z for calendar r   Zweekdays	intervals	from_timeto_timez%H:%M   )Zhours<   z.workz	.intervalz:defaultrC   )r   day_weekr  r  interval_minutesinterval_typedayZ_typeZ_intervals_total_minuteszAdd work interval z for default workweek r	  r
  r     )Z
back_years)&r3   r   r   r   r   r4   Z
astimezoneZtzinfor   CmfCalendarr   rL   r  r   r   intZ	utcoffsetZtotal_secondsZtimezoner   r   ZCmfCalendarWorkWeekrE   r   rv   	enumerateZstrptimer    setattrZCmfCalendarWorkWeekIntervalr	  r  r  r
  r  r  Zis_newZrecalc_calendar)r3   r   r   r   ZtzZcalendar_datar  Zsystem_calendarZworkweek_dataZworkweekr  Zworkweek_codeZweekday_numZday_dataZintervals_total_minutesr   intervalr  r  r
  Zinterval_datar  Zwork_intervalr   r   r   r\     s    












r\   c              C   s&   ddl m}  | jdddjdd d S )Nr   )r   u#   Пример 9-5 календарьF)r   r   T)r   )r   r   r  r   )r   r   r   r   init_calendar  s
    r  c              C   s$  ddl m}  | jjdddgd}|s0| jdd}d|_d	|_|jd	d
 | jj|dd}|sj| j|dd}d	|_d|_|jd	d
 xdD ]\}}| jj|d| dd}|s| jj|d| dd}|s| j|d| dd}| j	j|d}|s| j	j|d}||_
d| d|_|dkr d	nd|_|jd	d
 qW | jj|dd}|sZ| j|dd}d	|_d|_|jd	d
 xdD ]\}}| jj|d| dd}|s| jj|d| dd}|s| j|d| dd}| j	j|d}|s| j	j|d}||_
d| d|_d|_|jd	d
 qxW d S )Nr   )r   r   z==zsystem:default)r,   )r   u*   Системная по умолчаниюT)r   zsystem-readonly:default)rE   r   u   Только чтение))r1   z	var:owner)r/   zvar:executors)r.   zvar:responsible)r2   zvar:waiting_for)r0   zvar:spectatorszsystem-readonly-z:defaultr0   Fzsystem-private:defaultu   Приватный))r1   z	var:owner)r/   zvar:executors)r.   zvar:responsible)r2   zvar:waiting_forzsystem-private-)r   r   ZCmfSecurityLevelSchemer   r   r   r   ZCmfSecurityLevelZCmfSecurityLevelRuler   access_memberr   Zaccess_readonly)r   r   levelZuser_code_old	user_coder   r  r   r   r   r^     s^    r^   c              C   s   ddl m}  t d }xt|D ]l}| jjdd|d gdd}|sXtd|d   |  }|d |_|d	 |_|d
 |_d|_	|j
dd qW dS )u+   
    Добавляет события
    r   )r   
event_typer   z==T)r,   r9   zAdd obj CmfEventType r   r*   )r   N)r   r   r   CmfEventTyper   rL   r   r   r*   r   r   )r   Zevent_type_datar  Zeventr   r   r   rM   #  s    




rM   c        	         s  ddl m  t d } xb| D ]X} jjdd|d gdd}|s\td|d     }|d |_|d	 |_|d
 |_d|_	|j
dd x|d D ]} jj|d d} jj||d d}|rq|s܈ j||d d} fdd} fdd}x\|dg D ]L}dd||r*|j n&||rB|j ntd| qW d|_	|d |_||_|
  qW qW dS )u   
    Добавляет стандартную схему уведомлений. Клиенты могут ее редактировать!
    r   )r   Zproject_notify_schemer   z==T)r,   r9   zAdd obj CmfProjectNotifyScheme r   r*   )r   r   r  )r   )rE   r   c                s    j j| dS )N)r   )r   r   )r  )r   r!   r   r   lazy_loader_person_  s    z:scaffold_project_notify_scheme.<locals>.lazy_loader_personc                s    j j| dS )N)r   )r   r   )r  )r   person_groupr   r   lazy_loader_person_groupd  s    z@scaffold_project_notify_scheme.<locals>.lazy_loader_person_groupmembersNz/scaffold_project_notify_scheme Unknown member: 
model_type)r   r   r   ZCmfProjectNotifySchemer   rL   r   r   r*   r   r   r  ZCmfProjectNotifySchemeRuleZnotify_membersr    r   r  r  )	Zproject_notify_scheme_dataobj_datar   Z	rule_datar  r   r  r  r  r   )r   r!   r  r   rN   9  sL    






rN   c              C   s|  ddl m}  dd l}| jjddddgdddggdrLtd	| j   d S d}x$dd
gddggD ]\}}td|  d}td| dddd}|j|dd|jd}g }x|D ]}	|	d }
|	d }|rt	|}nd }|	d }|
| j |
||||d |d dkr6| jjj || | jj  g }|d7 }qW |rj| jjj || | jj  W d Q R X qdW d S )Nr   )r   rf   Z	dict_namerh   Z	ru_commonZru_it)r,   u8   Error! Словарь синонимов не пуст: i'  i  u"   Загружаем словарь a  INSERT INTO cmf_synonym (
                    id, cmf_created_at, cmf_modified_at, cmf_deleted, cmf_archived, system, 
                    stat_usage, stat_search, name, text, dict_name, stat_lang_usage, orderno,
                    import_original, is_favorite, has_tree_nodes, tree_node_is_branch, 
                    tree_hidden, perm_public, perm_has_acl, perm_inherit, perm_encrypt
                ) VALUES (
                    :id, now(), now(), FALSE, FALSE, TRUE, 0, 0, :word, :syns, :dictinary, 
                    :word_stat, :orderno, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, 
                    FALSE, FALSE
                );z/opt/eva-app/patch/cmf_synonym_z.dictr )newline;")Z	delimiterZ	quotecharZquotingr      )r)   wordsyns	dictinary	word_statr   )r   r   csvZ
CmfSynonymr   rL   r   readerZQUOTE_MINIMALfloatr    Zgen_idrI   Zdata_driverZSessionZexecuterJ   )r   r)  r   r'  r   ZsqlZcsvfiler*  valuesrowr%  r(  r&  r   r   r   rd   z  sF     



rd   c              C   s   ddl m}  t d }xj|D ]b}| jjdd|d gdd}|sN| j|d d}|d	 |_|d
 |_|d |_d|_|j	dd qW dS )u   
    Добавляет системные фильтры задач. Их нельзя редактировать и удалять.
    r   )r   Ztask_filterr   z==T)r,   r9   )r   r   ubql2bql)r   N)
r   r   r   r   r   r   r.  r/  r   r   )r   Ztask_filter_scheme_datar  Ztask_fitlerr   r   r   r_     s    




r_   c              C   s   ddl m}  t d }x~|D ]v}| jjdd|d gdd}|sN| j|d d}|d	 |_|d
 |_|d |_|d |_|d |_	d|_
|jdd qW | jjdgd}|d s| jjdd}||_|  dS )uS   
    Создает HTML схему по-умолчанию для servicedesk
    r   )r   html_schemer   z==T)r,   r9   )r   r   sd_name
home_titlecontent_background_colorcontent_text_color)r   sd_html_scheme)r   Zsd_default_schemeN)r   r   r   ZCmfHtmlSchemer   r   r1  r2  r3  r4  r   r   r&   r5  )r   Zhtml_scheme_datar  r0  Zglobal_settingsZ	sd_customr   r   r   r`     s$    






r`   c        	   	   C   sD  ddl m}  t d }x&|D ]}| jj|d d}|s^| j|d |d dd}|jdd	 x|d
 D ]}| jj|d d d}|s| j|d d |d d dd}|jdd	 | jj||d}|s| j||dd}|jdd	 xT|d dg D ]@}| jj|d |dd}|s| j|d |d |d |d  qW qhW qW d S )Nr   )r   Zcust_field_conf_schemer   )r   r   T)r   r   r   )r   r   cust_field_conf)r   r   r   )rE   r6  )rE   r6  r   r   )r   rE   r9   captionplaceholder)r   r7  r8  rE   )	r   r   r   ZCmfCustFieldConfSchemer   r   ZCmfCustFieldConfZCmfCustFieldConfSchemeRuleZCmfCustFieldConfField)	r   Zcust_field_config_schemesr   Zcust_field_config_schemer   Zcust_field_configr   ZfieldZ
field_confr   r   r   rc     s2    


rc   c           	   C   s  ddl m}  t d }x|D ]}| jjdddgdd|d ggd}|sR|  }d|_|d |_|d	 |_|jdd
 xN|d D ]@}| j	jdddgdd|d ggd}|s| 	 }||_
d|_|d |_|jdd
 x~|d D ]r}| jjdddgdd|d ggd}|s|  }||_
d|_|d |_| jj|d d|_|g|_|jdd
 qW xj|d D ]^}| jjdddgdd|d ggd}	|	s|  }	||	_
d|	_|d |	_||	_|	jdd
 qdW qW qW t d }
x|
D ]}| jjdddgdd|d ggd}|r| jjdd|d ggd}|s2|  }|d |_||_
g }x&|d D ]}	|| jj|	d qPW ||_| jj|d d|_|  qW d S )Nr   )r   asset_schemesr   rh   Tr   )r,   asset_code_prefix)r   Zasset_type_cats	asset_catr|   )r   asset_typesassetsasset_scheme)r   )r   r   r   ZCmfAssetSchemer   r   r   r:  r   ZCmfAssetTypeCatrE   ZCmfAssetCatr   Zdefault_logic_typeZasset_types_catZCmfAssetTypeasset_type_catZCmfAssetr    r<  r;  )r   r9  r>  r   Ztype_catr?  r   r;  Zobj_typeZ
asset_typer=  Z	obj_assetZassetr<  r   r   r   ra      s~    








ra   c              C   s   ddl m}  | jjdddgdddggddr0d S t d	 }xR|D ]J}|  }|d |_|d
 |_|d |_|d |_|d |_	|j
dd q@W d S )Nr   )r   r   rh   Tr   Zdone)r,   r9   resolutionsr   r*   r  )r   )r   r   ZCmfResolutionr   r   r   r   r*   r   r  r   )r   r@  Z
resolutionZnew_resolutionr   r   r   rb   T  s     






rb   )F)F)F)F)F)8__doc__r3   r   rG   typingr   Zflaskr   Zcmfr   Z
CMF_FOLDERr   r   r   r   r"   r%   r'   r(   r8   r;   r=   re   rS   rT   rP   rO   rU   rV   r   r   rQ   rR   ru   r   r   rX   rW   rY   r   r   r[   rZ   r]   r   r\   r  r^   rM   rN   rd   r_   r`   rc   ra   rb   r   r   r   r   <module>   sj    z
)

"

/ "+El<YAA;T