U
    g                    @   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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)
monthrange)CmfPluginConvertMixin)*N)CmfActiveEntity)cmfutilc                       s  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d1d2 Zd3d4 Zd5d6 Zdd7d8Zed9d: Zd;d< Z d=d> Z!dd?d@Z"e
d#ddA fdBdC
Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*e
dRdS Z+e
d fdTdU	Z,dVdW Z- fdXdYZ.dZd[ Z/d\d] Z0ed^d_ Z1d`da Z2dbdc Z3ddddeZ4dfdg Z5 fdhdiZ6 fdjdkZ7e
ddldmZ8dndo Z9dpdq Z:d.drds fdtdu
Z; fdvdwZ<dxdy Z=dzd{ Z>ee?d.d.d|d}d~d Z@edd ZAeBdddZCe
dd ZDdd ZEe
dd ZFe
dd ZGdd ZHdd ZI fddZJdd ZKdddZLeMdd ZN fddZOdddZPddddrdrdddZQee?d.dgddddddZRee?d.dgddddddZSee?dd.d.dgdeTdddZUeeTdddZVee?dd.d.dgddddddZWee?d.d.dd}dd ZX  ZYS )
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_change2   s    zCmfProject.on_project_changec                    s   | j r
d S t   d S N)
logic_typer   _calc_logic_typer+   r#   r%   r&   r3   8   s    zCmfProject._calc_logic_typec                    s   | j r
d S t   d S r1   )	scheme_wfr   _calc_scheme_wfr4   r#   r%   r&   r6   =   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getr2   r7   oldZ
cache_hooknewr4   r%   r%   r&   _calc_cust_field_conf_schemeC   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r7   )ui_form_schemer:   r;   r<   CmfUiFormSchemer=   r4   r%   r%   r&   _calc_ui_form_schemeN   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_alertr4   r%   r%   r&   _calc_default_listV   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rQ   ORtree_parent_idINr)   T)filtersfilter_projectrT   )	Exceptiondictvarsr<   r=   appendr)   r*   rO   rK   _get_node_models
class_name_get_tree_dataZ_create_tree)r!   Z	obj_modelZ
obj_filterrV   rT   r"   objrJ   Z
parents_idZparent_filtermodel
model_namemodel_filter	tree_datar%   r%   r&   r   c   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 )NrN   rS   rT   r   r)   rV   )rY   rZ   r]   r^   r=   r   r   )	r!   rT   project_typerV   r"   Zparent_filtra   rb   rc   r#   r%   r&   r      s      

zCmfProject.get_tree_leaf)rQ   rV   rf   rW   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 )!NrN   ordernonamecmf_owner_id	cmf_ownerrf   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   rQ   Zorder_bysys_type=rP   )	rY   r=   popr<   r   listr[   CmfListZtree_fields)r!   rQ   rV   rf   rW   argsr"   Zproject_filterZproject_fieldsrd   rb   ra   rc   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 )NrN   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_Trp   )
r   
tree_nodesr*   rQ   getattrr~   remove
isinstancer<   CmfChatGroup)re   noder%   r%   r&   hide_project_parts   s"    


z5CmfProject._get_tree_root.<locals>.hide_project_partstagsc                 S   s   | j S r1   rh   )r   r%   r%   r&   <lambda>       z+CmfProject._get_tree_root.<locals>.<lambda>)key:r   r   )rY   r=   r<   	CmfFolderr^   r~   r   r*   sortsplitr)   hasattrr   r   )r!   rd   rT   r   folderr`   re   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)rJ   r~   u   КорзинаT)rO   rh   r~   systemrw   Fnotify)r<   r   r=   rI   )r+   r   r%   r%   r&   scaffold_trashcan   s        zCmfProject.scaffold_trashcan   Активные спринтыTc                 C   sj   d}t 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]]]    Фильтр для доски "" re   )rJ   rh   
view_scopeft_add_ubqlFr   zboard.scrum:defaultzboard.simple:default)project.agileproject.simple-boardrO   rh   r2   kanban_filterr   )r<   CmfTaskFilterr7   rI   r=   logic_prefixCmfKanbanBoard)r+   rh   r   r   Zactive_sprints_filterZlt_mapltZactive_sprints_boardr%   r%   r&   scaffold_active_sprints   s*    z"CmfProject.scaffold_active_sprintsc                 C   sj   t j| d| j d| j dd| j dd| j dd}|jd	d
 t j| dd|dd}|jdd	d |S )Nr   r   re   project = ""z["project.id", "=", ""])rJ   rh   r   ubql2bqlFr   u   Доска Kanbanzboard.kanban:defaultTr   )Zis_scaffold_kanban_boardr   )r<   r   rh   r7   r)   rI   r   )r+   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rJ   Fr   ZBacklogbacklogT)rO   rh   r~   
tmp_filterfilter_parentr   )r<   r   rI   r   )r+   r   r"   backlog_filterr   r%   r%   r&   scaffold_backlog2  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:defaultrA   u   Простая доскаu)   Простая доска проекта r   T)rO   rh   text	list_typeZui_view_formr2   r   Fr   ztask.base:defaultu*   БП Задач Простой доски )rh   templateZhiddenZworkflowr   r7   NOT INopenZin_progress	in_reviewr   r8   )r<   CmfLogicTyper=   r   rh   rI   CmfWorkflowr7   	CmfStatusr   deletedefault_task_workflow)	r+   r   r"   Zlt_boardZsimple_boardr   ZwfZunneeded_statusesstatusr%   r%   r&   scaffold_simple_boardA  s8    
	
z CmfProject.scaffold_simple_boardc                 C   s   |s
| j }d| S N/r   r+   rh   r%   r%   r&   project_dirf  s    zCmfProject.project_dirc                 C   s   t jjj }|| S r1   )r<   CmfRFileZdpZdata_driverZget_rdZ	get_rfile)pathrdiskr%   r%   r&   
_get_rfilek  s    zCmfProject._get_rfilec                 C   s   |  |  jdddd dS )u   Создадим папку проекта, если её нет. Может так же нужно проверять "Документы"? T)is_direxist_okparentsN)r   r   creater4   r%   r%   r&   ensure_project_dirq  s    zCmfProject.ensure_project_dirc                 C   s   | j s&|  r"| |  }d|_d S |  s6|   | jrLd| jj }nd}|d7 }| jdgdD ]}|d|j d7 }qf|d	7 }| |  }||_d S )
Nz(owner: null
rules:
- all deny read,writezowner: zowner: nullz
rules:loginrR   z
- z allow read,writez
- all deny read,write)	rdisk_enabledis_project_dir_existr   r   perm_strr   rj   r   Zall_relation_persons)r+   Z	dir_rfiler   userr%   r%   r&   _sync_rdisk_folderu  s"    zCmfProject._sync_rdisk_folderc                 C   s   |s
| j }| | |jS r1   )rh   r   r   existsr   r%   r%   r&   r     s    zCmfProject.is_project_dir_existrf   rV   c                   sB   t dd S t jf ||d|}|D ]}|  |  q(|S )NrN   r   )rY   rZ   r   r   r   r   )r!   rf   rV   r   r"   resre   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rB| 5 |_6n"| j4dHkrZ| 7 |_6n
| 8 |_6tj"| dI| j | j9| j:dJ|_;|j;| _<| j=rTtj|jdKd| j dLd|_>| j4dMk}
|
rtj,|j+dNdO|_?tj@|j!dPdO|_Atj"|j#dQdO|_B|
r@tj| |j$dR|dS|_Ctj,|j%dTdU|dV|_Dtj,|j&dWdX|dV|_EtjF|j(dYddZ|_Gd[|j6_Hd\|j(_Hd]|j*_Hd^|j_Hd_|j_Hd`|j!_Hda|j#_Hdb|j$_Hdc|j&_Hdd|j%_Hde|j+_Hdf|j'_Hdg|j-_Hdh|j._Hdi|j/_Hdj|j3_Hdk|j1_Hdl|j _H| j4dmkrd|j6_Id|j(_Id|j*_Id|j_Id|j!_Id|j$_Id|j&_Id|j%_Id|j'_Id|j._Id|j/_Id|j3_Id|j1_Id|j-_Id|j_I|jJK D ]}|jdd qrd| _Ld| _Md| _Nd| _Od| _Pd| _Qd| _Rd| _Sd| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^| jdddn | j4dokrJd|j._Id|j/_Id|j1_Id|j3_Id|j-_I|jJK D ]}|jdd qDd| _Md| _Ld| _Nd| _Od| _Pd| _Qd| _Rd| _Sd| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^| jdddn tj_j`ja}|D ]b}|dpkrqtj_|| |j'|dq|_bdr|jJkr&|j>|jb_c|dskr8d|jb_|jbjdd q| j4dtkrd|j$_Id|j&_Id|j._Id|j/_Id|j1_Id|j*_Id|j3_Id|j-_I|jJK D ]}|jdd qtjdjdud| _ed| _Ld| _Nd| _Od| _Pd| _Qd| _Rd| _Sd| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^| jdddn tj_j`ja}|D ]b}|dpkr^qLtj_|| |j'|dq|_bdr|jJkr|j>|jb_c|dskrd|jb_|jbjdd qL| j4dvk	rd|j6_Id|j(_Id|j&_Id|j._Id|j/_Id|j1_Id|j*_Id|j3_Id|j-_I|jJK D ]}|jdd 	qd| _Ld| _Nd| _Od| _Pd| _Qd| _Rd| _Sd| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^| jdddn tj_j`ja}|D ]P}|dpk	r	qtj_|| |j'|dq|_bdr|jJk	r|j>|jb_c|jbjdd 	q| j4dGkr d|j _Id|j(_Id|j*_Id|j_Id|j!_Id|j$_Id|j&_Id|j%_Id|j+_Id|j'_Id|j-_Id|j._Id|j/_Id|j1_Id|j3_Id|j_I|jJK D ]}|jdd 
qd| _Md| _Ld| _Nd| _Od| _Pd| _Rd| _Sd| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^| jdddn | j4dwkrtjfjdxd| _gtjhjdyd| _i| jdzd{}| jd|d}}| jd~d}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}| k| | jlddtjjdd|||dd tj| dddd|_mtj| d| j) dd| j dd|_ntjo|jm| |jndd|_ptj| d| j) dd| j dd|_qtjo|jm| |jqdd|_rtj| d| j) dd| j dd|_stjo|jm| |jsdd|_ttj| ddddd|_utj|juddd.|_vtj|juddO|_wtj| dddd|_xtj| dddd|_yd[|jm_Hd\|ju_Hd]|jx_Hd^|jy_Hd_|j_Hd`|j'_Hda|j3_Hdb|j/_Hdc|j._Hdd|j1_Hde|j!_Hd|j(_Id|j6_Id|j*_Id|j#_Id|j$_Id|j&_Id|j%_Id|j+_Id|j-_Id|j3_Id|j._Id|j1_Id|j/_Id|j!_Id|j _I|jJK D ]}|jdd qdd| _]d| _zd| _Ld| _Nd| _Yd| _{d| _|d| _}d| _\d| _Od| _Pd| _Rd| _Sd| _^d| _~d| _d| _d| _d| _Td| _Wd| _[d| _Q| jdddn tj_j`ja}|D ]N}|drtj_|| |j'|dq|_bdr|jJkrV|j>|jb_c|jbjdd q|   |   |   |   d-S )uU    Добавляем структуру папок в новый проект
        zlist.pfeed:defaultrA   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   ФильтрыrV   )rO   rh   r~   r   u   ЗадачиCmfTask)rO   rJ   rh   typer   u$   Мои открытые задачиr   z?" and responsible in (currentUser()) and cache_status_type != "r   )rO   rh   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)rO   rh   r~   ZEpicsepicZReleasesreleaseZSprintssprintu   ОтчетыreportsZRoadmapsroadmapr   )r~   rT   u   Спискиr   u
   Лентаu   Лента проекта pfeed)rO   rh   r   r   r2   r   u   Дискdisku
   Архивarchiveu   Чат )rO   	executorsrh   r   r   )project.kanbanproject.servicedeskz	HomePage )rJ   rh   rj   
cmf_authoru   Фильтр1z$" and responsible in (currentUser()))r   project.wikiu   Список1)rO   rh   u   Компонент1u   Документ1ZEpic1)rJ   rO   rh   r2   u   Релиз1r   )rO   rh   r   r2   ZSprint1r   u   Roadmap Проекта)rO   rh   r   i i i i i" iI i q i i  i0 i@ iP4 i`[ ip i i i i r   rF   r   r   mark)rh   rO   report_typeZfilters_filter1Zagile_sprintr   zkanban:defaultzproject.baser   z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)rh   r   r2   categoryui_form_viewui_form_createui_form_view_inner9   Запросить новую учетную записьuP   Запросите новую учетную запись для системы.u7   Сообщить о системной проблемеu   Дайте нам знать, если что-то не работает должным образом, и постарайтесь быстро восстановить его работоспособность.task.sd_incident:defaultZ	incidentsu?   Сообщить о сломанном оборудованииu   Сообщите об оборудовании, которое может быть неисправным или сломанным, например разбитый экран компьютера или поврежденный сервер.)rh   typesu+   Логины и учетные записиu<   Запросить доступ администратораuY   Например, если вам нужно администрировать EvaProject.u3   Запрос по электронной почтеuu   Запрос получен от вашего канала поддержки по электронной почте.ztask.sd_emailed_request:default)rh   r   r2   r   r   r   r   u   Очередиqueuez[["parent_id", "=", "z*"], ["cache_status_type", "!=", "CLOSED"]]z!" and cache_status_type != CLOSEDrJ   r   r   u   Все обращения)rO   rJ   Ztask_filterrh   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)rO   rh   r~   r{   r   u   КатегорииZknowlage_base_categoriesu   Статьиu   Каналыservicedesk_channelsu   Клиентыservicedesk_clientsZanalysis)r   rK   r   r<   r   r=   ZlogginginfoZdataclassesr   r   main_gantt_projectr   r2   rJ   rh   r   rI   CmfStatusCoder   rV   CmfRegistrytasksr   r7   Ztasks__filter2Ztasks__filter3Ztasks__filter4Ztasks__filter5Ztasks__filter6Ztasks__filter7Ztasks__filter8Zblogr   CmfDocumentZdocsZepicsZreleasesZsprintsr   Zroadmapsr)   r   listsr   r   r   r   r   chatr   r   r   r   Zkanban_boardr   r   rj   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__roadmap1rg   rw   __dict__valuesrl   show_all_tasksrk   ro   rm   	show_blogrn   rp   Zshow_filtersrq   rr   Zshow_reportsrs   	show_docsrt   Zshow_components
show_listsshow_active_sprintsZshow_trashcanCmfTaskReportr   choicesZreports__report1report_filterCmfSchemeWfr5   CmfProjectNotifySchemenotify_schemerC   rB   _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&   scaffold  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  rJ   rh   rQ   ["parent_id", "=", "r   r   r   r   Fr   r   TrO   r~   r   r   rJ   rO   rh   r   r  )r<   r  r=   r   r)   r7   rI   r   )r+   report_namereportr  r%   r%   r&   r    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)rh   
value_typecoloru   РешенныеZdonez#7bc1a1)rh   rowsu5   Анализ SD. Отчет время решенияu   Все задачиZaveragez#8eb021   Время решения)rh   r+  r,  slau   Инцидентыz#ea632br2   r   )rh   r+  r,  r/  
row_filteru]   Анализ SD. Отчет по выполненным SLA против нарушенныхu   ВыполненоZsd_sla_processedz#14892cu   НарушеноZsd_sla_breachedz#d04437uQ   Анализ SD. Отчет по инцидентам по приоритетамu   Критичныйr      )r2   priority)rh   r+  r,  r0  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   Все)r2   request_typer   r   uM   Анализ SD. Отчет по проблемам по приоритетуztask.sd_problem:defaultrh   r  r%  r&  r   r   r   r   Fr   r   Tr'  
line_chartr(  r-  r,  r+  r/  rJ   rh   z
project = z["parent", "=", "r0  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 ()r7   rU   r8    c                 s   s   | ]}d | d V  qdS r:  r%   r;  r%   r%   r&   r=    s     z["z
", "IN", [z]]r7  z = "z	", "=", "r2  z and [z ,])r=   r<   r  r   r)   r7   rI   r   ZCmfRepLineChartRowrJ   rh   r,  r+  CmfSDeskSlar/  r\   joinr   r   r*   CmfSDeskRequestTyper   r2  r  r   r   r0  )r+   r8  Zchartr)  r*  r  r-  rowZrow_task_filterZ	chart_rowr/  Zubql_filterZ
bql_filterr0  fieldZvalsZlogic_typesZbql_valsr   r7  r2  r%   r%   r&   r    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 )
NrA   u3   Отсутствует экранная форма TrG   z: r   Fr   )Zobj_copy)	r<   Z	CmfUiFormr=   rL   task_code_prefixrh   Zcmf_model_namerI   r   )r+   r7   action_nameZui_formZ_ui_formr%   r%   r&   r    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:defaultrA   zsdesk-agent:default)r<   CmfProjectRoler=   CmfProjectRoleAssignrJ   Zproject_rolemembersr\   gcurrent_userrI   )r+   Zsdesk_clientZsdesk_agentZprr%   r%   r&   r  "  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:defaultrA   r.  date)rJ   rh   Zwidget_type     z+request_type.request_category = 'incidents')rJ   rg   Z	goal_timeZubqlcalendari  i  z2request_type.request_category = 'service-requests'i  i`	  z7request_type.request_category = 'post-incident-reviews'i  r?  startzissue-created)rJ   trigger_typetrigger_conditionzresolution-clearedstopzresolution-setr6  x   zcomment-for-reporterzstatus-type-changedZsd_waiting_for_customer)rJ   rS  rT  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=   rB  rI   ZCmfSDeskSlaGoalZCmfSDeskSlaTriggerr  )r+   Zdefault_calendarr/  Zgoal1Zgoal2Zgoal3Zgoal4Ztrigger1Ztrigger2Ztrigger3Ztrigger4Ztrigger5r%   r%   r&   r  3  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 )Nrh   r   r)   r   r8   u   Проект с именем uA    уже существует. Укажите другое имя.TrG   u-   Раздел на диске с именем uF    уже занят. Укажите другое имя проекта.)r<   r   slistrh   r)   rL   r   r4   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 )	NrS   rh   r   r7   r8   u7    с таким именем уже существуетTrG   )r\   r=   rL   Zverbose_name)r!   rh   r7   Z
prj_filterr%   r%   r&   _check_unique  s
    zCmfProject._check_uniquec                    s$   |  || t j|||d|S )N)rh   r7   )rZ  r   r   )r!   rh   r7   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g}ddg}|D ]}d| }| j | jr4|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}|rR| j | j |_|jdd qRtj	jdd| jgddd| ggd}|r4| j | j |_|jdd q4| j
jrVtjjdd | jgd}|rV| j
j |_|jdd | jjr| jd!krtj	jd"d | gd#d d$ggd}ntjj| d%}|r| jj |_|jdd | jjrtjj| d%}|r| jj |_|jdd | jjr4tjjd&d d'gd"d | ggd}|r4| jj |_|jdd | jjrztjjd&d d(gd"d | ggd}|rz| 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   rV   r   r   r   r  r   CmfActiveEntityFilterr   r   r   r~   r8   r   TrE   r   zlist.rT   r   r   rO   zlogic_type.coder   )rO   r   r   r   r   )r  r:   r[   r<   r=   r)   r*   rw   rI   r   rp   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g S )NZdefault_list_workflowZdefault_epic_workflowZdefault_subproject_workflowZdefault_release_workflowZdefault_sprint_workflowZdefault_document_workflowr   project_perm_schemer  rQ  r9   rB   cmf_project_admins)r   save_preload_fieldsr4   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<   Нельзя менять родителя у проектаsectionzCmfWiki:Classre   zCmfProject:Class)rJ   r:   rO   rL   rf   r   rT   r4   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 r1   )r   r:   r<   r  Zconfluence_convertr*   r)   r4   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   r?  z\W+-r3  c                 S   s   g | ]}|d  qS )r   r%   )r<  chunkr%   r%   r&   
<listcomp>+  s     z3CmfProject.get_prefix_from_name.<locals>.<listcomp>   z--rG  ZILIKE%rQ   r   c                 S   s   g | ]}|j  qS r%   )rG  lower)r<  re   r%   r%   r&   re  5  s     c              
      s8   g | ]0}|   rd d|   dqS )z\Dr?  )r  ri  subreplace)r<  pprefixrer%   r&   re  9  s      )default1)ro  r
   Ztranslit_striprj  ri  r   lenrC  r<   r   rX  setr   maxstrintupper)rh   ZslugchunksZprojectsprefixesZexisting_prefixesZmax_prefix_numr%   rm  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   Нельзя использовать системный префикс TrG   r)   r   rG  r   rh   )r   rQ   include_deletedu   Код u2    уже используется проектом u   . Выберите другойr7   ZLIKEz-%re   zproject.nameu8    ранее использовался проектом u   . Это может привести к пропускам в нумерации кодов. Если это нежелательно - укажите другой префиксur   Запущен фоновый процесс смены префиксов кодов у задач проекта)r   )rG  r:   Ztask_code_use_logic_type_prefixr*   rw  Zcode_prefixrL   r<   r   r=   r)   rh   CmfTaskCodeHistoryre   is_newschedule_deferred_jobr   Zrecalculate_codes_celery)r+   Zproject_with_prefixZ	code_usedr%   r%   r&   _calc_task_code_prefixB  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%   r<  cr%   r%   r&   re  y  s      zACmfProject._calc_task_code_prefix_for_section.<locals>.<listcomp>z(?:\b|_)([A-Za-z0-9]{1,4})Nrf  r3  r?  c                 s   s   | ]}|d  V  qdS )r   Nr%   r  r%   r%   r&   r=  }  s     z@CmfProject._calc_task_code_prefix_for_section.<locals>.<genexpr>rG  r   r)   r   r8   )Ztransliterater  rh   rK   r*   ro  findallrr  rC  rw  r<   r   sgetr)   rG  )r+   r  r7   Z	code_listir%   r%   r&   "_calc_task_code_prefix_for_sectionp  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   Для редактирования параметров проекта Вам необходимо находиться в группе Администраторы проектовTrG   Fu   Для редактирования параметров проекта Вам необходимо быть Администратором проекта)in_person_grouprL   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)rJ   r   Zblack)r  r<   ZCmfEmailListr=   rI   )r+   ZwlZblr%   r%   r&   _calc_white_black_lists  s    z"CmfProject._calc_white_black_listsc              
      s  | 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  | j s| j*j
rtj+=  tjBjCd#d$d%d&ggd#gd'}|D ]}d%|_D|jdd q|S )(NZProjectCreatorsr  u   Для создания проектов попросите Администратора системы добавить Вас в группу Создатели проектовTrG   r7   r   r  r8   r\   u   Пользователь uO    добавлен в группу Администраторы проектовrh   r)   r      Проект     уже существуетr   _%Y-%m-%d-%H%M%SFr  <   Имя проекта не может быть пустым.r   rE   r   servicedesk:defaultrA   system.open:defaultsystem:default)Z
is_defaultr`  u8   Укажите Префикс для кода задачdont_scaffoldonboarding_statusr   r   cancelrP   )Er  rL  rM  Zis_admindisable_permissionsacl_admin_moder  rL   r^  r\   r:   r<   CmfPersonGroupr=   Z
rg_membersZ
all_nestedZ_changesr
   Zdisable_aclrI   Zcurrent_person__member_ofaddr)   r*   r   rh   r   r   r   r   renamer   nowload_fieldsrY  r>   r  r7   r\  r]  r   CmfProjectPermSchemer  r  rQ  rW  rb  rM   rG  rf   r  r  r@   rD   r-   r   Zservicedesk_publicrj   ru   
spectatorsr   Ztrigger_reloadr  r$  r   r   
CmfLicenser   r  )r+   r   r"   Zproject_admins_groupZproject_admins_group_membersZchange_actionZpr_adminr  r   project_dir_rfileshould_be_scaffolded	old_rfilerQ  resultonboardings
onboardingr#   r%   r&   rI     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 )Nrh   r   r)   r   r8   r  r  TrG   r   r  r  Zdiv)Ztags_extendFr  r   r  rA   r  r  r`  r  r   r   r  rP   rE   ),r  r<   r   r=   rh   r)   rL   r   r   r   r   r  r   r  document_header_textr:   r
   Z
html_cleanr*   document_footer_textrY  r>   r7   r\  r]  r   r  r  r  rb  rM   rG  rf   r  rz  r  r@   r   _save_importr$  r  r   r  rI   )
r+   r   r"   r   r  r  r  r  r  r  r#   r%   r&   r  )  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   rg   re   rJ   r)   rQ   zCmfTask:zPPP-TSK-ORDERr`   zPPP-OBJ-ORDERr1  rO  TrE   )r   r<   r   r=   re   r  r   check_edit_permrg   r*   rv  rI   )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   g  s(    

zCmfProject.move_itemc                 C   s   d S r1   r%   r4   r%   r%   r&   
_calc_code  s    zCmfProject._calc_codec                 C   s   d S r1   r%   r4   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>.TrG   rE   )r
  r   rJ  ZCmfAttachmentZCmfImportDownloadr   r   ZCmfTransr   r   r  r  rI  r   Z	CmfPersonr  r   r   r   rJ   r   )r   r}  include_systemu   Удаляем )r)   r}  r  )r  force)re   r}  r  r'   )r   r  r.   rU   u   Удаляем из кеша F)r  r  r  r   )!
cmf_importrK   rL   ZconfigZSUPPORT_URLZapp_base_hrefrh   r*   r  rI   r[   r<   r   rL  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_namerE  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_trashrh   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   rP   )	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")
            r1  )r  rh   r`   msgr2  )
auto_alarm_dater  printrj   rh   r*   r<   Z	CmfNotifyZ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  rI   )re   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 есть две реализации механизма штатными средствами через подписку на фильтры или через крон в автоматизациях
        **rR   N)r<   r   r   r  re   r%   r%   r&   &notify_project_owner_not_planned_tasks  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*   )r<  tagr%   r%   r&   
<dictcomp>  s      z5CmfProject.hook_task_tags_changed.<locals>.<dictcomp>r   )r   r~   r   c                 S   s   i | ]}|j j|qS r%   )rh   r*   r<  r   r%   r%   r&   r    s    rX   filter_tag_idrT   r   r   r~   r  rh  )rJ   rO   rh   z: Create new filter for z with category Fr   #)rO   rh   r~   r   Z
filter_tag)r<   r   r=   r)   r   r[  r  r*   r   Ztag_categoryrK   rh   rI   rT   itemsrL  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_changed
  sz    
  


   
  
 
   z!CmfProject.hook_task_tags_changedc                 C   s   d S r1   r%   )r!   r  r%   r%   r&   hook_new_tagH  s    zCmfProject.hook_new_tagc                 C   s   dS )NTr%   r4   r%   r%   r&   has_tree_nodes_hookL  s    zCmfProject.has_tree_nodes_hookc                 O   s   d S r1   r%   )r!   r   r"   r%   r%   r&   public_listO  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)   rh   r7   ri   ru   Zactivity_idr   r2   zworkflow.namerj   cmf_created_atrf   rG  descriptionrx   ry   rz   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_jsrQ   )r<   r   r=   Z_acl_check_readZCmfPermissionError)r!   r   r"   Zfields_to_returnre   r%   r%   r&   
public_getT  s\    'zCmfProject.public_getc                 O   s   t jj| f||S r1   )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^  r5   r  Zsecurity_level_schemerB   r]  Z
protected_uv   Поле защищено от изменения, обратитесь к Администратору системыrG   )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:   rs  r  r^   Zproject_perm_allow_fieldsr  endswithr  r   rL  r  r  r  r   rL   r  rM  r>   r?   r   )r+   Zchanged_fields_to_checkrF  Zadmin_require_fieldfr%   r%   r&   r    sD    




zCmfProject.check_edit_permc                    s
   t   S r1   )r   check_delete_permr4   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 )Nrh   Fr   r   r   r2   r   r   r   r   )rh   r   r2   r   groupr   r   r   )r<   ZCmfSDeskRequestGrouprJ   r=   rh   rI   r  )r+   groupsr  request_groupr7  r%   r%   r&   r    s     z&CmfProject._create_sdesk_request_groupc	           
      C   s`   t  }	| |	_||	_||	_||	_||	_||	_||	_|d k	r@||	_	|d k	rT|	j
| |	  d S r1   )r<   rD  rJ   rh   r   r2   r   r   r   Zrequest_categoryr  r\   rI   )
r+   rh   r   r2   r   r  r   r   r   r7  r%   r%   r&   r    s    z%CmfProject._create_sdesk_request_typec                 C   s   | j  d| j d| j S r   )Z	ui_moduleZui_namer7   r4   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      rc  rf  )cmf.utilr  r   gen_coderr  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   )%attachmentsZchat_groupscmf_archivedr  Zcmf_deletedr  Zcmf_locked_atZcmf_locked_byZcmf_modified_atZcmf_modified_byZcmf_viewed_atr7   Zcommentsr   Z	documentsZext_idZfavorite_forrv   r)   Zimport_originalZimport_raw_jsonZlocal_linksZlocal_links_docs_inZlocal_links_tasks_inrh   ry   r  r   Zstatus_closed_atZstatus_in_progress_endZstatus_in_progress_startZstatus_modified_atZstatus_review_atrG  r  r   Ztask_filtersT)Z
is_definedr  Zperm_)rh   r<   r   r  r^   r  r  r   ZcmfrQ   Z
CmfBackrefsetattrr*   r  )r+   rh   r"   new_projectZskip_fieldsrF  attrr*   r%   r%   r&   clone  s&    
	


zCmfProject.clone)rh   r7   rG  structure_copy	full_copyc                   sH  dd   fdddd } fdd}	d	d
  fdd|rJd}t jj| jdgd}
|
j|pn|
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sDt  }t jjdd|_||_d|j |_d|_|jddd ||_|jddd |S )Nc                 S   s,   |    |   |   |   |   d S r1   )Z_calc_perm_parentZ_calc_perm_inherit_acl_idZ_calc_perm_has_aclZ_calc_perm_aclZ_calc_perm_effective_aclr  r%   r%   r&   	_calc_acl	  s
    z2CmfProject.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)rh   copy_attachmentsr~   Fr   r   r   emit)Znoitfyr  rF   )r   r<   r[  r   r   r   r  r   rh   rO   rJ   re   r   r   rI   r   r   r   )r  
new_parentorig_childrenZ
orig_child	new_childr   )r  _copy_tree_nodesr%   r&   r  #	  s$    z9CmfProject.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 )	Nre   r   cloned_fromrP   r  )out_linkrQ   r  )r  in_link)r<   r   rX  ZCmfRelationOptionr   r  r)   r  r  r   rh   r*   )re   r  relZin_taskZnew_relr%   r%   r&   _copy_relation_options<	  s    z?CmfProject.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 ]v}||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|_| |_g |	_g |	_|	j
dddd |	j s|	   |	 |	|_!|j
ddd	 |j|	_|j|	_||	_	|	j
dddd |	j"dkrH|	||j#< q||	 q|t|$  D ]\}|j rd|j |kr||_ nt jj%|j d|_ |&  |   |	 |j
dddd qd| || d S )Nc                 S   s"   i | ]}|j  d |jj |qS r   r^   rh   r*   )r<  lstr%   r%   r&   r  E	  s      zHCmfProject.create_from_template.<locals>._copy_tasks.<locals>.<dictcomp>T)rJ   Zinclude_archivedc                 S   s"   i | ]}|j  d |jj |qS r  r  )r<  compr%   r%   r&   r  G	  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.*rJ   rQ   )r  r  )r  fix_versionsaffected_versionsr   r   r  r   rF   	task.epicztask.subprojectr  )r   r  rF   )'r<   r   r   updater
  r  rK   r  rh   op_gantt_taskrI   Z_calc_gantt_taskr   r  r  r  r   r  rJ   r   r   r\   r^   r*   Z	main_listr!  r  rj   r   re   r  r   Zparent_taskr  r   r7   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#  r
  r  )r  
_copy_task_copy_task_filtersr%   r&   _copy_tasksB	  s    


     
, 


z4CmfProject.create_from_template.<locals>._copy_tasksc                 S   sb   |   }| j|_| j|_||_||_|jdkrDtjj| j	j
|d|_	| |_| jr^| | |S )Nr  rh   rJ   )r  rj   r   rJ   re   r   r<   r   r=   rO   rh   r  r7   r  r  )r  r  r  r%   r%   r&   r  	  s    


z3CmfProject.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  ddddddg}tjj|dgdd |D  d}|D ]}| }	| |	_| |	_	|j
r|j
|kr| |	_
ntjj|j
j| d|	_
| g|	_|D ]j}
t||
D ]X}|j	|kr,qt|	|
| ||j d|jj d }|rt|	|
| qq
 |	 |	jddd qd S )NrJ   r   c                 S   s"   i | ]}|j  d |jj |qS r  r  r  r%   r%   r&   r  	  s     zOCmfProject.create_from_template.<locals>._copy_task_filters.<locals>.<dictcomp>r8   c                 S   s"   i | ]}|j  d |jj |qS r  r  )r<  docr%   r%   r&   r  	  s     ZANDr   r  c                 S   s"   i | ]}|j  d |jj |qS r  r  )r<  r   r%   r%   r&   r  	  s     Z
ft_sprintsZft_tagsZft_listZ
ft_releaseZft_componentsZft_epicsr  c                 S   s   g | ]}|d  qS )z.parentr%   )r<  rF  r%   r%   r&   re  	  s     zOCmfProject.create_from_template.<locals>._copy_task_filters.<locals>.<listcomp>r  r  r   Fr  )r	  r<   r   r   r  r   r   r  re   rJ   rO   r=   rh   Zft_projectsr   r   r^   r*   r\   rI   )r  r  r  Z_folder_filterZ_doc_filterZ_epics_filterZ
field_listZorig_project_task_filtersZorig_task_filterZnew_task_filterrF  r#  Znew_item)r  r%   r&   r  	  sP    






z;CmfProject.create_from_template.<locals>._copy_task_filtersTr  r  r  )rh   r7   rG  r  F)r  r   r  )r  r  r  )r  r  r  r9  r  r   rA   r   r  )r<   r   r=   r)   r  rh   rI   r   r   r   r   r  r   r   r2   rJ   r   )r+   rh   r7   rG  r  r  r   r"   r  r  r  r  r  r%   )r  r  r  r  r&   r   	  sH    T/
zCmfProject.create_from_templateobj_id)r  only_once_argsz
str | None)r  c                 C   sH   t jj| d}|jddd}t jj| dd}|D ]}|jddd q0|S )Nr)   T)Zskip_tree_mover   Fr'   r  )r<   r   r=   r   r   r   r  re   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  Tr  )r<   r   r=   Zarchive_restorer   r   r  r%   r%   r&   r   
  s    
z"CmfProject.archive_restore_projectu   Удаление проекта)r  Zshow_bg_progressbarr  r  c                 C   s   t jj| dd}|  d S )NTr)   r}  )r<   r   r=   r   r  re   r%   r%   r&   
job_delete
  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  r  )r"   )r<   r   r=   r   r  r  r  r%   r%   r&   r   
  s    zCmfProject.delete_projectu)   Востановление проектаc                 C   s   t jj| dd}|jddS )NTr  )r  )r<   r   r=   r  r  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   )_argsr/   Zproject_listre   r%   r%   r&   $celery_hourly_sync_rdisk_folder_hook*
  s    z/CmfProject.celery_hourly_sync_rdisk_folder_hook)NNN)NN)re   N)N)r   T)N)N)NN)T)NN)NNNNN)N)N)N)N)Z__name__
__module____qualname__modulesre   rQ   cmf_projectr   Zapi_methodsr   classmethodr    r-   staticmethodZon_server_eventr0   r3   r6   r@   rD   rM   r   r   r_   r   r   r   r   r   r   r   r   r   r   r   r   r$  r  r  r  r  r  rY  rZ  r   r\  r_  ra  rb  rz  r  r  r  r  rI   r  r   r  r  r   r  r  r  Zcmf_deferred_jobr  r  r   r  r  r  r  r  r   r  r  r  r  propertyr  r  r  r   r   r   ru  r  r   r   r  __classcell__r%   r%   r#   r&   r      s   :&
%


    A  "f
R
!.
~> 8
>


47    


  cr   )r   r   r   r   rQ  r   Z&common.models.cmf_plugin_convert_mixinr   Zcmf.includeZ"modules.project.fields.cmf_projectr!  Zcommon.models.cmf_active_entityr	   r  r
   re   rQ   r"  r   r%   r%   r%   r&   <module>   s   