U
    Įwh                    @   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                       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dd3d4Zd5d6 Zd7d8 Zd9d: Zdd;d<Zdd=d>Z ed?d@ Z!dAdB Z"dCdD Z#ddEdFZ$e
d#ddG fdHdI
Z%dJdK Z&dLdM Z'dNdO Z(dPdQ Z)dRdS Z*dTdU Z+dVdW Z,e
dXdY Z-e
dʇ fdZd[	Z.d\d] Z/ fd^d_Z0d`da Z1dbdc Z2eddde Z3dfdg Z4dhdi Z5ddjdkZ6dldm Z7dndo Z8 fdpdqZ9 fdrdsZ:e
ddtduZ;dvdw Z<dxdy Z=d.dzd{ fd|d}
Z> fd~dZ?dd Z@dd ZAeeBd.d.dddd ZCedd ZDeEdddZFe
dd ZGdd ZHe
dd ZIe
dd ZJdd ZKdd ZL fddZMdd ZNdddZOePdd ZQ fddZRdddZSdddZTeeBd.dd.ddd ZUdddZVeeBd.dgddddddZWeeBd.dgddddddZXeeBdd.d.dgdeYdddZZeeYdddZ[eeBdd.d.dgddddddZ\eeBd.d.dddd Z]  Z^S )
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   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]]]    Фильтр для доски "" rf   )rK   ri   
view_scopeft_add_ubqlFr   zboard.scrum:defaultzboard.simple:default)project.agileproject.simple-boardrP   ri   r3   kanban_filterr   )r=   CmfTaskFilterr8   rJ   r>   logic_prefixCmfKanbanBoard)r,   ri   r   r   Z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   project = ""z["project.id", "=", ""])rK   ri   r   ubql2bqlFr   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_filterfilter_parentr   )r=   r   rJ   r   )r,   r   r#   backlog_filterr   r&   r&   r'   scaffold_backlog3  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_boardB  s8    
	
z CmfProject.scaffold_simple_boardc                 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   typer   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   CmfRegistryr   )r,   r   Z
reports_rgr&   r&   r'   scaffold_app_learng  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     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| _d| jNdskrldnd| _e| 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| _d| jdddt tjfjgjh}|D ]b}|dvkrxqftjf|| |j'|dw|_idx|jOkr|j@|ji_j|dykrd|ji_|jijdd qf| 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 qhd| _Rd| _Qd| _Sd| _Td| _Ud| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _d| jdddt | 5|  | j4dIk
rzd|j$_Md|j&_Md|j._Md|j/_Md|j1_Md|j*_Md|j3_Md|j-_Md|j6_M|jOP D ]}|jdd 	qdtjkjdzd| _ld| _Qd| _Sd| _Td| _Ud| _Vd| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _d| jdddt tjfjgjh}|D ]b}|dvk
r(
qtjf|| |j'|dw|_idx|jOk
rV|j@|ji_j|dyk
rhd|ji_|jij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| _d| jdddt tjfjgjh}|D ]P}|dvkrqtjf|| |j'|dw|_idx|jOkr|j@|ji_j|jij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 qrd| _Rd| _Qd| _Sd| _Td| _Ud| _Wd| _Xd| _Yd| _Zd| _[d| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _d| jdddt | j4dJkrtjmjd|d| _ntjojd}d| _p| qd~d}| qdd}| qdd}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}| r| | jsddtjjdd|||dd tj| dddd|_ttj| d| j) dd| j dd|_utjv|jt| |judd|_wtj| d| j) dd| j dd|_xtjv|jt| |jxdd|_ytj| d| j) dd| j dd|_ztjv|jt| |jzdd|_{tj| ddddd|_|tj|j|ddd.|_}tj|j|ddT|_~tj| dddd|_tj| dddd|_| K |_Ld`|jt_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 qtd| _cd| _d| _Qd| _Sd| __d| _d| _d| _d| _bd| _Td| _Ud| _Wd| _Xd| _dd| _d| _d| _d| _d| _Yd| _\d| _ad| _Vd| _Rd| _e| jdddt tjfjgjh}|D ]N}|dr4tjf|| |j'|dw|_idx|jOkrr|j@|ji_j|jijdd q4|   |   |   |   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   Ztask_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   CmfDocumentZ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_app_learnCmfTaskReportr   choicesZreports__report1report_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'   scaffold1  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'   r1    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   r=  r>  slau   Инцидентыz#ea632br3   r  )ri   r=  r>  rA  
row_filteru]   Анализ SD. Отчет по выполненным SLA против нарушенныхu   ВыполненоZsd_sla_processedz#14892cu   НарушеноZsd_sla_breachedz#d04437uQ   Анализ SD. Отчет по инцидентам по приоритетамu   Критичныйr      )r3   priority)ri   r=  r>  rB  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&  r7  r8  r   r   r   r  Fr   r   Tr9  
line_chartr:  r?  r>  r=  rA  rK   ri   z
project = z["parent", "=", "rB  z, c                 s   s   | ]}d | d V  qdS r   Nr&   .0r4  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 rL  r&   rM  r&   r&   r'   rO    s     z["z
", "IN", [z]]rI  z = "z	", "=", "rD  z and [z ,])r>   r=   r$  r   r*   r8   rJ   r   ZCmfRepLineChartRowrK   ri   r>  r=  CmfSDeskSlarA  r]   joinr   r   r+   CmfSDeskRequestTyper   rD  r%  r   r   rB  )r,   rJ  Zchartr;  r<  r&  r?  rowZrow_task_filterZ	chart_rowrA  Zubql_filterZ
bql_filterrB  fieldZvalsZlogic_typesZbql_valsr   rI  rD  r&   r&   r'   r0    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'   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:defaultrB   zsdesk-agent:default)r=   CmfProjectRoler>   CmfProjectRoleAssignrK   Zproject_rolemembersr]   gcurrent_userrJ   )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:defaultrB   r@  date)rK   ri   Zwidget_type     z+request_type.request_category = 'incidents')rK   rh   Z	goal_timeZubqlcalendari  i  z2request_type.request_category = 'service-requests'i  i`	  z7request_type.request_category = 'post-incident-reviews'i  rQ  startzissue-created)rK   trigger_typetrigger_conditionzresolution-clearedstopzresolution-setrH  x   zcomment-for-reporterzstatus-type-changedZsd_waiting_for_customer)rK   rf  rg  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>   rT  rJ   ZCmfSDeskSlaGoalZCmfSDeskSlaTriggerr  )r,   Zdefault_calendarrA  Zgoal1Zgoal2Zgoal3Zgoal4Ztrigger1Ztrigger2Ztrigger3Ztrigger4Ztrigger5r&   r&   r'   r/    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_conflicti  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_uniqueo  s
    zCmfProject._check_uniquec                    s$   |  || t j|||d|S )N)ri   r8   )rm  r    r   )r"   ri   r8   r   r#   r$   r&   r'   r   x  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rZtjjd!d"| jgd}|rZ| 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r8tjjd(d"d)gd$d"| ggd}|r8| 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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   rP   zlogic_type.coder   )rP   r   r   r   r   )r  r;   r\   r=   r>   r*   r+   rx   rJ   r   rq   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)  rd  r:   rC   cmf_project_admins)r    save_preload_fieldsr5   r$   r&   r'   rr    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   rQ  z\W+-rE  c                 S   s   g | ]}|d  qS )r   r&   )rN  chunkr&   r&   r'   
<listcomp>  s     z3CmfProject.get_prefix_from_name.<locals>.<listcomp>   z--rZ  ZILIKE%rR   r   c                 S   s   g | ]}|j  qS r&   )rZ  lower)rN  rf   r&   r&   r'   rw    s     c              
      s8   g | ]0}|   rd d|   dqS )z\DrQ  )r-  r{  subreplace)rN  pprefixrer&   r'   rw    s      )default1)r  r   Ztranslit_stripr|  r{  r   lenrU  r=   r   rk  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   rZ  r   ri   )r   rR   include_deletedu   Код u2    уже используется проектом u   . Выберите другойr8   ZLIKEz-%rf   zproject.nameu8    ранее использовался проектом u   . Это может привести к пропускам в нумерации кодов. Если это нежелательно - укажите другой префиксur   Запущен фоновый процесс смены префиксов кодов у задач проекта)r   )rZ  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_prefix  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&   rN  cr&   r&   r'   rw  K  s      zACmfProject._calc_task_code_prefix_for_section.<locals>.<listcomp>z(?:\b|_)([A-Za-z0-9]{1,4})Nrx  rE  rQ  c                 s   s   | ]}|d  V  qdS )r   Nr&   r  r&   r&   r'   rO  O  s     z@CmfProject._calc_task_code_prefix_for_section.<locals>.<genexpr>rZ  r   r*   r   r9   )Ztransliterater  ri   rL   r+   r  findallr  rU  r  r=   r   sgetr*   rZ  )r,   r  r8   Z	code_listir&   r&   r'   "_calc_task_code_prefix_for_sectionB  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   rq  r;   r  r?   )r,   personZraise_exceptionrq  r&   r&   r'   is_project_adminZ  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_listsp  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              
      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| E  |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   )Fr  r_  r`  Zis_admindisable_permissionsacl_admin_moder  rM   rq  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   rl  r?   r  r8   ro  rp  r   CmfProjectPermSchemer)  r(  rd  rj  rt  rN   rZ  rg   r  r  rA   rE   r.   r    Zservicedesk_publicrk   rv   
spectatorsr   Ztrigger_reloadr  r6  r   r   
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_rfilerd  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_textrl  r?   r8   ro  rp  r   r  r)  r(  rt  rN   rZ  rg   r  r  r  rA   r    _save_importr6  r  r   r  rJ   )
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   rh   rf   rK   r*   rR   zCmfTask:zPPP-TSK-ORDERra   zPPP-OBJ-ORDERrC  rb  TrF   )r   r=   r   r>   rf   r-  r   check_edit_permrh   r+   r  rJ   )r"   Zitem_idZ	anchor_idZnext_idZ
item_modelr5  Zanchor_modelanchorZanchor_ordernoZ
next_modelZ	next_itemZnext_ordernor&   r&   r'   r   C  s(    

zCmfProject.move_itemc                 C   s   d S r2   r&   r5   r&   r&   r'   
_calc_coded  s    zCmfProject._calc_codec                 C   s   d S r2   r&   r5   r&   r&   r'   get_code_prefixi  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   r]  ZCmfAttachmentZCmfImportDownloadr   r   ZCmfTransr   r   r'  r  r\  r   Z	CmfPersonr  r   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   r_  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_namerW  Z
gantt_taskZ	task_codeZdoc_historyZcust_field_confr   r   r$   r&   r'   r   m  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")
            rC  )r  ri   ra   msgrD  )
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_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+   )rN  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&   )ri   r+   rN  r   r&   r&   r'   r    s    rY   filter_tag_idrU   r   r   r   r  rz  )rK   rP   ri   z: Create new filter for z with category Fr   #)rP   ri   r   r   Z
filter_tag)r=   r   r>   r*   r   rn  r  r+   r   Ztag_categoryrL   ri   rJ   rU   itemsr_  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 r2   r&   )r"   r  r&   r&   r'   hook_new_tag$	  s    zCmfProject.hook_new_tagc                 C   s   dS )NTr&   r5   r&   r&   r'   has_tree_nodes_hook(	  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   rZ  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_get0	  s\    'zCmfProject.public_getc                 O   s   t jj| f||S r2   )r=   r  r   )r,   r   r#   r&   r&   r'   r   e	  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)rq  r6   r)  Zsecurity_level_schemerC   rp  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_fieldsr-  endswithr  r   r_  r  r  r   r   rM   r  r`  r?   r@   r   )r,   Zchanged_fields_to_checkrX  Zadmin_require_fieldfr&   r&   r'   r  h	  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   r,  )r,   groupsr  request_grouprI  r&   r&   r'   r+  	  s     z&CmfProject._create_sdesk_request_groupc	           
      C   s`   t  }	| |	_||	_||	_||	_||	_||	_||	_|d k	r@||	_	|d k	rT|	j
| |	  d S r2   )r=   rV  rK   ri   r   r3   r  r	  r
  Zrequest_categoryr  r]   rJ   )
r,   ri   r   r3   r  r  r  r	  r
  rI  r&   r&   r'   r,  	  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      ru  rx  )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   )%attachmentsZ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_atrZ  r  r   Ztask_filtersT)Z
is_definedr  Zperm_)ri   r=   r   r  r_   r  r-  r   ZcmfrR   Z
CmfBackrefsetattrr+   r  )r,   ri   r#   new_projectZskip_fieldsrX  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   rZ  structure_copy	full_copynotify_person_idr#   ri   r8   rZ  r  r  )r=   r  countr   r[   r  r*   r_  Zcurrent_personr+   r  create_from_template_jobdo_create_from_template)r,   ri   r8   rZ  r  r  r#   Z
job_kwargsr&   r&   r'   r   	  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   Ошибка создания проекта по шаблону rY  uB   Ошибка создания проекта по шаблону: T)r  rE  )ra   r  ri   r  Zforce_notify_current_personrD  )r   r>   r
  ri   rZ   Zrollback_purge_event	traceback
format_excr_  r  r=   r  r  )r  ri   r  r8   rZ  r  r  r0   rf   r  Znotify_nameZ
notify_msger&   r&   r'   r	  
  s,    
 
*z#CmfProject.create_from_template_jobc                    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 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_acl
  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=   rn  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  #
  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   rk  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+   )rN  lstr&   r&   r'   r  E
  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  )rN  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.*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  r$  r%  r   r  rK   r   r   r]   r_   r+   Z	main_listr3  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  r5  r*  r  Znew_parent_task)r  
_copy_task_copy_task_filtersr&   r'   _copy_tasksB
  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 )Nr'  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  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 )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  )rN  docr&   r&   r'   r  
  s     ZANDr   r(  c                 S   s"   i | ]}|j  d |jj |qS r  r  )rN  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&   )rN  rX  r&   r&   r'   rw  
  s     zRCmfProject.do_create_from_template.<locals>._copy_task_filters.<locals>.<listcomp>r#  r2  r   Fr  )r)  r=   r   r   r  r   r   r   rf   rK   rP   r>   ri   Zft_projectsr   r   r_   r+   r]   rJ   )r  r+  r,  Z_folder_filterZ_doc_filterZ_epics_filterZ
field_listZorig_project_task_filtersZorig_task_filterZnew_task_filterrX  r5  Znew_item)r  r&   r'   r0  
  sP    






z>CmfProject.do_create_from_template.<locals>._copy_task_filtersTr!  r  r  )ri   r8   rZ  r  F)r  r   r  )r  r  r  )r  r+  r  rK  r&  r   rB   r   r"  )r=   r   r>   r*   r   ri   rJ   r   r   r   r   r  r   r   r3   rK   r   )r,   ri   r8   rZ  r  r  r#   r  r1  r+  r  r-  r&   )r  r/  r0  r  r'   r
  
  sH    a/
z"CmfProject.do_create_from_templateobj_id)r  only_once_argsz
str | None)r4  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   r4  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  Tr6  )r=   r   r>   Zarchive_restorer   r   r7  r&   r&   r'   r     s    
z"CmfProject.archive_restore_projectu   Удаление проекта)r  r  r  r5  c                 C   s   t jj| dd}|  d S )NTr*   r  )r=   r   r>   r   r4  rf   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  r4  r  )r=   r   r>   r   r  r:  r9  r&   r&   r'   r   *  s    zCmfProject.delete_projectu)   Востановление проектаc                 C   s   t jj| dd}|jddS )NTr8  )r  )r=   r   r>   r  r9  r&   r&   r'   r   1  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_hook7  s    z/CmfProject.celery_hourly_sync_rdisk_folder_hook)NNN)NN)rf   N)N)r   T)r   r   )N)N)N)NN)T)NN)NNNNN)N)NNNFF)NNNFF)N)N)N)___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   r6  r1  r0  r*  r.  r/  rl  rm  r   ro  rr  rs  rt  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  r+  r,  propertyr  r  r   r   r	  r
  r   r   r  r:  r   r   r<  __classcell__r&   r&   r$   r'   r      s$   :&

%N

<

       "f
T
!.
 > 8
>


47    


    
    
 or   )r   r   r   r   decimalr   rd  r   Z&common.models.cmf_plugin_convert_mixinr   Zcmf.includeZ"modules.project.fields.cmf_projectr@  Zcommon.models.cmf_active_entityr
   r  r   rf   rR   rA  r   r&   r&   r&   r'   <module>   s   