U
    >thx                    @   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d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ZEdd ZF fddZGdd ZHdd ZIee@d(d(dddd ZJedd ZKeLdddZMe
dd ZNdd ZOe
dd ZPe
dd ZQdd ZRdd ZS fddZTdd ZUdddZVeWdd ZX fddZYdddZZdddZ[e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˄Zaee@dd(d(dgd͍dddŜddτZbee@d(d(dddd҄ ZcddԄ Zd  ZeS )
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_namern   ro   rp   kwargs	__class__ './modules/project/models/cmf_project.pyrr   y   s     zCmfProject.field_options_listc                    s   | j r
d S t   d S N)
logic_typerq   _calc_logic_typeselfru   rw   rx   r{      s    zCmfProject._calc_logic_typec                    s   | j r
d S t   d S ry   )	scheme_wfrq   _calc_scheme_wfr|   ru   rw   rx   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 )Ncoderj   rp   )cust_field_conf_scheme
is_changedis_nullmodelsZCmfCustFieldConfSchemegetrz   r   oldZ
cache_hooknewr|   rw   rw   rx   _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r   )ui_form_schemer   r   r   CmfUiFormSchemer   r|   rw   rw   rx   _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|   rw   rw   rx   _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rp   fieldsr   ORtree_parent_idINidT)filtersfilter_projectr   )	Exceptiondictvarsr   r   appendr   valuer   r   _get_node_models
class_name_get_tree_dataZ_create_tree)rs   Z	obj_modelZ
obj_filterr   r   rt   objr   Z
parents_idZparent_filtermodel
model_namemodel_filter	tree_datarw   rw   rx   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   r   rq   r`   )	rs   r   project_typer   rt   Zparent_filtr   r   r   ru   rw   rx   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]   )rp   r   order_bysys_type=r   )	r   r   popr   r]   listr   r   Ztree_fields)rs   r   r   r   r   argsrt   Zproject_filterZproject_fieldsr   r   r   r   rw   rw   rx   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   noderw   rw   rx   hide_project_parts%  s"    


z5CmfProject._get_tree_root.<locals>.hide_project_partstagsc                 S   s   | j S ry   r   )r   rw   rw   rx   <lambda>7      z+CmfProject._get_tree_root.<locals>.<lambda>)key:r   r   )r   r   r   rJ   r   r   r   r   sortsplitr   hasattrr   r]   )rs   r   r   r   folderr   r   rw   rw   rx   _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   r   r   )r}   r   rw   rw   rx   scaffold_trashcanF  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   rz   kanban_bql_filterr   )r   r   r   r   r   r   logic_prefixr   )r}   r   r   Zft_add_ubqlZactive_sprints_filterZlt_mapltZactive_sprints_boardrw   rw   rx   scaffold_active_sprintsN  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   r   r   r   r   )r}   kanban_namerz   r   kanbanrw   rw   rx   scaffold_kanban_boardj  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   rt   backlog_filterr   rw   rw   rx   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_formrz   r   Fr   ztask.base:defaultu*   БП Задач Простой доски )r   templateZhiddenZworkflowr   r   NOT INopenZin_progress	in_reviewrm   r   )r   CmfLogicTyper   r   r   r   CmfWorkflowr   	CmfStatusr   deletedefault_task_workflow)	r}   r   rt   Zlt_boardZsimple_boardr  ZwfZunneeded_statusesstatusrw   rw   rx   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   r   r   )r}   Zdoc_registryrw   rw   rx   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_registryrw   rw   rx   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_rgrw   rw   rx   scaffold_app_learn  s    zCmfProject.scaffold_app_learnc                 C   s   |s
| j }d| S N/r   r}   r   rw   rw   rx   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   rw   rw   rx   scaffold_tests$  st    





zCmfProject.scaffold_testsc                 C   s   t jjj }|| S ry   )r   CmfRFiledpdata_driverget_rdZ	get_rfile)pathrdiskrw   rw   rx   
_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#  creater|   rw   rw   rx   ensure_project_dirf  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_fieldsr2  is_project_dir_existr,  r#  perm_strr1  r   r3  Zall_relation_persons)r}   Z	dir_rfiler6  userrw   rw   rx   _sync_rdisk_folderj  s$    zCmfProject._sync_rdisk_folderc                 C   s   |s
| j }| | |jS ry   )r   r,  r#  existsr"  rw   rw   rx   r5    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   rq   ra   r  r1  )rs   r   r   r   rt   resr   ru   rw   rx   ra     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jjdd}td d	d
lm	} |dg  }| 
  | js
t }	tjjdd|	_| |	_d| j |	_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f |jdd| j d|
 dd||_tjf |jd d| j d!d||_tjf |jd"d| j d#|
 dd||_tjf |jd$d| j d%|
 dd||_ tjf |jd&d| j d'd||_!tjf |jd(d| j d)d||_"tjf |jd*d+d,d-d.||_#| j$%|j# tjf |jd/d0d1d2d.||_&| j$%|j& tjf |jd3d4d5d6d.||_'| j$%|j' tjf |jd7d8d9d:d.||_(| j$%|j( tjf |jd;d<d=d>d.||_)| j$%|j) tjf |jd?d@dAdBd.||_*| j$%|j* tj| | dCdDdd|_+tj| dEdFdd|_,tj-| dGdHdI|_.tj| dJdKdd|_/tj| dLdMdd|_0tj| dNdOdd|_1tj| dPdQdd|_2tj| dRdSdd|_3tjjdT| jdU|_4tj| | dVdWdd|_5tj6| dXdY| j dZ|dd[|_7tj| d\d]dd|_8tj| d^d_dd|_9tj:| | gd`| j dda|_;| < |_=| j>dbks| ? |_@| j>dckr| A |_Bn@| j>ddkr| C |_Bn(| j>dekr| jCdfdgdh|_Bn
| D |_Btj-| di| j | jE| jFdj|_G|jG| _H| jIrtj|jdkd| j dld|_J| j>dmk}|rrtj6|j5dndo|_KtjL|j,dpdo|_Mtj-|j.dqdo|_N|rtj| |j/dr|ds|_Otj6|j0dtdu|dv|_Ptj6|j1dwdx|dv|_QtjR|j3dyddz|_Sd{|jB_Td||j3_Td}|j4_Td~|j_Td|j_Td|j,_Td|j._Td|j/_Td|j1_Td|j0_Td|j5_Td|j2_Td|j7_Td|j8_Td|j9_Td|j=_Td|j;_Td|j+_T| j>dkr| U |_Vd|jB_Wd|j3_Wd|j4_Wd|j_Wd|j,_Wd|j/_Wd|j1_Wd|j0_Wd|j2_Wd|j8_Wd|j9_Wd|j=_Wd|j;_Wd|j7_Wd|j_Wd|j@_W| jXdkr(dnd|jV_W|jYZ D ]}|jdd q:d| _[d| _\d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _o| jXdkrdnd| _p| jddd | j>dk	r@d|j8_Wd|j9_Wd|j;_Wd|j=_Wd|j7_W|jYZ D ]}|jdd q.d| _\d| _[d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _o| jddd tjqjrjs}|D ]b}|dkrqtjq|| |j2|d|_td|jYk	r|jJ|jt_u|dk	r.d|jt_|jtjdd q| j>dbk
rd|j+_Wd|j3_Wd|j4_Wd|j_Wd|j/_Wd|j1_Wd|j0_Wd|j5_Wd|j7_Wd|j8_Wd|j9_Wd|j;_Wd|j=_Wd|j_Wd|j._Wd|jB_W|jYZ D ]}|jdd 	qd| _\d| _[d| _]d| _^d| __d| _ad| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _o| jddd | ?|  tjqjrjs}|D ]P}|vd
rtjq|| |j2|d}d| }tw||| tx||jdd 
q| j>ddkrTd|j/_Wd|j1_Wd|j8_Wd|j9_Wd|j;_Wd|j4_Wd|j=_Wd|j7_Wd|j@_W|jYZ D ]}|jdd q8tjyjdd| _zd| _[d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _o| jddd tjqjrjs}|D ]b}|dkrqtjq|| |j2|d|_td|jYkr0|jJ|jt_u|dkrBd|jt_|jtjdd q| j>dkrd|jB_Wd|j3_Wd|j1_Wd|j8_Wd|j9_Wd|j;_Wd|j4_Wd|j=_Wd|j7_Wd|j@_W|jYZ D ]}|jdd qd| _[d| _]d| _^d| __d| _`d| _ad| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _o| jddd tjqjrjs}|D ]P}|dkrtqbtjq|| |j2|d|_td|jYkr|jJ|jt_u|jtjdd qb| j>dckrd|j+_Wd|j3_Wd|j4_Wd|j_Wd|j,_Wd|j/_Wd|j1_Wd|j0_Wd|j5_Wd|j2_Wd|j7_Wd|j8_Wd|j9_Wd|j;_Wd|j=_Wd|j_Wd|j@_W|jYZ D ]}|jdd qRd| _\d| _[d| _]d| _^d| __d| _ad| _bd| _cd| _dd| _ed| _fd| _gd| _hd| _id| _jd| _kd| _ld| _md| _nd| _o| jddd | j>dekrt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|jdddI|_tj|jddo|_tj| dddd|_tj| dddd|_| U |_Vd{|j_Td||jB_Td}|j_Td~|j_Td|j_Td|j_Td|j2_Td|j=_Td|j9_Td|j8_Td|j;_Td|j,_Td|j3_Wd|jB_Wd|j4_Wd|j._Wd|j/_Wd|j1_Wd|j0_Wd|j5_Wd|j7_Wd|j=_Wd|j8_Wd|j;_Wd|j9_Wd|j,_Wd|j+_Wd|j_Wd|j@_Wd|jV_W|jYZ D ]}|jdd qZd| _md| _d| _[d| _]d| _id| _d| _d| _d| _ld| _^d| __d| _ad| _bd| _nd| _d| _d| _d| _d| _cd| _fd| _kd| _`d| _\d| _pd| _o| jddd tjqjrjs}|D ]N}|vdϡr tjq|| |j2|d|_td|jYkr^|jJ|jt_u|jtjdd q |   |   |   |   dHS )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	   Гант TFr   r   rm   u   Фильтрыr   r  r   )rz   
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  rz   r   u   Дискdisku
   Архивarchiveu   Чат )r   	executorsr   r   project.evatestr   zproject.kanbanproject.servicedesku
   Доскаzboard.sd_kanban:default)r   rz   z	HomePage )r   r   r   
cmf_authoru   Фильтр1z$" and responsible in (currentUser()))rR  project.wikirQ  u   Список1)r   r   u   Компонент1u   Документ1ZEpic1)r   r   r   rz   u   Релиз1r   )r   r   r  rz   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 rT  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  rz   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  rz   r[  r\  r]  rZ  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)r2  r   r8  r   r  r   ZlogginginfoZdataclassesr<  r  main_gantt_projectr   rz   r   r   r   r   r   r   ZAPPcache_projectsCmfStatusCoderJ   r   rM   tasksr   r   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blogrG  r   ZdocsZepicsZreleasesZsprintsrK  Zroadmapsr   listsr   rM  rN  rO  rH   chatr   r   r   r%  r$  r  Zkanban_boardr   r   r   rS  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_typera  Zqueue__queue1_task_filterrP   Zqueue__queue1Zqueue__queue2_task_filterZqueue__queue2Zqueue__queue3_task_filterZqueue__queue3rd  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_groupsrw   rw   rx   scaffold  sJ   










  



  


  



  


,
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   Оценка качества обслуживанияrz  r   r   r   ["parent_id", "=", "r   r   r   rb  Fr   rK  Tr   r   r   rW  r   r   r   r  rz  )r   rQ   r   r   r   r   r   rJ   )r}   report_namer  rz  rw   rw   rx   r  r  s"    zCmfProject.scaffold_markc                 C   s  dddddddddgd	d
dddddddddddgidgd	dddddddddddgd	dddddgdd d!d"dddgd#d d!d$dd%dgd&d d!d'dddgd(d d!d)dd*dgd+d d!gd	d,d-d.dd-ddd.d/ddgd	d0d1ddd2d3gd4d5d!d6dd%d2d3gd6d5d!d7ddd2d3gd7d5d!gd	d8dddd9gdd d!d"ddd9gd#d d!d$dd%d9gd&d d!d'ddd9gd(d d!d)dd*d9gd+d d!gd	g}|D ]}| d:}tjj | |d;gd<}|stj| d=| j d>d?| j d@dA}|jdBdC tj| tjj | dDdEdF|dG|dH}|jdBdC | dI}|D ]p}t }t }	||	_	| d:|	_
| dJ|	_| dK|	_| dL}
|
rtjj | |
dM|	_g }g }|dN| j  |dO| j d> | dPg }|D ]}|dkrdQdRdS || D }|| dT| dU tjjdVdW|| gdX}g }|D ]}||jj qBdY}dQdZdS |D }|d[| d\| d] n|d^krtjj | || dM}|rj|| d_|j d@ |d[| d`|jj d> n|dakr4tjjj}|| d_|||   d@ |d[| d`||  d> n6|| d_||  d@ |d[| d`||  d> qdb|}dcdd| de }||_||_|jdBdC ||	_|	jdBdC qD|jdBdC qd S )fNu`   Анализ SD. Отчет по созданным задачам против решенныхu   СозданоZcreatedz#f15c75)r   
value_typecoloru   РешенныеZdonez#7bc1a1)r   rowsu5   Анализ SD. Отчет время решенияu   Все задачиZaveragez#8eb021   Время решения)r   r  r  slau   Инцидентыz#ea632brz   r_  )r   r  r  r  
row_filteru]   Анализ SD. Отчет по выполненным SLA против нарушенныхu   ВыполненоZsd_sla_processedz#14892cu   НарушеноZsd_sla_breachedz#d04437uQ   Анализ SD. Отчет по инцидентам по приоритетамu   Критичныйr0  rD  )rz   priority)r   r  r  r  u   ВысокийrE  u   Обычныйz#815b3ar   u   Низкийu   Минимальныйz#d39c3fu>   Анализ SD. Отчет по уровню успеха SLA+   Время до первого ответаZsd_sla_compliance_percentz#59afe1uO   Анализ SD. Отчет по запросам на обслуживаниеu3   Все запросы на обслуживаниеrY  z'task.sd_service_request_approve:defaultu   Все)rz   request_typerX  r^  uM   Анализ SD. Отчет по проблемам по приоритетуztask.sd_problem:defaultr   rz  r  r  r   r   r   rb  Fr   rK  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   Nrw   .0r  rw   rw   rx   	<genexpr>  s     z1CmfProject.scaffold_line_chart.<locals>.<genexpr>z in ()r   r   r    c                 s   s   | ]}d | d V  qdS r  rw   r  rw   rw   rx   r    s     z["z
", "IN", [z]]r  z = "z	", "=", "r  z and [z ,])r   r   rQ   r   r   r   r   rJ   rX   r   r   r  r  r3   r  r   joinr  r   r   r2   r   r  ry  r   r   Zrow_bql_filter)r}   r  Zchartr  r  rz  r  rowZrow_task_filterZ	chart_rowr  Zubql_filterrc  r  fieldZvalsZlogic_typesZbql_valsr   r  r  rw   rw   rx   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   FrV  )Zobj_copy)	r   Z	CmfUiFormr   r   task_code_prefixr   cmf_model_namer   r   )r}   r   action_nameZui_formZ_ui_formrw   rw   rx   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   CmfProjectRoler   CmfProjectRoleAssignr   Zproject_rolemembersr   gcurrent_userr   )r}   Zsdesk_clientZsdesk_agentZprrw   rw   rx   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   CmfCalendarr   r3   r   r5   r6   rk  )r}   Zdefault_calendarr  Zgoal1Zgoal2Zgoal3Zgoal4Ztrigger1Ztrigger2Ztrigger3Ztrigger4Ztrigger5rw   rw   rx   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   r5  r|   rw   rw   rx   _check_project_dir_conflict)  s    "z&CmfProject._check_project_dir_conflictc                 C   sF   ddd|gg}|r"| dd|g | j|drBt| j ddd d S )	Nr   r   rj   r   r   u7    с таким именем уже существуетTr   )r   r   r   Zverbose_name)rs   r   r   Z
prj_filterrw   rw   rx   _check_unique/  s
    zCmfProject._check_uniquec                    s$   |  || t j|||d|S )N)r   r   )r  rq   r0  )rs   r   r   r   rt   ru   rw   rx   r0  8  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approvedrO  rM  rl  rN  ro  rH  rJ  rI  rL  r   rd  rK  r   ra  rG  rf  rg  r$  r  rJ   CmfActiveEntityFilterr   ri   rj   r   r   r   Tr   r   zlist.r   r   r  r   rU   r   r   zlogic_type.coder  )r   r   r   rF  CmfReq)rp  r   r   r   r   r   r   r   r   r   show_doc_registryrM   show_company_registryr   rH   rv  r   r   rt  r   rr  ru  rs  rw  )r}   Z	sys_typesZnode_modelsr   Z	fieldnameZ	nodeclassZsysnoderw   rw   rx   _calc_hidden_nodes=  s    

 
 






zCmfProject._calc_hidden_nodesc                    s,   t   ddddddddd	d
dddddg S )NZdefault_list_workflowZdefault_epic_workflowZdefault_subproject_workflowZdefault_release_workflowZdefault_sprint_workflowZdefault_document_workflowr  project_perm_schemer  r  r   r   cmf_project_adminsr  r   )rq   save_preload_fieldsr|   ru   rw   rx   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<   Нельзя менять родителя у проектаrU  zCmfWiki:Classr   zCmfProject:Class)r   r   r   r   r   ri   r   r|   rw   rw   rx   _calc_parent  s    


zCmfProject._calc_parentc                 C   s(   | j jsd S tj| j j| jj| _ d S ry   )r  r   r   r   Zconfluence_convertr   r   r|   rw   rw   rx   
_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+-rE  c                 S   s   g | ]}|d  qS )r   rw   )r  chunkrw   rw   rx   
<listcomp>  s     z3CmfProject.get_prefix_from_name.<locals>.<listcomp>rB  z--r  ZILIKE%r   rp   c                 S   s   g | ]}|j  qS rw   )r  lower)r  r   rw   rw   rx   r    s     c              
      s8   g | ]0}|   rd d|   dqS )z\Dr  )r{  r  subreplace)r  pprefixrerw   rx   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_numrw   r  rx   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   )rp   r   include_deletedu   Код u2    уже используется проектом u   . Выберите другойr   ZLIKEz-%r   zproject.nameu8    ранее использовался проектом u   . Это может привести к пропускам в нумерации кодов. Если это нежелательно - укажите другой префиксur   Запущен фоновый процесс смены префиксов кодов у задач проекта)r   )r  r   Ztask_code_use_logic_type_prefixr   r  Zcode_prefixr   r   r]   r   r   r   CmfTaskCodeHistoryr   is_newschedule_deferred_jobr   Zrecalculate_codes_celery)r}   Zproject_with_prefixZ	code_usedrw   rw   rx   _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 rw   rw   r  crw   rw   rx   r    s      zACmfProject._calc_task_code_prefix_for_section.<locals>.<listcomp>z(?:\b|_)([A-Za-z0-9]{1,4})NrB  rE  r  c                 s   s   | ]}|d  V  qdS )r   Nrw   r  rw   rw   rx   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  r   Z	code_listirw   rw   rx   "_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  rw   rw   rx   is_project_admin,  s"    zCmfProject.is_project_adminc                 C   sb   | j s
d S tjj| dd}|s4tj| dd}|  tjj| dd}|s^tj| dd}|  d S )NZwhite)r   r  Zblack)r  r   rV   r   r   )r}   ZwlZblrw   rw   rx   _calc_white_black_listsB  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  rx  r   r   rJ   r  r  )r}   r   rw   rw   rx   _calc_structure_scaffoldO  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   r   rj   r  r   r   u   Пользователь uO    добавлен в группу Администраторы проектовr   r   rl      Проект     уже существуетr!  _%Y-%m-%d-%H%M%SFri  <   Имя проекта не может быть пустым.r>  r   rR  servicedesk:defaultr   system.open:defaultsystem:default)r?  rU  u8   Укажите Префикс для кода задачdont_scaffoldonboarding_statusr  rm   cancelr   )Lr  r  r  Zis_admindisable_permissionsacl_admin_moder  r   r  r   r   r   CmfPersonGroupr   Z
rg_membersZ
all_nestedZ_changesr   Zdisable_aclr   Zcurrent_person__member_ofaddr   r   r]   r   r5  r,  r#  r9  renamer   nowr4  r  r   rename_project_dirri  r   r  r  r   CmfProjectPermSchemer  r~  r  r  r  r   r  r   r  r  r   r   rq   Zservicedesk_publicr   r   
spectatorsrP  Ztrigger_reloadr  r  r2  r8  r  r  r  r  rw  scaffold_req_registry
CmfLicenser   r  r  )r}   r   rt   Zproject_admins_groupZproject_admins_group_membersZchange_actionZpr_adminr  r9  project_dir_rfileshould_be_scaffoldedr  resultonboardings
onboardingru   rw   rx   r   W  s    


"


	


zCmfProject.save)returnc                 C   s&   |  | | jj}||   d S ry   )r,  r#  r   r   r  )r}   	old_rfilerw   rw   rx   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  rR  r  r   r  r  rU  r  r  rm   r  r   r   ),r  r   r]   r   r   r   r   r5  r,  r#  r9  r  r   r  document_header_textr   r   Z
html_cleanr   document_footer_textr  r   r   r  r  r   r
  r  r~  r  r   r  r   r  r  r  r   rq   _save_importr  r  r   r  r   )
r}   r   rt   r9  r  r  r  r  r  r  ru   rw   rx   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-ORDERrD  r  Tr   )r   r   r   r   r   r{  rb   check_edit_permr   r   r  r   )rs   Zitem_idZ	anchor_idZnext_idZ
item_modelr  Zanchor_modelanchorZanchor_ordernoZ
next_modelZ	next_itemZnext_ordernorw   rw   rx   r_   !	  s(    

zCmfProject.move_itemc                 C   s   d S ry   rw   r|   rw   rw   rx   
_calc_codeB	  s    zCmfProject._calc_codec                 C   s   d S ry   rw   r|   rw   rw   rx   get_code_prefixG	  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}  rk  r  r  	CmfPersonr  r   rI   rQ   r   rJ   r   rj   )rp   r  include_systemu   Удаляем )r   r  r%  )r   force)r   r  r%  
project_id)rp   rq  rj  r   u   Удаляем из кеша F)r  r   r%  r   )"
cmf_importr   r   configSUPPORT_URLapp_base_hrefr   r   rm  ri  r   r   r   r   r  debugr  r   r  Zcommit_with_eventr$   r  CmfDocumentHistoryCmfAccessRulebulk_updateCmfAccessListZCmfCustFieldConfrj  r   rq   r5  r&  r   move_to_trash)r}   r  r   r   rt   cur_nameZcls_namer  Z
gantt_taskZ	task_codeZdoc_historyZcust_field_confr;  r#  ru   rw   rx   _old_deleteK	  sd    
"

 zCmfProject._old_deletec             	   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|   |   t| jtf || jj||d	d
 d S )Nr?  r(  u@   Нельзя удалять проект по умолчаниюTr   r!  r"  r#  )r'  r  r   rt   )r4  r?  r   r(  r)  r*  r+  Zapply_delete_prefixZgenerate_delete_prefixcmf_deletedr   r   r   r5  r	  	save_datar  _delete_jobr   r   Zjson)r}   r  r   r   rt   project_namerw   rw   rx   r  	  s.    
	
zCmfProject.deleter@  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}||jjr|t j|}|r||	  d S )NTr   r  r  )
r   r]   r   
_db_delete_move_to_trashr   r   r5  r&  r1  )r'  r  r   r   rt   r   r2  r#  rw   rw   rx   r7  	  s    	zCmfProject._delete_jobc                 O   s   t D ]<}t|}|jdd| jjgdddgg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   r5  FT)rp   rq  include_dummyr  r]   Zoperater  rS  r   parent_nameZparent_code)PROJ_MODELSr   get_model_by_namer/  r   r   
cmf_commitr5  r6  r   r]   _remove_proj_objs_from_indexingcmfapp	CMF_CACHE
invalidateCmfAuditaudit_eventr  current_personr   r   )r   r  r   rt   	classnamer   rw   rw   rx   r?  	  s.    
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'  r4  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)rp   rq  r  Zstructural_project_idZfilter_project_idri   )rp   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\   )rp   r  r@  r  r  r]   rA  )*r   r   r  r   r]   _delete_attachments_files_jobr   r'  r(  SessionexecuterE  r$  r/  ZCmfPipelineZCmfRoleZCmfTagZCmfWhatsappZCmfMailHandlerZbulk_deleterF  ZCmfDealZCmfLeadr   rI   r-  r.  r0  r   rD  rq   r  rG  rH  rI  rJ  rK  rL  r  rM  r   r   )r   r  r   rt   r'  r   rN  ru   rw   rx   r>  
  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(  rP  rQ  rE  )r'  tablerw   rw   rx   rF  h  s    	z*CmfProject._remove_proj_objs_from_indexingu;   Жесткое удаление файлов проекта)r9  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 rw   )ri   r   )r  arw   rw   rx   	<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   rt   Z
parent_idsrV  ri   r*  Zrfrw   rw   rx   rO    s    
"z(CmfProject._delete_attachments_files_jobc                 C   s0   |  D ]"}| r|j|r|j  S qd S ry   )iterdirr-  r   r{  )r}   	trash_dirr8  r   rw   rw   rx   find_trash_folder  s    zCmfProject.find_trash_folderc                    s   | dp| jj}t jf ddi|}ttjjj	
 jjd }|rvt| j|rv| ||}|rn|dsv| jj}tj||   |   |S )Nprefix_namer%  TZTrashZDEL)r   r   r   rq   restorer   r   r&  r'  r(  r)  rV  abspathr  matchZdelete_prefix_patternrY  r{  Zrestore_from_trashr#  r8  )r}   rt   r   r;  rX  Zproject_folder_nameru   rw   rx   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  rl  rw   rw   rx   _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")
            rD  )r  r   r   msgr  )
auto_alarm_daterb  printr   r   r   r   	CmfNotifyplace_notifyZcaption)r}   rl  rw   rw   rx   '_notify_project_owner_not_planned_tasks  s"    z2CmfProject._notify_project_owner_not_planned_tasksz@daily)r9  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   rl  taskrw   rw   rx   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   rw   rw   rx   &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 rw   )r   r   )r  tagrw   rw   rx   
<dictcomp>  s      z5CmfProject.hook_task_tags_changed.<locals>.<dictcomp>r   )ri   r   r   c                 S   s   i | ]}|j j|qS rw   )r   r   r  r   rw   rw   rx   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   r   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_idrw   rw   rx   hook_task_tags_changed  sz    
  


   
  
 
   z!CmfProject.hook_task_tags_changedc                 C   s   d S ry   rw   )rs   ro  rw   rw   rx   hook_new_tag"  s    zCmfProject.hook_new_tagc                 C   s   dS )NTrw   r|   rw   rw   rx   has_tree_nodes_hook&  s    zCmfProject.has_tree_nodes_hookc                 O   s   d S ry   rw   )rs   r   rt   rw   rw   rx   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#d$g%}||d%< t jj||}|sld S z|  W n tk
r   Y d S X |S )&Nr   r   r   r   r   Zactivity_idr   rz   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]   r   Z_acl_check_readZCmfPermissionError)rs   r   rt   Zfields_to_returnr   rw   rw   rx   
public_get.  s^    (zCmfProject.public_getc                 O   s   t jj| f||S ry   )r   r
  rb   )r}   r   rt   rw   rw   rx   rb   d  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  rq  r   Zproject_perm_allow_fieldsr{  endswithr  r   r  r  r  r4  r   r   r  r  r   r   rb   )r}   Zchanged_fields_to_checkr  Zadmin_require_fieldfrw   rw   rx   r  g  sD    




zCmfProject.check_edit_permc                    s
   t   S ry   )rq   check_delete_permr|   ru   rw   rx   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   r`  r  rz   rZ  r[  r\  r]  )r   r  rz   rZ  groupr[  r\  r]  )r   r1   r   r   r   r   r  )r}   groupsr  request_groupr  rw   rw   rx   r    s     z&CmfProject._create_sdesk_request_groupc	           
      C   s`   t  }	| |	_||	_||	_||	_||	_||	_||	_|d k	r@||	_	|d k	rT|	j
| |	  d S ry   )r   r2   r   r   r  rz   r[  r\  r]  Zrequest_categoryr  r   r   )
r}   r   r  rz   rZ  r  r[  r\  r]  r  rw   rw   rx   r    s    z%CmfProject._create_sdesk_request_typec                 C   s   | j  d| j d| j S r   )Z	ui_moduleZui_namer   r|   rw   rw   rx   href  s    zCmfProject.hrefc                    sD   ddl m} t  }t|dkr@|d d  d||d }|S )Nr   )cmf_hashlib      r  rB  )cmf.utilr  rq   gen_coder  Zshort_str_enc)r}   r  Zres_coderu   rw   rx   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  r5  r(  Zcmf_locked_atZcmf_locked_byZcmf_modified_atZcmf_modified_byZcmf_viewed_atr   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   ri  r  Zstatus_closed_atZstatus_in_progress_endZstatus_in_progress_startZstatus_modified_atZstatus_review_atr  rl  r   Ztask_filtersT)Z
is_definedr{  Zperm_)r   r   r]   rq  r   r|  r{  r   rG  r   Z
CmfBackrefr|  r   rt  )r}   r   rt   new_projectZskip_fieldsr  attrr   rw   rw   rx   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   r   r  structure_copy	full_copynotify_person_idr4  r   r   r  r  r  )r   r   countr   r   r  r   r  rM  r   r  create_from_template_jobdo_create_from_template)r}   r   r   r  r  r  rt   Z
job_kwargsrw   rw   rx   rc     s(    $     zCmfProject.create_from_templateu3   Создание проекта по шаблону)r9  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&  rE  )r   r  r   rc  Zforce_notify_current_personr  )r]   r   r  r   r   Zrollback_purge_event	traceback
format_excr  r,  r   rf  rg  )r  r   r  r   r  r  r  _kwargsr   r  Znotify_nameZ
notify_msgerw   rw   rx   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szt  }t jjdd|_|
|_d|
j |_d|_|jddd  ||
_|
jddd  |
S )#Nc                 S   s,   |    |   |   |   |   d S ry   )Z_calc_perm_parentZ_calc_perm_inherit_acl_idZ_calc_perm_has_aclZ_calc_perm_aclZ_calc_perm_effective_aclr  rw   rw   rx   	_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   r4  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_nodesrw   rx   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_relrw   rw   rx   _copy_relation_optionsB  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 | _d| _| jdddd dS )uT   Обрабатывает параметры задачи (lists, fix_versions, etc.))rn  fix_versionsaffected_versionsrG  r   NFTr  r   r   )rn  r  r  rG  rt  r   r   r   r   r   r   r   r   Z	main_listr  rP  r  r   )new_task	orig_tasknew_project_params_dictZparams_listsZ
param_namelstr  rw   rw   rx   _process_task_paramsH  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   rS  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  rP  )r  r  r  r  r  rw   rx   _setup_gantt_task]  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  rw   rw   rx   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  comprw   rw   rx   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   ri  r   r4  r   r  r   r   r  r   r   r   r   r   r   r   rq  r  r   Z_calc_gantt_pathr  )r  orig_projectr  r  Ztasks_by_orig_idZorig_main_gantt_projectnew_main_gantt_projectZ
orig_tasksZparent_tasksrl  Z
epic_tasksr  r  ri  Z
needs_saveZnew_parent_taskZnew_gantt_project)r  
_copy_task_copy_task_filtersr  r  rw   rx   _copy_tasksy  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   rS  r   r   r   r   r   rJ   r   r   r  r   r  r  )ri  r  r  rw   rw   rx   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  rw   rw   rx   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  docrw   rw   rx   rp    s     ZANDr   r  c                 S   s"   i | ]}|j  d |jj |qS r  r  )r  rH  rw   rw   rx   rp    s     r  r  r  Fr  )r  r   rJ   r   r   r   r   r  r   r   r   r   r   Zft_projectsr   )	r  r  r  Z_folder_filterZ_doc_filterZ_epics_filterZorig_project_task_filtersZorig_task_filterZnew_task_filterr  rw   rx   r    s>    






	z>CmfProject.do_create_from_template.<locals>._copy_task_filtersTr  r  r  )r   r   r  r  F)r  r   r   )r  r  r  r  )r  r  r  rl  r  r  r=  r   r>  r  )N)N)r   r]   r   r   Zchat_topicsr  r  r   r   r   r   rh   r   ri  r   r  rz   r   r   )r}   r   r   r  r  r  rt   r  r  r  r  r  r  rw   )r  r  r  r  r  r  rx   r    sT     \/ 
z"CmfProject.do_create_from_templateobj_id)r9  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]   r   rO  r   r   r  r   r;  rl  ri  rw   rw   rx   rd   ?  s    zCmfProject.archive_projectc                 C   s<   t jj| d}| }t jj| dd}|D ]}|  q*|S )Nr  Tr  )r   r]   r   Zarchive_restorer   r   r  rw   rw   rx   re   L  s    
z"CmfProject.archive_restore_projectc                 C   s&   t jj| ddgd}|jddd |S )NTr5  )r   r  r   F)r&  r  )r   r]   r   r  r  r   rw   rw   rx   rf   Z  s    zCmfProject.delete_projectu)   Востановление проекта)r;  r<  r9  r:  c                 C   s"   t jj| dd}|jd|jjdS )NTr=  )r  rZ  )r   r]   r   r[  r   r   r  rw   rw   rx   rg   `  s    zCmfProject.restore_projectz@hourlyc                  O   s$   t jjdd}|D ]}|  qd S )NT)r2  )r   r]   r   r8  )_argsr  Zproject_listr   rw   rw   rx   $celery_hourly_sync_rdisk_folder_hookf  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_registryrw   rw   rx   r  q  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)f__name__
__module____qualname__modulesr   r   rR  r]   Zapi_methodsr	   classmethodrr   r{   r   r   r   r   r^   r`   r   r   r   r   r   r  r  r  r  r  r#  r%  staticmethodr,  r1  r8  r5  ra   r  r  r  r  r  r  r  r  r0  r  r  r  r  r  r  r  r  r  r  r   r	  r  r_   r  r  r3  r  Zcmf_deferred_jobr7  r?  r>  rF  rO  rY  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__rw   rw   ru   rx   r]   f   s\   :&

%N

<

     \  "f
d
!.
 	> N!
+      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  rC  r   r   rR  r]   rw   rw   rw   rx   <module>   s   U