U
    VЉh&                    @   s   d dl m Z  d dlmZmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
T d dlZd dlmZ d d	lmZ G d
d dejjjje	ZdS )    )copy)datetimetimezone	timedelta)Decimal)
monthrange)CmfPluginConvertMixin)*N)CmfActiveEntity)cmfutilc                       s4  e Zd Zejjjjje	j ddddddddd	d
dddg Ze
dǇ fdd	Zdd Zeedddd Z fddZ fddZdd Zdd Zdd  Ze
dd!d"Ze
dɇ fd$d%	Ze
ddddd&d'd(Ze
dd)d*Zd+d, Zdd/d0Zdd3d4Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Z dd?d@Z!ddAdBZ"edCdD Z#dEdF Z$dGdH Z%ddIdJZ&e
d#ddK fdLdM
Z'dNdO Z(dPdQ Z)dRdS Z*dTdU Z+dVdW Z,dXdY Z-dZd[ Z.e
d\d] Z/e
dЇ fd^d_	Z0d`da Z1 fdbdcZ2ddde Z3dfdg Z4edhdi Z5djdk Z6dldm Z7ddndoZ8dpdq Z9drds Z: fdtduZ; fdvdwZ<e
ddxdyZ=dzd{ Z>d|d} Z?d.d~d fdd
Z@ fddZAdd ZBdd ZCeeDd.d.dddd ZEedd ZFeGdddZHe
dd ZIdd ZJe
dd ZKe
dd ZLdd ZMdd ZN fddZOdd ZPdddZQeRdd ZS fddZTdddZUdddZVeeDd.dd.ddd ZWdddZXeeDd.dgddddddZYeeDd.dgddddddZZeeDdd.d.dgde[dddZ\ee[dddZ]eeDdd.d.dgddddddZ^eeDd.d.ddddĄ Z_ddƄ Z`  ZaS )
CmfProjectZui_getget_obj_treeZdelete_node	move_itemZget_public_tree_leafget_tree_leafget_full_treecheck_project_role_accesscreate_from_templatearchive_projectarchive_restore_projectdelete_projectrestore_projectNc                    sh   |dkr&|sg }|dd|gdddgg}|dkrL|s6g }|dd|gdddgg}t  j|f|||d|S )	Ndefault_list	parent_id==cache_status_type!=closedZdefault_list_if_empty)object_fields	object_idfilter)superfield_options_list)clsZrelation_field_namer   r   r   kwargs	__class__ './modules/project/models/cmf_project.pyr!   "   s     zCmfProject.field_options_listc                 C   s   d| j ji}td| d S )N
project_idCmfProject:changed)idvalueZcmf_emit_server_event)selfdatar&   r&   r'   invalidate_cache/   s    zCmfProject.invalidate_cacher)   )Zchannelc                 K   s   | d t jkrt j| d = d S )Nr(   )ZAPPcache_projects)r-   _kwargsr&   r&   r'   on_project_change3   s    zCmfProject.on_project_changec                    s   | j r
d S t   d S N)
logic_typer    _calc_logic_typer,   r$   r&   r'   r4   9   s    zCmfProject._calc_logic_typec                    s   | j r
d S t   d S r2   )	scheme_wfr    _calc_scheme_wfr5   r$   r&   r'   r7   >   s    zCmfProject._calc_scheme_wfc                 C   s`   | j js| j jsd S | j s4tjjdd| jjgd| _ | j jrH| j j	  | j j
r\| j j
	  d S )Ncoder   r   )cust_field_conf_scheme
is_changedis_nullmodelsZCmfCustFieldConfSchemegetr3   r8   oldZ
cache_hooknewr5   r&   r&   r'   _calc_cust_field_conf_schemeD   s    z'CmfProject._calc_cust_field_conf_schemec                 C   s.   | j js| j jsd S | j s*tjjdd| _ d S )Nzui_form_scheme:defaultr8   )ui_form_schemer;   r<   r=   CmfUiFormSchemer>   r5   r&   r&   r'   _calc_ui_form_schemeO   s    zCmfProject._calc_ui_form_schemec                 C   s|   | j jsd S | j jr.d| j j_| j jjdd | j jrx| j jj  | j jj| kr^tddd d| j j_| j jjdd d S )NFT	only_datauc   Нельзя указать Спипок по-умолчанию из другого проектаabort)	r   r;   r?   Zis_default_listsaver@   parentload	cmf_alertr5   r&   r&   r'   _calc_default_listW   s    

zCmfProject._calc_default_listc                 K   s   t ddS tt| j|dgd}|s,g S |}g }|rX||jj |jj	dgd}q4ddd|gd	d|gg}	| 
 D ]2}
|
j}||}|r|| |	g||< qv|	||< qv| jf |d
d|}| j||dS )u_   
        Построение дерева от не корневого обьекта
        
DepricatedNtree_parentr   fieldsrR   ORtree_parent_idINr*   T)filtersfilter_projectrU   )	Exceptiondictvarsr=   r>   appendr*   r+   rP   rL   _get_node_models
class_name_get_tree_dataZ_create_tree)r"   Z	obj_modelZ
obj_filterrW   rU   r#   objrK   Z
parents_idZparent_filtermodel
model_namemodel_filter	tree_datar&   r&   r'   r   d   s*      

zCmfProject.get_obj_treeprojectc           	         sx   t dd S ddd|gdd|gg}|  D ]2}|j}||}|rT|| |g||< q*|||< q*t j||fd|i|S )NrO   rT   rU   r   r*   rW   )rZ   r[   r^   r_   r>   r    r   )	r"   rU   project_typerW   r#   Zparent_filtrb   rc   rd   r$   r&   r'   r      s      

zCmfProject.get_tree_leaf)rR   rW   rg   rX   c                O   s   t dd S |rdd|g}|drF|r8||dg}n|rF|d}dtjj||| ddgdi}	|D ]H}
tt|
 }||
 pg }|tjkr|ddd gg}|j||jd |	|
< qh|	S )!NrO   ordernonamecmf_owner_id	cmf_ownerrg   show_approved
show_tasksshow_archive
show_pfeed	show_disk	show_chat	show_epicshow_sprintshow_releaseshow_roadmapZactivitycmf_owner_assistantshas_tree_nodestree_hidden	is_publicsharelink_hashperm_policy_anonymousperm_policy_guestperm_policy_sharelinkperm_policyr   r   )r   rR   Zorder_bysys_type=rQ   )	rZ   r>   popr=   r   listr\   CmfListZtree_fields)r"   rR   rW   rg   rX   argsr#   Zproject_filterZproject_fieldsre   rc   rb   rd   r&   r&   r'   r`      sh                                 


 
zCmfProject._get_tree_datac                 C   s   t dd S D ]"}|jdkr|jjjdd d q|r||	dd	  D ]>}|j
|krHt|d
shg   S t|tjr||| |g  S qHg S |tjj D ]}|| q|tjj S )NrO   c                 S   s   t | jjD ]~}d|jkrZt|dd rZd|j | jkrZt| d|j dsZ| jj| t|tj	rd| jkrt| dds| jj| qd S )Nr   show_Trq   )
r   
tree_nodesr+   rR   getattrr   remove
isinstancer=   CmfChatGroup)rf   noder&   r&   r'   hide_project_parts   s"    


z5CmfProject._get_tree_root.<locals>.hide_project_partstagsc                 S   s   | j S r2   ri   )r   r&   r&   r'   <lambda>       z+CmfProject._get_tree_root.<locals>.<lambda>)key:r   r   )rZ   r>   r=   	CmfFolderr_   r   r   r+   sortsplitr*   hasattrr   r   )r"   re   rU   r   folderra   rf   r&   r&   r'   _get_tree_root   s$     



zCmfProject._get_tree_rootc                 C   s8   t jj| dd}|s4t j| ddddd}|jdd |S )NtrashcanrK   r   u   КорзинаT)rP   ri   r   systemrx   Fnotify)r=   r   r>   rJ   )r,   r   r&   r&   r'   scaffold_trashcan   s        zCmfProject.scaffold_trashcan   Активные спринтыTc                 C   s   d}t j| d| d| j dd| j dd| j dd	}|jd
d ddd}|| j}t j| ||||d}|jd
d |S )NzX[lists, EXISTS, [[cache_status_type = IN_PROGRESS], [logic_prefix = list.agile_sprint]]]    Фильтр для доски "" rf   project = ""["project.id", "=", ""]rK   ri   Z
view_scopeubqlbqlFr   zboard.scrum:defaultzboard.simple:default)project.agileproject.simple-boardrP   ri   r3   kanban_bql_filterr   )r=   CmfBqlFilterr8   r*   rJ   r>   logic_prefixCmfKanbanBoard)r,   ri   r   Zft_add_ubqlZactive_sprints_filterZlt_mapltZactive_sprints_boardr&   r&   r'   scaffold_active_sprints  s,    z"CmfProject.scaffold_active_sprints   Доска Kanbanboard.kanban:defaultc                 C   sj   t j| d| j d| j dd| j dd| j dd}|jd	d
 t j| |||dd}|jdd	d |S )Nr   r   rf   r   r   r   r   r   Fr   Tr   )Zis_scaffold_kanban_boardr   )r=   r   ri   r8   r*   rJ   r   )r,   kanban_namer3   r   kanbanr&   r&   r'   scaffold_kanban_board  s"    z CmfProject.scaffold_kanban_boardc                 O   s>   t j| d}|jdd t j| dd|| dd}|jdd d S )NrK   Fr   ZBacklogbacklogT)rP   ri   r   tmp_bql_filterfilter_parentr   )r=   r   rJ   r   )r,   r   r#   backlog_filterr   r&   r&   r'   scaffold_backlog4  s    	zCmfProject.scaffold_backlogc           	   	   O   s   t jjdd}t j| dd| j dd|dd}|jdd	 t jjd
d}t jd|j |dd}|jdd	 t jj	dd|gddddddgggd}|D ]}|j
dd	 q||_|jdd	 |S )Nlist.board:defaultrB   u   Простая доскаu)   Простая доска проекта r   T)rP   ri   text	list_typeZui_view_formr3   r   Fr   ztask.base:defaultu*   БП Задач Простой доски )ri   templateZhiddenZworkflowr   r8   NOT INopenZin_progress	in_reviewr   r9   )r=   CmfLogicTyper>   r   ri   rJ   CmfWorkflowr8   	CmfStatusr   deletedefault_task_workflow)	r,   r   r#   Zlt_boardZsimple_boardr   ZwfZunneeded_statusesstatusr&   r&   r'   scaffold_simple_boardC  s8    
	
z CmfProject.scaffold_simple_boardc                 C   s>   t jj| | dd}|rd S t j| | dddd}|jdd d S )NCmfDocumentrK   rP   typeu!   Реестр документовTrK   rP   ri   r   r   Fr   r=   CmfRegistryr>   rJ   )r,   Zdoc_registryr&   r&   r'   scaffold_doc_registryh  s    z CmfProject.scaffold_doc_registryc                 C   s>   t jj| | dd}|rd S t j| | dddd}|jdd d S )N
CmfCompanyr   u%   Реестр контрагентовTr   Fr   r   )r,   Zcompany_registryr&   r&   r'   scaffold_company_registryv  s    z$CmfProject.scaffold_company_registryc                 C   s  t j| dddd}|jdd t j|| dddd	d
jdd t j|| ddddd
jdd t j|| ddddd
jdd t j|| ddddd
}|jdd t jd|dd	djdd t jd|dddjdd t jd|dddjdd t jd|dddjdd |S )Nu   Обучение	app_learnTrP   ri   r   r   Fr   u
   КурсыZ	CmfCourse順 rP   rK   ri   r   r   rh   u   ВопросыZCmfQuestion@ u   Набор вопросовZCmfQuestionFolderi    Отчеты	CmfReporti  u?   Отчет. Отчет по результатам курсовZlms_course_summary)ri   rP   report_typerh   u.   Отчет. Сводка по ученикамZlms_student_summaryu.   Отчет. Сводка по заданиямZlms_jobu+   Отчет. Результаты тестаZlms_exam_resulti )r=   r   rJ   r   r   )r,   r   Z
reports_rgr&   r&   r'   scaffold_app_learn  s    zCmfProject.scaffold_app_learnc                 C   s   |s
| j }d| S N/r   r,   ri   r&   r&   r'   project_dir  s    zCmfProject.project_dirc                 C   s   |st j| | ddddd}t j|| ddddd  t j|| d	d
ddd  t j|| ddddd  t j|d| dddd  t j|d| dddd  t j|d| dddd  |S )NZEvaTesttestsT)rP   rK   ri   r   r   rx   u   Тест-кейсыZCmfTestcaser   r   u   Тест-планыZCmfTestplani u!   Выполнение тестовZCmfTestcycleip u   КонфигурацииZCmfTestConfigurationiX )rP   ri   rK   r   r   rh   u   ПараметрыZCmfTestParami@ u   ОкруженияZCmfTestEnvironmenti( )r=   r   r   rJ   )r,   rP   r&   r&   r'   scaffold_tests  st    





zCmfProject.scaffold_testsc                 C   s   t jjj }|| S r2   )r=   CmfRFileZdpZdata_driverZget_rdZ	get_rfile)pathrdiskr&   r&   r'   
_get_rfile  s    zCmfProject._get_rfilec                 C   s   |  |  jdddd dS )u   Создадим папку проекта, если её нет. Может так же нужно проверять "Документы"? T)is_direxist_okparentsN)r   r   creater5   r&   r&   r'   ensure_project_dir  s    zCmfProject.ensure_project_dirc                 C   s   |  ddg | js4|  r0| |  }d|_d S |  sD|   | jrZd| jj }nd}|d7 }| j	dgdD ]}|d	|j d
7 }qt|d7 }| |  }||_d S )Nrdisk_enabledrk   z(owner: null
rules:
- all deny read,writezowner: zowner: nullz
rules:loginrS   z
- z allow read,writez
- all deny read,write)
load_fieldsr   is_project_dir_existr   r   perm_strr   rk   r   Zall_relation_persons)r,   Z	dir_rfiler   userr&   r&   r'   _sync_rdisk_folder  s$    zCmfProject._sync_rdisk_folderc                 C   s   |s
| j }| | |jS r2   )ri   r   r   existsr   r&   r&   r'   r   9  s    zCmfProject.is_project_dir_existrg   rW   c                   sB   t dd S t jf ||d|}|D ]}|  |  q(|S )NrO   r   )rZ   r[   r    r   r   r   )r"   rg   rW   r   r#   resrf   r$   r&   r'   r   >  s      
zCmfProject.get_full_treec                 C   s  | j   | j r|   tjjdd}tjjdd}tjjdd}tjjdd}tjjdd}td dd	lm	} |d
g  }| 
  | jst }tjjdd|_| |_d| j |_d|_|jdd || _tjjddj}	tj| dddd|_tj| | dddd|_tj|jdd| j d|	 dd|_tj|jdd| j dd|_tj|jdd| j d|	 dd|_tj|jd d| j d!|	 dd|_tj|jd"d| j d#d|_tj|jd$d| j d%d|_tj|jd&d| j d'd|_tj| | d(d)dd|_ tj| d*d+dd|_!tj"| d,d-d.|_#tj| d/d0dd|_$tj| d1d2dd|_%tj| d3d4dd|_&tj| d5d6dd|_'tj| d7d8dd|_(tjjd9| j)d:|_*tj| | d;d<dd|_+tj,| d=d>| j d?|dd@|_-tj| dAdBdd|_.tj| dCdDdd|_/tj0| | gdE| j ddF|_1| 2 |_3| j4dGks@| 5 |_6| j4dHkrX| 7 |_8n@| j4dIkrp| 9 |_8n(| j4dJkr| j9dKdLdM|_8n
| : |_8tj"| dN| j | j;| j<dO|_=|j=| _>| j?rtj|jdPd| j dQd|_@| j4dRk}
|
rtj,|j+dSdT|_AtjB|j!dUdT|_Ctj"|j#dVdT|_D|
rttj| |j$dW|dX|_Etj,|j%dYdZ|d[|_Ftj,|j&d\d]|d[|_GtjH|j(d^dd_|_Id`|j8_Jda|j(_Jdb|j*_Jdc|j_Jdd|j_Jde|j!_Jdf|j#_Jdg|j$_Jdh|j&_Jdi|j%_Jdj|j+_Jdk|j'_Jdl|j-_Jdm|j._Jdn|j/_Jdo|j3_Jdp|j1_Jdq|j _J| j4drkr| K |_Ld|j8_Md|j(_Md|j*_Md|j_Md|j!_Md|j$_Md|j&_Md|j%_Md|j'_Md|j._Md|j/_Md|j3_Md|j1_Md|j-_Md|j_Md|j6_M| jNdskrdnd|jL_M|jOP D ]}|jdd qd| _Qd| _Rd| _Sd| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _e| jNdskrrdnd| _f| jdddt | j4dukrd|j._Md|j/_Md|j1_Md|j3_Md|j-_M|jOP D ]}|jdd qd| _Rd| _Qd| _Sd| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _e| jdddt tjgjhji}|D ]b}|dvkrqrtjg|| |j'|dw|_jdx|jOkr|j@|jj_k|dykrd|jj_|jjjdd qr| j4dGk	rd|j _Md|j(_Md|j*_Md|j_Md|j$_Md|j&_Md|j%_Md|j+_Md|j'_Md|j-_Md|j._Md|j/_Md|j1_Md|j3_Md|j_Md|j#_Md|j8_M|jOP D ]}|jdd qtd| _Rd| _Qd| _Sd| _Td| _Ud| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _e| jdddt | 5|  | j4dIk
rd|j$_Md|j&_Md|j._Md|j/_Md|j1_Md|j*_Md|j3_Md|j-_Md|j6_M|jOP D ]}|jdd 	qvtjljdzd| _md| _Qd| _Sd| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _e| jdddt tjgjhji}|D ]b}|dvk
r@
q.tjg|| |j'|dw|_jdx|jOk
rn|j@|jj_k|dyk
rd|jj_|jjjdd 
q.| j4d{krd|j8_Md|j(_Md|j&_Md|j._Md|j/_Md|j1_Md|j*_Md|j3_Md|j-_Md|j6_M|jOP D ]}|jdd 
qd| _Qd| _Sd| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _e| jdddt tjgjhji}|D ]P}|dvkrqtjg|| |j'|dw|_jdx|jOkr|j@|jj_k|jjjdd q| j4dHkr*d|j _Md|j(_Md|j*_Md|j_Md|j!_Md|j$_Md|j&_Md|j%_Md|j+_Md|j'_Md|j-_Md|j._Md|j/_Md|j1_Md|j3_Md|j_Md|j6_M|jOP D ]}|jdd qd| _Rd| _Qd| _Sd| _Td| _Ud| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _e| jdddt | j4dJkrtjnjd|d| _otjpjd}d| _q| rd~d}| rdd}| rdd}dddtjjddd|||dddtjjddd|||dddtjjddd|||dddtjjddd|||dgddddtjjddd|||dddtjjddd|||dgdg}| s| | jtddtjjdd|||dd tj| dddd|_utj| d| j) dd| j dd|_vtjw|ju| |jvdd|_xtj| d| j) dd| j dd|_ytjw|ju| |jydd|_ztj| d| j) dd| j dd|_{tjw|ju| |j{dd|_|tj| ddddd|_}tj|j}ddd.|_~tj|j}ddT|_tj| dddd|_tj| dddd|_| K |_Ld`|ju_Jda|j8_Jdb|j}_Jdc|j_Jdd|j_Jde|j_Jdf|j'_Jdg|j3_Jdh|j/_Jdi|j._Jdj|j1_Jdk|j!_Jd|j(_Md|j8_Md|j*_Md|j#_Md|j$_Md|j&_Md|j%_Md|j+_Md|j-_Md|j3_Md|j._Md|j1_Md|j/_Md|j!_Md|j _Md|j_Md|j6_Md|jL_M|jOP D ]}|jdd qd| _cd| _d| _Qd| _Sd| __d| _d| _d| _d| _bd| _Td| _Ud| _Wd| _Xd| _dd| _d| _d| _d| _d| _Yd| _\d| _ad| _Vd| _Rd| _fd| _e| jdddt tjgjhji}|D ]N}|dr^tjg|| |j'|dw|_jdx|jOkr|j@|jj_k|jjjdd q^|   |   |   |   d-S )uU    Добавляем структуру папок в новый проект
        zlist.pfeed:defaultrB   ztask.epic:defaultzlist.agile_sprint:defaultzlist.release:defaultzlist.base:defaultuc   Вызываем разворачивание чтобы появилась папка задачиr   )make_dataclassZ	DataEmptytask.gantt_project:default	   Гант TFr   r   u   ФильтрыrW   r   u   ЗадачиCmfTask)rP   rK   ri   r   r   u$   Мои открытые задачиr   z?" and responsible in (currentUser()) and cache_status_type != "r   )rP   ri   r   u   Сообщено мнойz"" and cmf_owner in (currentUser())u   Открытые задачиz" and cache_status_type != "u#   Выполненные задачиz" and cache_status_type = "u!   Недавно созданныеz" and cmf_created_at >= "-1w"u   Недавно решенныеz" and status_closed_at >= "-1w"u%   Недавно обновленныеz" and cmf_modified_at >= "-1w"u   БлогCmfDocument-blogu   Компоненты
componentsu   ДокументыN)rP   ri   r   ZEpicsepicZReleasesreleaseZSprintssprintr   reportsZRoadmapsroadmapr   )r   rU   u   Спискиr   u
   Лентаu   Лента проекта pfeed)rP   ri   r   r   r3   r   u   Дискdisku
   Архивarchiveu   Чат )rP   	executorsri   r   project.evatestr   zproject.kanbanproject.servicedesku
   Доскаzboard.sd_kanban:default)r   r3   z	HomePage )rK   ri   rk   
cmf_authoru   Фильтр1z$" and responsible in (currentUser()))r  project.wikir  u   Список1)rP   ri   u   Компонент1u   Документ1ZEpic1)rK   rP   ri   r3   u   Релиз1r   )rP   ri   r   r3   ZSprint1r   u   Roadmap Проекта)rP   ri   r   r   i i i i" iI i q i i  i0 r   iP4 i`[ ip i i i i r  sectionrG   r   r   mark)ri   rP   r   Zfilters_filter1Zagile_sprintzkanban:defaultzproject.basezsystem:servicedeskzui_form_scheme_sd:defaultzui_form.sd_view:defaultu   Просмотрzui_form.sd_create:defaultu   Созданиеzui_form.sd_view_inner:defaultu(   Просмотр в приложенииu
   Общее"   Получить ИТ помощьuZ   Получите помощь по общим ИТ-проблемам и вопросам.task.sd_service_request:defaultzservice-requests)ri   r   r3   categoryui_form_viewui_form_createui_form_view_inner9   Запросить новую учетную записьuP   Запросите новую учетную запись для системы.u7   Сообщить о системной проблемеu   Дайте нам знать, если что-то не работает должным образом, и постарайтесь быстро восстановить его работоспособность.task.sd_incident:defaultZ	incidentsu?   Сообщить о сломанном оборудованииu   Сообщите об оборудовании, которое может быть неисправным или сломанным, например разбитый экран компьютера или поврежденный сервер.)ri   typesu+   Логины и учетные записиu<   Запросить доступ администратораuY   Например, если вам нужно администрировать EvaProject.u3   Запрос по электронной почтеuu   Запрос получен от вашего канала поддержки по электронной почте.ztask.sd_emailed_request:default)ri   r   r3   r  r  r  r  u   Очередиqueuez[["parent_id", "=", "z*"], ["cache_status_type", "!=", "CLOSED"]]z!" and cache_status_type != CLOSEDrK   r   r   u   Все обращения)rP   rK   
bql_filterri   zT"], ["responsible", "=", "__G_CURRENT_USER"], ["cache_status_type", "!=", "CLOSED"]]zC" and responsible = "currentUser()" and cache_status_type != CLOSEDu   Назначенные мнеz)"], ["cache_status_type", "=", "CLOSED"]]z " and cache_status_type = CLOSEDu#   Закрытые обращенияu   База знанийknowlage_basereadonly)rP   ri   r   r|   r   u   КатегорииZknowlage_base_categoriesu   Статьиu   Каналыservicedesk_channelsu   Клиентыservicedesk_clientsZanalysis)r   rL   r   r=   r   r>   ZlogginginfoZdataclassesr   r   main_gantt_projectr   r3   rK   ri   r   rJ   CmfStatusCoder   rW   r   tasksr   r8   Ztasks__filter2Ztasks__filter3Ztasks__filter4Ztasks__filter5Ztasks__filter6Ztasks__filter7Ztasks__filter8Zblogr   r   ZdocsZepicsZreleasesZsprintsr   Zroadmapsr*   r   listsr   r  r  r  r   chatr   r   r   r   r   r   Zkanban_boardr   r   rk   r  ZhomepageZdescr_documentZsl_create_examplesZfilters__filter1Zlists__list1CmfComponentZcomponents__component1Z
docs__doc1Zepics__epic1Zreleases__release1Zsprints__sprint1Z
CmfRoadmapZroadmaps__roadmap1rh   r   r   rx   rg   __dict__valuesrm   show_all_tasksrl   rp   rn   	show_blogro   rq   Zshow_filtersrr   rs   Zshow_reportsZ
show_testsrt   	show_docsru   Zshow_components
show_listsshow_active_sprintsZshow_trashcanshow_reqshow_app_learnCmfTaskReportr   choicesZreports__report1report_bql_filterCmfSchemeWfr6   CmfProjectNotifySchemenotify_schemerD   rC   _create_ui_view_form_create_sdesk_request_group_create_sdesk_request_typer  Zqueue__queue1_task_filterZCmfTaskQueueZqueue__queue1Zqueue__queue2_task_filterZqueue__queue2Zqueue__queue3_task_filterZqueue__queue3r  Zknowlage_base__categoriesZknowlage_base__articlesZchannelsZclientsZshow_roadmapsZ
show_epicsZshow_sprintsZshow_releasesZ
show_queueZshow_knowlage_baseZshow_servicedesk_channelsZshow_servicedesk_clients
startswith_create_assign_to_project_create_sdesk_slascaffold_line_chartscaffold_mark)r,   Zlt_pfeedZlt_epicZ	lt_sprintZ
lt_releaseZlt_baser   tgantt_projectZclosed_status_nameZcreate_list_examplesvr   itemZ_ui_form_viewZ_ui_form_createZ_ui_form_view_innerZrequest_groupsr&   r&   r'   scaffoldN  s   










  




  



  


,
D

               

  
zCmfProject.scaffoldc                 C   s~   d}t jj| |dgd}|szt j| d| j dd| j dd}|jd	d
 t j| t jj| ddd|d|d}|jd	d
 d S )Nu6   Оценка качества обслуживанияr.  rK   ri   rR   ["parent_id", "=", "r   r   r   r  Fr   r   TrP   r   r   r  rK   rP   ri   r   r.  )r=   r,  r>   r   r*   r8   rJ   r   )r,   report_namereportr.  r&   r&   r'   r9    s"    zCmfProject.scaffold_markc                 C   s  dddddddddgd	d
dddddddddddgidgd	dddddddddddgd	dddddgdd d!d"dddgd#d d!d$dd%dgd&d d!d'dddgd(d d!d)dd*dgd+d d!gd	d,d-d.dd-ddd.d/ddgd	d0d1ddd2d3gd4d5d!d6dd%d2d3gd6d5d!d7ddd2d3gd7d5d!gd	d8dddd9gdd d!d"ddd9gd#d d!d$dd%d9gd&d d!d'ddd9gd(d d!d)dd*d9gd+d d!gd	g}|D ]}| d:}tjj | |d;gd<}|stj| d=| j d>d?| j d@dA}|jdBdC tj| tjj | dDdEdF|dG|dH}|jdBdC | dI}|D ]p}t }t }	||	_	| d:|	_
| dJ|	_| dK|	_| dL}
|
rtjj | |
dM|	_g }g }|dN| j  |dO| j d> | dPg }|D ]}|dkrdQdRdS || D }|| dT| dU tjjdVdW|| gdX}g }|D ]}||jj qBdY}dQdZdS |D }|d[| d\| d] n|d^krtjj | || dM}|rj|| d_|j d@ |d[| d`|jj d> n|dakr4tjjj}|| d_|||   d@ |d[| d`||  d> n6|| d_||  d@ |d[| d`||  d> qdb|}dcdd| de }||_||_|jdBdC ||	_|	jdBdC qD|jdBdC qd S )fNu`   Анализ SD. Отчет по созданным задачам против решенныхu   СозданоZcreatedz#f15c75)ri   
value_typecoloru   РешенныеZdonez#7bc1a1)ri   rowsu5   Анализ SD. Отчет время решенияu   Все задачиZaveragez#8eb021   Время решения)ri   rE  rF  slau   Инцидентыz#ea632br3   r  )ri   rE  rF  rI  
row_filteru]   Анализ SD. Отчет по выполненным SLA против нарушенныхu   ВыполненоZsd_sla_processedz#14892cu   НарушеноZsd_sla_breachedz#d04437uQ   Анализ SD. Отчет по инцидентам по приоритетамu   Критичныйr      )r3   priority)ri   rE  rF  rJ  u   Высокий   u   Обычныйz#815b3ar   u   Низкийu   Минимальныйz#d39c3fu>   Анализ SD. Отчет по уровню успеха SLA+   Время до первого ответаZsd_sla_compliance_percentz#59afe1uO   Анализ SD. Отчет по запросам на обслуживаниеu3   Все запросы на обслуживаниеr  z'task.sd_service_request_approve:defaultu   Все)r3   request_typer  r  uM   Анализ SD. Отчет по проблемам по приоритетуztask.sd_problem:defaultri   r.  r?  r@  r   r   r   r  Fr   r   TrA  
line_chartrB  rG  rF  rE  rI  rK   ri   z
project = z["parent", "=", "rJ  z, c                 s   s   | ]}d | d V  qdS r   Nr&   .0r<  r&   r&   r'   	<genexpr>  s     z1CmfProject.scaffold_line_chart.<locals>.<genexpr>z in ()r8   rV   r9    c                 s   s   | ]}d | d V  qdS rT  r&   rU  r&   r&   r'   rW    s     z["z
", "IN", [z]]rQ  z = "z	", "=", "rL  z and [z ,])r>   r=   r,  r   r*   r8   rJ   r   ZCmfRepLineChartRowrK   ri   rF  rE  CmfSDeskSlarI  r]   joinr   r   r+   CmfSDeskRequestTyper   rL  r-  r   r   Zrow_bql_filter)r,   rR  ZchartrC  rD  r.  rG  rowZrow_task_filterZ	chart_rowrI  Zubql_filterr  rJ  fieldZvalsZlogic_typesZbql_valsr   rQ  rL  r&   r&   r'   r8    s    



3

!



  N









 
zCmfProject.scaffold_line_chartc                 C   sj   t jj|d}|s$td| dd t  }| j d| j d| |_d|_|jddd |j|d	 |S )
NrB   u3   Отсутствует экранная форма TrH   : r   Fr
  )Zobj_copy)	r=   Z	CmfUiFormr>   rM   task_code_prefixri   Zcmf_model_namerJ   r   )r,   r8   action_nameZui_formZ_ui_formr&   r&   r'   r2  
  s    zCmfProject._create_ui_view_formc                 C   sf   t jjdd}t jjdd}t  }| |_||_|jtj	 |
  t  }| |_||_|
  d S )Nzsdesk-client:defaultrB   zsdesk-agent:default)r=   CmfProjectRoler>   CmfProjectRoleAssignrK   Zproject_rolemembersr]   gcurrent_userrJ   )r,   Zsdesk_clientZsdesk_agentZprr&   r&   r'   r6    s    z$CmfProject._create_assign_to_projectc                 C   sb  t jjdd}t j| ddd}|  t j|ddd|d	}|  t j|d
dd|d	}|  t j|ddd|d	}|  t j|dd d|d	}|  t j|ddd}|  t j|ddd}|  t j|ddd}	|	  t j| ddd}|  t j|ddd|d	}|  t j|d
dd|d	}|  t j|dd d|d	}|  t j|ddd}|  t j|ddd}|  t j|ddd}	|	  t j|ddt jjddd}
|
  t j| ddd}|  t j|ddd |d	}|  t j|d
d d|d	}|  t j|ddd}|  t j|ddd}|  t j|ddt jjd!dd}	|	  t j| d"dd}|  t j|ddd#|d	}|  t j|d
d d|d	}|  t j|ddt jjd$dd}|  t j|ddt jjd!dd}|  t j|ddt jjd%dd}	|	  t j|ddt jjd&dd}
|
  t j|ddt jjd'dd}|  d S )(Nzfulltime:defaultrB   rH  date)rK   ri   Zwidget_type     z+request_type.request_category = 'incidents')rK   rh   Z	goal_timer   calendari  i  z2request_type.request_category = 'service-requests'i  i`	  z7request_type.request_category = 'post-incident-reviews'i  rY  startzissue-created)rK   trigger_typetrigger_conditionzresolution-clearedstopzresolution-setrP  x   zcomment-for-reporterzstatus-type-changedZsd_waiting_for_customer)rK   rn  ro  Ztrigger_condition_status_codeu;   Время закрытия после разрешенияi  zBrequest_type.request_category in ['incidents', 'service-requests']r   u/   Время на проведение ревьюz)request_type.request_category = 'changes'r   Zsd_declinedZsd_implementingZsd_planning)r=   CmfCalendarr>   r\  rJ   ZCmfSDeskSlaGoalZCmfSDeskSlaTriggerr  )r,   Zdefault_calendarrI  Zgoal1Zgoal2Zgoal3Zgoal4Ztrigger1Ztrigger2Ztrigger3Ztrigger4Ztrigger5r&   r&   r'   r7  &  s    













zCmfProject._create_sdesk_slac                 C   sZ   t jjdd| jgdd| jggdr8td| j ddd	 |  rVtd
| j ddd	 d S )Nri   r   r*   r   r9   u   Проект с именем uA    уже существует. Укажите другое имя.TrH   u-   Раздел на диске с именем uF    уже занят. Укажите другое имя проекта.)r=   r   slistri   r*   rM   r   r5   r&   r&   r'   _check_project_dir_conflict  s    "z&CmfProject._check_project_dir_conflictc                 C   sF   ddd|gg}|r"| dd|g | j|drBt| j ddd d S )	NrT   ri   r   r8   r9   u7    с таким именем уже существуетTrH   )r]   r>   rM   Zverbose_name)r"   ri   r8   Z
prj_filterr&   r&   r'   _check_unique  s
    zCmfProject._check_uniquec                    s$   |  || t j|||d|S )N)ri   r8   )ru  r    r   )r"   ri   r8   r   r#   r$   r&   r'   r     s    zCmfProject.createc                 C   s  ddddddddd	d
ddddddddddg}ddg}|D ]}d| }| j | jr8|D ]|}tt| jdd| jgdd|ggd}|s|dkrtt| jdd| jgdddggd}|rV| j | j |_|jdd qVtj	jdd| jgddd | ggd}|r8| j | j |_|jdd q8| j
jrdtjjd!d"| jgd#d"d$ggd}|rd| j
j |_|jdd | jjrtjjd!d"| jgd#d"d%ggd}|r| jj |_|jdd | jjrtjjd!d"| jgd}|r| jj |_|jdd | jjrL| jd&kr tj	jd'd"| gd(d"d)ggd}ntjj| d*}|rL| jj |_|jdd | jjrtjj| d*}|r| jj |_|jdd | jjrtjjd#d"d+gd'd"| ggd}|r| jj |_|jdd | jjrtjjd#d"d,gd'd"| ggd}|r| jj |_|jdd | jjrTtjjd#d"d-gd'd"| ggd}|rT| jj |_|jdd | jjrtjjd#d"d.gd'd"| ggd}|r| jj |_|jdd d S )/NZapprovedr  r  r  r  r!  r   r   r   r   r   r  r   rW   r  r   r  r  r   r   r   CmfActiveEntityFilterr   r   r   r   r9   r   TrF   r   zlist.rU   r   r   r   r   r   rP   zlogic_type.coder   )rP   r   r   r   CmfReq)r#  r;   r\   r=   r>   r*   r+   rx   rJ   r   show_doc_registryr   show_company_registryrq   r   r)  r   r   r'  r   r%  r(  r&  r*  )r,   Z	sys_typesZnode_modelsr   Z	fieldnameZ	nodeclassZsysnoder&   r&   r'   _calc_hidden_nodes  s    

 
 






zCmfProject._calc_hidden_nodesc                    s,   t   ddddddddd	d
dddddg S )NZdefault_list_workflowZdefault_epic_workflowZdefault_subproject_workflowZdefault_release_workflowZdefault_sprint_workflowZdefault_document_workflowr   project_perm_schemer1  rl  r:   rC   cmf_project_adminsrb  rg   )r    save_preload_fieldsr5   r$   r&   r'   r}    s"    zCmfProject.save_preload_fieldsc                 C   sN   | j js| jjrtd | jdkr(d| _| jdkr:d| _n| jdkrJd| _d S )Nu<   Нельзя менять родителя у проектаr	  zCmfWiki:Classrf   zCmfProject:Class)rK   r;   rP   rM   rg   r   rU   r5   r&   r&   r'   _calc_parent  s    


zCmfProject._calc_parentc                 C   s(   | j jsd S tj| j j| jj| _ d S r2   )r   r;   r=   r   Zconfluence_convertr+   r*   r5   r&   r&   r'   
_calc_text"  s    zCmfProject._calc_textc                    s   dd l | sdS t| } dd|  }|d}d t|dkr\ddd |D  n|d d d  tj	j
d	d
gd
d   dgd}tdd |D }t|}  |krt fdd|D dd}|r tt|d 7  n d7    S )Nr   rY  z\W+-rM  c                 S   s   g | ]}|d  qS )r   r&   )rV  chunkr&   r&   r'   
<listcomp>2  s     z3CmfProject.get_prefix_from_name.<locals>.<listcomp>   z--rb  ZILIKE%rR   r   c                 S   s   g | ]}|j  qS r&   )rb  lower)rV  rf   r&   r&   r'   r  <  s     c              
      s8   g | ]0}|   rd d|   dqS )z\DrY  )r5  r  subreplace)rV  pprefixrer&   r'   r  @  s      )default1)r  r   Ztranslit_stripr  r  r   lenr]  r=   r   rs  setr   maxstrintupper)ri   ZslugchunksZprojectsprefixesZexisting_prefixesZmax_prefix_numr&   r  r'   get_prefix_from_name'  s,    

zCmfProject.get_prefix_from_namec                 C   s,  | j js| jjsd S | j jr| j j | _ | j dksT| j dksT| j dksT| j | jkrhtd| j  dd tjj	dd| j
gd	d
| j ggdgdd}|rtd| j  d|j ddd tjj	dd| j  dgdd| ggdgdd}|rtd| j  d|jj d | jr
d S td ttjj| j
jgd d S )NTSKAZ	NOPROJECTuH   Нельзя использовать системный префикс TrH   r*   r   rb  r   ri   )r   rR   include_deletedu   Код u2    уже используется проектом u   . Выберите другойr8   ZLIKEz-%rf   zproject.nameu8    ранее использовался проектом u   . Это может привести к пропускам в нумерации кодов. Если это нежелательно - укажите другой префиксur   Запущен фоновый процесс смены префиксов кодов у задач проекта)r   )rb  r;   Ztask_code_use_logic_type_prefixr+   r  Zcode_prefixrM   r=   r   r>   r*   ri   CmfTaskCodeHistoryrf   is_newschedule_deferred_jobr   Zrecalculate_codes_celery)r,   Zproject_with_prefixZ	code_usedr&   r&   r'   _calc_task_code_prefixI  sF    

z!CmfProject._calc_task_code_prefixc                 C   s   ddl m} | j  || jjp"dddd}dd td	|D d
d }t|dkrh|d d
d }nddd |D }|	 }d}t
jjdd| | gdd| jggdr|sd}|d7 }q| | | _d
S )u  
        Генерируем автоматически Префикс для кода задач для Разделов (там он не очень важен)
        TODO1: возможно, выводить на форме создания разделов поле ввода Префикса
        Важно! Этот метод разрешен только для Разделов!
        r   )translitr  ruT)Zlanguage_codereversedc                 S   s   g | ]}|r|qS r&   r&   rV  cr&   r&   r'   r    s      zACmfProject._calc_task_code_prefix_for_section.<locals>.<listcomp>z(?:\b|_)([A-Za-z0-9]{1,4})Nr  rM  rY  c                 s   s   | ]}|d  V  qdS )r   Nr&   r  r&   r&   r'   rW    s     z@CmfProject._calc_task_code_prefix_for_section.<locals>.<genexpr>rb  r   r*   r   r9   )Ztransliterater  ri   rL   r+   r  findallr  r]  r  r=   r   sgetr*   rb  )r,   r  r8   Z	code_listir&   r&   r'   "_calc_task_code_prefix_for_sectionw  s     

z-CmfProject._calc_task_code_prefix_for_sectionc                 C   s\   |j dds |rtddd dS | j}| jjr<| js<| jj}||krX|rTtddd dS dS )NProjectAdminsZ
group_codeu   Для редактирования параметров проекта Вам необходимо находиться в группе Администраторы проектовTrH   Fu   Для редактирования параметров проекта Вам необходимо быть Администратором проекта)in_person_grouprM   r|  r;   r  r?   )r,   personZraise_exceptionr|  r&   r&   r'   is_project_admin  s"    zCmfProject.is_project_adminc                 C   sb   | j s
d S tjj| dd}|s4tj| dd}|  tjj| dd}|s^tj| dd}|  d S )NZwhite)rK   r   Zblack)r  r=   ZCmfEmailListr>   rJ   )r,   ZwlZblr&   r&   r'   _calc_white_black_lists  s    z"CmfProject._calc_white_black_listsc                 C   s4   | j s0| jjr0| jr0tjj| dd}|s0|   d S )Nr   r   )r  r+  r;   r=   r   r  r   )r,   r   r&   r&   r'   _calc_structure_scaffold  s    z#CmfProject._calc_structure_scaffoldc              
      sZ  | j r4tjjs4tjs4tjs4tjjdds4tddd | j rH| j	tj | j sV| jj
rtjjdddgd	}|j }| jjD ]x^}}}|d
kr|||kr|t  |j	| |  W 5 Q R X |tjkrtj|jj |jdds|td| d q|| j r|tjjdd| jgdd| jggd	}|r>td| j ddd n>|  r|| |  }	|	jr||	d| j dt  d d}
| jj
r| !dg | jstd | "  | jj#r| | jj#r| | | jj#}||   | j$rd| j | j$_| j$jdd | j r,| js(| j%| _d}
| j s<| &  | j'sr| j(dkrbtj)jdd| _'ntj)jdd| _'| j*stj+jdd| _*| j,stj-jdd}|stj-jdd}|| _,| .  | /  | j0s| j1d kr| 2  ntd!dd | 3  | 4  | 5  | 6  t7 j||}| j sf| j'j
sf| j8j
sf| j9j
sf| j:j
sf| j;j
sf| j<j
rptj)=  | >  |d"drd}
|
r| ?  | j@j
r| A  | jBj
r| jBr| C  | jDj
r| jDr| E  | jFj
r| jFr| G  | j s
| j*j
rtj+=  tjHjId#d$d%d&ggd#gd'}|D ]}d%|_J|jdd q4| K  |S )(NZProjectCreatorsr  u   Для создания проектов попросите Администратора системы добавить Вас в группу Создатели проектовTrH   r8   r   r  r9   r]   u   Пользователь uO    добавлен в группу Администраторы проектовri   r*   r      Проект     уже существуетr   _%Y-%m-%d-%H%M%SFr  <   Имя проекта не может быть пустым.r   rF   r  servicedesk:defaultrB   system.open:defaultsystem:default)Z
is_defaultr	  u8   Укажите Префикс для кода задачdont_scaffoldonboarding_statusr   r   cancelrQ   )Lr  rg  rh  Zis_admindisable_permissionsacl_admin_moder  rM   r|  r]   r;   r=   CmfPersonGroupr>   Z
rg_membersZ
all_nestedZ_changesr   Zdisable_aclrJ   Zcurrent_person__member_ofaddr*   r+   r   ri   r   r   r   r   renamer   nowr   rt  r?   r  r8   rz  r{  r   CmfProjectPermSchemer1  r0  rl  rr  r  rN   rb  rg   r  r  rA   rE   r.   r    Zservicedesk_publicrk   rv   
spectatorsr  Ztrigger_reloadr  r>  r   r   rx  r   ry  r   r*  scaffold_req_registry
CmfLicenser   r  r  )r,   r   r#   Zproject_admins_groupZproject_admins_group_membersZchange_actionZpr_adminr  r   project_dir_rfileshould_be_scaffolded	old_rfilerl  resultonboardings
onboardingr$   r&   r'   rJ     s    


"


	


zCmfProject.savec           
         s<  | j r~tjjdd| jgdd| jggd}|rDtd| j ddd	 n:|  r~| | 	 }|j
r~|d
| j dt d | jjrtj| jjdgd| _| jjrtj| jjdgd| _d}| jjr| jstd |   | jjr| | jjr| | 	| jj}|| 	  | j r6| js2| j| _d}| j sF|   | js|| jdkrltjjdd| _ntjjdd| _| jstjjdd| _|   |   | js| j dkr| !  n| "| jj| _| #  | $  t% j&||}|r| '  tj(j)ddddggdgd}|D ]}	d|	_*|	j+dd q|S )Nri   r   r*   r   r9   r  r  TrH   r   r  r  Zdiv)Ztags_extendFr  r  r  rB   r  r  r	  r  r   r   r  rQ   rF   ),r  r=   r   r>   ri   r*   rM   r   r   r   r   r  r   r  document_header_textr;   r   Z
html_cleanr+   document_footer_textrt  r?   r8   rz  r{  r   r  r1  r0  r  rN   rb  rg   r  r  r  rA   r    _save_importr>  r  r   r  rJ   )
r,   r   r#   r   r  r  r  r  r  r  r$   r&   r'   r  C  s`    "

zCmfProject._save_importc                 C   s.  t t|dd }|j|dddgd}|jr\|drJ|jjd|d	 qd|jjd
|d	 n|  |ozt t|dd }|o|j|dgd}|r|jj	pd}|ot t|dd }	|	o|	j|dgd}
|
r|
jj	pd}|r|r|t
|| d  |_n"|r|d |_n|r|d |_|jdd d S )Nr   r   rh   rf   rK   r*   rR   zCmfTask:zPPP-TSK-ORDERra   zPPP-OBJ-ORDERrK  rj  TrF   )r   r=   r   r>   rf   r5  r   check_edit_permrh   r+   r  rJ   )r"   Zitem_idZ	anchor_idZnext_idZ
item_modelr=  Zanchor_modelanchorZanchor_ordernoZ
next_modelZ	next_itemZnext_ordernor&   r&   r'   r     s(    

zCmfProject.move_itemc                 C   s   d S r2   r&   r5   r&   r&   r'   
_calc_code  s    zCmfProject._calc_codec                 C   s   d S r2   r&   r5   r&   r&   r'   get_code_prefix  s    zCmfProject.get_code_prefixF)	recursiveTEXKOM_db_deletec                   s(  | j  r,|s,tdtj dt  ddd | jj}|rd | _| j	dd dD ]f}t
t| jdd	| gddd
D ]B}td|  t
t| j|jdddrr|jddd t  qrqPtjj| dddD ]"}td|  |jddd qtjj| dddD ]$}	td|	  |	jddd q tjj| dddD ]$}
td|
  |
jddd q8tjjdd	| jgdd id tjjdd	| jgdd id tjjdd| jggddd
D ].}td|  |j|  |j	dd qt j|||ddd|}| |r$tj|}|r$|   |S )Nu   Данный проект был импортирован из внешней системы. Удаление импортированных проектов доступно через <a href="u@  " target="_blank">службу технической поддержки</a>.<br />Если Вам необходимо обновить данные проекта, пожалуйста, воспользуйтесь процедурой повторного импорта проектов через меню <a href="u"   settings/import">Импорт</a>.TrH   rF   )r"  r   re  ZCmfAttachmentZCmfImportDownloadr   r   ZCmfTransr   r   r/  r  rd  r   Z	CmfPersonr  r   ZCmfTaskFilterr,  r   r   rK   r   )r   r  include_systemu   Удаляем )r*   r  r  )r  force)rf   r  r  r(   )r   r$  r/   rV   u   Удаляем из кеша F)r  r  r  r   )!
cmf_importrL   rM   ZconfigZSUPPORT_URLZapp_base_hrefri   r+   r  rJ   r\   r=   r   rg  debugr  r*   r   Zcommit_with_eventZCmfGanttTaskr  ZCmfDocumentHistoryZCmfAccessRuleZbulk_updateZCmfAccessListZCmfCustFieldConfr/   r   r    r   r   r>   Zmove_to_trash)r,   r  r  r   r#   Zcur_nameZcls_namer_  Z
gantt_taskZ	task_codeZdoc_historyZcust_field_confr   r   r$   r&   r'   r     sb    
"

 zCmfProject.deletec                    s8   t  jf ddi|}tj| jj|   |   |S )Nr  T)	r    restorer=   r   Zrestore_from_trashri   r+   r   r   )r,   r#   r   r$   r&   r'   r    s    zCmfProject.restorec                 C   sT   t jtjd}|tdd7 }tjjdd| jgdd|gdd	d
gddd ggdgd}|S )N)Ztz   )Zhoursr   r   plan_start_date<r   r   ZCLOSED
alarm_dater	   rQ   )	r   r  r   Zutcr   r=   r   r   r*   )r,   r  r  r&   r&   r'   _list_tasks_need_to_start  s    
z$CmfProject._list_tasks_need_to_startc              	   C   s^   | j r
d S |  }|sd S td| jjj  tjj| jd| d| j d| j j	 ddd d S )Nu&   Отправляем карточку u   Рекомендацияu   
            В проекте u(   есть задачи с планом, но без будильника.
            Назначьте будильник, или список с планом,
            чтобы задачи появились у исполнителя в ленте.
            (сброшен флаг "z")
            rK  )r  ri   ra   msgrL  )
auto_alarm_dater  printrk   ri   r+   r=   	CmfNotifyplace_notifyZcaption)r,   r  r&   r&   r'   '_notify_project_owner_not_planned_tasks	  s"    z2CmfProject._notify_project_owner_not_planned_tasksz@daily)	only_onceZ
system_jobZschedulec                  C   s:   t jjddD ]&} |  }|D ]}|j|_|  qqd S )NT)r  )r=   r   r   r  r  r  rJ   )rf   r  taskr&   r&   r'   cron_auto_alarm_date&	  s
    zCmfProject.cron_auto_alarm_datec                  C   s"   t jjdgdD ]} |   qdS )u   DEPRICATED есть две реализации механизма штатными средствами через подписку на фильтры или через крон в автоматизациях
        **rS   N)r=   r   r   r  rf   r&   r&   r'   &notify_project_owner_not_planned_tasks0	  s    z1CmfProject.notify_project_owner_not_planned_tasks)	task_tagsc           
      C   s  |sdS dd |D }t jj| jdd}t jj| jdd}|rB|sFdS dd t jj|jdD }t jjd	d
gdd| jgdddggdD ]}|jj|kr||jj}|j	
 r
||j	jj}|st j| ||j	jd }|||j	jj< |j|jkr&|j|_|  q|j|jkr|j|_|  q| D ]\}	}|j	
 rt|  d| d|j	  ||j	jj}|st j| ||j	jdjdd}|||j	jj< t j|d|j d| |d}|  n8t|  d|  t j|d|j d| |d}|  q0dS )u   
        Вызывается если у задачи проекта изменяются тэги.
        Если появился тэг, для которого нет фильтра - создадим его.
        TODO
        Nc                 S   s   i | ]}|j j|qS r&   )r*   r+   )rV  tagr&   r&   r'   
<dictcomp>A	  s      z5CmfProject.hook_task_tags_changed.<locals>.<dictcomp>r   )r   r   r   c                 S   s   i | ]}|j j|qS r&   )ri   r+   rV  r   r&   r&   r'   r  F	  s    rY   filter_tag_idrU   r   r   r   r  r  )rK   rP   ri   z: Create new filter for z with category Fr   #)rP   ri   r   r   Z
filter_tag)r=   r   r>   r*   r   rv  r  r+   r   Ztag_categoryrL   ri   rJ   rU   itemsrg  r  )
r,   r  Ztask_tags_id_dictZtasks_filterZtags_folderZcategory_foldersZ	ae_filterr  Zcategory_folderZtag_idr&   r&   r'   hook_task_tags_changed8	  sz    
  


   
  
 
   z!CmfProject.hook_task_tags_changedc                 C   s   d S r2   r&   )r"   r  r&   r&   r'   hook_new_tagv	  s    zCmfProject.hook_new_tagc                 C   s   dS )NTr&   r5   r&   r&   r'   has_tree_nodes_hookz	  s    zCmfProject.has_tree_nodes_hookc                 O   s   d S r2   r&   )r"   r   r#   r&   r&   r'   public_list}	  s    zCmfProject.public_listc              $   O   s   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"d#g$}||d$< t jj||}|sjd S z|  W n tk
r   Y d S X |S )%Nr*   ri   r8   rj   rv   Zactivity_idr   r3   zworkflow.namerk   cmf_created_atrg   rb  descriptionry   rz   r{   r|   r}   r~   r   Zpublic_html_schemer  r  z*public_html_scheme.header_background_colorz$public_html_scheme.header_text_colorz+public_html_scheme.content_background_colorz%public_html_scheme.content_text_colorz*public_html_scheme.footer_background_colorz$public_html_scheme.footer_text_colorz+public_html_scheme.sidebar_background_colorz%public_html_scheme.sidebar_text_colorzpublic_html_scheme.footer_textzpublic_html_scheme.custom_csszpublic_html_scheme.custom_jsrR   )r=   r   r>   Z_acl_check_readZCmfPermissionError)r"   r   r#   Zfields_to_returnrf   r&   r&   r'   
public_get	  s\    'zCmfProject.public_getc                 O   s   t jj| f||S r2   )r=   r  r   )r,   r   r#   r&   r&   r'   r   	  s    z$CmfProject.check_project_role_accessc                 C   sD  | j s| jsd S | j rd S | jr@t }| jddD ]6}|j|  kr4|jds4|jds4||j q4dD ]^}||krp|	| t
jspt
jrqp| d| g t| d| rtddd | t
j qpd	D ]V}||kr|	| t
jst
jrqt| |}|jr|jstd
dd | t
j q|r@| jd| d d S )NT)r;   Zcache__id)r|  r6   r1  Zsecurity_level_schemerC   r{  Z
protected_uv   Поле защищено от изменения, обратитесь к Администратору системыrH   )Zprotected_cmf_project_adminsZprotected_scheme_wfZprotected_notify_schemeZprotected_security_level_schemeZprotected_ui_form_schemeZprotected_project_perm_schemeu   Для снятия защиты изменения поля, обратитесь к Администратору системыzPPP-PR-ADMINr  )r  r;   r  r$  r_   Zproject_perm_allow_fieldsr5  endswithr  r   rg  r  r  r   r   rM   r  rh  r?   r@   r   )r,   Zchanged_fields_to_checkr`  Zadmin_require_fieldfr&   r&   r'   r  	  sD    




zCmfProject.check_edit_permc                    s
   t   S r2   )r    check_delete_permr5   r$   r&   r'   r  	  s    zCmfProject.check_delete_permc                 C   s   |D ]~}t  }| |_|d|_|jdd |dD ]H}| j|d|d|d|d||d|d	|d
d q8qd S )Nri   Fr   r  r   r3   r  r  r  r  )ri   r   r3   r  groupr  r  r  )r=   ZCmfSDeskRequestGrouprK   r>   ri   rJ   r4  )r,   groupsr  request_grouprQ  r&   r&   r'   r3  	  s     z&CmfProject._create_sdesk_request_groupc	           
      C   s`   t  }	| |	_||	_||	_||	_||	_||	_||	_|d k	r@||	_	|d k	rT|	j
| |	  d S r2   )r=   r^  rK   ri   r   r3   r  r  r  Zrequest_categoryr  r]   rJ   )
r,   ri   r   r3   r  r  r  r  r  rQ  r&   r&   r'   r4  	
  s    z%CmfProject._create_sdesk_request_typec                 C   s   | j  d| j d| j S r   )Z	ui_moduleZui_namer8   r5   r&   r&   r'   href
  s    zCmfProject.hrefc                    sD   ddl m} t  }t|dkr@|d d  d||d }|S )Nr   )cmf_hashlib      r  r  )cmf.utilr  r    gen_coder  Zshort_str_enc)r,   r  Zres_coder$   r&   r'   r  !
  s
    
zCmfProject.gen_codec                 K   s   |s| j d }tj|d}d}| jddD ]F}|j|ks*|jds*|jds*t|tj	j
r`q*t||j|j q*| D ]\}}||j	krzt||| qz|S )N    Копияr   )%attachmentschat_groupscmf_archivedr  Zcmf_deletedr  Zcmf_locked_atZcmf_locked_byZcmf_modified_atZcmf_modified_byZcmf_viewed_atr8   Zcommentsr   Z	documentsZext_idZfavorite_forrw   r*   Zimport_originalZimport_raw_jsonZlocal_linksZlocal_links_docs_inZlocal_links_tasks_inri   rz   r  r   Zstatus_closed_atZstatus_in_progress_endZstatus_in_progress_startZstatus_modified_atZstatus_review_atrb  r  r   Ztask_filtersT)Z
is_definedr  Zperm_)ri   r=   r   r$  r_   r  r5  r   ZcmfrR   Z
CmfBackrefsetattrr+   r  )r,   ri   r#   new_projectZskip_fieldsr`  attrr+   r&   r&   r'   clone)
  s&    
	


zCmfProject.clonec              
   K   s   |rdt jj| ddks(t jj| ddkrdtf t| j|||||tjjj	d|}t
| j|d | S | jf |||||d|S )Nr   2   )proj_idri   r8   rb  structure_copy	full_copynotify_person_idr#   ri   r8   rb  r  r  )r=   r   countr   r[   r  r*   rg  Zcurrent_personr+   r  create_from_template_jobdo_create_from_template)r,   ri   r8   rb  r  r  r#   Z
job_kwargsr&   r&   r'   r   G
  s(    $     zCmfProject.create_from_templateu3   Создание проекта по шаблону)r  r  show_bg_progressbarc              
   K   s   z:t j| dgd}|j|||||d}	d|	j d}
d}W nh tk
r } zJt  t j| d}	d|	 }
| d	t  }tj	d
t  dd W 5 d }~X Y nX t
jj|	||
|ddd d S )Nr	   r  r  u   Проект "u   " успешно созданu-   Создан проект по шаблонуr*   uA   Ошибка создания проекта по шаблону ra  uB   Ошибка создания проекта по шаблону: T)r  rM  )ra   r  ri   r  Zforce_notify_current_personrL  )r   r>   r  ri   rZ   Zrollback_purge_event	traceback
format_excrg  r  r=   r  r  )r  ri   r  r8   rb  r  r  r0   rf   r  Znotify_nameZ
notify_msger&   r&   r'   r  S
  s,    
 
*z#CmfProject.create_from_template_jobc                    sT  dd   fdddd } fdd}d	d
  fdd|rJd}t jj| jdgd}	g |	_g |	_|	j|pz|	jd ||| d}
|
jdd|d |r|
|
t	|	j
d |r||
|	d ||
d |	jrt jj|
|	jjd|
_|
jdddd |
jsPt  }t jjdd|_|
|_d|
j |_d|_|jddd ||
_|
jddd |
S )Nc                 S   s,   |    |   |   |   |   d S r2   )Z_calc_perm_parentZ_calc_perm_inherit_acl_idZ_calc_perm_has_aclZ_calc_perm_aclZ_calc_perm_effective_aclr  r&   r&   r'   	_calc_acln
  s
    z5CmfProject.do_create_from_template.<locals>._calc_aclc                    s   |D ]}t |tjtjtjtjfr$q|dg |j|jdd}||_	| |_
| |_|j|_ | t|dddkrtj| d}|jddd ||_|jdddd	 | |t|j qd S )
Nr   T)ri   copy_attachmentsr   Fr   r   r   emit)Znoitfyr   rG   )r   r=   rv  r   r   r   r   r   ri   rP   rK   rf   r   r   rJ   r   r   r   )r  
new_parentorig_childrenZ
orig_child	new_childr   )r  _copy_tree_nodesr&   r'   r$  u
  s$    z<CmfProject.do_create_from_template.<locals>._copy_tree_nodesc                 S   sf   t jjdd| gdgdD ]H}t jj|jjdgdD ],}t jj|jd}|j	|j
j|j|jd}q2qd S )	Nrf   r   cloned_fromrQ   r  )out_linkrR   )r%  )r&  in_link)r=   r   rs  ZCmfRelationOptionr   r%  r*   r  r'  r   ri   r+   )rf   r  relZin_taskZnew_relr&   r&   r'   _copy_relation_options
  s    zBCmfProject.do_create_from_template.<locals>._copy_relation_optionsc                    s@  dd t jj| ddD }|dd t jj| ddD  |j }|dg || }d| j |_d |_	|j
ddd	 |  |j
ddd	 || _| j
ddd	 t jj|dd
ddddd
dddddgd}i }g }|D ]}||krqڈ|| d}	|j|j|j|jd}
|
 D ]Z\}}|D ]J}|j|kr4q t|	|| t|	|||j d|jj   q q|	jr||	jjj d|	jjj  |	_d |	_|	j	 }|	j	j|_|	j	j|_| |_d |_d|_d|_ d|_!d|_"d |_#d |_$t%d|_&t%d|_'g |	_(g |	_)|	j
dddd |	js4|	   |	 |	|_*|j
ddd	 |j(|	_(|j)|	_)||	_	|	j
dddd |	j+dkr|	||j,< q||	 q|t|-  D ]}|jr|j|kr||_n*|.|jj,d }|rt jj.|j/jd|_|0  |   |	 |j
dddd |j|j	_|j	j
dd q| || d S )Nc                 S   s"   i | ]}|j  d |jj |qS r   r_   ri   r+   )rV  lstr&   r&   r'   r  
  s      zKCmfProject.do_create_from_template.<locals>._copy_tasks.<locals>.<dictcomp>T)rK   Zinclude_archivedc                 S   s"   i | ]}|j  d |jj |qS r*  r+  )rV  compr&   r&   r'   r  
  s      ***r   Fr   r   zlists.parentzattachments.urlzfix_versions.parentzaffected_versions.parentzcomponents.parentzop_gantt_task.projectzop_gantt_task.cmf_authorzop_gantt_task.cmf_ownerzop_gantt_task.*rK   rR   )r  r!  )r   fix_versionsaffected_versionsr   r   r   z0.00r   r   rG   	task.epicztask.subprojectr  )r   r   rG   rF   )1r=   r   r   updater"  r  rL   r   ri   op_gantt_taskrJ   Z_calc_gantt_taskr   r   r1  r2  r   r  rK   r   r   r]   r_   r+   Z	main_listr;  r  rk   r  rf   Zparent_taskZactual_workZactual_durationZactual_completeZactual_myself_workZactual_start_dateZactual_finish_dater   Zactual_costZactual_myself_costr  r  r  r   r8   r$  r>   r*   Z_calc_gantt_path)r  orig_projectnew_project_params_dictZorig_main_gantt_projectnew_main_gantt_projectZ
orig_tasksZparent_tasksr  Z	orig_tasknew_taskZparams_listsZ
param_namer,  r=  r7  r  Znew_parent_task)r  
_copy_task_copy_task_filtersr&   r'   _copy_tasks
  s    


     
, 





z7CmfProject.do_create_from_template.<locals>._copy_tasksc                 S   sb   |   }| j|_| j|_||_||_|jdkrDtjj| j	j
|d|_	| |_| jr^| | |S )Nr4  ri   rK   )r  rk   r  rK   rf   r   r=   r   r>   rP   ri   r  r8   r  r  )r  r!  r;  r&   r&   r'   r<  
  s    


z6CmfProject.do_create_from_template.<locals>._copy_taskc           	         s  dd| g}| dd tjj|dD  dd| g}| dd tjj|dD  ddd| gddd	gg}| d
d tjj|dD  tjj|dgd}|D ]d}| }| |_| |_	|j
r|j
|kr| |_
ntjj|j
j| d|_
| g|_ | |jddd qd S )NrK   r   c                 S   s"   i | ]}|j  d |jj |qS r*  r+  r  r&   r&   r'   r  
  s     zRCmfProject.do_create_from_template.<locals>._copy_task_filters.<locals>.<dictcomp>r9   c                 S   s"   i | ]}|j  d |jj |qS r*  r+  )rV  docr&   r&   r'   r    s     ZANDr   r5  c                 S   s"   i | ]}|j  d |jj |qS r*  r+  )rV  r   r&   r&   r'   r    s     r.  r0  r?  Fr  )r6  r=   r   r   r   r   r   r  rf   rK   rP   r>   ri   Zft_projectsrJ   )	r  r8  r9  Z_folder_filterZ_doc_filterZ_epics_filterZorig_project_task_filtersZorig_task_filterZnew_task_filter)r  r&   r'   r=    s>    






	z>CmfProject.do_create_from_template.<locals>._copy_task_filtersTr.  r  r  )ri   r8   rb  r%  F)r   r   r  )r  r!  r"  )r  r8  r  rS  r3  r   rB   r   r/  )r=   r   r>   r*   Zchat_topicsr  r  ri   rJ   r   r   r   r   r  r   r   r3   rK   r   )r,   ri   r8   rb  r  r  r#   r)  r>  r8  r  r:  r&   )r  r<  r=  r$  r'   r  l
  sL    a/
z"CmfProject.do_create_from_templateobj_id)r  only_once_argsz
str | None)rA  c                 C   sH   t jj| d}|jddd}t jj| dd}|D ]}|jddd q0|S )Nr  T)Zskip_tree_mover   Fr(   r	  )r=   r   r>   r  r   r   rA  rf   r   r  r  r&   r&   r'   r   ]  s    zCmfProject.archive_projectc                 C   s<   t jj| d}| }t jj| dd}|D ]}|  q*|S )Nr  TrC  )r=   r   r>   Zarchive_restorer   r   rD  r&   r&   r'   r   j  s    
z"CmfProject.archive_restore_projectu   Удаление проекта)r  r  r  rB  c                 C   s   t jj| dd}|  d S )NTr*   r  )r=   r   r>   r   rA  rf   r&   r&   r'   
job_deletex  s    zCmfProject.job_deletec                 C   s4   t jj| d}|jddd tt jjd| id |S )Nr  TF)r  r  rA  r  )r=   r   r>   r   r  rG  rF  r&   r&   r'   r     s    zCmfProject.delete_projectu)   Востановление проектаc                 C   s   t jj| dd}|jddS )NTrE  )r  )r=   r   r>   r  rF  r&   r&   r'   r     s    zCmfProject.restore_projectz@hourlyc                  O   s$   t jjdd}|D ]}|  qd S )NT)r   )r=   r   r   r   )_argsr0   Zproject_listrf   r&   r&   r'   $celery_hourly_sync_rdisk_folder_hook  s    z/CmfProject.celery_hourly_sync_rdisk_folder_hookc                 C   s>   t jj| | dd}|rd S t j| | dddd}|jdd d S )Nrw  r   u   ТребованияTr   Fr   r   )r,   Zreq_registryr&   r&   r'   r    s    z CmfProject.scaffold_req_registry)NNN)NN)rf   N)N)r   T)r   r   )N)N)N)NN)T)NN)NNNNN)N)NNNFF)NNNFF)N)N)N)b__name__
__module____qualname__modulesrf   rR   cmf_projectr   Zapi_methodsr   classmethodr!   r.   staticmethodZon_server_eventr1   r4   r7   rA   rE   rN   r   r   r`   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r>  r9  r8  r2  r6  r7  rt  ru  r   rz  r}  r~  r  r  r  r  r  r  r  rJ   r  r   r  r  r   r  r  r  Zcmf_deferred_jobr  r  r   r  r  r  r  r  r   r  r  r3  r4  propertyr   r  r  r   r  r  r   r   r  rG  r   r   rI  r  __classcell__r&   r&   r$   r'   r      s*   :&

%N

<

       "f
d
!.
 
> L
>


47    


    
    
 r	r   )r   r   r   r   decimalr   rl  r   Z&common.models.cmf_plugin_convert_mixinr   Zcmf.includeZ"modules.project.fields.cmf_projectrM  Zcommon.models.cmf_active_entityr
   r  r   rf   rR   rN  r   r&   r&   r&   r'   <module>   s   