
    oiJ                        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 d dlZd d	lmZ d d
lmZ d dlZdZ G d dej*                  j,                  j.                  j0                  e      Zy)    )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CmfFollower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                   P    e Zd Zej                  j
                  j                  j                  j                  e	j                  z   g dz   Ze
dn fd	       Z fdZ fdZd Zd Zd Ze
dod	       Ze
dp fd	       Ze
dddddd       Ze
dqd       Zd ZdrdZdsdZd Zd Zd Zd Zd ZdqdZdqdZed        Z d Z!d Z"dqdZ#e
d
dd fd
       Z$d  Z%d! Z&d" Z'd# Z(d$ Z)d% Z*d& Z+e
d'        Z,e
do fd(	       Z-d) Z. fd*Z/d+ Z0d, Z1ed-        Z2d. Z3d/ Z4dtd0Z5d1 Z6d2 Z7 fd3Z8dud4Z9 fd5Z:e
dod6       Z;d7 Z<d8 Z=dd9d: fd;
Z>dd9dd<d=Z?e e@d>dd?gd@dA      dd9d:dB              ZAedC        ZBe fdD       ZCedE        ZDe e@dd?gdFG      dd9d:dH              ZE fdIZFdJ ZGdK ZHe e@dddLM      dN               ZIedO        ZJdPeKfdQZLe
dR        ZMdS ZNe
dT        ZOe
dU        ZPdV ZQdW ZR fdXZSdY ZT	 	 dvdZZUeVd[        ZW fd\ZXdqd]ZY	 	 dwd^ZZe e@dd_d`      da               Z[	 	 dwdbZ\e e@ddcgd      dqdxde              Z]e e@ddcgd      dqdxdf              Z^edce_fdg       Z`e e@dhdddcgi      dqdxdj              Zae e@dddkM      dl               Zbdm Zc xZdS )y
CmfProject)ui_getget_obj_treedelete_node	move_item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                     |dk(  r|sg }|dd|gg dg}nG|dk(  r|sg }|dd|gg dg}n3|dk(  r.|sg }|r(|j                  d      r|d   }|dk(  r|g d	g}n|g d
g}t        |   |f|||d|S )Ndefault_list	parent_id==)cache_status_type!=closeddefault_list_if_empty
logic_typelogic_prefixproject.servicedesk)codeLIKEproject.servicedesk:%)ry   zNOT LIKEr{   )object_fields	object_idfilter)getsuperfield_options_list)clsrelation_field_namer|   r}   r~   kwargsrw   	__class__s          './modules/project/models/cmf_project.pyr   zCmfProject.field_options_listy   s    .0{D)<>cdF $;;{D)<>cdF !L0!2!2>!B,^<#88$&OPF$&STFw)*= X]4=fXPVX 	X    c                 <    | j                   ry t        | 	          y N)rv   r   _calc_logic_typeselfr   s    r   r   zCmfProject._calc_logic_type   s    ?? "r   c                 <    | j                   ry t        | 	          y r   )	scheme_wfr   _calc_scheme_wfr   s    r   r   zCmfProject._calc_scheme_wf   s    >>!r   c                    | j                   j                  s| j                   j                  sy | j                   s<t        j                  j                  dd| j                  j                  g      | _         | j                   j                  r$| j                   j                  j                          | j                   j                  r%| j                   j                  j                          y y )Nry   rq   r~   )cust_field_conf_scheme
is_changedis_nullmodelsCmfCustFieldConfSchemer   rv   ry   old
cache_hooknewr   s    r   _calc_cust_field_conf_schemez'CmfProject._calc_cust_field_conf_scheme   s    ++66..66***0*G*G*K*KTZ\`bfbqbqbvbvSw*K*xD'&&**''++668&&**''++668 +r   c                     | j                   j                  s| j                   j                  sy | j                   s&t        j                  j                  d      | _         y y )Nzui_form_scheme:defaultry   )ui_form_schemer   r   r   CmfUiFormSchemer   r   s    r   _calc_ui_form_schemezCmfProject._calc_ui_form_scheme   sN    ##..&&.."""("8"8"<"<BZ"<"[D #r   c                 L   | j                   j                  sy | j                   j                  rAd| j                   j                  _        | j                   j                  j	                  d       | j                   j
                  r| j                   j
                  j                  j                          | j                   j
                  j                  | k7  rt        dd       d| j                   j
                  _        | j                   j
                  j	                  d       y y )NFT	only_datauc   Нельзя указать Спипок по-умолчанию из другого проектаabort)	ro   r   r   is_default_listsaver   parentload	cmf_alertr   s    r   _calc_default_listzCmfProject._calc_default_list   s      ++  49D!!1!!&&&6  !!((--/  $$++t3  HL  M48D!!1!!&&&6 !r   c                     t        d      )u_   
        Построение дерева от не корневого обьекта
        
Depricated)	Exceptiondictvarsr   r   appendidvaluetree_parentr   _get_node_models
class_name_get_tree_data_create_tree)r   	obj_model
obj_filterfilterstree_parent_idr   objr   
parents_idparent_filtermodel
model_namemodel_filter	tree_datas                 r   rb   zCmfProject.get_obj_tree   s     %%r   projectc                     t        d      Nr   )r   r   r   r   r   r   rf   )
r   r   project_typer   r   parent_filtr   r   r   r   s
            r   rf   zCmfProject.get_tree_leaf        %%r   )fieldsr   r   filter_projectc                    t        d      r   )	r   r   popr   r`   listr   r   tree_fields)r   r   r   r   r   argsr   project_filterproject_fieldsr   r   r   r   s                r   r   zCmfProject._get_tree_data        %%r   c                     t        d      r   )r   r   r   rL   r   sys_type
tree_nodesr   sortsplitr   hasattr
isinstancer`   )r   r   r   hide_project_partsfolderr   r   s          r   _get_tree_rootzCmfProject._get_tree_root+  r   r   c                     t         j                  j                  | d      }|s,t         j                  | dddd      }|j                  d       |S )Ntrashcanr   r   u   КорзинаT)r   namer   systemtree_hiddenFnotify)r   rL   r   r   )r   r   s     r   scaffold_trashcanzCmfProject.scaffold_trashcanR  sW    ##''tj'I'' '7*UYgk ( mHMMM'r   Tc           	      R   d}t         j                  | d| d| j                   dd| j                   dd| j                   d	      }|j	                  d
       ddd}|j                  | j                        }t         j                  | ||||      }|j	                  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   rv   kanban_bql_filterr   )r   r   ry   r   r   r   rw   r   )r   r   r   ft_add_ubqlactive_sprints_filterlt_mapltactive_sprints_boards           r   scaffold_active_sprintsz"CmfProject.scaffold_active_sprintsZ  s    p & 3 33D6DII;G tyyk+'y3 !4 !
 	""%"0 3$:
 ZZ))*%443  5  
 	!!!/##r   c           	      $   t         j                  | d| j                   d| j                   dd| j                   dd| j                   d      }|j                  d	
       t         j                  | |||d      }|j                  dd	       |S )Nr   r   r   r   r   r   r   r   Fr   Tr   )is_scaffold_kanban_boardr   )r   r   r   ry   r   r   r   )r   kanban_namerv   r   kanbans        r   scaffold_kanban_boardz CmfProject.scaffold_kanban_boardv  s    "//3DII;bL tyyk+'y3 0 
 	e, &&!/ ' 
 	T%@r   c                     t         j                  |       }|j                  d       t         j                  | dd|| d      }|j                  d       y )Nr   Fr   BacklogbacklogT)r   r   r   tmp_bql_filterfilter_parentr   )r   r   r   rL   )r   r   r   backlog_filterr  s        r   scaffold_backlogzCmfProject.scaffold_backlog  s]    ,,D,95)"") # 
 	D!r   c           	      "   t         j                  j                  d      }t         j                  | dd| j                   dd|d      }|j                  d	       t         j                  j                  d
      }t         j                  d|j                   |d      }|j                  d	       t         j                  j                  dd|gddg dgg      }|D ]  }|j                  d	        ||_        |j                  d	       |S )Nlist.board:defaultr   u   Простая доскаu)   Простая доска проекта r   T)r   r   text	list_typeui_view_formrv   r   Fr   ztask.base:defaultu*   БП Задач Простой доски )r   templatehiddenworkflow=ry   NOT IN)openin_progress	in_reviewrt   r   )r   CmfLogicTyper   r   r   r   CmfWorkflowry   	CmfStatusr   deletedefault_task_workflow)	r   r   r   lt_boardsimple_boardr  wfunneeded_statusesstatuss	            r   scaffold_simple_boardz CmfProject.scaffold_simple_board  s1   &&**0D*E~~,<TYYKH! & 
 	' %%))/B)C=l>O>O=PQ   

 	u",,11b)XMNP 2 
 ( 	(FMMM'	( .0*'r   c                     t         j                  j                  | | d      }|ry t         j                  | | ddd      }|j                  d       y )Nr   r   r   typeu!   Реестр документовTr   r   r   r#  r   Fr   r   rO   r   r   )r   doc_registrys     r   scaffold_doc_registryz CmfProject.scaffold_doc_registry  s]    ))--TtR_-`))4 * 
 	'r   c                     t         j                  j                  | | d      }|ry t         j                  | | ddd      }|j                  d       y )NrW   r"  u%   Реестр контрагентовTr$  Fr   r%  )r   company_registrys     r   scaffold_company_registryz$CmfProject.scaffold_company_registry  s_    !--114Vb1c!--8 . 
 	U+r   c                     t         j                  | ddd      }|j                  d       t         j                  || dddd	
      j                  d       t         j                  || dddd
      j                  d       t         j                  || dddd
      j                  d       t         j                  || dddd
      }|j                  d       t         j	                  d|dd	      j                  d       t         j	                  d|dd      j                  d       t         j	                  d|dd      j                  d       t         j	                  d|dd      j                  d       |S )Nu   Обучение	app_learnTr   r   r   r   Fr   u
   Курсыr   順 r   r   r   r#  r   ordernou   Вопросыr#   @ u   Набор вопросовr!   i    ОтчетыrP   i  u?   Отчет. Отчет по результатам курсовlms_course_summary)r   r   report_typer0  u.   Отчет. Сводка по ученикамlms_student_summaryu.   Отчет. Сводка по заданиямlms_jobu+   Отчет. Результаты тестаlms_exam_resulti )r   rL   r   rO   rP   )r   r,  
reports_rgs      r   scaffold_app_learnzCmfProject.scaffold_app_learn  s   $$# 	 % 
	 	e$! 	 	
 $e$
!! 	 	
 $e$
!.$ 	 	
 $e$
 ''! ( 

 	u%R",	 	 	

 $e$
A"-	 	 	

 $e$
A"!	 	 	

 $e$
>")	 	 	

 $e$
r   c                 (    |s| j                   }d| S N/r   r   r   s     r   project_dirzCmfProject.project_dir+  s    99D4&zr   c                 ,   |st         j                  | | dddd      }t         j                  || dddd      j                          t         j                  || d	d
dd      j                          t         j                  || dddd      j                          t         j                  |d| ddd      j                          t         j                  |d| ddd      j                          t         j                  |d| ddd      j                          |S )NEvaTesttestsT)r   r   r   r   r   r   u   Тест-кейсыCmfTestcaser.  r/  u   Тест-планыrU   i u   Тест-прогоныrT   ip u   Конфигурацииr;   iX )r   r   r   r#  r   r0  u   Параметрыr=   i@ u   Окруженияr<   i( )r   rL   rO   r   )r   r   s     r   scaffold_testszCmfProject.scaffold_tests0  sH    **    + K 	#& 	 	
 $&#& 	 	
 $&#* 	 	
 $&#+' 	 	
 $&#% 	 	
 $&#%% 	 	
 $&r   c                     t         j                  j                  j                  j	                         }|j                  |       S r   )r   CmfRFiledpdata_driverget_rd	get_rfile)pathrdisks     r   
_get_rfilezCmfProject._get_rfilel  s1     ""..557t$$r   c                 f    | j                  | j                               j                  ddd       y)u   Создадим папку проекта, если её нет. Может так же нужно проверять "Документы"? T)is_direxist_okparentsN)rM  r?  creater   s    r   ensure_project_dirzCmfProject.ensure_project_dirr  s*    ((*+22$W[2\r   c                    | j                  ddg       | j                  s7| j                         r&| j                  | j	                               }d|_        y | j                         s| j                          | j                  rd| j                  j                   }nd}|dz  }| j                  dg      D ]  }|d	|j                   d
z  } |dz  }| j                  | j	                               }||_        y )Nrdisk_enabled	cmf_ownerz(owner: null
rules:
- all deny read,writezowner: zowner: nullz
rules:loginr   z
- z allow read,writez
- all deny read,write)
load_fieldsrU  is_project_dir_existrM  r?  perm_strrS  rV  rW  all_relation_persons)r   	dir_rfiler[  users       r   _sync_rdisk_folderzCmfProject._sync_rdisk_folderv  s    /;78!! ((* OOD,<,<,>?	 " ((*##%>> !5!5 67H$HJ--gY-? 	=D$tzzl*;<<H	=--OOD$4$4$67	%	r   c                 r    |s| j                   }| j                  | j                  |            j                  S r   )r   rM  r?  existsr>  s     r   rZ  zCmfProject.is_project_dir_exist  s.    99Dt//56===r   )r   r   c                    t        d      r   )r   r   r   rg   r  rS  )r   r   r   r   r   resr   r   s          r   rg   zCmfProject.get_full_tree  r   r   c                 @   | j                   j                          | j                   r| j                          t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }t        j                  j                  d      }t        j                  d       d	d
lm	}   |dg              }| j                          | j                  st        j                         }	t        j                  j                  d      |	_        | |	_        d| j                   |	_        d|	_        d|	_        |	j%                  d       |	| _        | j%                  d       | j&                  j(                  t*        j,                  v r%t*        j,                  | j&                  j(                  = t        j.                  j                  d      j                  }
t        j1                  | ddd      |_        |ddd}t        j5                  | | ddd      |_        t        j9                  |j6                  dd| j:                   d|
 d       |_        t        j9                  |j6                  d!d| j:                   d"       |_        t        j9                  |j6                  d#d| j:                   d$|
 d       |_         t        j9                  |j6                  d%d| j:                   d&|
 d       |_!        t        j9                  |j6                  d'd| j:                   d(       |_"        t        j9                  |j6                  d)d| j:                   d*       |_#        t        j8                  d|j6                  d+d,d-d.d/||_$        | jJ                  jM                  |jH                         t        j8                  d|j6                  d0d1d2d3d/||_'        | jJ                  jM                  |jN                         t        j8                  d|j6                  d4d5d6d7d/||_(        | jJ                  jM                  |jP                         t        j8                  d|j6                  d8d9d:d;d/||_)        | jJ                  jM                  |jR                         t        j8                  d|j6                  d<d=d>d?d/||_*        | jJ                  jM                  |jT                         t        j8                  d|j6                  d@dAdBdCd/||_+        | jJ                  jM                  |jV                         t        j5                  | | dDdEd      |_,        t        j1                  | dFdGd      |_-        t        j]                  | dHdIJ      |_/        t        j1                  | dKdLd      |_0        t        j1                  | dMdNd      |_1        t        j1                  | dOdPd      |_2        t        j1                  | dQdRd      |_3        t        j1                  | dSdTd      |_4        t        j0                  j                  dU| j&                  V      |_5        t        j5                  | | dWdXd      |_6        t        jo                  | dYdZ| j                   d[|d\      |_8        t        j1                  | d]d^d      |_9        t        j1                  | d_d`d      |_:        t        jw                  | | gda| j                   db      |_<        | j{                         |_>        | j~                  dck(  s| j                         |_A        | j~                  ddk(  r| j                         |_C        nb| j~                  dek(  r| j                         |_C        n=| j~                  dfk(  r| j                  dgdhi      |_C        n| j                         |_C        t        j]                  | dj| j                   | j                  | j                  k      |_H        |j                  | _I        | j                  rXt        j9                  |j2                  dld| j:                   dm       |_K        | j~                  dnv}|r&t        jo                  |jl                  dop      |_L        t        j                  |jZ                  dqp      |_N        t        j]                  |j^                  drp      |_O        |rxt        j                  | |j`                  ds|t      |_P        t        jo                  |jb                  dudv|w      |_Q        t        jo                  |jd                  dxdy|w      |_R        t        j                  |jh                  dzd{      |_T        d||j                  _U        d}|jh                  _U        d~|jj                  _U        d|j2                  _U        d|j6                  _U        d|jZ                  _U        d|j^                  _U        d|j`                  _U        d|jd                  _U        d|jb                  _U        d|jl                  _U        d|jf                  _U        d|jp                  _U        d|jr                  _U        d|jt                  _U        d|j|                  _U        d|jx                  _U        d|jX                  _U        | j~                  dk(  r6| j                         |_W        d|j                  _X        d|jh                  _X        d|jj                  _X        d|j2                  _X        d|jZ                  _X        d|j`                  _X        d|jd                  _X        d|jb                  _X        d|jf                  _X        d|jr                  _X        d|jt                  _X        d|j|                  _X        d|jx                  _X        d|jp                  _X        d|j6                  _X        d|j                  _X        | j                  dk(  rdnd|j                  _X        |j                  j                         D ]  }|j%                  d        d| _\        d| _]        d| _^        d| __        d| _`        d| _a        d| _b        d| _c        d| _d        d| _e        d| _f        d| _g        d| _h        d| _i        d| _j        d| _k        d| _l        d| _m        d| _n        d| _o        d| _p        | j                  dk7  rdnd| _q        | j%                  dd       | j~                  dk(  rd|jr                  _X        d|jt                  _X        d|jx                  _X        d|j|                  _X        d|jp                  _X        |j                  j                         D ]  }|j%                  d        d| _]        d| _\        d| _^        d| __        d| _`        d| _a        d| _b        d| _c        d| _d        d| _e        d| _f        d| _g        d| _h        d| _i        d| _j        d| _k        d| _l        d| _m        d| _n        d| _o        d| _p        | j%                  dd       t        j                  j                  j                  }|D ]  }|dk(  r	t        j                  ||   |jf                  |      |_u        d|j                  v r|j                  |j                  _v        |dk(  rd|j                  _        |j                  j%                  d        | j~                  dck(  rd|jX                  _X        d|jh                  _X        d|jj                  _X        d|j2                  _X        d|j`                  _X        d|jd                  _X        d|jb                  _X        d|jl                  _X        d|jp                  _X        d|jr                  _X        d|jt                  _X        d|jx                  _X        d|j|                  _X        d|j6                  _X        d|j^                  _X        d|j                  _X        |j                  j                         D ]  }|j%                  d        d| _]        d| _\        d| _^        d| __        d| _`        d| _b        d| _c        d| _d        d| _e        d| _f        d| _g        d| _h        d| _i        d| _j        d| _k        d| _l        d| _m        d| _n        d| _o        d| _p        | j%                  dd       | j                  |        t        j                  j                  j                  }|D ]g  }|j                  d      st        j                  ||   |jf                  |      }d| }t        |||       t        ||      j%                  d       i | j~                  dek(  rDd|j`                  _X        d|jd                  _X        d|jr                  _X        d|jt                  _X        d|jx                  _X        d|jj                  _X        d|j|                  _X        d|jp                  _X        d|j                  _X        |j                  j                         D ]  }|j%                  d        t        j                  j                  d      | _{        d| _\        d| _^        d| __        d| _`        d| _a        d| _b        d| _c        d| _d        d| _e        d| _f        d| _g        d| _h        d| _i        d| _j        d| _k        d| _l        d| _m        d| _n        d| _o        d| _p        | j%                  dd       t        j                  j                  j                  }|D ]  }|dk(  r	t        j                  ||   |jf                  |      |_u        d|j                  v r|j                  |j                  _v        |dk(  rd|j                  _        |j                  j%                  d        | j~                  dk(  rd|j                  _X        d|jh                  _X        d|jd                  _X        d|jr                  _X        d|jt                  _X        d|jx                  _X        d|jj                  _X        d|j|                  _X        d|jp                  _X        d|j                  _X        |j                  j                         D ]  }|j%                  d        d| _\        d| _^        d| __        d| _`        d| _a        d| _b        d| _c        d| _d        d| _e        d| _f        d| _g        d| _h        d| _i        d| _j        d| _k        d| _l        d| _m        d| _n        d| _o        d| _p        | j%                  dd       t        j                  j                  j                  }|D ]w  }|dk(  r	t        j                  ||   |jf                  |      |_u        d|j                  v r|j                  |j                  _v        |j                  j%                  d       y | j~                  ddk(  rd|jX                  _X        d|jh                  _X        d|jj                  _X        d|j2                  _X        d|jZ                  _X        d|j`                  _X        d|jd                  _X        d|jb                  _X        d|jl                  _X        d|jf                  _X        d|jp                  _X        d|jr                  _X        d|jt                  _X        d|jx                  _X        d|j|                  _X        d|j6                  _X        d|j                  _X        |j                  j                         D ]  }|j%                  d        d| _]        d| _\        d| _^        d| __        d| _`        d| _b        d| _c        d| _d        d| _e        d| _f        d| _g        d| _h        d| _i        d| _j        d| _k        d| _l        d| _m        d| _n        d| _o        d| _p        | j%                  dd       | j~                  dfk(  rt        j                  j                  d      | _}        t        j                  j                  d      | _        | j                  dd      }| j                  dd      }| j                  dd      }dddt        j                  j                  d      d|||dddt        j                  j                  d      d|||dddt        j                  j                  d      d|||dddt        j                  j                  d      d|||dgddddt        j                  j                  d      d|||dddt        j                  j                  d      d|||dgdg}| j                  |       | j                  ddt        j                  j                  d      |||d       t        j1                  | ddd      |_        t        j9                  | d| j&                   dd| j:                   d      |_        t        j                  |j                  | |j                  d      |_        t        j9                  | d| j&                   dd| j:                   d      |_        t        j                  |j                  | |j                  d+      |_        t        j9                  | d| j&                   dd| j:                   dÝ      |_        t        j                  |j                  | |j                  dĬ      |_        t        j1                  | ddddȫ      |_        t        j1                  |j                  ddʬJ      |_        t        j1                  |j                  dˬp      |_        t        j1                  | ddd      |_        t        j1                  | ddd      |_        | j                         |_W        d||j                  _U        d}|j                  _U        d~|j                  _U        d|j                  _U        d|j                  _U        d|j2                  _U        d|jf                  _U        d|j|                  _U        d|jt                  _U        d|jr                  _U        d|jx                  _U        d|jZ                  _U        d|jh                  _X        d|j                  _X        d|jj                  _X        d|j^                  _X        d|j`                  _X        d|jd                  _X        d|jb                  _X        d|jl                  _X        d|jp                  _X        d|j|                  _X        d|jr                  _X        d|jx                  _X        d|jt                  _X        d|jZ                  _X        d|jX                  _X        d|j6                  _X        d|j                  _X        d|j                  _X        |j                  j                         D ]  }|j%                  d        d| _n        d| _        d| _\        d| _^        d| _j        d| _        d| _        d| _        d| _m        d| __        d| _`        d| _b        d| _c        d| _o        d| _        d| _        d| _        d| _        d| _d        d| _g        d| _l        d| _a        d| _]        d| _q        d| _p        | j%                  dd       t        j                  j                  j                  }|D ]  }|j                  dЫ      st        j                  ||   |jf                  |      |_u        d|j                  v r|j                  |j                  _v        |j                  j%                  d        | j1                          | j3                          | j5                          | j7                          yIyI)uU    Добавляем структуру папок в новый проект
        zlist.pfeed:defaultr   ztask.epic:defaultzlist.agile_sprint:defaultzlist.release:defaultzlist.base:defaultzbqlfilter.quick:defaultuc   Вызываем разворачивание чтобы появилась папка задачиr   )make_dataclass	DataEmptytask.gantt_project:default	   Гант 	9_disableTFr   r   rt   u   Фильтрыr   r-  r   )rv   
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   r0  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   EpicsepicReleasesreleaseSprintssprintr2  reportsRoadmapsroadmapr  )r   r   u   Спискиr   u
   Лентаu   Лента проекта pfeed)r   r   r  r  rv   r   u   Дискdisku
   Архивarchiveu   Чат )r   	executorsr   r   project.evatestr   zproject.kanbanrx   u
   Доскаzboard.sd_kanban:default)r   rv   z	HomePage )r   r   rV  
cmf_authoru   Фильтр1z$" and responsible in (currentUser()))rx   project.wikir  u   Список1)r   r   u   Компонент1u   Документ1Epic1)r   r   r   rv   u   Релиз1r   )r   r   r  rv   Sprint1r   u   Roadmap Проекта)r   r   r   r.  i i i i" iI i q i i  i0 r1  iP4 i`[ ip i i i i r  sectionr   r   r   mark)r   r   r4  filters_filter1agile_sprinttest_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  rv   categoryui_form_viewui_form_createui_form_view_inner9   Запросить новую учетную записьuP   Запросите новую учетную запись для системы.u7   Сообщить о системной проблемеu   Дайте нам знать, если что-то не работает должным образом, и постарайтесь быстро восстановить его работоспособность.task.sd_incident:default	incidentsu?   Сообщить о сломанном оборудованииu   Сообщите об оборудовании, которое может быть неисправным или сломанным, например разбитый экран компьютера или поврежденный сервер.)r   typesu+   Логины и учетные записиu<   Запросить доступ администратораuY   Например, если вам нужно администрировать EvaProject.u3   Запрос по электронной почтеuu   Запрос получен от вашего канала поддержки по электронной почте.ztask.sd_emailed_request:default)r   r  rv   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   perm_policy_guestr   u   Категорииknowlage_base_categoriesu   Статьиu   Каналыservicedesk_channelsu   Клиентыservicedesk_clientsanalysis )rU  r   r_  r   r  r   logginginfodataclassesre  r  main_gantt_projectr   rv   r   r   full_search_typer   r   r   r   APPcache_projectsCmfStatusCoderL   r   rO   tasksr   ry   tasks__filter2tasks__filter3tasks__filter4tasks__filter5tasks__filter6tasks__filter7tasks__filter9default_bql_filtersr   tasks__filter10tasks__filter11tasks__filter12tasks__filter13tasks__filter14blogrr  r   docsepicsreleasessprintsry  roadmapsr  listsr   r|  r}  r~  rJ   chatr   r   rw   rD  rB  r   kanban_boardr   r   rV  r  homepagedescr_documentsl_create_examplesfilters__filter1lists__list1rI   components__component1
docs__doc1epics__epic1releases__release1sprints__sprint1rQ   roadmaps__roadmap1r0  r9  r,  r   r   __dict__values
show_tasksshow_all_tasksshow_approved	show_diskshow_archive	show_blog
show_pfeed	show_chatshow_filters	show_epicshow_sprintshow_reports
show_testsshow_release	show_docsshow_roadmapshow_components
show_listsshow_active_sprintsshow_trashcanshow_reqshow_app_learnrS   r4  choicesreports__report1report_bql_filter
startswithsetattrgetattrCmfSchemeWfr   CmfProjectNotifySchemenotify_schemer   r   _create_ui_view_form_create_sdesk_request_group_create_sdesk_request_typer  queue__queue1_task_filterrR   queue__queue1queue__queue2_task_filterqueue__queue2queue__queue3_task_filterqueue__queue3r  knowlage_base__categoriesknowlage_base__articleschannelsclientsshow_roadmaps
show_epicsshow_sprintsshow_releases
show_queueshow_knowlage_baseshow_servicedesk_channelsshow_servicedesk_clients_create_assign_to_project_create_sdesk_slascaffold_line_chartscaffold_mark)r   lt_pfeedlt_epic	lt_sprint
lt_releaselt_baselt_bql_filterre  tgantt_projectclosed_status_namedefault_quick_kwargscreate_list_examplesvr4  itemreport_typesreport	attr_name_ui_form_view_ui_form_create_ui_form_view_innerrequest_groupss                          r   scaffoldzCmfProject.scaffold  s@    	!##%&&**0D*E%%))/B)C''++1L+M	((,,2H,I
%%))/B)C++//5N/O 	z{.+N;+- 	 &&"NN,M'-':':'>'>D`'>'aM$#'M #,TYYK!8M-8M*#'M e,&3D#III%ww}} 2 22&&tww}}5#115585DII $$<LW`im$n	 (# 
 $$d^gpt$u!..7tyyk)hi{h||}~ / 

 "..,tyyk)KL / 

 "..0tyyk)EFXEYYZ[ / 

 "..6tyyk)DEWDXXYZ / 

 "..4tyyk)FG / 

 "..2tyyk)HI / 
 ".. 
0.=
 #
 	  ''(8(89"// 
8,6
 #
 	  ''(9(9:"// 
8(.
 #
 	  ''(9(9:"// 
0/9
 #
 	  ''(9(9:"// 
8$.
 #
 	  ''(9(9:"// 
6&0
 #
 	  ''(9(9:##T
Yktx#y''D?U`luy'z##;OZ^#_""t'F[_"`%%$ZR[dh%i
$$IPXae$f	$$NU^gk$l	%%$ZR[dh%i
$$(()DGG(T	$$d^gpt$u..-dii[9 ! 
 !!df]a!b$$LS\ei$j	$$$PWX\XaXaWbNclp$q++-
  $55))+AG 66!779AN"22!779AN"77!77L]v7wAN!99;AN ''TYYK(nn	 ( 

  jj"" "(!4!4II$"499+-QR "5 "A
 $(#4#4<v#v #!'AGG/!Z'-':':q||Zo':'pA$!--!&&GZ-[AL#!'tW^kr!s'-~~!**S`lr  @J~  (K$%+^^		PYem  {D^  &E"#)#4#4Rjsw#4#xA  "(#

"		"		 % "		#

 "		 "		#

.113AK *.ANN&%)AJJ"$(AII!$(AII!'+ALL$"&AGG$(AII!%)AJJ"$(AII!!%AFF$(AII!%)AJJ"!%AFF"&AGG"&AGG"&AGG/3/@/@I/MeSWAKK#ZZ&&( %e$% $DO"'D!&D"DN %D!DN#DO"DN %D"DN$D %D#DO %D!DN %D#(D "DO',D$!&D DM+/+<+<	+I%tDIIUI3/!%AFF$(AII!!%AFF%)AJJ""&AGGZZ&&( %e$% #'D"DO!&D"DN %D!DN#DO"DN $D!DN#D $D#DO $D!DN $D#'D "DO'+D$!&D DMIIUI3 ..::BBK# 
66>%+%9%9$T*		t &: &" %

2;<;M;MA&&8>)04A&&-""''u'5
6  11!%AFF%)AJJ"$(AII!$(AII!"&AGG$(AII!%)AJJ""&AGG"&AGG!%AFF$(AII!!%AFF%)AJJ""&AGG!%AFF)-ANN&ZZ&&( %e$%"'D#DO!&D"DN %D#DO"DN %D"DN$D $D#DO %D"DN %D#'D #DO',D$!&D!DMIIUI3%!//;;CCL$ =??7+#11)$/QYYTX 2 F #+4& 1IAy&1Ay)..e.<=  00"&AGG$(AII!!%AFF$(AII!!%AFF$(AII!%)AJJ""&AGG"&AGGZZ&&( %e$% $//339I3JDN $DO!&D"DN %D!DN#DO"DN $D"DN$D $D#DO $D!DN $D#'D "DO'+D$!&D!DMIIUI3 ..::BBK# 	66>%+%9%9$T*		t &: &U"$

2;<;M;MA&&8>)04A&&-""''u'5	6 .)-ANN&%)AJJ"$(AII!!%AFF$(AII!!%AFF$(AII!%)AJJ""&AGG"&AGGZZ&&( %e$% $DO!%D"DN %D!DN#DO"DN $D!DN$D $D#DO $D!DN %D#'D "DO',D$!&D DMIIUI3 ..::BBK# 66>%+%9%9$T*		t &: &" %

2;<;M;MA&&8""''u'56  66!%AFF%)AJJ"$(AII!$(AII!'+ALL$"&AGG$(AII!%)AJJ""&AGG$(AII!"&AGG!%AFF$(AII!!%AFF%)AJJ""&AGG"&AGGZZ&&( %e$% #(D#DO!&D"DN %D#DO"DN %D"DN$D %D#DO %D!DN %D#(D #DO'+D$!&D!DMIIUI3 55!'!>!>!B!BH\!B!]D"("8"8"<"<B]"<"^D 556OQcdM"778SUghO"&";";<[  ^H  #I
 ) %I %A*0*=*=*A*AGh*A*i(:,9.=2E %`$v*0*=*=*A*AGh*A*i(:,9.=2E %^&T*0*=*=*A*AGa*A*b(3,9.=2E	 %f&F*0*=*=*A*AGa*A*b(3,9.=2E	;'*X J %`$v*0*=*=*A*AGh*A*i(:,9.=2E %c$*0*=*=*A*AGh*A*i(:,9.=2EYCNH ,,^<++J M!..228Y2Z*.#6+ ,  &&4>NY`im&nAG*0*=*=+DGG94^_"499+-NO +> +QA' %11GGDQ=X=X_z 2 |AO*0*=*=+DGG9 5h i"499+-pq	 +> +sA'
 %11GGDQ=X=X_~ 2 @AO*0*=*=+DGG94]^"499+-MN +> +PA' %11GGDQ=X=X  `E 2 FAO$.. '>lv / AO +1*:*:OO2FQk +; +mA'(.(8(8OO. )9 )BA%))dZpy})~AJ((T@P[py}(~AI113AK$AGGO%+ANN"&,AOO#!'AJJ &AII &AII &AII!'AJJ &AII#AFFN#AFFN#)ALL %)AJJ").ANN&$(AII!!%AFF"&AGG$(AII!%)AJJ""&AGG"&AGG%)AJJ"!%AFF!%AFF$(AII!'+ALL$!&AFF"&AGG"&AGG&+AKK#ZZ&&( %e$% (,D$!&D#DO!&D"DN#DO %D!&D#DO"DN %D#DO"DN!&D"DO&*D#-1D*,0D) $D $D#(D !DN"'D"&D!DMIIUI3 ..::BBK# :??:.)/)=)=(.AIISW *> *A& )AJJ6?@?Q?Q**<&&++5+9: **,""$$$& K 6r   c                 x   d}t         j                  j                  | |dg      }|st         j                  | d| j                   dd| j
                   d      }|j                  d	
       t         j                  | t         j                  j                  | dd      |d|      }|j                  d	
       y y )Nu6   Оценка качества обслуживанияr  r   r   r   ["parent_id", "=", "r   r   r   r  Fr   ry  Tr   r   r   r  r   r   r   r4  r  )r   rS   r   r   r   ry   r   rL   )r   report_namer  r  s       r   r  zCmfProject.scaffold_marky  s    N%%))KQdPe)f & 3 3.twwir:&tyyk3 !4 !
 ""%"0))",,00TI^b0c ""3 * F KKuK% r   c                 
   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 ]0  }|j                  d:      }t        j                  j                  | |d;g<      }|r;t        j                  | d=| j                   d>d?| j
                   d@A      }|j                  dBC       t        j                  | t        j                  j                  | dDdEF      |dG|H      }|j                  dBC       |j                  dI      }|D ];  }t        j                         }t        j                         }	||	_	        |j                  d:      |	_
        |j                  dJ      |	_        |j                  dK      |	_        |j                  dL      }
|
r&t        j                  j                  | |
M      |	_        g }g }|j                  dN| j
                          |j                  dO| j                   d>       |j                  dPg       }|D ]  }|dk(  rdQj!                  dR ||   D              }|j                  | dS| dT       t        j"                  j%                  dUdV||   gW      }g }|D ]'  }|j                  |j                  j&                         ) dX}dQj!                  dY |D              }|j                  dZ| d[| d\       |d]k(  rvt        j(                  j                  | ||   M      }|s|j                  | d^|j
                   d@       |j                  dZ| d_|j                  j&                   d>       =|d`k(  r^t        j*                  j,                  j.                  }|j                  | d^|||       d@       |j                  dZ| d_||    d>       |j                  | d^||    d@       |j                  dZ| d_||    d>        daj!                  |      }dbdcj!                  |      z   ddz   }||_        ||_        |j                  dBC       ||	_        |	j                  dBC       > |j                  dBC       3 y )eNu`   Анализ SD. Отчет по созданным задачам против решенныхu   Созданоcreatedz#f15c75)r   
value_typecoloru   Решенныеdonez#7bc1a1)r   rowsu5   Анализ SD. Отчет время решенияu   Все задачиaveragez#8eb021   Время решения)r   r"  r#  slau   Инцидентыz#ea632brv   r  )r   r"  r#  r(  
row_filteru]   Анализ SD. Отчет по выполненным SLA против нарушенныхu   Выполненоsd_sla_processedz#14892cu   Нарушеноsd_sla_breachedz#d04437uQ   Анализ SD. Отчет по инцидентам по приоритетамu   КритичныйrR  ro  )rv   priority)r   r"  r#  r)  u   Высокийrp  u   Обычныйz#815b3ar   u   Низкийu   Минимальныйz#d39c3fu>   Анализ SD. Отчет по уровню успеха SLA+   Время до первого ответаsd_sla_compliance_percentz#59afe1uO   Анализ SD. Отчет по запросам на обслуживаниеu3   Все запросы на обслуживаниеr  z'task.sd_service_request_approve:defaultu   Все)rv   request_typer  r  uM   Анализ SD. Отчет по проблемам по приоритетуztask.sd_problem:defaultr   r  r  r  r   r   r   r  Fr   ry  Tr  
line_chartr  r%  r#  r"  r(  r   r   z
project = z["parent", "=", "r)  z, c              3   (   K   | ]
  }d | d   ywr   Nr  .0r  s     r   	<genexpr>z1CmfProject.scaffold_line_chart.<locals>.<genexpr>  s     ,Q!q1X,Q   z in ()ry   INr    c              3   (   K   | ]
  }d | d   ywr5  r  r6  s     r   r8  z1CmfProject.scaffold_line_chart.<locals>.<genexpr>  s     ,H!q1X,Hr9  z["z
", "IN", [z]]r1  z = "z	", "=", "r,  z and [z ,])r   r   rS   r   r   ry   r   rL   rZ   r   r   r#  r"  r5   r(  r   joinr  r   r   r4   r   r,  r  r   r   row_bql_filter)r   r2  chartr  r  r  r%  rowrow_task_filter	chart_rowr(  ubql_filterr  r)  fieldvalslogic_typesbql_valsr   r1  r,  s                        r   r  zCmfProject.scaffold_line_chart  s    { !1&/!* !3&,!*  P !6&/!*:	 !5&/!*:(+E*F'* x !5&8!*:	 !3&7!*:	$ l !5&.!*+E*F()'	 !1&.!*+E*F()'	 !1&.!*+E*F()'	 !/&.!*+E*F(*'	 !9&.!*+E*F(*'	K.1f Y !N&A!*L	 !<&A!*:	& j !V&.!*+LNw*x,4'	 !E&.!*+LNw*x,P'	 !\&.!*+LNw*x,g'	'B h !5&.!*+D*E()'	 !1&.!*+D*E()'	 !1&.!*+D*E()'	 !/&.!*+D*E(*'	 !9&.!*+D*E(*'	K.1sK

Z   O	*E))F+K))--TUhTi-jF$*$7$7#2477)2>*499+Q7 %8 %!
 "&&e&4-- & 0 0 4 4PYbf 4 g$ ,&7 .  5)yy( 71C&,&9&9&;O & 9 9 ;I'-I$%(WWV_IN&)ggg&6IO+.77<+@I(''%.C(.(:(:(>(>dQT(>(U	 #%K!#J&&DII;'?@%%(9$''"&EF!$r!:J!+ Z L0#'99,Qz%?P,Q#QD'..%dV1/EF*0*=*=*B*B(.j6G'H +C +K (*H&1 = ( <=#%D#'99,Hx,H#HD&--5'D6.LM"n4+1+E+E+I+IQU\fgl\m+I+nL+ + 2 2eWDARAR@SST3U V * 1 1BugY|G\G\F]]_2` a"j0'-~~'>'>'F'FH'..%XjQVFW=X<YYZ/[\&--5':eCTBUUW.XY'..%Z=N<Oq/QR&--5':eCTBUUW.XY1Z4 #*,,{";K!$tyy'<!<s!BJ+6O(*4O'#(((6/>I,NN%N0o71r 5)_O	*r   c                 0   t         j                  j                  |      }|st        d| d       t         j                         }| j                   d| j
                   d| |_        d|_        |j                  dd       |j                  |	       |S )
Nr   u3   Отсутствует экранная форма Tr   : r   Fr  )obj_copy)	r   	CmfUiFormr   r   task_code_prefixr   cmf_model_namer   r   )r   ry   action_nameui_form_ui_forms        r   r  zCmfProject._create_ui_view_form  s    ""&&D&1KD6RZ^_##%001DII;bN"+U3h'r   c                    t         j                  j                  d      }t         j                  j                  d      }t         j                         }| |_        ||_        |j                  j                  t        j                         |j                          t         j                         }| |_        ||_        |j                          y )Nzsdesk-client:defaultr   zsdesk-agent:default)r   CmfProjectRoler   CmfProjectRoleAssignr   project_rolemembersr   gcurrent_userr   )r   sdesk_clientsdesk_agentprs       r   r  z$CmfProject._create_assign_to_project  s    ,,006L0M++//5J/K ((*	%


!..)
	 ((*	&
	r   c                    t         j                  j                  d      }t         j                  | dd      }|j	                          t         j                  |ddd|	      }|j	                          t         j                  |d
dd|	      }|j	                          t         j                  |ddd|	      }|j	                          t         j                  |dd d|	      }|j	                          t         j                  |dd      }|j	                          t         j                  |dd      }|j	                          t         j                  |dd      }	|	j	                          t         j                  | dd      }|j	                          t         j                  |ddd|	      }|j	                          t         j                  |d
dd|	      }|j	                          t         j                  |dd d|	      }|j	                          t         j                  |dd      }|j	                          t         j                  |dd      }|j	                          t         j                  |dd      }	|	j	                          t         j                  |ddt         j                  j                  d            }
|
j	                          t         j                  | dd      }|j	                          t         j                  |ddd |	      }|j	                          t         j                  |d
d d|	      }|j	                          t         j                  |dd      }|j	                          t         j                  |dd      }|j	                          t         j                  |ddt         j                  j                  d!            }	|	j	                          t         j                  | d"d      }|j	                          t         j                  |ddd#|	      }|j	                          t         j                  |d
d d|	      }|j	                          t         j                  |ddt         j                  j                  d$            }|j	                          t         j                  |ddt         j                  j                  d!            }|j	                          t         j                  |ddt         j                  j                  d%            }	|	j	                          t         j                  |ddt         j                  j                  d&            }
|
j	                          t         j                  |ddt         j                  j                  d'            }|j	                          y )(Nzfulltime:defaultr   r'  date)r   r   widget_type     z+request_type.request_category = 'incidents')r   r0  	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-changedsd_waiting_for_customer)r   rf  rg  trigger_condition_status_codeu;   Время закрытия после разрешенияi  zBrequest_type.request_category in ['incidents', 'service-requests']rt   u/   Время на проведение ревьюz)request_type.request_category = 'changes'r  sd_declinedsd_implementingsd_planning)r   CmfCalendarr   r5   r   r7   r8   r  )r   default_calendarr(  goal1goal2goal3goal4trigger1trigger2trigger3trigger4trigger5s               r   r  zCmfProject._create_sdesk_sla  s:    "--117I1J  3N\b c
&&c44>% ' 
 	

&&c44E% ' 
 	

&&c45J% ' 
 	

&&c44VXcs&t

,,Cgap,q,,Cgau,v,,Cf`p,q   3`nt u
&&c44>% ' 
 	

&&c44E% ' 
 	

&&c44VXcs&t

,,Cgap,q,,Cf`v,w,,Cf`p,q,,Cf`u?E?S?S?W?W]v?W?w - y   3p  E   F
&&c45U% ' 
 	

&&c44VXcs&t

,,Cgaq,r,,Cf`t,u,,Cf`u?E?S?S?W?W]e?W?f - h   3drx y
&&c45<% ' 
 	

&&c44VXdt&v

,,CgavGMG[G[G_G_epG_Gq - s,,Cf`u?E?S?S?W?W]e?W?f - h,,Cf`u?E?S?S?W?W]j?W?k - m,,Cf`u?E?S?S?W?W]n?W?o - q,,Cf`u?E?S?S?W?W]j?W?k - mr   c                 
   t         j                  j                  dd| j                  gdd| j                  gg      rt        d| j                   dd	       | j                         rt        d
| j                   dd	       y y )Nr   r  r   rs   r   u   Проект с именем uA    уже существует. Укажите другое имя.Tr   u-   Раздел на диске с именем uF    уже занят. Укажите другое имя проекта.)r   r`   slistr   r   r   rZ  r   s    r   _check_project_dir_conflictz&CmfProject._check_project_dir_conflict0  s    ""FC+CdDRVRYRYEZ*["\5dii[  AB  C  KO  P$$&Edii[  QW  X  `d  e 'r   c                     ddd|gg}|r|j                  dd|g       | j                  |      rt        | j                   dd       y y )	NORr   rq   ry   r   u7    с таким именем уже существуетTr   )r   r   r   verbose_name)r   r   ry   
prj_filters       r   _check_uniquezCmfProject._check_unique6  sX    VT401
vtT2377*7%))**abjno &r   c                 L    | j                  ||       t        |   |||d|S )N)r   ry   )r  r   rR  )r   r   ry   r   r   r   s        r   rR  zCmfProject.create?  s+    $%w~t$TDVDDr   c                 
   g d}ddg}|D ]5  }d| }| j                   |   j                  s#|D ]  }t        t              |   j	                  dd| j
                  gdd|gg      }|s8|d	k(  r3t        t              |   j	                  dd| j
                  gg d
g      }|st| j                   |   j                   |_        |j                  d        t        j                  j	                  dd| j
                  gddd| gg      }|s| j                   |   j                   |_        |j                  d       8 | j                  j                  rat        j                  j	                  dd| j
                  gg dg      }|r.| j                  j                   |_        |j                  d       | j                  j                  rat        j                  j	                  dd| j
                  gg dg      }|r.| j                  j                   |_        |j                  d       | j                  j                  r]t        j                  j	                  dd| j
                  g      }|r.| j                  j                   |_        |j                  d       | j                  j                  r| j                   dk(  r(t        j                  j	                  dd| gg dg      }n t        j"                  j	                  |       }|r.| j                  j                   |_        |j                  d       | j$                  j                  rPt        j&                  j	                  |       }|r.| j$                  j                   |_        |j                  d       | j(                  j                  rWt        j                  j	                  g ddd| gg      }|r.| j(                  j                   |_        |j                  d       | j*                  j                  rWt        j                  j	                  g ddd| gg      }|r.| j*                  j                   |_        |j                  d       | j,                  j                  rWt        j                  j	                  g ddd| gg      }|r.| j,                  j                   |_        |j                  d       | j.                  j                  rYt        j                  j	                  g ddd| gg      }|r/| j.                  j                   |_        |j                  d       y y y )N)approvedr~  r|  r  r}  r  rt  rx  rv  r{  r   r  ry  r   r  rr  r  r  rB  r,  rL   CmfActiveEntityFiltershow_rp   rq   r   r   r  )r   rq   r  Tr   rw   zlist.r   r  )r#  r  r   )r#  r  rW   r   r   )zlogic_type.coder  r
  )r   )r#  r  r   )r#  r  r   )r#  r  rq  )r#  r  CmfReq)r  r   r   r   r   r   r   r   r   r   show_doc_registryrO   show_company_registryr  rJ   r  rw   r   r  r   r  r  r  r  )r   	sys_typesnode_modelsr   	fieldname	nodeclasssysnodes          r   _calc_hidden_nodeszCmfProject._calc_hidden_nodesD  s   
	, #$;<! 	1Hz*I}}Y'22!, 
5I"6l9599!,dDGG <z4QY>Z[ : ]G"x7': #'v,y"9"="=%0$$@B_#` #> #b26--	2J2P2P.P+t4
5 !..,,($8>4SXYaXbQc:de - g.2mmI.F.L.L*LG'LL4L0'	1* !!,,((,,6FTWW5UWs4t,uG*.*@*@*F*F&F#t,%%00((,,6FTWW5UWr4s,tG*.*D*D*J*J&J#t,>>$$))--6FTWW5U-VG*...*>*>&>#t,##..  $:: ..,,&T2F -  !//333E*.*B*B*H*H&H#t,>>$$((,,,>G*...*>*>&>#t,))((,,5MP]_bdhOi4j,kG*.*=*=*C*C&C#t,??%%((,,5MP]_bdhOi4j,kG*.//*?*?&?#t,>>$$((,,5VYfhkmqXr4s,tG*...*>*>&>#t,==##((,,5L}^acgNh4i,jG*.--*=*=&=#t,  $r   c                 *    t         |          g dz   S )N)default_list_workflowdefault_epic_workflowdefault_subproject_workflowdefault_release_workflowdefault_sprint_workflowdefault_document_workflowr  project_perm_schemer  rd  r   r   cmf_project_adminsrO  r   )r   save_preload_fieldsr   s    r   r  zCmfProject.save_preload_fields  s    w*, 0
 
 	
r   c                     | j                   j                  s| j                  j                  rt        d       | j                  dk(  rd| _        | j                  dk(  rd| _        y | j                  dk(  rd| _        y y )Nu<   Нельзя менять родителя у проектаr  zCmfWiki:Classr   zCmfProject:Class)r   r   r   r   r   rp   r   r   s    r   _calc_parentzCmfProject._calc_parent  sl    ;;!!T%5%5%@%@TU	),DN	)"1D)+"4D ,r   c                     | j                   j                  sy t        j                  j	                  | j                   j
                  | j                  j
                        | _         y r   )r  r   r   r   confluence_convertr   r   r   s    r   
_calc_textzCmfProject._calc_text  s<    yy##&&99$))//477==Y	r   c                    dd l }| syt        j                  |       }  |j                  dd| j	                               }|j                  d      }d}t        |      dkD  r#dj                  |D cg c]  }|d   	 c}      }n|d   d d }t        j                  j                  ddgdd	|j	                          d
g      }t        |D cg c]  }|j                  j	                          c}      }t        |      }	|j	                         |	v rt        |	D 
cg c]b  }
|
j                  |j	                               s# |j                  dd|
j	                         j!                  |j	                         d            d c}
d      }|r*|t#        t%        |      dz         z  }|j'                         S |dz  }|j'                         S c c}w c c}w c c}
w )Nr   r<  z\W+-rp  rm  z--rO  ILIKE%r   r~   z\D)default1)rer   translit_stripsublowerr   lenr@  r   r`   r{  setrO  r   maxr  replacestrintupper)r   r  slugchunksprefixchunkprojectsr   prefixesexisting_prefixespmax_prefix_nums               r   get_prefix_from_namezCmfProject.get_prefix_from_name  s   %%d+rvvfc4::<0Cv;?WWF;5eAh;<FAYr]F$$**,-&FLLN3C11EF + 
 QW00668QR N<<>.. du  "W_`yz  zF  zF  GM  GS  GS  GU  zV&"&&AGGI4E4EfllnVX4Y"Z  "W  ab  cN#c.1A566 ||~ #||~+ < R "Ws   /G
!G$G>AGc                    | j                   j                  s| j                  j                  sy | j                   j                  r\| j                   j                  j	                         | _         | j                   dk(  s7| j                   dk(  s(| j                   dk(  s| j                   | j
                  k(  rt        d| j                    d       t        j                  j                  dd| j                  gd	d
| j                   ggdgd      }|r(t        d| j                    d|j                   dd       t        j                  j                  dd| j                    dgdd| ggdgd      }|r0t        d| j                    d|j                  j                   d       | j                  ry t        d       t        t        j                   j"                  | j                  j                  g       y )NTSKA	NOPROJECTuH   Нельзя использовать системный префикс Tr   r   rs   rO  r  r   )r~   r   include_deletedu   Код u2    уже используется проектом u   . Выберите другойry   rz   z-%r   zproject.nameu8    ранее использовался проектом u   . Это может привести к пропускам в нумерации кодов. Если это нежелательно - укажите другой префиксur   Запущен фоновый процесс смены префиксов кодов у задач проекта)r   )rO  r   task_code_use_logic_type_prefixr   r  code_prefixr   r   r`   r   r   r   CmfTaskCodeHistoryr   is_newschedule_deferred_jobr   recalculate_codes_celery)r   project_with_prefix	code_useds      r   _calc_task_code_prefixz!CmfProject._calc_task_code_prefix  s   !!,,33>>   ++$($9$9$?$?$E$E$GD!$$-,,3,,;,,0@0@@deiezezd{|  EI  J"("3"3"7"7tTWW-0BCI^I^/_`x $ #8 #
 #GD$9$9#::l  nA  nF  nF  mG G; < $&
 1155D,A,A+B")EFTXZ^H_`&' $ 6 I
  GD$9$9#::rs|  tE  tE  tJ  tJ  sK Ks t u ;;  G  	IfnnEETWW]]O\r   c                 l   ddl m} | j                  j                           || j                  j                  xs ddd      }t        j                  d|      D cg c]  }|s|	 c}dd	 }t        |      d
k(  r	|d   dd	 }ndj                  d |D              }|j                         }d}t        j                  j                  dd| | gdd| j                  gg      r@|sd}|d
z  }t        j                  j                  dd| | gdd| j                  gg      r@| | | _        yc c}w )u  
        Генерируем автоматически Префикс для кода задач для Разделов (там он не очень важен)
        TODO1: возможно, выводить на форме создания разделов поле ввода Префикса
        Важно! Этот метод разрешен только для Разделов!
        r   )translitr  ruT)language_codereversedz(?:\b|_)([A-Za-z0-9]{1,4})Nrm  rp  r<  c              3   &   K   | ]	  }|d      yw)r   Nr  )r7  cs     r   r8  z@CmfProject._calc_task_code_prefix_for_section.<locals>.<genexpr>(  s     3A1Q43s   rO  r  r   rs   r   )transliterater  r   r   r   r  findallr  r@  r  r   r`   sgetr   rO  )r   r  ry   r  	code_listis         r   "_calc_task_code_prefix_for_sectionz-CmfProject._calc_task_code_prefix_for_section  s;    	+				05tT "

+H$ OU1STQUVXWXY	y>QQ<#D77333Dzz|$$+STF1#,?$dggAVW % 
 FA $$+STF1#,?$dggAVW % 
 $(& Vs   D1$D1c                     |j                  d      s|rt        dd       y| j                  }| j                  j                  r"| j                  s| j                  j
                  }||vr|rt        dd       yy)NProjectAdmins
group_codeu   Для редактирования параметров проекта Вам необходимо находиться в группе Администраторы проектовTr   Fu   Для редактирования параметров проекта Вам необходимо быть Администратором проекта)in_person_groupr   r  r   r  r   )r   personraise_exceptionr  s       r   is_project_adminzCmfProject.is_project_admin3  s     %%%A M  !44""--dkk!%!8!8!<!<++  w "r   c                 H   | j                   sy t        j                  j                  | d      }|s't        j                  | d      }|j	                          t        j                  j                  | d      }|s(t        j                  | d      }|j	                          y y )Nwhite)r   r#  black)r  r   rX   r   r   )r   wlbls      r   _calc_white_black_listsz"CmfProject._calc_white_black_listsI  s    {{  $$Dw$?$$Dw$?BGGI  $$Dw$?$$Dw$?BGGI r   c                     | j                   sY| j                  j                  rB| j                  r5t        j                  j                  | d      }|s| j                          y y y y y )Nr,  r   )r  r  r   r   rL   r  r9  )r   r   s     r   _calc_structure_scaffoldz#CmfProject._calc_structure_scaffoldV  s\     {{t22==$BUBU%%**$*MF'')  CV={r   c                 T   | j                   rgt        j                  j                  sMt        j                  s=t        j
                  s-t        j                  j                  d      st        dd       | j                   r)| j                  j                  t        j                         | j                   s| j                  j                  rt        j                  j                  g d      }|j                  j                         }| j                  j                   D ]  ^}}}|dk(  s||vst#        j$                         5  |j                  j                  |       |j'                          d d d        |t        j                  k(  r3t        j(                  j+                  |j,                  j.                         |j                  d      rt        d	| d
        | j                   rt        j0                  j                  dd| j2                  gdd| j,                  gg      }|rt        d| j2                   dd       no| j5                         r_| j7                  | j9                               }	|	j:                  r4|	j=                  d| j2                   dt?        j@                         d       d}
| j2                  j                  r| jC                  dg       | j2                  st        d       | jE                          | j2                  jF                  r5| j5                  | j2                  jF                        r| jI                          | jJ                  r:d| j2                   | jJ                  _        | jJ                  j'                  d       | j                   r| j2                  s| jL                  | _        d}
| j                   s| jO                          | jP                  sZ| jR                  dk(  r&t        jT                  j                  d      | _(        n%t        jT                  j                  d      | _(        | jV                  s%t        jX                  j                  d      | _+        | jZ                  sIt        j\                  j                  d      }|s t        j\                  j                  d      }|| _-        | j_                          | ja                          | jb                  s-| jd                  dk(  r| jg                          nt        d d       | ji                          | jk                          | jm                          to        | L  |i |}| j                   s| jP                  j                  sn| jp                  j                  sX| jr                  j                  sB| jt                  j                  s,| jv                  j                  s| jx                  j                  rt        jT                  j{                          | j}                          |j                  d!d      rd}
|
r| j                          | j                  j                  r| j                          | j                  j                  r| j                  r| j                          | j                  j                  r| j                  r| j                          | j                  j                  r| j                  r| j                          | j                   s| jV                  j                  rt        jX                  j{                          t        j                  j                  d"d#d$d%ggd"g&      }|D ]  }d$|_J        |j'                  d        | j                          |S # 1 sw Y   /xY w)'NProjectCreatorsr  u   Для создания проектов попросите Администратора системы добавить Вас в группу Создатели проектовTr   )ry   rq   r  r   r   u   Пользователь uO    добавлен в группу Администраторы проектовr   rq   r   rs      Проект     уже существуетr<  _%Y-%m-%d-%H%M%SFr  <   Имя проекта не может быть пустым.rh  r   rx   servicedesk:defaultr   system.open:defaultsystem:default)rj  r  u8   Укажите Префикс для кода задачdont_scaffoldonboarding_statusr  rt   cancelr~   r   )Lr  rY  rZ  is_admindisable_permissionsacl_admin_moder  r   r  r   r   r   CmfPersonGroupr   
rg_members
all_nested_changesr   disable_aclr   current_person__member_ofaddr   r   r`   r   rZ  rM  r?  ra  renamer   nowrY  r|  r   rename_project_dirr  ry   r  r  rw   CmfProjectPermSchemer  r  rd  ro  r  r   rO  r   r  r  r   r   r   servicedesk_publicrV  cmf_owner_assistants
spectatorsr  trigger_reloadr  r  rU  r_  r  r'  r  r*  r  scaffold_req_registry
CmfLicenser   r  r  )r   r   r   project_admins_groupproject_admins_group_memberschange_actionpr_adminr  ra  project_dir_rfileshould_be_scaffoldedrd  resultonboardings
onboardingr   s                  r   r   zCmfProject.save^  s   ;;q~~66))Q-=-=~~55AR5S ELPR ;;##**1>>: ;;$11<<#)#8#8#<#<Dc#<#d +?+J+J+U+U+W(/3/F/F/O/O 
]+x! H,'CC$002 80;;BB8L05578 $q~~577;;<P<S<S<Y<YZ'77CT7U%(A(  L[  '\  ]
] ;;&&**FD$))3LtUY[_[b[bNc2d*eFM$))4PQY]^,,.(,8H8H8J(K%(//)001TYYKqP_@`1ab$9923499XY,,.yy}}!:!:499==!I'')&&1:499+/F'','',,t,<;;99 II	#' {{##%''  $99+1+F+F+J+JPe+J+f(+1+F+F+J+JPe+J+f( !!!'!>!>!B!BHX!B!YD }}))--->H!--117G1H$DM!$$  I-779T]ab##%))+!!#t.v.;;++66**55>>,,,,77??-->>,, ''668$$&::ou-#( MMO((##%!!,,1G1G&&(%%00T5O5O**,==##&&( ;;$,,77))88:'',,5H(U]_gTh4i  tG  sH,  I% 	,J+3J(OOdO+	, 	%%'g8 8s   ,^^'	c                     | j                  | j                  | j                  j                              }|j	                  | j                                y r   )rM  r?  r   r   r  )r   	old_rfiles     r   r   zCmfProject.rename_project_dir  s:    OOD$4$4TYY]]$CD	))+,r   c                     | j                   rt        j                  j                  dd| j                  gdd| j
                  gg      }|rt        d| j                   dd	       no| j                         r_| j                  | j                               }|j                  r4|j                  d
| j                   dt        j                         d       | j                  j                  r1t!        j"                  | j                  j$                  dg      | _        | j&                  j                  r1t!        j"                  | j&                  j$                  dg      | _        d}| j                  j                  r| j                  st        d       | j)                          | j                  j*                  rx| j                  | j                  j*                        rS| j                  | j                  | j                  j*                              }|j                  | j                                | j                   r| j                  s| j,                  | _        d}| j                   s| j/                          | j0                  sZ| j2                  dk(  r&t        j4                  j                  d      | _        n%t        j4                  j                  d      | _        | j6                  s%t        j8                  j                  d      | _        | j;                          | j=                          | j>                  sJ| j@                  dk(  r| jC                          n*| jE                  | j                  j$                        | _        | jG                          | jI                          tK        
|   |i |}|r| jO                          t        jP                  jS                  ddddggdg      }|D ]  }	d|	_*        |	jW                  d        |S )Nr   rq   r   rs   r   r  r  Tr   r<  r  r  div)tags_extendFr  rx   r  r   r  r  r  r  r  rt   r  r  r   ),r  r   r`   r   r   r   r   rZ  rM  r?  ra  r  r   r  document_header_textr   r   
html_cleanr   document_footer_textr|  r   ry   r  r  rw   r  r  r  r  r   rO  r   r  r  r  r   r   _save_importr  r  r   r  r   )r   r   r   ra  r  r  r  r  r  r  r   s             r   r  zCmfProject._save_import  s@   ;;&&**FD$))3LtUY[_[b[bNc2d*eFM$))4PQY]^,,.(,8H8H8J(K%(//)001TYYKqP_@`1ab $$//(/(:(:4;T;T;Z;Zinho(pD%$$//(/(:(:4;T;T;Z;Zinho(pD%$9999XY,,.yy}}!:!:499==!I OOD,<,<TYY]],KL	  !1!1!34;;99 II	#' {{##%''  $99+1+F+F+J+JPe+J+f(+1+F+F+J+JPe+J+f(!!!'!>!>!B!BHX!B!YD!$$  I-779(,(A(A$))//(R%##%))+%t6v6MMO'',,5H(U]_gTh4i  tG  sH,  I% 	,J+3J(OOdO+	, r   c                 F   t        t        |j                  d      d         }|j                  |g d      }|j                  rM|j                  d      r|j                  j                  d|       n.|j                  j                  d|       n|j                          |xr" t        t        |j                  d      d         }|xr |j                  |d	g      }|xr |j                  j                  xs d}|xr" t        t        |j                  d      d         }	|	xr |	j                  |d	g      }
|
xr |
j                  j                  xs d}|r|r|t        ||z
  d
z        z   |_        n|r|dz   |_        n|r
|dz
  |_        |j                  d       y )N:r   )r0  r   r   r   r   zCmfTask:zPPP-TSK-ORDERr   zPPP-OBJ-ORDERr0  ro  ra  Tr   )r  r   r   r   r   r  rh   check_edit_permr0  r   r  r   )r   item_id	anchor_idnext_id
item_modelr  anchor_modelanchoranchor_orderno
next_model	next_itemnext_ordernos               r   rd   zCmfProject.move_item(	  sx    VW]]3%7%:;
~~1Q~R <<!!*-66D6Q66D6Q   " MWVY__S5I!5L%MT,"2"2i"2"T8FNN$8$8=AGs1CA1F!G
Q:>>Wi[>#Q	 <Y%6%6%<%<Ay)C1NRS0S,TTDL)D0DL'$.DL		D	!r   c                      y r   r  r   s    r   
_calc_codezCmfProject._calc_codeI	  s     	r   c                      y r   r  r   s    r   get_code_prefixzCmfProject.get_code_prefixN	  s    r   F	recursiveTEXKOM_db_deletec                   | j                   j                         r,|s*t        dt        j                   dt                dd       | j                  j                  }|rg | _        d | _	        | j                  d       dD ]  }t        t              |   j                  dd	| gdd
      D ]f  }t        j                  d|        t        t              |   j!                  |j"                  dd      sJ|j%                  dd       t'                h  t        j(                  j                  | dd      D ]-  }t        j                  d|        |j%                  dd       / t        j*                  j                  | dd      D ]-  }	t        j                  d|	        |	j%                  dd       / t        j,                  j                  | dd      D ]-  }
t        j                  d|
        |
j%                  dd       / t        j.                  j1                  dd	| j"                  gdd i       t        j2                  j1                  dd	| j"                  gdd i       t        j4                  j                  dd| j"                  ggdd
      D ]G  }t        j                  d|        |j6                  j9                  |        |j                  d       I t;        | H  |||ddd|}| j=                  |      r1t        j>                  jA                  |      }|r|jC                          |S )N   Данный проект был импортирован из внешней системы. Удаление импортированных проектов доступно через <a href="@  " target="_blank">службу технической поддержки</a>.<br />Если Вам необходимо обновить данные проекта, пожалуйста, воспользуйтесь процедурой повторного импорта проектов через меню <a href=""   settings/import">Импорт</a>.Tr   r   )rI   rJ   rV  r   CmfImportDownloadr   r   CmfTransr  r  r  r  rU  r  	CmfPersonr  r   rK   rS   r   rL   r   rq   )r~   r  include_systemu   Удаляем )r   r  r7  )r/  force)r   r  r7  
project_id)r~   r  r  r;  u   Удаляем из кеша F)r.  r/  r7  r   )"
cmf_importr   r   configSUPPORT_URLapp_base_hrefr   r   r  r  r   r   r   r   rY  debugr  r   r  commit_with_eventr&   r  CmfDocumentHistoryCmfAccessRulebulk_updateCmfAccessListCmfCustFieldConfr  remover   rZ  rF  r   move_to_trash)r   r.  r/  r   r   cur_namecls_namerC  
gantt_task	task_codedoc_historycust_field_confrc  r?  r   s                 r   _old_deletezCmfProject._old_deleteR	  s@   ??!*:"../ 0 *O,,NP  99??')D$&*D#III% ,.  <166xt>Tfj{6  A ,CGGocU34F|H-22cffdcg2h

D
E)+	,/,8 %1166tUYjn6o E
/*67!!4t!DE $66;;DZ^os;t D	/)56  $d CD  &88==d\`qu=v F/+78""D"EF   ,,\44Q5A44H - J  ,,\44Q5A44H - J $*#:#:#?#?($	: $# $@ $ 5
 77HIJ..55d;$$t$45 gndiJZ,0JBHJ$$X. //--h7K))+
r   )r.  r/  use_jobc                z   | j                  ddg       | j                  rt        dd       | j                  r,|s*t        dt        j
                   dt                dd       | j                  | j                                d| _	        | j                  j                  r| j                  j                  n| j                  }| j                  |      r| j                          | j                          | j                   j"                  ||d	|}|rt%        | j&                  |
       y  | j&                  di | y )Nrj  r:  u@   Нельзя удалять проект по умолчаниюTr   r1  r2  r3  )r9  r.  r/  r   r  )rY  rj  r   r:  r;  r<  r=  apply_delete_prefixgenerate_delete_prefixcmf_deletedr   r   r   rZ  r   	save_datar   jsonr  _delete_job)r   r.  r/  rN  r   r   project_name
job_kwargss           r   r  zCmfProject.delete	  s   ,56??X`de ??#3"../ 0 *O,,NP  	  !<!<!>?(,		(<(<tyy}}$))$$\2##% '',," 0
 	

 !$"2"2:FD*z*r   rk  r9  u   Удаление проекта)r,  	only_onceonly_once_argsdescriptionshow_bg_progressbarc                   t         j                  j                  | d      }|r&t        j                  j                  |g|d|i| n%t        j                  j                  |g|d|i| |j
                  j                  }|j                  |      r5t         j                  j                  |      }|r|j                  d       y y y )NTr   r  r.  F)	is_rename)
r   r`   r   
_db_delete_move_to_trashr   r   rZ  rF  rF  )r9  r.  r/  r   r   r   rG  r?  s           r   rV  zCmfProject._delete_job	  s     ##'':t'L((W4W9WPVW,,W[t[y[TZ[<<%%''1 //--h7K))E):  2r   c                    dd| j                   j                  gg dg}t        D ]c  }t        j                  |      }|dk(  r'|j                  |      D ]  }|j                           |j                  |ddid       t                e d| _	        | j                          t        j                  j                  | j                   j                         t        j                  j                   j#                  | d	       t        j$                  j'                  d	d
t(        j*                  | | j,                  j                  | j.                  j                         t                y )Nr9  r  )rS  r  Fr   r   rS  T)r~   r  include_dummyr  r`   operaterP  r  r   parent_nameparent_code)r   r   PROJ_MODELSr   get_model_by_namer   delete_filerB  
cmf_commitrS  rT  r   r`   _remove_proj_objs_from_indexingcmfapp	CMF_CACHE
invalidateCmfAuditaudit_eventrY  current_personr   ry   )r   r.  r   r   _filter	classnamer   attachs           r   ra  zCmfProject._move_to_trash	  s7    3

 0 01'
 % 	I--i8EO+#jjj8 )F&&() %t,"   L	 #99'**:J:JK 	$$Wh7 	##'''**** 	$ 	
 	r   c                 )   | j                   j                  }t        t        j                  j
                  t        |             t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  d	d|i       t                t        j                  j                  j                  j                         j                  d
d|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  dd|i       t                t        j                  j                  j                  j                         j                  d d|i       t                t        j                  j                  j                  j                         j                  d!d|i       t                t        j                  j                  j                  j                         j                  d"d|i       t                t        j                  j                  j                  j                         j                  d#d|i       t                t        j                  j                  j                  j                         j                  d$d|i       t                t        j                  j                  j                  j                         j                  d%d|i       t                t        j                  j                  j                  j                         j                  d&d|i       t                t        j                  j                  j                  j                         j                  d'd|i       t                t        j                  j                  j                  j                         j                  d(d|i       t                t        j                  j                  j                  j                         j                  d)d|i       t                t        j                  j                  j                  j                         j                  d*d|i       t                t        j                  j                  j                  j                         j                  d+d|i       t                t        j                  j                  j                  j                         j                  d,d|i       t                t        j                  j                  j                  j                         j                  d-d|i       t                t        j                  j                  j                  j                         j                  d.d|i       t                t        j                  j                  j                  j                         j                  d/d|i       t                t        j                  j                  j                  j                         j                  d0d|i       t                t        j                  j                  j                  j                         j                  d1d|i       t                t        j                  j                  j                  j                         j                  d2d|i       t                t        j                  j                  j                  j                         j                  d3d|i       t                t        j                  j                  j                  j                         j                  d4d|i       t                t        j                  j                  j                  j                         j                  d5d|i       t                t        j                  j                  j                  j                         j                  d6d|i       t                t        j                  j                  j                  j                         j                  d7d|i       t                t        j                  j                  j                  j                         j                  d8d|i       t                t        j                  j                  j                  j                         j                  d9d|i       t                t        j                  j                  j                  j                         j                  d:d|i       t                t        j                  j                  j                  j                         j                  d;d|i       t                t        j                  j                  j                  j                         j                  d<d|i       t                t        j                  j                  j                  j                         j                  d=d|i       t                t        j                  j                  d>d?|gd>d id@A       t                t        j                  j                  dd?|gdd id@A       t                t        j                  j                  dBd?|gdBd id@A       t                t        j                   j                  dCd?|gdCd id@A       t                t        j"                  j                  dd?|gdd id@A       t                t        j$                  j'                  dDd?|gd@E       t                t        j                  j)                  |       t        j*                  t        j,                  t        j.                  t        j0                  t        j2                  t        j4                  t        j6                  fD ]%  }|j                  dd?|gdd id@A       t                ' dFD ]8  }t9        j:                  |      }|j'                  dd?|gd@d@G       t                : t        j<                  t        j0                  fD ]#  }|j'                  dDd?|gd@d@G       t                % t?        t        |   ||d@dH| t                tB        jD                  jF                  jI                  | dI       t        jJ                  jM                  dIdJtN        jP                  | | jR                  j                  | jT                  j                  K       t                y )LN)r9  rP  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;
            r9  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;
            default_project_idr  T)r~   r  r  structural_project_idfilter_project_idrp   )r~   r  )Qr  rU   rT   rZ   rS   rR   rQ   rP   rO   rN   rM   rL   rJ   rI   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   rK   r   rV   rW   rX   rY   r[   r\   r]   r^   )r~   r  rc  r-  r  r`   rd  )+r   r   r  r   r`   _delete_attachments_files_jobr   rG  rH  Sessionexecuterk  r6  rB  CmfPipelineCmfRoleCmfTagCmfWhatsappCmfMailHandlerbulk_deleterl  CmfDealCmfLeadr   rK   r@  rA  rC  r   ri  r   r   r  rm  rn  ro  rp  rq  rr  rY  rs  r   ry   )r   r.  r   r   r9  r   ru  r   s          r   r`  zCmfProject._db_delete
  s   ZZ%%
;;:.	
 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002:: :&		
 	 	((002::
 :&	
 	 	((002:: :&	
 	 	((002::S:&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::_:&	
 	 	((002::Q:&	
 	 	((002::Q:&	
 	 	((002:: :&		
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002:: :&	
 	 	((002::
 :&	
 	 	((002:: :&		
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002::
 :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	((002:: :&	
 	 	$$(#z:($/  	% 	

 	 	&& #z2 $'  	' 	

 	 	""+S*=+T2  	# 	

 	 	!!'j9'.  	" 	

 	 	&& #z2 $'  	' 	

 	 	))j1  	* 	
 	99*E NNNN  %%    	
 	E $c:6$d+ $  
 L	"R
 Y	If --i8E$c:6 $"  
 LsY	z   
 		E #S*5 $"  
 L		 	j')49W[f_ef 	$$Wh7 	##'''**** 	$ 	
 	r   c                     dD ]T  }t         j                  j                  j                  j	                         j                  d| dd| i       t                V y )N)
cmf_taskcmf_documentcmf_listcmf_kanban_boardcmf_task_filter
cmf_foldercmf_dashboard
cmf_reportcmf_project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
                r9  )r   r`   rG  rH  r|  r}  rk  )r9  tables     r   rl  z*CmfProject._remove_proj_objs_from_indexing  se    
 	E   ,,446>>   ! z* L+	r   u;   Жесткое удаление файлов проекта)rY  rZ  r[  c                   t         j                  j                  | dgd      D ch c]  }|j                  j                   }}t         j
                  j                  j                  j                         j                  }|D ]Y  }t        d      t        j                  |      z  |d d z  |z  }	|j                  t        |	            }
|
sJ|
j                          [ y c c}w )Nrp   T)r9  order_byr  r   i)r   r   r   rp   r   rF  rG  rH  rI  rootr   r   get_class_name_by_idfind_child_by_idr  r  )r9  r.  r/  r   r   a
parent_idsr  rp   rK  rfs              r   r{  z(CmfProject._delete_attachments_files_job  s     281E1E1J1J!!]  2K 2
 Aakk'' 
 
 !!--446;;# 	I;!=!=i!HH9UYVY?Z]ffD&&s4y1B			s   C c                    | j                   j                  }t        |   dddi|}| j                   j                  }t        j
                  j                  || j                         |       | j                          |S )Nr7  T)name_before
target_dir
name_afterr  )	r   r   r   restorer   rF  restore_from_trashr?  r_  )r   r   r  rc  r  r   s        r   r  zCmfProject.restore  so    iioogo<T<V<YY__
**#'')! 	+ 	

 	!
r   c                     t        j                  t        j                        }|t	        d      z  }t
        j                  j                  dd| j                  gdd|gg dg d	gd
g      }|S )N)tz   )hoursrp   rq   plan_start_date<)rr   rs   CLOSED)
alarm_daterq   Nr   r  )	r   r  r   utcr   r   r   r   r   )r   r  r  s      r   _list_tasks_need_to_startz$CmfProject._list_tasks_need_to_start  sp    llhll+yr""##dDGG,"C-5*	  $ 

 r   c           
      B   | j                   ry | j                         }|sy t        d| j                  j                  j
                          t        j                  j                  | j                  d| d| j                   d| j                   j                   dd       y )Nu&   Отправляем карточку u   Рекомендацияu   
            В проекте u(   есть задачи с планом, но без будильника.
            Назначьте будильник, или список с планом,
            чтобы задачи появились у исполнителя в ленте.
            (сброшен флаг "z")
            ro  )r  r   r   msgr,  )
auto_alarm_dater  printrV  r   r   r   	CmfNotifyplace_notifycaption)r   r  s     r   '_notify_project_owner_not_planned_tasksz2CmfProject._notify_project_owner_not_planned_tasks  s    ..06t~~7J7J7P7P6QRS%%>>+#yyk *' (,';';'C'C&D E	  	& 	
r   z@daily)rY  
system_jobschedulec                      t         j                  j                  d      D ]:  } | j                         }|D ]#  }|j                  |_        |j                          % < y )NT)r  )r   r`   r   r  r  r  r   )r   r  tasks      r   cron_auto_alarm_datezCmfProject.cron_auto_alarm_date  sZ     ((--d-C 	G557E "&"6"6			r   c                  p    t         j                  j                  dg      D ]  } | j                           y)u   DEPRICATED есть две реализации механизма штатными средствами через подписку на фильтры или через крон в автоматизациях
        **rX  N)r   r`   r   r  r   s    r   &notify_project_owner_not_planned_tasksz1CmfProject.notify_project_owner_not_planned_tasks  s5    
 ((--dV-< 	>G;;=	>r   	task_tagsc                    |sy|D ci c]  }|j                   j                  | }}t        j                  j	                  | j                   d      }t        j                  j	                  | j                   d      }|r|syt        j                  j                  |j                         D ci c]  }|j                  j                  | }}t        j                  j                  ddgdd	| j                   gg d
g      D ]c  }|j                  j                  |v s|j                  |j                  j                        }|j                  j                         r|j	                  |j                  j                  j                        }	|	s]t        j                  | ||j                  j                        j                         }	|	||j                  j                  j                  <   |j                  |	j                   k7  s|	j                   |_        |j                          (|j                  |j                   k7  sC|j                   |_        |j                          f |j                         D ]a  \  }
}|j                  j                         rt        j!                  |  d| d|j                          |j	                  |j                  j                  j                        }	|	s_t        j                  | ||j                  j                        j                  d      }	|	||j                  j                  j                  <   t        j                  |	d|j                   d| |      }|j                          t        j!                  |  d|        t        j                  |d|j                   d| |      }|j                          d yc c}w c c}w )u   
        Вызывается если у задачи проекта изменяются тэги.
        Если появился тэг, для которого нет фильтра - создадим его.
        TODO
        Nr  )rp   r   tags)r   filter_tag_idr   rp   rq   )r   rq   tagr  )r   r   r   z: Create new filter for z with category Fr   #r  )r   r   r   r  
filter_tag)r   r   r   rL   r   r   r   r  r  r   tag_categoryr   r   r   itemsrY  r>  )r   r  r  task_tags_id_dicttasks_filtertags_folderr   category_folders	ae_filtercategory_foldertag_ids              r   hook_task_tags_changedz!CmfProject.hook_task_tags_changed  sw    :CD3SVV\\3.DD''++dgg	+R&&**TWWv*N !**//|/OQ KKv%Q Q  55::')9:$dDGG46OP ; R 	)I &&,,0AA'++I,C,C,I,IJ##((*&6&:&:3;K;K;P;P;V;V&WO**0*:*:#'\HXHXH]H] +; +__c_c_e (HW()9)9)>)>)D)DE //?3E3EE3B3E3E	0!( //;>>A3>>>	0!()	). -224 	!KFC$$&4& 8_SM]M]L^_`"2"6"6s7G7G7L7L7R7R"S&&,&6&6#CDTDTDYDY '7 '[[_[_gl[_[m $DS$S%5%5%:%:%@%@A"88 /#((nu"&3 9 8	   4& 8>?"88 +AchhZ.5`dqt 9 v	 %	!A E
Qs   O /O%c                      y r   r  )r   r  s     r   hook_new_tagzCmfProject.hook_new_tag7  s    r   c                      y)NTr  r   s    r   has_tree_nodes_hookzCmfProject.has_tree_nodes_hook;  s    r   c                      y r   r  )r   r   r   s      r   public_listzCmfProject.public_list>  s     r   c                     g d}||d<   t        j                  j                  |i |}|sy 	 |j                          |S # t        $ r Y y w xY w)N)%r   r   ry   cmf_owner_idr  activity_idrw   rv   zworkflow.namerV  cmf_created_atr   rO  r[  	is_publicsharelink_hashperm_policy_anonymousr  perm_policy_sharelinkperm_policyr  r  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_jsdescr_document_idr   )r   r`   r   _acl_check_readCmfPermissionError)r   r   r   fields_to_returnr   s        r   
public_getzCmfProject.public_getC  sd    &
P ,x##''88	##%  " 		s   ? 	A
Ac                 H    t        j                  j                  | g|i |S r   )r   r  rh   )r   r   r   s      r   rh   z$CmfProject.check_project_role_accessy  s$    **DDT[D[TZ[[r   c                    | j                   s| j                  sy | j                   ry | j                  rt               }| j                  d      D ]r  }|j                  | j                         vs |j                  j                  d      r<|j                  j                  d      rX|j                  |j                         t dD ]  }||v s|j                  |       t        j                  st        j                  r:| j                  d| g       t        | d|       rt        dd       | j!                  t        j"                          d	D ]  }||v s|j                  |       t        j                  st        j                  r:t        | |      }|j$                  r|j&                  st        d
d       | j!                  t        j"                          |r| j)                  d|        y y y )NT)r   cache__id)r  r   r  security_level_schemer   r  
protected_uv   Поле защищено от изменения, обратитесь к Администратору системыr   )protected_cmf_project_adminsprotected_scheme_wfprotected_notify_schemeprotected_security_level_schemeprotected_ui_form_schemeprotected_project_perm_schemeu   Для снятия защиты изменения поля, обратитесь к Администратору системыzPPP-PR-ADMINr  )r  r   r  r  r   project_perm_allow_fieldsr  endswithr  rE  rY  r  r  rY  r  r   r  rZ  r   r   rh   )r   changed_fields_to_checkrG  admin_require_fieldfs        r   r  zCmfProject.check_edit_perm|  s   t;; ??&)e#5 B((0N0N0PP % 0 0 ; ;H E % 0 0 9 9% @+//0@0@AB(? :# '*AA+223FG,,0@0@ $$
3F2G&H%IJtz2E1F%GH!  %[  dh  i))!..9:"(I :# '*AA+223FG,,0@0@ &9:AuuQUU!  %f  os  t))!..9: '..~4.H 'W r   c                      t         |          S r   )r   check_delete_permr   s    r   r  zCmfProject.check_delete_perm  s    w(**r   c                    |D ]  }t         j                         }| |_        |j                  d      |_        |j                  d       |j                  d      D ]  }| j                  |j                  d      |j                  d      |j                  d      |j                  d      ||j                  d      |j                  d	      |j                  d
               y )Nr   Fr   r  r  rv   r  r  r  r  )r   r  rv   r  groupr  r  r  )r   r3   r   r   r   r   r  )r   groupsr  request_groupr1  s        r   r  z&CmfProject._create_sdesk_request_group  s     	E"779M#'M !&6!2Me, %		' 2 
//%))&1%))&1+//=)--j9'!-!1!1.!A#/#3#34D#E'3'7'78L'M 0 	
	r   c	                     t         j                         }	| |	_        ||	_        ||	_        ||	_        ||	_        ||	_        ||	_        |||	_	        ||	j                  j                  |       |	j                          y r   )r   r4   r   r   r  rv   r  r  r  request_categoryr  r   r   )
r   r   r  rv   r  r  r  r  r  r1  s
             r   r  z%CmfProject._create_sdesk_request_type  s~     113"  ",$0!&4#*<',4L)&&--e4r   c                 R    | j                    d| j                   d| j                   S r;  )	ui_moduleui_namery   r   s    r   hrefzCmfProject.href  s&    ..!4<<.$))==r   c                     ddl m} t        |          }t	        |      dkD  r|d d  d|j                  |d       }|S )Nr   )cmf_hashlib      r  rm  )cmf.utilr  r   gen_coder  short_str_enc)r   r  res_coder   s      r   r  zCmfProject.gen_code  sH    (7#%x=""3B-+*C*CHa*P)QRHr   c                    |s| j                   dz   }t        j                  |      }d}| j                  d      D ]  }|j                  |v sZ|j                  j                  d      s?|j                  j                  d      s$t        |t        j                  j                        rlt        ||j                  |j                          |j                         D ]!  \  }}||j                  v st        |||       # |S )N    Копияr=  )%attachmentschat_groupscmf_archivedr  rS  r:  cmf_locked_atcmf_locked_bycmf_modified_atcmf_modified_bycmf_viewed_atry   commentsro   	documentsext_idfavorite_forhas_tree_nodesr   import_originalimport_raw_jsonlocal_linkslocal_links_docs_inlocal_links_tasks_inr   r  r  r  status_closed_atstatus_in_progress_endstatus_in_progress_startstatus_modified_atstatus_review_atrO  r  r   task_filtersT)
is_definedr  perm_)r   r   r`   r  r   r  r  r   rm  r   
CmfBackrefr  r   r  )r   r   r   new_projectskip_fieldsrG  attrr   s           r   clonezCmfProject.clone  s    99},D''T'2
 [[D[1 	@E  K/##,,U3##..w7eSZZ%:%:;K!1!15;;?	@ "<<> 	2KD%{)))T51	2 r   c                    |rt         j                  j                  |       dkD  s#t         j                  j                  |       dkD  rat	        dt        | j                        |||||t        j                  j                  j                  d|}t        | j                  |       | S  | j                  d|||||d|S )Nr  2   )proj_idr   ry   rO  structure_copy	full_copynotify_person_idrP  r   ry   rO  r*  r+  r  )r   r   countr   r   r  r   rY  rs  r   r  create_from_template_jobdo_create_from_template)r   r   ry   rO  r*  r+  r   rX  s           r   ri   zCmfProject.create_from_template	  s    !!''t'4r9V^^=Q=QY]=Q=^ac=c! J#dgg,%)GW/=efeueuexexe~e~J CIJ
 &d&C&CJW+t++ jDSc;IU^jbhj 	jr   u3   Создание проекта по шаблону)rY  r[  r\  c                    	 t         j                  | dg      }|j                  |||||      }	d|	j                   d}
d}t        j                  j                  |	||
|dd       y # t        $ rt}t                t         j                  |       }	d|	 }
| d	t        j                          }t        j                  d
t        j                          d       Y d }~d }~ww xY w)Nr   r  r-  u   Проект "u   " успешно созданu-   Создан проект по шаблонуr   uA   Ошибка создания проекта по шаблону rL  uB   Ошибка создания проекта по шаблону: T)r8  rp  )r   r  r   r  force_notify_current_personr,  )r`   r   r0  r   r   rollback_purge_event	traceback
format_excrY  r>  r   r  r  )r)  r   r,  ry   rO  r*  r+  _kwargsr   r#  notify_name
notify_msges                r   r/  z#CmfProject.create_from_template_job  s    	 nnn>G!99t$aq;IU^ : `K*;+;+;*<<YZKHJ 	%%#(, 	& 	
  	 "$..G.4K]^i]jkK3b!5!5!7 89JGGXYbYmYmYoXpqy}G~~	s   A A( (	C%1A*C  C%c                    d dfd	d }d fddfd	}d fd|rd	}t         j                  j                  | j                  d
g      }	g |	_        g |	_        |	j                  |xs |	j                  dz   |||       }
|
j                  dd|       |ri } |
|
t        |	j                        |       |rn ||
|	|        ||
       |	j                  rNt         j                  j                  |
|	j                  j                        |
_        |
j                  ddd	       |
j                  st         j                         }t         j                  j                  d      |_        |
|_        d|
j                   |_        d|_        d	|_        |j                  dd       ||
_        |
j                  dd       |
S )Nc                     | j                          | j                          | j                          | j                          | j	                          y r   )_calc_perm_parent_calc_perm_inherit_acl_id_calc_perm_has_acl_calc_perm_acl_calc_perm_effective_aclr  s    r   	_calc_aclz5CmfProject.do_create_from_template.<locals>._calc_acl0  s>    %%'--/&&(""$,,.r   c                    |i }|D ]4  }t        |t        j                  t        j                  t        j                  t        j
                  f      rM|j                  dg       |j                  |j                  d      }||_	        | |_
        | |_        |j                  |_         |       t        |dd      dk(  r0t        j                  |       }|j                  dd       ||_        |j                  ddd	       |||j                   j"                  <    | |t%        |j&                        |       7 y )
Nr   T)r   copy_attachmentsr   Fr  r  r   emit)noitfyrF  r   )r   r   r  r   rJ   r   rY  r   r   r   r   r   r   r  r   r  r   r   r   r   )	r#  
new_parentorig_childrentree_parent_mapping
orig_child	new_childr  rB  _copy_tree_nodess	          r   rM  z<CmfProject.do_create_from_template.<locals>._copy_tree_nodes7  s0   "*&(#+ k
j6+G+GY_YlYl+1+>+>+@ A&&~6&OOSWOX	(2	%#.	 $/	! $.#4#4	  )$9j%8IE%+%8%8%8%LN"''u5'A/=I,e%4H <E#JMM$7$78 ij>S>S9TVij3kr   c                    t         j                  j                  dd| gdg      D ]  }t         j                  j	                  |j
                  j                  dg      D ]h  }t         j                  j                  |j                        }|j                  |j                  j                  |j                  |j                        }j  y )	Nr   rq   cloned_fromr  r  )out_linkr   )rO  )rP  in_link)r   r   r{  r+   r   rO  r   r  rQ  r   r   r   )r   r  relin_tasknew_rels        r   _copy_relation_optionszBCmfProject.do_create_from_template.<locals>._copy_relation_optionsW  s    ,,Yg4NXeWf,g ]!3388$BRBRBUBU_c^d8e ]C$nn11ckk1JG!hhsxx~~QXQ[Q[h\G]]r   c                 ~   |j                   |j                  |j                  |j                  d}|j	                         D ]  \  }}|D ]x  }|j
                  |j                  k7  rt        | |      j                  |       t        | |      j                  ||j                   d|j                  j                             z  | j                  rK|| j                  j                  j                   d| j                  j                  j                      | _        g | _        g | _        | j!                  ddd       y)uT   Обрабатывает параметры задачи (lists, fix_versions, etc.))r  fix_versionsaffected_versionsrr  r  FTrF  r   r   N)r  rW  rX  rr  r  r   r   r  rE  r   r   r   r   	main_listr  r  r   )new_task	orig_tasknew_project_params_dictparams_lists
param_namelstr  s          r   _process_task_paramsz@CmfProject.do_create_from_template.<locals>._process_task_params]  sD    # ) 6 6%.%@%@'22	L $0#5#5#7 z
C zD{{i&7&77 Hj188>Hj1889PTXTcTcSddefjfofofufuevQw9xy	zz !!%<@R@R@X@X@c@c?ddefnfxfxf}f}  gD  gD  fE  >F  &G""$H!#HMMuUdMCr   c                 L   | j                   j                         }| j                   j                  |_        | j                   j                  |_        ||_        d|_        d|_        d|_        d|_        d|_	        d|_
        d|_        t        d      |_        t        d      |_        | j
                  s| j                           |        | |_        |j#                  dd       |j$                  | _        |j&                  | _        || _         | j#                  ddd       y)uP   Настраивает gantt_task для скопированной задачиNr   z0.00FrF  r   TrY  )op_gantt_taskr&  rV  r  r   parent_taskactual_workactual_durationactual_completeactual_myself_workactual_start_dateactual_finish_dater   actual_costactual_myself_cost_calc_gantt_taskr  r   r  r  )r[  r#  r\  rd  rB  s       r   _setup_gantt_taskz=CmfProject.do_create_from_template.<locals>._setup_gantt_taskq  s   $2288:M&.&<&<&F&FM#'/'='='H'HM$$/M!(,M%()M%,-M),-M)/0M,.2M+/3M,(/M%/6vM,''))+(#!)ME%8"+"6"6H!*!4!4H%2H"MMuUdMCr   c                 	   |i }t         j                  j                  | d      D ci c](  }|j                   d|j                  j
                   |* }}|j                  t         j                  j                  | d      D ci c](  }|j                   d|j                  j
                   |* c}       i }|j                  j                         }|j                  dg        ||       }d| j                   |_        d |_        d|_        |j                  dd       |j                          |j                  dd       || _        | j                  dd       |||j                  <   t         j                   j                  |g d	      }	i }
g }g }|	D ]f  }||k(  r	|j"                  d
v r|j%                  |       ) ||       } |||        || |       |j%                  |       |||j                  <   h |D ]f  } ||       } |||        || |       ||
|j                  <   |||j                  <   |||j&                  j
                  <   |||j                  <   h |D ]  }||j&                  j
                     }|j(                  rJ|j(                  j&                  j
                  |v r(||j(                  j&                  j
                     |_        |j                  ddd        |j+                         D ]]  }d}|j,                  r|j/                  |j,                  j                  d       }|r9t         j                   j/                  |j&                  j
                        |_        |j1                           |       |j,                  |j                  _        d}|j2                  rv|j/                  |j2                  j                  d       }|r4t         j                   j/                  |j&                  j
                        }||_        ||j                  _        d}|s.|j                  ddd       |j                  j                  d       `  | ||       y c c}w c c}w )NT)r   include_archivedr  ***rh  Frc  )rr  lists.parentattachments.urlzfix_versions.parentzaffected_versions.parentzcomponents.parentrs  rt  zop_gantt_task.projectzop_gantt_task.cmf_authorzop_gantt_task.cmf_ownerzop_gantt_task.*r   r   	task.epicztask.subproject)r  rH  rY  r2  )r   rF  r   r   )r   r   r   r   r   r   updaterI   r  r   rY  rd  r   r   rn  ry   r   rw   r   r   r   r  re  r   _calc_gantt_pathr  )r#  orig_projectrJ  r`  r]  comptasks_by_orig_idorig_main_gantt_projectnew_main_gantt_project
orig_tasksparent_tasksr  
epic_tasksr\  r[  r  
needs_savenew_parent_tasknew_gantt_projectrB  
_copy_task_copy_task_filtersra  ro  s                      r   _copy_tasksz7CmfProject.do_create_from_template.<locals>._copy_tasks  sq   "*&(# +1..*=*=[cg*=*h'jUX#..)9388>>:J'KS'P 'j# 'j#**/5/B/B/G/G{mq/G/r,t]at.?q@Q,RTX,X ,t u  " '3&E&E&J&J&L##//8%/0G%U",5k6F6F5G*H"'37"0,0")"''U5'A"335"''U5'A-CK*%6=S499:,,L Jx, yJ LEJ ( 
@	 77))-MM%%i0)y[QH(9>UV%hYGLL*7?$Y^^4
@ ( <	%9M$Xy:QR!(KC/7Y^^,3; 0:B#ILL$6$673; 0< ( H	.y||/A/AB((Y-B-B-E-E-K-KOb-b+>y?T?T?W?W?]?]+^H(5$GH )//1 <"
##&6&:&:4;K;K;P;PRV&WO&+1>>+=+=ASASAYAY+=+Z())+dO595E5ED&&2!%J%%(8(<(<T=O=O=T=TVZ([%(,2NN,>,>BSBVBVB\B\,>,])):D&7HD&&4!%JIIU$IG&&++d+;'<* {L:QRm'j,ts   -Q7-Q<c                    | j                         }| j                  |_        | j                  |_        ||_        ||_        |j
                  dv rF| j                  r:t        j                  j                  | j                  j                  |      |_        |j                         |_        | j                  r| j                  |       |S )Nrv  r   r   )r&  rV  r  r   r   rw   r   r   rL   r   r   r  ry   r  rD  )r  rH  r[  s      r   r  z6CmfProject.do_create_from_template.<locals>._copy_task  s     zz|H!%H"&//H(HO)H$$(HH##+1+;+;+?+?TEUEUEZEZcm+?+nH($--/HM%%h/Or   c                     dd| g}|j                  t        j                  j                  |      D ci c](  }|j                   d|j
                  j                   |* c}       dd| g}|j                  t        j                  j                  |      D ci c](  }|j                   d|j
                  j                   |* c}       ddd| gg dg}|j                  t        j                  j                  |      D ci c](  }|j                   d|j
                  j                   |* c}       t        j                  j                  |dg      }	|	D ]  }
|
j                         }| |_        | |_        |
j                  rQ|
j                  |k(  r| |_        n:t        j                  j                  |
j                  j
                  | 	      |_        | g|_         |       |j!                  d
d
        y c c}w c c}w c c}w )Nr   rq   r   r  AND)rw   rq   rw  rr  ru  r  FrE  )rx  r   rL   r   r   r   r   r   r   r   r&  r   r   r   r   ft_projectsr   )r#  rz  r]  _folder_filterr   _doc_filterdoc_epics_filterrt  orig_project_task_filtersorig_task_filternew_task_filterrB  s               r   r  z>CmfProject.do_create_from_template.<locals>._copy_task_filters  s    'k:N#**QWQaQaQfQfn|QfQ},GM6$$%Qv{{'8'8&9:FB,  $T;7K#**EKEWEWE\E\doE\Ep,>A3>>"!CHHNN#34c9,  #Xt[$A$GIM#**IOI\I\dqI\Ir,AE4??#1TYY__$56<, 
 )/(;(;(@(@#w )A )%
 %> ? "2"8"8":*5')4&#//'33|C6A36<6F6F6J6JP`PlPlPqPqR] 7K 7_3/:m+ /*$$E$>)?+,
,,s   -H-H-HTrr  r  r  )r   ry   rO  rO  F)rF  r   r  )r#  rH  rI  rJ  )r#  rz  rJ  r  r3  rY  rg  r   rh  ri  rc  r   )r   r`   r   r   chat_topicsr	  r&  r   r   r   r   ro   r   r  r   r  rv   r   r  r   )r   r   ry   rO  r*  r+  r   rU  r  rz  r#  rJ  r~  rB  r  r  rM  ra  ro  s                @@@@@@r   r0  z"CmfProject.do_create_from_template.  s   	/	k@	]	D(	D8[	S [	Sz	$-	?^ !N((,,,H#% #% "((:**]:-	 ) 
 	eEP"$*.|/F/F*G]pr ,dwx&{;,,/5~~/A/A[g[t[t[y[y/A/zK,$$%$N--%+^^%5"060C0C0G0GMi0G0j"-,7"),5k6F6F5G*H"'6A"3,0")"''U5'A-CK*%6r   obj_id)rY  rZ  c                     t         j                  j                  |       }|j                  dd      }t         j                  j                  | d      }|D ]  }|j                  dd        |S )Nr2  T)skip_tree_moverj   Fr9  r
  )r   r`   r   r~  r   r   r  r   rc  r  r  s        r   rj   zCmfProject.archive_projectU  sr     ##''6'2ooT4oH ##vE#J 	DDLLdLC	D 
r   c                     t         j                  j                  |       }|j                         }t         j                  j                  | d      }|D ]  }|j                           |S )Nr2  Tr  )r   r`   r   archive_restorer   r   r  s        r   rk   z"CmfProject.archive_restore_projectb  sh     ##''6'2%%' ##vD#I 	#D  "	# 
r   c                 r    t         j                  j                  | ddg      }|j                  dd       |S )NTrS  )r   r  r   F)r8  r.  )r   r`   r   r  r  r   s     r   rl   zCmfProject.delete_projectp  s8    ##''64Q^P_'`TU3r   u)   Востановление проекта)r[  r\  rY  rZ  c                     t         j                  j                  | d      }|j                  d|j                  j
                        S )NTr^  )r.  prefix_name)r   r`   r   r  r   r   r  s     r   rm   zCmfProject.restore_projectv  s<     ##''64'H7<<;M;MNNr   z@hourlyc                  r    t         j                  j                  d      }|D ]  }|j                           y )NT)rU  )r   r`   r   r_  )_argsr7  project_listr   s       r   $celery_hourly_sync_rdisk_folder_hookz/CmfProject.celery_hourly_sync_rdisk_folder_hook|  s8     ((--D-A# 	)G&&(	)r   c                     t         j                  j                  | | d      }|ry t         j                  | | ddd      }|j                  d       y )Nr  r"  u   ТребованияTr$  Fr   r%  )r   req_registrys     r   r  z CmfProject.scaffold_req_registry  s]    ))--TtRZ-[))' * 
 	'r   )NNN)NN)r   Nr   )u   Активные спринтыT)u   Доска Kanbanzboard.kanban:default)T)returnN)NNNNN)NNNFF)r  z
str | None)e__name__
__module____qualname__modulesr   r   r  r`   api_methodsr
   classmethodr   r   r   r   r   r   rb   rf   r   r   r   r   r   r  r   r'  r*  r9  r?  rD  staticmethodrM  rS  r_  rZ  rg   r  r  r  r  r  r  r|  r  rR  r  r  r  r  r  r  r  r  r  r  r   r   r  rd   r*  r,  rM  r  cmf_deferred_jobrV  ra  r`  rl  r{  r  r  r  r  r  r   r  r  r  r  r  rh   r  r  r  r  propertyr  r  r&  ri   r/  r0  rj   rk   r  rl   rm   r  r  __classcell__)r   s   @r   r`   r`   f   s   //((44??KK

+
+,

K$ X X0#
"	9\7 J J@ ^ ^" *.4`d 8 8t $7 $7L$8."#J(,L\
:x % %
]&8>
 /8$  P!d&*^*@		"dLe p p E Eb-H
&	5Z
  B,]\-0,*FP-<| " "@
 ,0% L\ '+UD  +D $~5  26 ; ;2 0 0d j jX  0 $~Q
 DHZ_   
"
0 I J  > >;! ;!|     3 3j\5In+( jnKO( > >< KO=B
j 2g  ~B  C
 C 
. NR@EeN	 hZ@	 A 	 hZ@
 A 
 s  
 "Mcgsw  JR  IS  TO T O 	J) K )(r   r`   )r   pathlibr   r   r   r   decimalr   rd  r	   &common.models.cmf_plugin_convert_mixinr
   cmf.include"modules.project.fields.cmf_projectr  common.models.cmf_active_entityr   r  r   r  rh  r   r   r  r`   r  r   r   <module>r     s[      2 2   H  ) ;  	Rjm@(''33>>@U m@(r   