U
    bi                    @   s   d dl m Z  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 d dlZdZG dd dejjjjeZdS )    )copy)Path)datetimetimezone	timedelta)Decimal)
monthrange)CmfPluginConvertMixin)*N)CmfActiveEntity)cmfutil)QCmfTaskCmfDocumentCmfListCmfKanbanBoardCmfAchievementCmfAnswerTemplateCmfAttachmentCmfBqlFilterCmfChecklistCmfChecklistItemCmfChecklistTemplateCmfChecklistTemplateItem	CmfCourseCmfCourseProgressCmfCourseDocumentResultCmfExamCmfExamResultCmfExamQuestionFolderCmfExamQuestionFolderResultCmfQuestionFolderCmfQuestionResultCmfQuestionCmfFollowerZCmfGanttBaselineCmfGanttTaskCmfKanbanBoardColumnCmfKanbanBoardCardColorRuleCmfKeyPhraseCmfPermPublishPolicyCmfRelationOptionCmfRichFilterCmfRichFilterControlPanelCmfRichFilterCustomValueCmfRichFilterQueueCmfRichFilterSmartFilterCmfRichFilterViewCmfRichFilterViewColumnCmfSDeskRequestGroupCmfSDeskRequestTypeCmfSDeskSlaCmfSDeskSlaCycleCmfSDeskSlaGoalCmfSDeskSlaTriggerCmfTaskResAssignCmfTaskResAssignTimephaseCmfTestConfigurationCmfTestEnvironmentCmfTestParamCmfTestParamRowValueCmfTestParamValueCmfTestParamsRowCmfTestcaseRunCmfTestcaseRunHistoryCmfTestcaseRunHistoryStepCmfTestcaseStepCmfTestcycleTestcaseFolderCmfTestplanTestcaseCmfTestplanTestcaseFolderCmfTimeTrackerHistoryCmfComponentCmfChatGroupCmfTaskFilter	CmfFolderCmfBlogFolderCmfChatTopicCmfRegistry	CmfReport
CmfRoadmapCmfTaskQueueCmfTaskReportCmfTestcycleCmfTestplan
CmfComment
CmfCompanyCmfEmailListCmfFormCmfRepLineChartRow
CmfApproveCmfLinkCmfPluginTelphinCmfUserRatingc                       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 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)d*Zdd-d.Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zdd9d:Zdd;d<Zed=d> Z d?d@ Z!dAdB Z"ddCdDZ#e
dddE fdFdG
Z$dHdI Z%dJdK Z&dLdM Z'dNdO Z(dPdQ Z)dRdS Z*dTdU Z+e
dVdW Z,e
d݇ fdXdY	Z-dZd[ Z. fd\d]Z/d^d_ Z0d`da Z1edbdc Z2ddde Z3dfdg Z4ddhdiZ5djdk Z6dldm Z7 fdndoZ8ddpdqdrZ9 fdsdtZ:e
ddudvZ;dwdx Z<dydz Z=d(d{d| fd}d~
Z>d(d{d(dddZ?ee@dd(dgdd(dd(d{d|ddZAedd ZBe fddZCedd ZDee@d(dgddd(d{d|ddZE fddZFdd ZGdd ZHee@d(d(dddd ZIedd ZJeKdddZLe
dd ZMdd ZNe
dd ZOe
dd ZPdd ZQdd ZR fddZSdd ZTdddZUeVdd ZW fddZXdddZYdddZZee@d(dd(ddd Z[dddZ\ee@d(dgddddĜddƄZ]ee@d(dgddddĜddȄZ^ee_dĜddʄZ`ee@dd(d(dgd̍dddĜdd΄Zaee@d(d(ddddф Zbddӄ Zc  ZdS )
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                    s   |dkr(|sg }|dd|gdddgg}nt|dkrP|s8g }|dd|gdddgg}nL|dkr|s`g }|r| d	r|d	 }|d
kr|dddgg}n|dddgg}t j|f|||d|S )Ndefault_list	parent_id==cache_status_type!=closedZdefault_list_if_empty
logic_typelogic_prefixproject.servicedeskcodeLIKEzproject.servicedesk:%zNOT LIKE)object_fields	object_idfilter)getsuperfield_options_list)clsZrelation_field_namers   rt   ru   kwargsro   	__class__ './modules/project/models/cmf_project.pyrx   y   s,     zCmfProject.field_options_listc                    s   | j r
d S t   d S N)rn   rw   _calc_logic_typeselfr{   r}   r~   r      s    zCmfProject._calc_logic_typec                    s   | j r
d S t   d S r   )	scheme_wfrw   _calc_scheme_wfr   r{   r}   r~   r      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 )Nrq   rj   ru   )cust_field_conf_scheme
is_changedis_nullmodelsZCmfCustFieldConfSchemerv   rn   rq   oldZ
cache_hooknewr   r}   r}   r~   _calc_cust_field_conf_scheme   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rq   )ui_form_schemer   r   r   CmfUiFormSchemerv   r   r}   r}   r~   _calc_ui_form_scheme   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)	rh   r   r   Zis_default_listsaver   parentload	cmf_alertr   r}   r}   r~   _calc_default_list   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ru   fieldsr   ORtree_parent_idINidT)filtersfilter_projectr   )	Exceptiondictvarsr   rv   appendr   valuer   r   _get_node_models
class_name_get_tree_dataZ_create_tree)ry   Z	obj_modelZ
obj_filterr   r   rz   objr   Z
parents_idZparent_filtermodel
model_namemodel_filter	tree_datar}   r}   r~   r^      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 )Nr   r   r   rj   r   r   )r   r   r   r   rv   rw   r`   )	ry   r   project_typer   rz   Zparent_filtr   r   r   r{   r}   r~   r`      s      

zCmfProject.get_tree_leaf)r   r   r   r   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 )!Nr   ordernonamecmf_owner_id	cmf_ownerr   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_policyrj   r]   )ru   r   order_bysys_type=r   )	r   rv   popr   r]   listr   r   Ztree_fields)ry   r   r   r   r   argsrz   Zproject_filterZproject_fieldsr   r   r   r   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 )Nr   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_Tr   )
r   
tree_nodesr   r   getattrr   remove
isinstancer   rH   )r   noder}   r}   r~   hide_project_parts1  s"    


z5CmfProject._get_tree_root.<locals>.hide_project_partstagsc                 S   s   | j S r   r   )r   r}   r}   r~   <lambda>C      z+CmfProject._get_tree_root.<locals>.<lambda>)key:r   r   )r   rv   r   rJ   r   r   r   r   sortsplitr   hasattrr   r]   )ry   r   r   r   folderr   r   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r   r   u   КорзинаT)r   r   r   systemr   Fnotify)r   rJ   rv   r   )r   r   r}   r}   r~   scaffold_trashcanR  s        zCmfProject.scaffold_trashcan   Активные спринтыTc                 C   s   d}t j| d| d| j dd| j dd| j dd	}|jd
d ddd}|| j}t j| ||||d}|jd
d |S )NzX[lists, EXISTS, [[cache_status_type = IN_PROGRESS], [logic_prefix = list.agile_sprint]]]    Фильтр для доски "" r   project = ""["project.id", "=", ""]r   r   
view_scopeubqlbqlFr   zboard.scrum:defaultzboard.simple:default)project.agileproject.simple-boardr   r   rn   kanban_bql_filterr   )r   r   rq   r   r   rv   ro   r   )r   r   r   Zft_add_ubqlZactive_sprints_filterZlt_mapltZactive_sprints_boardr}   r}   r~   scaffold_active_sprintsZ  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   r   r   r   r   r   r   Fr   Tr   )Zis_scaffold_kanban_boardr   )r   r   r   rq   r   r   r   )r   kanban_namern   r   kanbanr}   r}   r~   scaffold_kanban_boardv  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r   Fr   ZBacklogbacklogT)r   r   r   tmp_bql_filterfilter_parentr   )r   r   r   rJ   )r   r   rz   backlog_filterr  r}   r}   r~   scaffold_backlog  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:defaultr   u   Простая доскаu)   Простая доска проекта r   T)r   r   text	list_typeZui_view_formrn   r   Fr   ztask.base:defaultu*   БП Задач Простой доски )r   templateZhiddenZworkflowr   rq   NOT INopenZin_progress	in_reviewrm   r   )r   CmfLogicTyperv   r   r   r   CmfWorkflowrq   	CmfStatusr   deletedefault_task_workflow)	r   r   rz   Zlt_boardZsimple_boardr	  ZwfZunneeded_statusesstatusr}   r}   r~   scaffold_simple_board  s8    
	
z CmfProject.scaffold_simple_boardc                 C   s>   t jj| | dd}|rd S t j| | dddd}|jdd d S )Nr   r   r   typeu!   Реестр документовTr   r   r   r  r   Fr   r   rM   rv   r   )r   Zdoc_registryr}   r}   r~   scaffold_doc_registry  s    z CmfProject.scaffold_doc_registryc                 C   s>   t jj| | dd}|rd S t j| | dddd}|jdd d S )NrU   r  u%   Реестр контрагентовTr  Fr   r  )r   Zcompany_registryr}   r}   r~   scaffold_company_registry  s    z$CmfProject.scaffold_company_registryc                 C   s  t j| dddd}|jdd t j|| dddd	d
jdd t j|| ddddd
jdd t j|| ddddd
jdd t j|| ddddd
}|jdd t jd|dd	djdd t jd|dddjdd t jd|dddjdd t jd|dddjdd |S )Nu   Обучение	app_learnTr   r   r   r   Fr   u
   Курсыr   順 r   r   r   r  r   r   u   Вопросыr"   @ u   Набор вопросовr    i    ОтчетыrN   i  u?   Отчет. Отчет по результатам курсовZlms_course_summary)r   r   report_typer   u.   Отчет. Сводка по ученикамZlms_student_summaryu.   Отчет. Сводка по заданиямZlms_jobu+   Отчет. Результаты тестаZlms_exam_resulti )r   rJ   r   rM   rN   )r   r  Z
reports_rgr}   r}   r~   scaffold_app_learn  s    zCmfProject.scaffold_app_learnc                 C   s   |s
| j }d| S N/r   r   r   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)r   r   r   r   r   r   u   Тест-кейсыZCmfTestcaser  r  u   Тест-планыrS   i u!   Выполнение тестовrR   ip u   Конфигурацииr9   iX )r   r   r   r  r   r   u   Параметрыr;   i@ u   Окруженияr:   i( )r   rJ   rM   r   )r   r   r}   r}   r~   scaffold_tests0  st    





zCmfProject.scaffold_testsc                 C   s   t jjj }|| S r   )r   CmfRFiledpdata_driverget_rdZ	get_rfile)pathrdiskr}   r}   r~   
_get_rfilel  s    zCmfProject._get_rfilec                 C   s   |  |  jdddd dS )u   Создадим папку проекта, если её нет. Может так же нужно проверять "Документы"? T)is_direxist_okparentsN)r.  r%  creater   r}   r}   r~   ensure_project_dirr  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_enabledr   z(owner: null
rules:
- all deny read,writezowner: zowner: nullz
rules:loginr   z
- z allow read,writez
- all deny read,write)
load_fieldsr4  is_project_dir_existr.  r%  perm_strr3  r   r5  Zall_relation_persons)r   Z	dir_rfiler8  userr}   r}   r~   _sync_rdisk_folderv  s$    zCmfProject._sync_rdisk_folderc                 C   s   |s
| j }| | |jS r   )r   r.  r%  existsr$  r}   r}   r~   r7    s    zCmfProject.is_project_dir_existr   r   c                   sB   t dd S t jf ||d|}|D ]}|  |  q(|S )Nr   r<  )r   r   rw   ra   r  r3  )ry   r   r   r   rz   resr   r{   r}   r~   ra     s      
zCmfProject.get_full_treec                 C   sj  | 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jjdd}td d	d
lm	} |dg  }| 
  | jst }	tjjdd|	_| |	_d| j |	_d|	_d|	_|	jdd |	| _| jdd | jjtjkrtj| jj= tjjddj}
tj| ddd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f |jd+d,d-d.d/||_$| j%&|j$ tjf |jd0d1d2d3d/||_'| j%&|j' tjf |jd4d5d6d7d/||_(| j%&|j( tjf |jd8d9d:d;d/||_)| j%&|j) tjf |jd<d=d>d?d/||_*| j%&|j* tjf |jd@dAdBdCd/||_+| j%&|j+ tj| | dDdEdd|_,tj| dFdGdd|_-tj.| dHdIdJ|_/tj| dKdLdd|_0tj| dMdNdd|_1tj| dOdPdd|_2tj| dQdRdd|_3tj| dSdTdd|_4tjjdU| jdV|_5tj| | dWdXdd|_6tj7| dYdZ| j d[|dd\|_8tj| d]d^dd|_9tj| d_d`dd|_:tj;| | gda| j ddb|_<| = |_>| j?dcks| @ |_A| j?ddkr| B |_Cn@| j?dekr| D |_Cn(| j?dfkr| jDdgdhdi|_Cn
| E |_Ctj.| dj| j | jF| jGdk|_H|jH| _I| jJrtj|jdld| j dmd |_K| j?dnk}|rHtj7|j6dodp|_LtjM|j-dqdp|_Ntj.|j/drdp|_O|rtj| |j0ds|dt|_Ptj7|j1dudv|dw|_Qtj7|j2dxdy|dw|_RtjS|j4dzdd{|_Td||jC_Ud}|j4_Ud~|j5_Ud|j_Ud|j_Ud|j-_Ud|j/_Ud|j0_Ud|j2_Ud|j1_Ud|j6_Ud|j3_Ud|j8_Ud|j9_Ud|j:_Ud|j>_Ud|j<_Ud|j,_U| j?dkr| V |_Wd|jC_Xd|j4_Xd|j5_Xd|j_Xd|j-_Xd|j0_Xd|j2_Xd|j1_Xd|j3_Xd|j9_Xd|j:_Xd|j>_Xd|j<_Xd|j8_Xd|j_Xd|jA_X| jYdkrdnd|jW_X|jZ[ D ]}|jdd qd| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _od| _p| jYdkrdnd| _q| jddd | j?dk	rd|j9_Xd|j:_Xd|j<_Xd|j>_Xd|j8_X|jZ[ D ]}|jdd qd| _]d| _\d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _od| _p| jddd tjrjsjt}|D ]b}|dkrĐqtjr|| |j3|d|_ud|jZkr|jK|ju_v|dk	rd|ju_|jujdd q| j?dck
rd|j,_Xd|j4_Xd|j5_Xd|j_Xd|j0_Xd|j2_Xd|j1_Xd|j6_Xd|j8_Xd|j9_Xd|j:_Xd|j<_Xd|j>_Xd|j_Xd|j/_Xd|jC_X|jZ[ D ]}|jdd 	qd| _]d| _\d| _^d| __d| _`d| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _od| _p| jddd | @|  tjrjsjt}|D ]P}|wd
r^tjr|| |j3|d}d| }tx||| ty||jdd 
q^| j?dekr*d|j0_Xd|j2_Xd|j9_Xd|j:_Xd|j<_Xd|j5_Xd|j>_Xd|j8_Xd|jA_X|jZ[ D ]}|jdd qtjzjdd| _{d| _\d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _od| _p| jddd tjrjsjt}|D ]b}|dkrؐqtjr|| |j3|d|_ud|jZkr|jK|ju_v|dkrd|ju_|jujdd q| j?dkrd|jC_Xd|j4_Xd|j2_Xd|j9_Xd|j:_Xd|j<_Xd|j5_Xd|j>_Xd|j8_Xd|jA_X|jZ[ D ]}|jdd qd| _\d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _od| _p| jddd tjrjsjt}|D ]P}|dkrJq8tjr|| |j3|d|_ud|jZkrx|jK|ju_v|jujdd q8| j?ddkrd|j,_Xd|j4_Xd|j5_Xd|j_Xd|j-_Xd|j0_Xd|j2_Xd|j1_Xd|j6_Xd|j3_Xd|j8_Xd|j9_Xd|j:_Xd|j<_Xd|j>_Xd|j_Xd|jA_X|jZ[ D ]}|jdd q(d| _]d| _\d| _^d| __d| _`d| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _od| _p| jddd | j?dfkrftj|jdd| _}tj~jdd| _| dd}| dd}| dd}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}| | | jddtjjdd|||dd tj| dddd|_tj| d| j dd| j dd|_tj|j| |jdd|_tj| d| j dd| j dd|_tj|j| |jd+d|_tj| d| j dd| j dÝd|_tj|j| |jdd|_tj| dddddȍ|_tj|jdddJ|_tj|jddp|_tj| dddd|_tj| dddd|_| V |_Wd||j_Ud}|jC_Ud~|j_Ud|j_Ud|j_Ud|j_Ud|j3_Ud|j>_Ud|j:_Ud|j9_Ud|j<_Ud|j-_Ud|j4_Xd|jC_Xd|j5_Xd|j/_Xd|j0_Xd|j2_Xd|j1_Xd|j6_Xd|j8_Xd|j>_Xd|j9_Xd|j<_Xd|j:_Xd|j-_Xd|j,_Xd|j_Xd|jA_Xd|jW_X|jZ[ D ]}|jdd q0d| _nd| _d| _\d| _^d| _jd| _d| _d| _d| _md| __d| _`d| _bd| _cd| _od| _d| _d| _d| _d| _dd| _gd| _ld| _ad| _]d| _qd| _p| jddd tjrjsjt}|D ]N}|wdСrtjr|| |j3|d|_ud|jZkr4|jK|ju_v|jujdd q|   |   |   |   dIS )uU    Добавляем структуру папок в новый проект
        zlist.pfeed:defaultr   ztask.epic:defaultzlist.agile_sprint:defaultzlist.release:defaultzlist.base:defaultzbqlfilter.quick:defaultuc   Вызываем разворачивание чтобы появилась папка задачиr   )make_dataclassZ	DataEmptytask.gantt_project:default	   Гант 	9_disableTFr   r   rm   u   Фильтрыr   r  r   )rn   
is_defaultr   u   Задачиr   )r   r   r   r  r   u$   Мои открытые задачиr   z?" and responsible in (currentUser()) and cache_status_type != "r   )r   r   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responsible = currentUser()z)["responsible","IN",["__G_CURRENT_USER"]]   )r   r   r   r   r   u%   Недавно обновленныеzcmf_modified_at >= "-12h"z$["cmf_modified_at",">=","now()-12h"]   u%   Приоритетные задачиzpriority in (1, 2, 3)z["priority","IN", [1 ,2, 3]]   u   Зависшие задачиzstatus_modified_at <= "-20d"z'["status_modified_at","<=","now()-20d"]   u%   Просроченные задачиzdeadline <= "-0m"z["deadline","<=","now()-0m"]   u#   Будильник сработалzalarm_date <= "-0m"z["alarm_date","<=","now()-0m"]   u   БлогCmfDocument-blogu   Компоненты
componentsu   ДокументыN)r   r   r   ZEpicsepicZReleasesreleaseZSprintssprintr  reportsZRoadmapsroadmapr  )r   r   u   Спискиr   u
   Лентаu   Лента проекта pfeed)r   r   r  r  rn   r   u   Дискdisku
   Архивarchiveu   Чат )r   	executorsr   r   project.evatestr   zproject.kanbanrp   u
   Доскаzboard.sd_kanban:default)r   rn   z	HomePage )r   r   r   
cmf_authoru   Фильтр1z$" and responsible in (currentUser()))rp   project.wikirT  u   Список1)r   r   u   Компонент1u   Документ1ZEpic1)r   r   r   rn   u   Релиз1r   )r   r   r  rn   ZSprint1r   u   Roadmap Проекта)r   r   r   r  i i i i" iI i q i i  i0 r  iP4 i`[ ip i i i i rV  sectionr   r   r   mark)r   r   r   Zfilters_filter1Zagile_sprintZtest_Zreport__z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)r   r  rn   categoryui_form_viewui_form_createui_form_view_inner9   Запросить новую учетную записьuP   Запросите новую учетную запись для системы.u7   Сообщить о системной проблемеu   Дайте нам знать, если что-то не работает должным образом, и постарайтесь быстро восстановить его работоспособность.task.sd_incident:defaultZ	incidentsu?   Сообщить о сломанном оборудованииu   Сообщите об оборудовании, которое может быть неисправным или сломанным, например разбитый экран компьютера или поврежденный сервер.)r   typesu+   Логины и учетные записиu<   Запросить доступ администратораuY   Например, если вам нужно администрировать EvaProject.u3   Запрос по электронной почтеuu   Запрос получен от вашего канала поддержки по электронной почте.ztask.sd_emailed_request:default)r   r  rn   r]  r^  r_  r\  u   Очередиqueuez[["parent_id", "=", "z*"], ["cache_status_type", "!=", "CLOSED"]]z!" and cache_status_type != CLOSEDr   r   r   u   Все обращения)r   r   
bql_filterr   zT"], ["responsible", "=", "__G_CURRENT_USER"], ["cache_status_type", "!=", "CLOSED"]]zC" and responsible = "currentUser()" and cache_status_type != CLOSEDz)"], ["cache_status_type", "=", "CLOSED"]]z " and cache_status_type = CLOSEDu#   Закрытые обращенияu   База знанийknowlage_basereadonly)r   r   r   r   r   u   КатегорииZknowlage_base_categoriesu   Статьиu   Каналыservicedesk_channelsu   Клиентыservicedesk_clientsZanalysis)r4  r   r:  r   r  rv   ZlogginginfoZdataclassesr>  r  main_gantt_projectr   rn   r   r   full_search_typer   r   r   r   ZAPPcache_projectsCmfStatusCoderJ   r   rM   tasksr   rq   Ztasks__filter2Ztasks__filter3Ztasks__filter4Ztasks__filter5Ztasks__filter6Ztasks__filter7Ztasks__filter9default_bql_filtersr   Ztasks__filter10Ztasks__filter11Ztasks__filter12Ztasks__filter13Ztasks__filter14ZblogrJ  r   ZdocsZepicsZreleasesZsprintsrN  Zroadmapsr  listsr   rP  rQ  rR  rH   chatr   r   ro   r'  r&  r  Zkanban_boardr   r   r   rU  ZhomepageZdescr_documentZsl_create_examplesZfilters__filter1Zlists__list1rG   Zcomponents__component1Z
docs__doc1Zepics__epic1Zreleases__release1Zsprints__sprint1rO   Zroadmaps__roadmap1r   r!  r  r   r   __dict__valuesr   show_all_tasksr   r   r   	show_blogr   r   Zshow_filtersr   r   Zshow_reportsZ
show_testsr   	show_docsr   Zshow_components
show_listsshow_active_sprintsZshow_trashcanshow_reqshow_app_learnrQ   r   choicesZreports__report1report_bql_filter
startswithsetattrr   CmfSchemeWfr   CmfProjectNotifySchemenotify_schemer   r   _create_ui_view_form_create_sdesk_request_group_create_sdesk_request_typerc  Zqueue__queue1_task_filterrP   Zqueue__queue1Zqueue__queue2_task_filterZqueue__queue2Zqueue__queue3_task_filterZqueue__queue3rf  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_create_assign_to_project_create_sdesk_slascaffold_line_chartscaffold_mark)r   Zlt_pfeedZlt_epicZ	lt_sprintZ
lt_releaseZlt_baseZlt_bql_filterr>  tgantt_projectZclosed_status_nameZdefault_quick_kwargsZcreate_list_examplesvr   itemZreport_typesreportZ	attr_nameZ_ui_form_viewZ_ui_form_createZ_ui_form_view_innerZrequest_groupsr}   r}   r~   scaffold  s4   










  



  


  



  


,
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}  r   r   r   ["parent_id", "=", "r   r   r   rd  Fr   rN  Tr   r   r   rY  r   r   r   r   r}  )r   rQ   rv   r   r   rq   r   rJ   )r   report_namer  r}  r}   r}   r~   r  y  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)r   
value_typecoloru   РешенныеZdonez#7bc1a1)r   rowsu5   Анализ SD. Отчет время решенияu   Все задачиZaveragez#8eb021   Время решения)r   r  r  slau   Инцидентыz#ea632brn   ra  )r   r  r  r  
row_filteru]   Анализ SD. Отчет по выполненным SLA против нарушенныхu   ВыполненоZsd_sla_processedz#14892cu   НарушеноZsd_sla_breachedz#d04437uQ   Анализ SD. Отчет по инцидентам по приоритетамu   Критичныйr2  rG  )rn   priority)r   r  r  r  u   ВысокийrH  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   Все)rn   request_typerZ  r`  uM   Анализ SD. Отчет по проблемам по приоритетуztask.sd_problem:defaultr   r}  r  r  r   r   r   rd  Fr   rN  Tr  
line_chartr  r  r  r  r  r   r   z
project = z["parent", "=", "r  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 ()rq   r   r    c                 s   s   | ]}d | d V  qdS r  r}   r  r}   r}   r~   r    s     z["z
", "IN", [z]]r  z = "z	", "=", "r  z and [z ,])rv   r   rQ   r   r   rq   r   rJ   rX   r   r   r  r  r3   r  r   joinr  r   r   r2   r   r  r|  r   r   Zrow_bql_filter)r   r  Zchartr  r  r}  r  rowZrow_task_filterZ	chart_rowr  Zubql_filterre  r  fieldZvalsZlogic_typesZbql_valsr   r  r  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 )
Nr   u3   Отсутствует экранная форма Tr   : r   FrX  )Zobj_copy)	r   Z	CmfUiFormrv   r   task_code_prefixr   cmf_model_namer   r   )r   rq   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:defaultr   zsdesk-agent:default)r   CmfProjectRolerv   CmfProjectRoleAssignr   Zproject_rolemembersr   gcurrent_userr   )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:defaultr   r  date)r   r   Zwidget_type     z+request_type.request_category = 'incidents')r   r   Z	goal_timer   calendari  i  z2request_type.request_category = 'service-requests'i  i`	  z7request_type.request_category = 'post-incident-reviews'i  r  startzissue-created)r   trigger_typetrigger_conditionzresolution-clearedstopzresolution-setr  x   zcomment-for-reporterzstatus-type-changedZsd_waiting_for_customer)r   r  r  Ztrigger_condition_status_codeu;   Время закрытия после разрешенияi  zBrequest_type.request_category in ['incidents', 'service-requests']rm   u/   Время на проведение ревьюz)request_type.request_category = 'changes'r  Zsd_declinedZsd_implementingZsd_planning)r   CmfCalendarrv   r3   r   r5   r6   rn  )r   Zdefault_calendarr  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 )Nr   r   r   rl   r   u   Проект с именем uA    уже существует. Укажите другое имя.Tr   u-   Раздел на диске с именем uF    уже занят. Укажите другое имя проекта.)r   r]   slistr   r   r   r7  r   r}   r}   r~   _check_project_dir_conflict0  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 )	Nr   r   rj   rq   r   u7    с таким именем уже существуетTr   )r   rv   r   Zverbose_name)ry   r   rq   Z
prj_filterr}   r}   r~   _check_unique6  s
    zCmfProject._check_uniquec                    s$   |  || t j|||d|S )N)r   rq   )r  rw   r2  )ry   r   rq   r   rz   r{   r}   r~   r2  ?  s    zCmfProject.createc                 C   s  ddddddddd	d
ddddddddddg}ddg}|D ]}d| }| j | jr8|D ]|}tt| jdd| jgdd|ggd}|s|dkrtt| jdd| jgdddggd}|rV| j | j |_|jdd qVtj	jdd| jgddd | ggd}|r8| j | j |_|jdd q8| j
jrdtjjd!d"| jgd#d"d$ggd}|rd| j
j |_|jdd | jjrtjjd!d"| jgd#d"d%ggd}|r| jj |_|jdd | jjrtjjd!d"| jgd}|r| jj |_|jdd | jjrL| jd&kr tj	jd'd"| gd(d"d)ggd}ntjj| d*}|rL| jj |_|jdd | jjrtjj| d*}|r| jj |_|jdd | jjrtjjd#d"d+gd'd"| ggd}|r| jj |_|jdd | jjrtjjd#d"d,gd'd"| ggd}|r| jj |_|jdd | jjrTtjjd#d"d-gd'd"| ggd}|rT| jj |_|jdd | jjrtjjd#d"d.gd'd"| ggd}|r| jj |_|jdd d S )/NZapprovedrR  rP  ro  rQ  rr  rK  rM  rL  rO  r   rf  rN  r   rc  rJ  rh  ri  r&  r  rJ   CmfActiveEntityFilterr   ri   rj   r   r   r  Tr   ro   zlist.r   r   r  r   rU   r   r   zlogic_type.coder  )r   r   r   rI  CmfReq)rs  r   r   r   rv   r   r   r   r   r   show_doc_registryrM   show_company_registryr   rH   ry  ro   r   rw  r   ru  rx  rv  rz  )r   Z	sys_typesZnode_modelsr   Z	fieldnameZ	nodeclassZsysnoder}   r}   r~   _calc_hidden_nodesD  s    

 
 






zCmfProject._calc_hidden_nodesc                    s,   t   ddddddddd	d
dddddg S )NZdefault_list_workflowZdefault_epic_workflowZdefault_subproject_workflowZdefault_release_workflowZdefault_sprint_workflowZdefault_document_workflowr  project_perm_schemer  r  r   r   cmf_project_adminsr  r   )rw   save_preload_fieldsr   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<   Нельзя менять родителя у проектаrW  zCmfWiki:Classr   zCmfProject:Class)r   r   r   r   r   ri   r   r   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 r   )r  r   r   r   Zconfluence_convertr   r   r   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+-rH  c                 S   s   g | ]}|d  qS )r   r}   )r  chunkr}   r}   r~   
<listcomp>  s     z3CmfProject.get_prefix_from_name.<locals>.<listcomp>rE  z--r  ZILIKE%r   ru   c                 S   s   g | ]}|j  qS r}   )r  lower)r  r   r}   r}   r~   r    s     c              
      s8   g | ]0}|   rd d|   dqS )z\Dr  )r~  r  subreplace)r  pprefixrer}   r~   r    s      )default1)r  r   Ztranslit_stripr  r  r   lenr  r   r]   r  setr   maxstrintupper)r   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   Нельзя использовать системный префикс Tr   r   rl   r  r   r   )ru   r   include_deletedu   Код u2    уже используется проектом u   . Выберите другойrq   rr   z-%r   zproject.nameu8    ранее использовался проектом u   . Это может привести к пропускам в нумерации кодов. Если это нежелательно - укажите другой префиксur   Запущен фоновый процесс смены префиксов кодов у задач проекта)r   )r  r   Ztask_code_use_logic_type_prefixr   r  Zcode_prefixr   r   r]   rv   r   r   CmfTaskCodeHistoryr   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}   r  cr}   r}   r~   r  $  s      zACmfProject._calc_task_code_prefix_for_section.<locals>.<listcomp>z(?:\b|_)([A-Za-z0-9]{1,4})NrE  rH  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>r  r   r   rl   r   )Ztransliterater  r   r   r   r  findallr  r  r  r   r]   sgetr   r  )r   r  rq   Z	code_listir}   r}   r~   "_calc_task_code_prefix_for_section  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   Для редактирования параметров проекта Вам необходимо находиться в группе Администраторы проектовTr   Fu   Для редактирования параметров проекта Вам необходимо быть Администратором проекта)in_person_groupr   r  r   r  r   )r   personZraise_exceptionr  r}   r}   r~   is_project_admin3  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)r   r  Zblack)r  r   rV   rv   r   )r   ZwlZblr}   r}   r~   _calc_white_black_listsI  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   rJ   r  r!  )r   r   r}   r}   r~   _calc_structure_scaffoldV  s    z#CmfProject._calc_structure_scaffoldc              
      s8  | 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%rd| j | j%_| j%jdd | j r| js| j&| _d}
| j s"| '  | j(sX| j)dkrHtj*jdd| _(ntj*jdd| _(| j+sptj,jdd| _+| j-stj.jdd}|stj.jdd}|| _-| /  | 0  | j1s| j2d kr| 3  ntd!dd | 4  | 5  | 6  t7 j||}| j sD| j(j
sD| j8j
sD| j9j
sD| j:j
sD| j;j
sD| j<j
rNtj*=  | >  |d"drhd}
|
rv| ?  | j@j
r| A  | jBj
r| jBr| C  | jDj
r| jDr| E  | jFj
r| jFr| G  | j s| j+j
rtj,=  tjHjId#d$d%d&ggd#gd'}|D ]}d%|_J|jdd q| K  |S )(NZProjectCreatorsr  u   Для создания проектов попросите Администратора системы добавить Вас в группу Создатели проектовTr   rq   rj   r  r   r   u   Пользователь uO    добавлен в группу Администраторы проектовr   r   rl      Проект     уже существуетr#  _%Y-%m-%d-%H%M%SFrk  <   Имя проекта не может быть пустым.r@  r   rp   servicedesk:defaultr   system.open:defaultsystem:default)rB  rW  u8   Укажите Префикс для кода задачdont_scaffoldonboarding_statusr
  rm   cancelr   )Lr  r  r  Zis_admindisable_permissionsacl_admin_moder  r   r  r   r   r   CmfPersonGrouprv   Z
rg_membersZ
all_nestedZ_changesr   Zdisable_aclr   Zcurrent_person__member_ofaddr   r   r]   r   r7  r.  r%  r;  renamer   nowr6  r  r   rename_project_dirrk  rq   r  r  ro   CmfProjectPermSchemer  r  r  r  r  r   r  r   r  r  r   r   rw   Zservicedesk_publicr   r   
spectatorsrS  Ztrigger_reloadr  r  r4  r:  r  r  r  r  rz  scaffold_req_registry
CmfLicenser   r  r  )r   r   rz   Zproject_admins_groupZproject_admins_group_membersZchange_actionZpr_adminr  r;  project_dir_rfileshould_be_scaffoldedr  resultonboardings
onboardingr{   r}   r~   r   ^  s    


"


	


zCmfProject.save)returnc                 C   s&   |  | | jj}||   d S r   )r.  r%  r   r   r
  )r   	old_rfiler}   r}   r~   r    s    zCmfProject.rename_project_dirc           
         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 )Nr   rj   r   rl   r   r  r  Tr   r#  r  r  Zdiv)Ztags_extendFr  rp   r   r   r  r  rW  r  r
  rm   r  r   r   ),r  r   r]   rv   r   r   r   r7  r.  r%  r;  r
  r   r  document_header_textr   r   Z
html_cleanr   document_footer_textr  r   rq   r  r  ro   r  r  r  r  r   r  r   r  r  r  r   rw   _save_importr  r  r   r  r   )
r   r   rz   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   r   r   r   r   r   zCmfTask:zPPP-TSK-ORDERr   zPPP-OBJ-ORDERrG  r  Tr   )r   r   r   rv   r   r~  rb   check_edit_permr   r   r  r   )ry   Zitem_idZ	anchor_idZnext_idZ
item_modelr  Zanchor_modelanchorZanchor_ordernoZ
next_modelZ	next_itemZnext_ordernor}   r}   r~   r_   (	  s(    

zCmfProject.move_itemc                 C   s   d S r   r}   r   r}   r}   r~   
_calc_codeI	  s    zCmfProject._calc_codec                 C   s   d S r   r}   r   r}   r}   r~   get_code_prefixN	  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}|rg | _d | _	| 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rx|jddd t  qxqVt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 q>t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 )N   Данный проект был импортирован из внешней системы. Удаление импортированных проектов доступно через <a href="@  " target="_blank">службу технической поддержки</a>.<br />Если Вам необходимо обновить данные проекта, пожалуйста, воспользуйтесь процедурой повторного импорта проектов через меню <a href=""   settings/import">Импорт</a>.Tr   r   )rG   rH   r  r   ZCmfImportDownloadr   r   ZCmfTransr  r  r  rn  r  r  	CmfPersonr  r   rI   rQ   r   rJ   r   rj   )ru   r  include_systemu   Удаляем )r   r  r(  )r#  force)r   r  r(  
project_id)ru   rt  rm  r   u   Удаляем из кеша F)r"  r#  r(  r   )"
cmf_importr   r   configSUPPORT_URLapp_base_hrefr   r   rp  rk  r   r   r   r   r  debugr  r   r  Zcommit_with_eventr$   r  CmfDocumentHistoryCmfAccessRulebulk_updateCmfAccessListZCmfCustFieldConfrm  r   rw   r7  r(  rv   move_to_trash)r   r"  r#  r   rz   cur_nameZcls_namer  Z
gantt_taskZ	task_codeZdoc_historyZcust_field_confr=  r%  r{   r}   r~   _old_deleteR	  sd    
"

 zCmfProject._old_delete)r"  r#  use_jobc                O   s   |  ddg | jr tddd | jrH|sHtdtj dt  ddd | |   d| _	| j
jrl| j
jn| j
}| |r|   |   | jj||d	|}|rt| j|d
 n| jf | d S )NrB  r+  u@   Нельзя удалять проект по умолчаниюTr   r$  r%  r&  )r*  r"  r#  rz   )r6  rB  r   r+  r,  r-  r.  Zapply_delete_prefixZgenerate_delete_prefixcmf_deletedr   r   r   r7  r  	save_datar   Zjsonr  _delete_job)r   r"  r#  r7  r   rz   Zproject_name
job_kwargsr}   r}   r~   r  	  s.    
	
zCmfProject.deleterC  r*  u   Удаление проекта)r  	only_onceonly_once_argsdescriptionshow_bg_progressbarc                O   s   t jj| dd}|r2t jj|f|d|i| nt jj|f|d|i| |jj}||r|t j|}|r||j	dd d S )NTr   r  r"  F)Z	is_rename)
r   r]   rv   
_db_delete_move_to_trashr   r   r7  r(  r4  )r*  r"  r#  r   rz   r   r5  r%  r}   r}   r~   r;  	  s    	
zCmfProject._delete_jobc                 O   s   dd| j jgdddgg}tD ]J}t|}|dkrL|j|dD ]}|  q>|j|ddidd t  qd| _	| 
  tj| j j tjj| d	 tjjd	d
tj| | jj| jjd t  d S )Nr*  r   r9  Fr   r   T)ru   rt  include_dummyr  r]   Zoperater  rU  r   parent_nameZparent_code)r   r   PROJ_MODELSr   get_model_by_namer   Zdelete_filer2  
cmf_commitr9  r:  r   r]   _remove_proj_objs_from_indexingcmfapp	CMF_CACHE
invalidateCmfAuditaudit_eventr  current_personr   rq   )r   r"  r   rz   Z_filter	classnamer   Zattachr}   r}   r~   rC  	  s6    

zCmfProject._move_to_trashc                    s	  | j j}ttjjt|dd tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
d	d|i t  tjjj	 
d
d|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
dd|i t  tjjj	 
d d|i t  tjjj	 
d!d|i t  tjjj	 
d"d|i t  tjjj	 
d#d|i t  tjjj	 
d$d|i t  tjjj	 
d%d|i t  tjjj	 
d&d|i t  tjjj	 
d'd|i t  tjjj	 
d(d|i t  tjjj	 
d)d|i t  tjjj	 
d*d|i t  tjjj	 
d+d|i t  tjjj	 
d,d|i t  tjjj	 
d-d|i t  tjjj	 
d.d|i t  tjjj	 
d/d|i t  tjjj	 
d0d|i t  tjjj	 
d1d|i t  tjjj	 
d2d|i t  tjjj	 
d3d|i t  tjjj	 
d4d|i t  tjjj	 
d5d|i t  tjjj	 
d6d|i t  tjjj	 
d7d|i t  tjjj	 
d8d|i t  tjjj	 
d9d|i t  tjjj	 
d:d|i t  tjjj	 
d;d|i t  tjjj	 
d<d|i t  tjjj	 
d=d|i t  tjjd>d?|gd>d id@dA t  tjjdd?|gdd id@dA t  tjjdBd?|gdBd id@dA t  tjjdCd?|gdCd id@dA t  tjjdd?|gdd id@dA t  tjjdDd?|gd@dE t  tj| tjtjtjtjtjtjtjfD ]&}|jdd?|gdd id@dA t  qPdFD ],}t|}|jdd?|gd@d@dG t  q|tt| j||d@dH| t  t j!j"#| dI tj$j%dIdJt&j'| | j(j| j)jdK t  d S )LN)r*  r8  z
                DELETE FROM cmf_kanban_board_column_cmf_status_code s
                USING cmf_kanban_board_column c
                WHERE s.left_id = c.id AND c.project_id = :project_id;
            r*  z
                DELETE FROM cmf_list_cmf_task lt
                USING cmf_task t
                WHERE lt.right_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_list_cmf_task lt
                USING cmf_list l
                WHERE lt.left_id = l.id AND l.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_git_branch tg
                USING cmf_task t
                WHERE tg.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_git_commit tg
                USING cmf_task t
                WHERE tg.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_git_merge_request tg
                USING cmf_task t
                WHERE tg.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_cust_field_conf_cmf_project cp
                USING cmf_project p
                WHERE cp.right_id = p.id AND p.id = :project_id;
            z
                DELETE FROM cmf_roadmap_cmf_task_filter rt
                USING cmf_roadmap r
                WHERE rt.left_id = r.id AND r.project_id = :project_id;
            z
                DELETE FROM cmf_s_desk_request_type_cmf_s_desk_request_group m2m
                USING cmf_s_desk_request_type t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_active_entity_filter_cmf_tag m2m
                USING cmf_active_entity_filter t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_component m2m
                USING cmf_component c
                WHERE m2m.right_id = c.id AND c.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_testcase m2m
                USING cmf_task t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_component m2m
                USING cmf_task t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_document m2m
                USING cmf_task t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_task m2m
                USING cmf_task t
                WHERE (
                    m2m.left_id = t.id OR m2m.right_id = t.id
                ) AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_person m2m
                USING cmf_task t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            ai  
                DELETE FROM cmf_kanban_board_column_cmf_status_code m2m
                WHERE left_id IN (
                    SELECT kbc.id AS left_id
                    FROM cmf_kanban_board_column kbc
                    JOIN cmf_kanban_board kb ON kbc.parent_id = kb.id
                    WHERE kb.project_id = :project_id
                );
            zEDELETE FROM cmf_task_filter_cmf_project WHERE right_id = :project_id;z
                DELETE FROM cmf_roadmap_cmf_list m2m
                USING cmf_list l
                WHERE m2m.right_id = l.id AND l.project_id = :project_id;
            z
                DELETE FROM cmf_roadmap_cmf_task m2m
                USING cmf_task t
                WHERE m2m.right_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_roadmap_cmf_bql_filter m2m
                USING cmf_roadmap r
                WHERE m2m.left_id = r.id AND r.project_id = :project_id;
            z
                DELETE FROM cmf_document_cmf_key_phrase m2m
                USING cmf_key_phrase kp
                WHERE m2m.right_id = kp.id AND kp.project_id = :project_id;
            zQDELETE FROM cmf_automation_crud_trigger_cmf_project WHERE right_id = :project_id;zCDELETE FROM cmf_project_cmf_plugin_git WHERE left_id = :project_id;zCDELETE FROM cmf_project_cmf_bql_filter WHERE left_id = :project_id;z
                DELETE FROM cmf_relation_option r
                USING cmf_task t
                WHERE
                    (r.in_link_id = t.id OR r.out_link_id = t.id)
                    AND t.project_id = :project_id;
            z
                DELETE FROM cmf_list_history_o_t_r lh
                USING cmf_list l
                WHERE lh.task_list_id = l.id AND l.project_id = :project_id;
            z
                DELETE FROM cmf_list_history_r_t_e lh
                USING cmf_list l
                WHERE lh.task_list_id = l.id AND l.project_id = :project_id;
            z
                DELETE FROM cmf_task_code_history tc
                USING cmf_task t
                WHERE tc.task_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_form_field ff
                USING cmf_form f
                WHERE ff.form_id = f.id AND f.project_id = :project_id;
            a  
                DELETE FROM cmf_task_res_assign_timephase
                WHERE resource_assignment_id IN (
                    SELECT a.id as resource_assignment_id
                    FROM cmf_task_res_assign a
                    JOIN cmf_task t ON a.parent_id = t.id
                    WHERE t.project_id = :project_id OR a.project_id = :project_id
                );
            z
                DELETE FROM cmf_task_res_assign a
                USING cmf_task t
                WHERE a.parent_id = t.id AND t.project_id = :project_id;
            a  
                UPDATE cmf_task t1
                SET op_gantt_task_id = null
                FROM cmf_gantt_task gt
                JOIN cmf_task t2 ON t2.id = gt.task_id
                WHERE gt.id = t1.op_gantt_task_id AND t2.project_id = :project_id;
            z
                DELETE FROM cmf_gantt_task gt
                USING cmf_task t
                WHERE gt.task_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_kanban_board_column kbc
                USING cmf_kanban_board kb
                WHERE kbc.parent_id = kb.id AND kb.project_id = :project_id;
            z
                DELETE FROM cmf_access_rule ar
                USING cmf_access_list al
                WHERE ar.parent_id = al.id AND al.project_id = :project_id;
            z
                UPDATE cmf_comment c1
                SET tree_parent_id = null
                FROM cmf_comment c2
                WHERE c1.tree_parent_id = c2.id AND c2.project_id = :project_id;
            z
                UPDATE cmf_task t1
                SET epic_id = null
                FROM cmf_task t2
                WHERE t1.epic_id = t2.id AND t2.project_id = :project_id;
            z
                UPDATE cmf_list_history_r_t_e lh
                SET timetracker_history_id = null
                FROM cmf_time_tracker_history tth
                WHERE lh.timetracker_history_id = tth.id AND tth.project_id = :project_id;
            z
                UPDATE cmf_list_history_r_t_e lh
                SET task_id = null
                FROM cmf_task t
                WHERE lh.task_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_list_history_o_t_r lh
                SET task_id = null
                FROM cmf_task t
                WHERE lh.task_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_document d
                SET cur_published_version_id = null
                FROM cmf_document_history dh
                WHERE d.cur_published_version_id = dh.id AND dh.project_id = :project_id;
            z
                UPDATE cmf_document d
                SET cur_workflow_version_id = null
                FROM cmf_document_history dh
                WHERE d.cur_workflow_version_id = dh.id AND dh.project_id = :project_id;
            z
                UPDATE cmf_shadow_link sl
                SET task_id = null
                FROM cmf_task t
                WHERE sl.task_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_task t
                SET main_list_id = null
                FROM cmf_list l
                WHERE t.main_list_id = l.id AND l.project_id = :project_id;
            z
                UPDATE cmf_gantt_task gt
                SET gantt_project_id = null
                FROM cmf_task t
                WHERE gt.gantt_project_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_project p
                SET main_gantt_project_id = null
                FROM cmf_task t
                WHERE p.main_gantt_project_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_task t1
                SET gantt_project_id = null
                FROM cmf_task t2
                WHERE t1.gantt_project_id = t2.id AND t2.project_id = :project_id;
            z
                UPDATE cmf_gantt_task gt
                SET parent_task_id = null
                FROM cmf_task t
                WHERE gt.parent_task_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_task t1
                SET parent_task_id = null
                FROM cmf_task t2
                WHERE t1.parent_task_id = t2.id AND t2.project_id = :project_id;
            z
                UPDATE cmf_task t1
                SET subproject_id = null
                FROM cmf_task t2
                WHERE t1.subproject_id = t2.id AND t2.project_id = :project_id;
            z
                UPDATE cmf_task t
                SET request_type_id = null
                FROM cmf_s_desk_request_type rt
                WHERE t.request_type_id = rt.id AND rt.project_id = :project_id;
            z
                UPDATE cmf_chat_topic ct
                SET group_id = null
                FROM cmf_chat_group cg
                WHERE ct.group_id = cg.id AND cg.project_id = :project_id;
            z
                UPDATE cmf_document d
                SET perm_acl_id = null
                FROM cmf_access_list a
                WHERE d.perm_acl_id = a.id AND a.project_id = :project_id;
            z
                UPDATE cmf_task_filter t
                SET perm_acl_id = null
                FROM cmf_access_list a
                WHERE t.perm_acl_id = a.id AND a.project_id = :project_id;
            z
                UPDATE cmf_checklist_item c
                SET cache_task_id = NULL
                FROM cmf_task t
                WHERE c.cache_task_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_project p
                SET perm_acl_id = null
                FROM cmf_access_list a
                WHERE p.perm_acl_id = a.id AND a.project_id = :project_id;
            z
                UPDATE cmf_task t
                SET op_gantt_task_id = NULL
                FROM cmf_gantt_task gt
                WHERE t.op_gantt_task_id = gt.id AND gt.project_id = :project_id;
            Zdefault_project_idr   T)ru   rt  r  Zstructural_project_idZfilter_project_idri   )ru   r  )Qr  rS   rR   rX   rQ   rP   rO   rN   rM   rL   rK   rJ   rH   rG   rF   rE   rD   rC   rB   rA   r@   r?   r>   r=   r<   r;   r:   r9   r8   r7   r6   r5   r4   r3   r2   r1   r0   r/   r.   r-   r,   r+   r*   r)   r(   r'   r&   r%   r#   r"   r!   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r$   r   r   r   rI   r   rT   rU   rV   rW   rY   rZ   r[   r\   )ru   r  rD  r!  r  r]   rE  )*r   r   r  r   r]   _delete_attachments_files_jobr   r)  r*  SessionexecuterI  r'  r2  ZCmfPipelineZCmfRoleZCmfTagZCmfWhatsappZCmfMailHandlerZbulk_deleterJ  ZCmfDealZCmfLeadr   rI   r0  r1  r3  r   rH  rw   r  rK  rL  rM  rN  rO  rP  r  rQ  r   rq   )r   r"  r   rz   r*  r   rR  r{   r}   r~   rB  
  s   
	
	
																						

S

zCmfProject._db_deletec                 C   s6   dD ],}t jjj d| dd| i t  qd S )N)
Zcmf_taskZcmf_documentZcmf_listZcmf_kanban_boardZcmf_task_filterZ
cmf_folderZcmf_dashboardZ
cmf_reportcmf_projectZcmf_commentzs
                    UPDATE cmf_full_search AS fs
                    SET is_dirty = true
                    FROM z` AS t
                    WHERE t.id = fs.obj_id AND t.project_id = :project_id
                r*  )r   r]   r)  r*  rT  rU  rI  )r*  tabler}   r}   r~   rJ  w  s    	z*CmfProject._remove_proj_objs_from_indexingu;   Жесткое удаление файлов проекта)r=  r>  r?  c          
      O   sx   dd t jj| dgddD }t jjj j}|D ]@}tdt	
| |d d  | }|t|}	|	r2|	  q2d S )Nc                 S   s   h | ]}|j jqS r}   )ri   r   )r  ar}   r}   r~   	<setcomp>  s     z;CmfProject._delete_attachments_files_job.<locals>.<setcomp>ri   T)r*  r   r  r   i)r   r   r   r(  r)  r*  r+  rootr   r   Zget_class_name_by_idZfind_child_by_idr  r  )
r*  r"  r#  r   rz   Z
parent_idsrZ  ri   r,  Zrfr}   r}   r~   rS    s    
"z(CmfProject._delete_attachments_files_jobc                    sH   | j j}t jf ddi|}| j j}tjj||  |d |   |S )Nr(  T)name_beforeZ
target_dir
name_after)	r   r   rw   restorer   r(  Zrestore_from_trashr%  r:  )r   rz   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hoursri   rj   plan_start_date<rk   rl   ZCLOSED
alarm_dater
   r   )	r   r  r   Zutcr   r   r   r   r   )r   r  ro  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")
            rG  )r  r   r   msgr  )
auto_alarm_daterb  printr   r   r   r   	CmfNotifyplace_notifyZcaption)r   ro  r}   r}   r~   '_notify_project_owner_not_planned_tasks  s"    z2CmfProject._notify_project_owner_not_planned_tasksz@daily)r=  Z
system_jobZschedulec                  C   s:   t jjddD ]&} |  }|D ]}|j|_|  qqd S )NT)rd  )r   r]   r   rb  r_  ra  r   )r   ro  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 есть две реализации механизма штатными средствами через подписку на фильтры или через крон в автоматизациях
        **r   N)r   r]   r   rh  r   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  )ri   r   r   c                 S   s   i | ]}|j j|qS r}   )r   r   r  r   r}   r}   r~   rp    s    r   filter_tag_idr   ri   rj   r   ro  r  )r   r   r   z: Create new filter for z with category Fr   #)r   r   r   r  Z
filter_tag)r   rJ   rv   r   r   r  rr  r   r   Ztag_categoryr   r   r   r   itemsr  r/  )
r   rn  Ztask_tags_id_dictZtasks_filterZtags_folderZcategory_foldersZ	ae_filterro  Zcategory_folderZtag_idr}   r}   r~   hook_task_tags_changed  sz    
  


   
  
 
   z!CmfProject.hook_task_tags_changedc                 C   s   d S r   r}   )ry   ro  r}   r}   r~   hook_new_tag+  s    zCmfProject.hook_new_tagc                 C   s   dS )NTr}   r   r}   r}   r~   has_tree_nodes_hook/  s    zCmfProject.has_tree_nodes_hookc                 O   s   d S r   r}   )ry   r   rz   r}   r}   r~   public_list2  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#d$g%}||d%< t jj||}|sld S z|  W n tk
r   Y d S X |S )&Nr   r   rq   r   r   Zactivity_idro   rn   zworkflow.namer   cmf_created_atr   r  r?  r   r   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_jsZdescr_document_idr   )r   r]   rv   Z_acl_check_readZCmfPermissionError)ry   r   rz   Zfields_to_returnr   r}   r}   r~   
public_get7  s^    (zCmfProject.public_getc                 O   s   t jj| f||S r   )r   r  rb   )r   r   rz   r}   r}   r~   rb   m  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  r   r  Zsecurity_level_schemer   r  Z
protected_uv   Поле защищено от изменения, обратитесь к Администратору системыr   )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  rt  r   Zproject_perm_allow_fieldsr~  endswithr	  r   r  r  r  r6  r   r   r  r  r   r   rb   )r   Zchanged_fields_to_checkr  Zadmin_require_fieldfr}   r}   r~   r  p  sD    




zCmfProject.check_edit_permc                    s
   t   S r   )rw   check_delete_permr   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 )Nr   Fr   rb  r  rn   r\  r]  r^  r_  )r   r  rn   r\  groupr]  r^  r_  )r   r1   r   rv   r   r   r  )r   groupsr  request_groupr  r}   r}   r~   r    s     z&CmfProject._create_sdesk_request_groupc	           
      C   s`   t  }	| |	_||	_||	_||	_||	_||	_||	_|d k	r@||	_	|d k	rT|	j
| |	  d S r   )r   r2   r   r   r  rn   r]  r^  r_  Zrequest_categoryr  r   r   )
r   r   r  rn   r\  r  r]  r^  r_  r  r}   r}   r~   r    s    z%CmfProject._create_sdesk_request_typec                 C   s   | j  d| j d| j S r"  )Z	ui_moduleZui_namerq   r   r}   r}   r~   href  s    zCmfProject.hrefc                    sD   ddl m} t  }t|dkr@|d d  d||d }|S )Nr   )cmf_hashlib      r  rE  )cmf.utilr  rw   gen_coder  Zshort_str_enc)r   r  Zres_coder{   r}   r~   r    s
    
zCmfProject.gen_codec                 K   s   |s| j d }tj|d}d}| jddD ]F}|j|ks*|jds*|jds*t|tj	j
r`q*t||j|j q*| D ]\}}||j	krzt||| qz|S )N    Копияr   )%attachmentschat_groupscmf_archivedry  r9  r+  Zcmf_locked_atZcmf_locked_byZcmf_modified_atZcmf_modified_byZcmf_viewed_atrq   Zcommentsrh   Z	documentsZext_idZfavorite_forr   r   Zimport_originalZimport_raw_jsonZlocal_linksZlocal_links_docs_inZlocal_links_tasks_inr   r   rk  r  Zstatus_closed_atZstatus_in_progress_endZstatus_in_progress_startZstatus_modified_atZstatus_review_atr  ro  r   Ztask_filtersT)Z
is_definedr{  Zperm_)r   r   r]   rt  r   r|  r~  r   rK  r   Z
CmfBackrefr  r   rt  )r   r   rz   new_projectZskip_fieldsr  attrr   r}   r}   r~   clone  s&    
	


zCmfProject.clonec              
   K   s   |rdt jj| ddks(t jj| ddkrdtf t| j|||||tjjj	d|}t
| j|d | S | jf |||||d|S )Nr   2   )proj_idr   rq   r  structure_copy	full_copynotify_person_idr8  r   rq   r  r  r  )r   r   countr   r   r  r   r  rQ  r   r  create_from_template_jobdo_create_from_template)r   r   rq   r  r  r  rz   r<  r}   r}   r~   rc     s(    $     zCmfProject.create_from_templateu3   Создание проекта по шаблону)r=  r?  r@  c              
   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   Ошибка создания проекта по шаблону r  uB   Ошибка создания проекта по шаблону: T)r)  rH  )r   r  r   rc  Zforce_notify_current_personr  )r]   rv   r  r   r   Zrollback_purge_event	traceback
format_excr  r/  r   rf  rg  )r  r   r  rq   r  r  r  _kwargsr   r  Znotify_nameZ
notify_msger}   r}   r~   r  	  s,    
 
*z#CmfProject.create_from_template_jobc                    s  dd  d" fdd	dd }dd  fd	d
d# fdd	}dd  fdd|rfd}t jj| jdgd}	g |	_g |	_|	j|p|	jd ||| d}
|
jdd|d |ri }|
|
t	|	j
|d |r||
|	|d ||
d |	jrt jj|
|	jjd|
_|
jdddd |
jst  }t jjdd|_|
|_d|
j |_d |_d|_|jddd! ||
_|
jddd! |
S )$Nc                 S   s,   |    |   |   |   |   d S r   )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 kri }|D ]}t |tjtjtjtjfr0q|dg |j|jdd}||_	| |_
| |_|j|_ | t|dddkrtj| d}|jddd ||_|jdddd	 |||jj< | |t|j| qd S )
Nr   T)r   copy_attachmentsr   Fr  r   r   emit)Znoitfyr  r   )r   r   r  r   rH   r   r6  r   r   r   r   r   r   r   r   r  r   r   r   r   )r  
new_parentorig_childrentree_parent_mappingZ
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 )	Nr   rj   cloned_fromr   rk  )out_linkr   )r  )r  in_link)r   r   r  r)   r   r  r   r  r  r   r   r   )r   ri  relZin_taskZnew_relr}   r}   r~   _copy_relation_optionsK  s    zBCmfProject.do_create_from_template.<locals>._copy_relation_optionsc                 S   s   |j |j|j|jd}| D ]T\}}|D ]F}|j|jkr<q*t| || t| |	||j
 d|jj   q*q| jr|| jjj
 d| jjj  | _g | _g | _| jdddd dS )uT   Обрабатывает параметры задачи (lists, fix_versions, etc.))rq  fix_versionsaffected_versionsrJ  r   FTr  r   r   N)rq  r  r  rJ  rt  r   r   r   r   r   r   r   r   Z	main_listr  rS  r   )new_task	orig_tasknew_project_params_dictZparams_listsZ
param_namelstr  r}   r}   r~   _process_task_paramsQ  s     ( z@CmfProject.do_create_from_template.<locals>._process_task_paramsc                    s   | j  }| j j|_| j j|_||_d|_d|_d|_d|_d|_	d|_
d|_td|_td|_| jsx|    |  | |_|jddd |j| _|j| _|| _ | jdddd dS )uP   Настраивает gantt_task для скопированной задачиNr   z0.00Fr  r   Tr  )op_gantt_taskr  r   rU  r   parent_taskZactual_workZactual_durationZactual_completeZactual_myself_workZactual_start_dateZactual_finish_dater   Zactual_costZactual_myself_cost_calc_gantt_taskri  r   r  rS  )r  r  r  r  r  r}   r~   _setup_gantt_taske  s,    




z=CmfProject.do_create_from_template.<locals>._setup_gantt_taskc                    s  |d kri }dd t jj| ddD }|dd t jj| ddD  i }|j }|dg || }d| j |_d |_	d|_
|jddd	 |  |jddd	 || _| jddd	 |||j< t jj|dd
ddddd
dddddgd}i }g }	g }
|D ]`}||krq|jdkr&|
| q|| d}||| || | |	| |||j< q|
D ]J}|| d}||| || | |||j< |||j< |||jj< qd|
D ]J}||jj }|jr|jjj|kr||jjj |_|jdddd q| D ]}d}|jr`||jjd }|rBt jj|jjd|_|   | |j|j	_d}|jr||jjd }|rt jj|jjd}||_||j	_d}|r|jdddd |j	jdd q| || d S )Nc                 S   s"   i | ]}|j  d |jj |qS r   r   r   r   )r  r  r}   r}   r~   rp    s      zKCmfProject.do_create_from_template.<locals>._copy_tasks.<locals>.<dictcomp>T)r   Zinclude_archivedc                 S   s"   i | ]}|j  d |jj |qS r  r  )r  compr}   r}   r~   rp    s      ***r@  Fr  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.*r   r   	task.epicztask.subproject)ri  r  r  r  )r   r  r   r   )r   r   r   updaterG   rk  r   r6  r   r  r   r   r  rq   r   ro   r   r   r   r   rt  r  rv   Z_calc_gantt_pathr  )r  orig_projectr  r  Ztasks_by_orig_idZorig_main_gantt_projectnew_main_gantt_projectZ
orig_tasksZparent_tasksro  Z
epic_tasksr  r  ri  Z
needs_saveZnew_parent_taskZnew_gantt_project)r  
_copy_task_copy_task_filtersr  r  r}   r~   _copy_tasks  s    



     




z7CmfProject.do_create_from_template.<locals>._copy_tasksc                 S   sh   |   }| j|_| j|_||_||_|jdkrJ| jrJtjj	| jj
|d|_| |_| jrd| | |S )Nr  r   r   )r  r   rU  r   r   ro   r   r   rJ   rv   r   r  rq   r  r  )ri  r  r  r}   r}   r~   r    s    


z6CmfProject.do_create_from_template.<locals>._copy_taskc           	         s  dd| g}| dd tjj|dD  dd| g}| dd tjj|dD  ddd| gddd	gg}| d
d tjj|dD  tjj|dgd}|D ]d}| }| |_| |_	|j
r|j
|kr| |_
ntjj|j
j| d|_
| g|_ | |jddd qd S )Nr   rj   c                 S   s"   i | ]}|j  d |jj |qS r  r  rq  r}   r}   r~   rp    s     zRCmfProject.do_create_from_template.<locals>._copy_task_filters.<locals>.<dictcomp>r   c                 S   s"   i | ]}|j  d |jj |qS r  r  )r  docr}   r}   r~   rp    s     ZANDro   r  c                 S   s"   i | ]}|j  d |jj |qS r  r  )r  rK  r}   r}   r~   rp    s     r  r  r  Fr  )r  r   rJ   r   r   r   r   r  r   r   r   rv   r   Zft_projectsr   )	r  r  r  Z_folder_filterZ_doc_filterZ_epics_filterZorig_project_task_filtersZorig_task_filterZnew_task_filterr  r}   r~   r    s>    






	z>CmfProject.do_create_from_template.<locals>._copy_task_filtersTr  r  r  )r   rq   r  r  F)r  r   r  )r  r  r  r  )r  r  r  rl  r  r  r?  r   r@  rA  r  )N)N)r   r]   rv   r   Zchat_topicsr  r  r   r   r   r   rh   r   rk  r   r  rn   r   rl  r   )r   r   rq   r  r  r  rz   r  r  r  r  r  r  r}   )r  r  r  r  r  r  r~   r  "  sV     [/ 
z"CmfProject.do_create_from_templateobj_id)r=  r>  z
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 )Nr  T)Zskip_tree_moverd   Fr*  r  )r   r]   rv   rR  r   r   r  r   r=  ro  ri  r}   r}   r~   rd   G  s    zCmfProject.archive_projectc                 C   s<   t jj| d}| }t jj| dd}|D ]}|  q*|S )Nr  Tr  )r   r]   rv   Zarchive_restorer   r   r  r}   r}   r~   re   T  s    
z"CmfProject.archive_restore_projectc                 C   s&   t jj| ddgd}|jddd |S )NTr9  )r   r  r   F)r)  r"  )r   r]   rv   r  r  r   r}   r}   r~   rf   b  s    zCmfProject.delete_projectu)   Востановление проекта)r?  r@  r=  r>  c                 C   s"   t jj| dd}|jd|jjdS )NTrA  )r"  Zprefix_name)r   r]   rv   r]  r   r   r  r}   r}   r~   rg   h  s    zCmfProject.restore_projectz@hourlyc                  O   s$   t jjdd}|D ]}|  qd S )NT)r4  )r   r]   r   r:  )_argsr  Zproject_listr   r}   r}   r~   $celery_hourly_sync_rdisk_folder_hookn  s    z/CmfProject.celery_hourly_sync_rdisk_folder_hookc                 C   s>   t jj| | dd}|rd S t j| | dddd}|jdd d S )Nr  r  u   ТребованияTr  Fr   r  )r   Zreq_registryr}   r}   r~   r  y  s    z CmfProject.scaffold_req_registry)NNN)NN)r   N)N)r   T)r   r   )N)N)N)NN)T)NN)NNNNN)N)NNNFF)NNNFF)N)N)N)e__name__
__module____qualname__modulesr   r   rV  r]   Zapi_methodsr	   classmethodrx   r   r   r   r   r   r^   r`   r   r   r   r   r   r  r  r  r  r!  r%  r'  staticmethodr.  r3  r:  r7  ra   r  r  r  r  r  r  r  r  r2  r  r  r  r  r  r  r  r  r  r  r   r  r  r_   r  r   r6  r  Zcmf_deferred_jobr;  rC  rB  rJ  rS  r]  rb  rh  rj  rm  r   ru  rv  rw  rx  rz  rb   r  r~  r  r  propertyr  r  r  rc   r  r  rd   re   r  rf   rg   r  r  __classcell__r}   r}   r{   r~   r]   f   sZ   :&

%N

<

     W  "f
d
!.
 	> N"
2      f

>


57    


    
    
  '	r]   )r   pathlibr   r   r   r   decimalr   r  r   Z&common.models.cmf_plugin_convert_mixinr	   Zcmf.includeZ"modules.project.fields.cmf_projectr  Zcommon.models.cmf_active_entityr   r  r   r  rG  r   r   rV  r]   r}   r}   r}   r~   <module>   s   U