
    ^gi                        d dl m Z  d dlmZ d dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlT d dlZd d	lmZ d d
lmZ d dlZdZ G d dej        j        j        j        e          ZdS )    )copy)Path)datetimetimezone	timedelta)Decimal)
monthrange)CmfPluginConvertMixin)*N)CmfActiveEntity)cmfutil)QCmfTaskCmfDocumentCmfListCmfKanbanBoardCmfAchievementCmfAnswerTemplateCmfAttachmentCmfBqlFilterCmfChecklistCmfChecklistItemCmfChecklistTemplateCmfChecklistTemplateItem	CmfCourseCmfCourseProgressCmfCourseDocumentResultCmfExamCmfExamResultCmfExamQuestionFolderCmfExamQuestionFolderResultCmfQuestionFolderCmfQuestionResultCmfQuestion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                       e Zd Zej        j        j        j        j        e	j        z   g dz   Ze
ds fd	            Z fdZ fdZd Zd Zd Ze
dtd	            Ze
du fd	            Ze
dddddd            Ze
dvd            Zd ZdwdZdxdZd Zd Zd Zd Zd ZdvdZdvdZed             Z d Z!d Z"dvd 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
dt fd+	            Z-d, Z. fd-Z/d. Z0d/ Z1ed0             Z2d1 Z3d2 Z4dyd3Z5d4 Z6d5 Z7 fd6Z8dzd8Z9 fd9Z:e
dtd:            Z;d; Z<d< Z=dd=d> fd?
Z>dd=dd@dAZ?e e@dBddCgdDdE          dd=d>dF                        ZAedG             ZBe fdH            ZCedI             ZDe e@ddCgdJK          dd=d>dL                        ZE fdMZFdN ZGdO ZHe e@dddPQ          dR                         ZIedS             ZJdTeKfdUZLe
dV             ZMdW ZNe
dX             ZOe
dY             ZPdZ ZQd[ ZR fd\ZSd] ZT	 	 d{d^ZUeVd_             ZW fd`ZXdvdaZY	 	 d|dbZZe e@ddcdd          de                         Z[	 	 d|dfZ\e e@ddggh          dvd}dj                        Z]e e@ddggh          dvd}dk                        Z^edge_fdl            Z`e e@dmdddggn          dvd}do                        Zae e@dddpQ          dq                         Zbdr Zc xZdS )~
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}nQ|dk    r|sg }|dd|gg dg}n<|dk    r6|sg }|r0|                     d          r|d         }|dk    r|g d	g}n|g d
g} t                      j        |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0 {D)<>c>c>cdFF $;;; {D)<>c>c>cdFF !L00  U!2!2>!B!B U,^<#888$&O&O&OPFF$&S&S&STF)uww)*= X]4=fX XPVX X 	X    c                 Z    | j         rd S t                                                       d S N)rv   r   _calc_logic_typeselfr   s    r   r   zCmfProject._calc_logic_type   s.    ? 	F  """""r   c                 Z    | j         rd S t                                                       d S r   )	scheme_wfr   _calc_scheme_wfr   s    r   r   zCmfProject._calc_scheme_wf   s.    > 	F!!!!!r   c                 X   | j         j        s| j         j        sd S | j         s2t          j                            dd| j        j        g          | _         | j         j        r| j         j        	                                 | j         j
        r | j         j
        	                                 d S d S )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	F* 	y*0*G*K*KTZ\`bfbqbvSw*K*x*xD'&* 	9'+66888&* 	9'+6688888	9 	9r   c                     | j         j        s| j         j        sd S | j         s't          j                            d          | _         d S d S )Nzui_form_scheme:defaultry   )ui_form_schemer   r   r   CmfUiFormSchemer   r   s    r   _calc_ui_form_schemezCmfProject._calc_ui_form_scheme   s^    #. 	&.	F" 	\"("8"<"<BZ"<"["[D	\ 	\r   c                    | j         j        sd S | j         j        r1d| j         j        _        | j         j                            d           | j         j        r|| j         j        j                                         | j         j        j        | k    rt          dd           d| j         j        _        | j         j                            d           d S d S )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     + 	F  	749D!1!&&&666  	7!(--/// $+t33  HL  M  M  M  M48D!1!&&&66666	7 	7r   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                            | d          }|s5t                               | dddd          }|                    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  sh    #''tj'II 	('' '7*UYgk ( m mHMMM'''r      Активные спринтыTc           	      V   d}t                               | d| d| j         dd| j         dd| j         d	          }|                    d
           ddd}|                    | j                  }t                               | ||||          }|                    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GDGGDIGG +ty+++3333 !4 !
 !
 	""%"000 3$:
 
 ZZ)**%443  5  
  
 	!!!///##r      Доска Kanbanboard.kanban:defaultc           	          t                               | d| j         d| j         dd| j         dd| j         d          }|                    d	
           t                               | |||d          }|                    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    "//LDILLLL +ty+++3333 0 
 
 	e,,, &&!/ ' 
 
 	T%@@@r   c                     t                               |           }|                    d           t                               | dd|| d          }|                    d           d S )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  sw    ,,D,995)))"") # 
 
 	D!!!!!r   c           	      >   t           j                            d          }t                               | dd| j         dd|d          }|                    d	           t           j                            d
          }t                               d|j         |d          }|                    d	           t           j        	                    dd|gddg dgg          }|D ]}|
                    d	           ||_        |                    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  sZ   &**0D*EE~~,HTYHH! & 
 
 	''' %))/B)CCQl>OQQ   
 

 	u",11b)XMMMNP 2 
 
 ( 	( 	(FMMM'''' .0*'''r   c                     t           j                            | | d          }|rd S t                               | | ddd          }|                    d           d S )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  su    )--TtR_-`` 	F))4 * 
 
 	'''''r   c                     t           j                            | | d          }|rd S t                               | | ddd          }|                    d           d S )NrW   r%  u%   Реестр контрагентовTr'  Fr   r(  )r   company_registrys     r   scaffold_company_registryz$CmfProject.scaffold_company_registry  sw    !-114Vb1cc 	F!--8 . 
 
 	U+++++r   c                    t                               | ddd          }|                    d           t                               || dddd	
                              d           t                               || dddd
                              d           t                               || dddd
                              d           t                               || dddd
          }|                    d           t                               d|dd	                              d           t                               d|dd                              d           t                               d|dd                              d           t                               d|dd                              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_typer3  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     	9D4zzr   c                    |s t                               | | dddd          }t                               || dddd                                           t                               || d	d
dd                                           t                               || dddd                                           t                               |d| ddd                                           t                               |d| ddd                                           t                               |d| ddd                                           |S )NEvaTesttestsT)r   r   r   r   r   r   u   Тест-кейсыCmfTestcaser1  r2  u   Тест-планыrU   i u   Тест-прогоныrT   ip u   Конфигурацииr;   iX )r   r   r   r&  r   r3  u   Параметрыr=   i@ u   Окруженияr<   i( )r   rL   rO   r   )r   r   s     r   scaffold_testszCmfProject.scaffold_tests0  s    	 **    +  K 	#& 	 	
 	
 $&&&#& 	 	
 	
 $&&&#* 	 	
 	
 $&&&#+' 	 	
 	
 $&&&#% 	 	
 	
 $&&&#%% 	 	
 	
 $&&&r   c                 |    t           j        j        j                                        }|                    |           S r   )r   CmfRFiledpdata_driverget_rd	get_rfile)pathrdisks     r   
_get_rfilezCmfProject._get_rfilel  s/     ".5577t$$$r   c                     |                      |                                                               ddd           dS )u   Создадим папку проекта, если её нет. Может так же нужно проверять "Документы"? T)is_direxist_okparentsN)rP  rB  creater   s    r   ensure_project_dirzCmfProject.ensure_project_dirr  s<    ((**++22$W[2\\\\\r   c                    |                      ddg           | j        sD|                                 r.|                     |                                           }d|_        d S |                                 s|                                  | j        rd| j        j         }nd}|dz  }| 	                    dg          D ]}|d	|j         d
z  }|dz  }|                     |                                           }||_        d S )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_fieldsrX  is_project_dir_existrP  rB  perm_strrV  rY  rZ  all_relation_persons)r   	dir_rfiler^  users       r   _sync_rdisk_folderzCmfProject._sync_rdisk_folderv  s2   /;7888! 
	 ((**  OOD,<,<,>,>??	 " F((** 	&##%%%> 	&7!577HH%HJ--gY-?? 	= 	=D<tz<<<<HH--OOD$4$4$6$677	%	r   c                 n    |s| j         }|                     |                     |                    j        S r   )r   rP  rB  existsrA  s     r   r]  zCmfProject.is_project_dir_exist  s4     	9Dt//5566==r   )r   r   c                "    t          d          r   )r   r   r   rg   r  rV  )r   r   r   r   r   resr   r   s          r   rg   zCmfProject.get_full_tree  r   r   c                 $:   | j                                          | j         r|                                  t          j                            d          }t          j                            d          }t          j                            d          }t          j                            d          }t          j                            d          }t          j                            d          }t                              d           d	d
lm	}   |dg                       }| 
                                 | j        st                                          }	t          j                            d          |	_        | |	_        d| j         |	_        d|	_        |	                    d           |	| _        |                     d           | j        j        t(          j        v rt(          j        | j        j        = t          j                            d          j        }
t                              | ddd          |_        |ddd}t                              | | ddd          |_        t                              |j        dd| j         d|
 d          |_        t                              |j        d d| j         d!          |_        t                              |j        d"d| j         d#|
 d          |_        t                              |j        d$d| j         d%|
 d          |_         t                              |j        d&d| j         d'          |_!        t                              |j        d(d| j         d)          |_"        t          j        d|j        d*d+d,d-d.||_#        | j$        %                    |j#                   t          j        d|j        d/d0d1d2d.||_&        | j$        %                    |j&                   t          j        d|j        d3d4d5d6d.||_'        | j$        %                    |j'                   t          j        d|j        d7d8d9d:d.||_(        | j$        %                    |j(                   t          j        d|j        d;d<d=d>d.||_)        | j$        %                    |j)                   t          j        d|j        d?d@dAdBd.||_*        | j$        %                    |j*                   t                              | | dCdDd          |_+        t                              | dEdFd          |_,        t          -                    | dGdHI          |_.        t                              | dJdKd          |_/        t                              | dLdMd          |_0        t                              | dNdOd          |_1        t                              | dPdQd          |_2        t                              | dRdSd          |_3        t          j                            dT| j        U          |_4        t                              | | dVdWd          |_5        t          6                    | dXdY| j         dZ|d[          |_7        t                              | d\d]d          |_8        t                              | d^d_d          |_9        t          :                    | | gd`| j         da          |_;        | <                                |_=        | j>        dbk    s| ?                                |_@        | j>        dck    r| A                                |_B        nf| j>        ddk    r| C                                |_B        nA| j>        dek    r| C                    dfdgh          |_B        n| D                                |_B        t          -                    | di| j         | jE        | jF        j          |_G        |jG        | _H        | jI        rNt                              |j        dkd| j         dl          |_J        | j>        dmv}|r&t          6                    |j5        dno          |_K        t          L                    |j,        dpo          |_M        t          -                    |j.        dqo          |_N        |rxt                              | |j/        dr|s          |_O        t          6                    |j0        dtdu|v          |_P        t          6                    |j1        dwdx|v          |_Q        t          R                    |j3        dydz          |_S        d{|jB        _T        d||j3        _T        d}|j4        _T        d~|j        _T        d|j        _T        d|j,        _T        d|j.        _T        d|j/        _T        d|j1        _T        d|j0        _T        d|j5        _T        d|j2        _T        d|j7        _T        d|j8        _T        d|j9        _T        d|j=        _T        d|j;        _T        d|j+        _T        | j>        dk    r| U                                |_V        d|jB        _W        d|j3        _W        d|j4        _W        d|j        _W        d|j,        _W        d|j/        _W        d|j1        _W        d|j0        _W        d|j2        _W        d|j8        _W        d|j9        _W        d|j=        _W        d|j;        _W        d|j7        _W        d|j        _W        d|j@        _W        | jX        dk    rdnd|jV        _W        |jY        Z                                D ]}|                    d           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        | jX        dk    rdnd| _p        |                     dd           | j>        dk    rd|j8        _W        d|j9        _W        d|j;        _W        d|j=        _W        d|j7        _W        |jY        Z                                D ]}|                    d           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d           t          jq        jr        js        }|D ]}}|dk    r	t          q                    ||         |j2        |          |_t        d|jY        v r|jJ        |jt        _u        |dk    rd|jt        _        |jt                            d           ~| j>        dbk    r<d|j+        _W        d|j3        _W        d|j4        _W        d|j        _W        d|j/        _W        d|j1        _W        d|j0        _W        d|j5        _W        d|j7        _W        d|j8        _W        d|j9        _W        d|j;        _W        d|j=        _W        d|j        _W        d|j.        _W        d|jB        _W        |jY        Z                                D ]}|                    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d           | ?                    |            t          jq        jr        js        }|D ]y}|v                    d          rbt          q                    ||         |j2        |          }d| }t          |||           t          ||                              d           z| j>        ddk    rd|j/        _W        d|j1        _W        d|j8        _W        d|j9        _W        d|j;        _W        d|j4        _W        d|j=        _W        d|j7        _W        d|j@        _W        |jY        Z                                D ]}|                    d           t          jy                            d          | _z        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d           t          jq        jr        js        }|D ]}}|dk    r	t          q                    ||         |j2        |          |_t        d|jY        v r|jJ        |jt        _u        |dk    rd|jt        _        |jt                            d           ~| j>        dk    rd|jB        _W        d|j3        _W        d|j1        _W        d|j8        _W        d|j9        _W        d|j;        _W        d|j4        _W        d|j=        _W        d|j7        _W        d|j@        _W        |jY        Z                                D ]}|                    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d           t          jq        jr        js        }|D ]k}|dk    r	t          q                    ||         |j2        |          |_t        d|jY        v r|jJ        |jt        _u        |jt                            d           l| j>        dck    rd|j+        _W        d|j3        _W        d|j4        _W        d|j        _W        d|j,        _W        d|j/        _W        d|j1        _W        d|j0        _W        d|j5        _W        d|j2        _W        d|j7        _W        d|j8        _W        d|j9        _W        d|j;        _W        d|j=        _W        d|j        _W        d|j@        _W        |jY        Z                                D ]}|                    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d           | j>        dek    r)t          j{                            d          | _|        t          j}                            d          | _~        |                     dd          }|                     dd          }|                     dd          }dddt          j                            d          d|||dddt          j                            d          d|||dddt          j                            d          d|||dddt          j                            d          d|||dgddddt          j                            d          d|||dddt          j                            d          d|||dgdg}|                     |           |                     ddt          j                            d          |||d           t                              | ddd          |_        t                              | d| j         dd| j         d          |_        t                              |j        | |j        d          |_        t                              | d| j         dd| j         d          |_        t                              |j        | |j        d*          |_        t                              | d| j         dd| j         d          |_        t                              |j        | |j        dì          |_        t                              | ddddǦ          |_        t                              |j        ddɬI          |_        t                              |j        dʬo          |_        t                              | ddd          |_        t                              | ddd          |_        | U                                |_V        d{|j        _T        d||jB        _T        d}|j        _T        d~|j        _T        d|j        _T        d|j        _T        d|j2        _T        d|j=        _T        d|j9        _T        d|j8        _T        d|j;        _T        d|j,        _T        d|j3        _W        d|jB        _W        d|j4        _W        d|j.        _W        d|j/        _W        d|j1        _W        d|j0        _W        d|j5        _W        d|j7        _W        d|j=        _W        d|j8        _W        d|j;        _W        d|j9        _W        d|j,        _W        d|j+        _W        d|j        _W        d|j@        _W        d|jV        _W        |jY        Z                                D ]}|                    d           d| _m        d| _        d| _[        d| _]        d| _i        d| _        d| _        d| _        d| _l        d| _^        d| __        d| _a        d| _b        d| _n        d| _        d| _        d| _        d| _        d| _c        d| _f        d| _k        d| _`        d| _\        d| _p        d| _o        |                     dd           t          jq        jr        js        }|D ]y}|v                    dϦ          rbt          q                    ||         |j2        |          |_t        d|jY        v r|jJ        |jt        _u        |jt                            d           z|                                  |                                  |                                  |                                  dHS dHS )uU    Добавляем структуру папок в новый проект
        zlist.pfeed:defaultr   ztask.epic:defaultzlist.agile_sprint:defaultzlist.release:defaultzlist.base:defaultzbqlfilter.quick:defaultuc   Вызываем разворачивание чтобы появилась папка задачиr   )make_dataclass	DataEmptytask.gantt_project:default	   Гант TFr   r   rt   u   Фильтрыr   r0  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   r3  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sprintr5  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   rY  
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   r1  i i i i" iI i q i i  i0 r4  iP4 i`[ ip i i i i r  sectionr   r   r   mark)r   r   r7  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 )rX  r   rb  r   r  r   logginginfodataclassesrh  r  main_gantt_projectr   rv   r   r   r   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blogrt  r   docsepicsreleasessprintsr{  roadmapsr  listsr   r~  r  r  rJ   chatr   r   rw   rG  rE  r#  kanban_boardr  r   rY  r  homepagedescr_documentsl_create_examplesfilters__filter1lists__list1rI   components__component1
docs__doc1epics__epic1releases__release1sprints__sprint1rQ   roadmaps__roadmap1r3  r<  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   r7  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_filterrh  tgantt_projectclosed_status_namedefault_quick_kwargscreate_list_examplesvr7  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E%))/B)CC'++1L+MM	(,,2H,II
%))/B)CC+//5N/OO 	z{{{......+NN;++-- 	 & 	6"NN,,M'-':'>'>D`'>'a'aM$#'M !8TY!8!8M#'M e,,,&3D#III%%%w} 222&tw}5#15585DDI $$<LW`im$nn	 (# 
  
 $$d^gpt$uu!..7~ty~~i{~~~ / 
 

 "..,LtyLLL / 
 

 "..0[ty[[FX[[[ / 
 

 "..6ZtyZZEWZZZ / 
 

 "..4GtyGGG / 
 

 "..2ItyIII / 
 
 ". 
0/>
 
 #
 
 	 ''(8999"/ 
8-7
 
 #
 
 	 ''(9:::"/ 
8)/
 
 #
 
 	 ''(9:::"/ 
00:
 
 #
 
 	 ''(9:::"/ 
8%/
 
 #
 
 	 ''(9:::"/ 
6'1
 
 #
 
 	 ''(9:::##T
Yktx#yy''D?U`luy'zz##;OZ^#__""t'F[_"``%%$ZR[dh%ii
$$IPXae$ff	$$NU^gk$ll	%%$ZR[dh%ii
$(()DG(TT	$$d^gpt$uu..9di99 ! 
 
 !!df]a!bb$$LS\ei$jj	$$$NcX\XaNcNclp$qq++--
 $555))++AG 666!7799ANN"222!7799ANN"777!77L]v7wwANN!99;;AN ''(TY((n	 ( 
 

  j" 	y "(!4!4I$R49RRR "5 " "A
 $(#4<v#v # [!'AG/!Z!Z'-':':q|Zo':'p'pA$!--!&GZ-[[AL# E!'tW^kr!s!s'-~~!*S`lr  @J~  (K  (K$%+^^	PYem  {D^  &E  &E"#)#4#4Rjsw#4#x#xA  "(#
"	"	 % "	#
 "	 "	#
..1133AK *.AN&%)AJ"$(AI!$(AI!'+AL$"&AG$(AI!%)AJ"$(AI!!%AF$(AI!%)AJ"!%AF"&AG"&AG"&AG/3/@I/M/MeeSWAK#Z&&(( % %e$$$$ $DO"'D!&D"DN %D!DN#DO"DN %D"DN$D %D#DO %D!DN %D#(D "DO',D$!&D DM+/+<	+I+I%%tDIIUI333//!%AF$(AI!!%AF%)AJ""&AGZ&&(( % %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33 .:BK# 
6 
66>>%+%9%9$T*	t &: & &" %
22;<;MA&8>))04A&-"''u'5555 111!%AF%)AJ"$(AI!$(AI!"&AG$(AI!%)AJ""&AG"&AG!%AF$(AI!!%AF%)AJ""&AG!%AF)-AN&Z&&(( % %e$$$$"'D#DO!&D"DN %D#DO"DN %D"DN$D $D#DO %D"DN %D#'D #DO',D$!&D!DMIIUI333%%%!/;CL$ = =??7++ =#11)$/QYTX 2  F !24 1 1IAy&111Ay))..e.<<< 000"&AG$(AI!!%AF$(AI!!%AF$(AI!%)AJ""&AG"&AGZ&&(( % %e$$$$#/339I3JJDN $DO!&D"DN %D!DN#DO"DN $D"DN$D $D#DO $D!DN $D#'D "DO'+D$!&D!DMIIUI333 .:BK# 	6 	66>>%+%9%9$T*	t &: &U &U"$
22;<;MA&8>))04A&-"''u'5555..)-AN&%)AJ"$(AI!!%AF$(AI!!%AF$(AI!%)AJ""&AG"&AGZ&&(( % %e$$$$#DO!%D"DN %D!DN#DO"DN $D!DN$D $D#DO $D!DN %D#'D "DO',D$!&D DMIIUI333 .:BK# 6 66>>%+%9%9$T*	t &: & &" %
22;<;MA&8"''u'5555 666!%AF%)AJ"$(AI!$(AI!'+AL$"&AG$(AI!%)AJ""&AG$(AI!"&AG!%AF$(AI!!%AF%)AJ""&AG"&AGZ&&(( % %e$$$$"'D#DO!&D"DN %D#DO"DN %D"DN$D %D#DO %D!DN %D#(D #DO'+D$!&D!DMIIUI333 555!'!>!B!BH\!B!]!]D"("8"<"<B]"<"^"^D 556OQcddM"778SUghhO"&";";<[  ^H  #I  #I
 ) %I %A*0*=*A*AGh*A*i*i(:,9.=2E  %`$v*0*=*A*AGh*A*i*i(:,9.=2E  %^&T*0*=*A*AGa*A*b*b(3,9.=2E	 	 %f&F*0*=*A*AGa*A*b*b(3,9.=2E	 	;'* *X J %`$v*0*=*A*AGh*A*i*i(:,9.=2E  %c$*0*=*A*AGh*A*i*i(:,9.=2E  YCNH ,,^<<<++J M!.228Y2ZZ*.#6+ ,    &&4>NY`im&nnAG*0*=*=_DG___O49OOO +> +Q +QA' %11GDQ=X_z 2 | |AO*0*=*=iDG i i iq49qqq	 +> +s +sA'
 %11GDQ=X_~ 2 @ @AO*0*=*=^DG^^^N49NNN +> +P +PA' %11GDQ=X  `E 2 F FAO$.. '>lv /  AO +1*:*:O2FQk +; +m +mA'(.(8(8O. )9 )B )BA%))dZpy})~~AJ((T@P[py}(~~AI1133AK$AGO%+AN"&,AO#!'AJ &AI &AI &AI!'AJ &AI#AFN#AFN#)AL %)AJ").AN&$(AI!!%AF"&AG$(AI!%)AJ""&AG"&AG%)AJ"!%AF!%AF$(AI!'+AL$!&AF"&AG"&AG&+AK#Z&&(( % %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33 .:BK# : :??:.. :)/)=)=(.AISW *> * *A& )AJ66?@?Q*<&++5+999**,,,""$$$$$&&&     K 65r   c                    d}t           j                            | |dg          }|st                               | d| j         dd| j         d          }|                    d	
           t                               | t           j                            | dd          |d|          }|                    d	
           d S d S )Nu6   Оценка качества обслуживанияr  r   r   r   ["parent_id", "=", "r   r   r   r  Fr   r{  Tr   r   r   r  r   r   r   r7  r  )r   rS   r   r   r   ry   r   rL   )r   report_namer  r  s       r   r  zCmfProject.scaffold_markx  s    N%))KQdPe)ff 	& & 3 3:tw:::3ty333 !4 ! !
 ""%"000))",00TI^b0c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 ]}|                     d:          }t          j                             | |d;g<          }|sQt                              | d=| j         d>d?| j         d@A          }|                    dBC           t                              | t          j                             | dDdEF          |dG|H          }|                    dBC           |                     dI          }|D ]}t                                          }t                                          }	||	_	        |                     d:          |	_
        |                     dJ          |	_        |                     dK          |	_        |                     dL          }
|
r&t          j                             | |
M          |	_        g }g }|                    dN| j                    |                    dO| j         d>           |                     dPg           }|D ]}|dk    rdQ                    dR ||         D                       }|                    | dS| dT           t          j                            dUdV||         gW          }g }|D ]!}|                    |j        j                   "dX}dQ                    dY |D                       }|                    dZ| d[| d\           |d]k    rqt          j                             | ||         M          }|rF|                    | d^|j         d@           |                    dZ| d_|j        j         d>           M|d`k    rat          j        j        j        }|                    | d^|||                   d@           |                    dZ| d_||          d>           |                    | d^||          d@           |                    dZ| d_||          d>           da                    |          }dbdc                    |          z   ddz   }||_        ||_        |                    dBC           ||	_        |	                    dBC           |                    dBC           d S )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   КритичныйrU  rq  )rv   priority)r   r#  r$  r*  u   Высокийrr  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   r{  Tr  
line_chartr  r&  r$  r#  r)  r   r   z
project = z["parent", "=", "r*  z, c              3   "   K   | ]
}d | d V  dS r   Nr  .0r  s     r   	<genexpr>z1CmfProject.scaffold_line_chart.<locals>.<genexpr>  s*      ,Q,Q!XXXX,Q,Q,Q,Q,Q,Qr   z in ()ry   INr    c              3   "   K   | ]
}d | d V  dS r6  r  r7  s     r   r9  z1CmfProject.scaffold_line_chart.<locals>.<genexpr>  s*      ,H,H!XXXX,H,H,H,H,H,Hr   z["z
", "IN", [z]]r2  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   r3  chartr   r  r  r&  rowrow_task_filter	chart_rowr)  ubql_filterr  r*  fieldvalslogic_typesbql_valsr   r2  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 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 1sK

Z   O	* O	*E))F++K)--TUhTi-jjF L*$*$7$7#>47>>>749777 %8 % %!
 "&&e&444-- & 0 4 4PYbf 4 g g$ ,&7 .   5)))yy(( 71 71C&,&9&9&;&;O & 9 9 ; ;I'-I$%(WWV__IN&)ggg&6&6IO+.77<+@+@I(''%..C V(.(:(>(>dQT(>(U(U	 #%K!#J&&'?DI'?'?@@@%%&E$'&E&E&EFFF!$r!:!:J!+ Z Z L00#'99,Q,Qz%?P,Q,Q,Q#Q#QD'..%/E/Ed/E/E/EFFF*0*=*B*B(.j6G'H +C + +K (*H&1 = = ( < < < <#%D#'99,H,Hx,H,H,H#H#HD&--.L5.L.LD.L.L.LMMMM"n44+1+E+I+IQU\fgl\m+I+n+nL+ b + 2 2e3U3UAR3U3U3U V V V * 1 12`u2`2`|G\2`2`2` a a a"j00'-~'>'FH'..%/[/[XjQVFW=X/[/[/[\\\&--.X5.X.X:eCT.X.X.XYYYY'..%/Q/QZ=N/Q/Q/QRRR&--.X5.X.X:eCT.X.X.XYYYY"),,{";";K!$tyy'<'<!<s!BJ+6O(*4O'#(((666/>I,NN%N00005)))_O	* O	*r   c                 >   t           j                            |          }|st          d| d           t                                           }| j         d| j         d| |_        d|_        |                    dd           |                    |	           |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1 	`RDRRZ^____##%%0NNDINNNN"+U333h'''r   c                    t           j                            d          }t           j                            d          }t                                           }| |_        ||_        |j                            t          j	                   |
                                 t                                           }| |_        ||_        |
                                 d S )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M+//5J/KK ((**	%

!.)))
			 ((**	&
					r   c                    t           j                            d          }t                               | dd          }|                                 t                               |ddd|	          }|                                 t                               |d
dd|	          }|                                 t                               |ddd|	          }|                                 t                               |dd d|	          }|                                 t                               |dd          }|                                 t                               |dd          }|                                 t                               |dd          }	|	                                 t                               | dd          }|                                 t                               |ddd|	          }|                                 t                               |d
dd|	          }|                                 t                               |dd d|	          }|                                 t                               |dd          }|                                 t                               |dd          }|                                 t                               |dd          }	|	                                 t                               |ddt           j                            d                    }
|
                                 t                               | dd          }|                                 t                               |ddd |	          }|                                 t                               |d
d d|	          }|                                 t                               |dd          }|                                 t                               |dd          }|                                 t                               |ddt           j                            d!                    }	|	                                 t                               | d"d          }|                                 t                               |ddd#|	          }|                                 t                               |d
d d|	          }|                                 t                               |ddt           j                            d$                    }|                                 t                               |ddt           j                            d!                    }|                                 t                               |ddt           j                            d%                    }	|	                                 t                               |ddt           j                            d&                    }
|
                                 t                               |ddt           j                            d'                    }|                                 d S )(Nzfulltime:defaultr   r(  date)r   r   widget_type     z+request_type.request_category = 'incidents')r   r3  	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-setr0  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  s6    "-117I1JJ  3N\b cc


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

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

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

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

,,Cgap,qq,,Cgau,vv,,Cf`p,qq   3`nt uu


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

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

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

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


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

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

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


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

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

,,CgavGMG[G_G_epG_GqGq - s s,,Cf`u?E?S?W?W]e?W?f?f - h h,,Cf`u?E?S?W?W]j?W?k?k - m m,,Cf`u?E?S?W?W]n?W?o?o - q q,,Cf`u?E?S?W?W]j?W?k?k - m mr   c                     t           j                            dd| j        gdd| j        gg          rt          d| j         dd	           |                                 rt          d
| j         dd	           d S d S )Nr   r  r   rs   r   u   Проект с именем uA    уже существует. Укажите другое имя.Tr   u-   Раздел на диске с именем uF    уже занят. Укажите другое имя проекта.)r   r`   slistr   r   r   r]  r   s    r   _check_project_dir_conflictz&CmfProject._check_project_dir_conflict/  s    ""FC+CdDRVRYEZ*["\\ 	P  Cdi  C  C  C  KO  P  P  P  P$$&& 	e  Xdi  X  X  X  `d  e  e  e  e  e  e	e 	er   c                     ddd|gg}|r|                     dd|g           |                     |          rt          | j         dd           d S d S )	NORr   rq   ry   r   u7    с таким именем уже существуетTr   )r   r   r   verbose_name)r   r   ry   
prj_filters       r   _check_uniquezCmfProject._check_unique5  s    VT401
 	4vtT233377*7%% 	p)bbbjnoooooo	p 	pr   c                 h    |                      ||            t                      j        |||d|S )N)r   ry   )r  r   rU  )r   r   ry   r   r   r   s        r   rU  zCmfProject.create>  s;    $%%%uww~t$TDDVDDDr   c                 j	   g d}ddg}|D ]-}d| }| j         |         j        r|D ]}t          t                    |                             dd| j        gdd|gg          }|s@|d	k    r:t          t                    |                             dd| j        gg d
g          }|r.| j         |         j         |_        |                    d           t          j	                            dd| j        gddd| gg          }|r.| j         |         j         |_        |                    d           /| j
        j        rVt          j                            dd| j        gg dg          }|r(| j
        j         |_        |                    d           | j        j        rVt          j                            dd| j        gg dg          }|r(| j        j         |_        |                    d           | j        j        rRt          j                            dd| j        g          }|r(| j        j         |_        |                    d           | j        j        r}| j        dk    r(t          j	                            dd| gg dg          }n t          j                            |           }|r(| j        j         |_        |                    d           | j        j        rJt          j                            |           }|r(| j        j         |_        |                    d           | j        j        rQt          j                            g ddd| gg          }|r(| j        j         |_        |                    d           | j        j        rQt          j                            g ddd| gg          }|r(| j        j         |_        |                    d           | j        j        rQt          j                            g ddd| gg          }|r(| j        j         |_        |                    d           | j        j        rSt          j                            g ddd| gg          }|r,| j        j         |_        |                    d           d S d S d S )N)approvedr  r~  r  r  r  rv  rz  rx  r}  r   r  r{  r   r  rt  r  r  rE  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  rs  )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_nodesC  sm   
 
 
	, #$;<! 	1 	1H***I}Y'2 1!, 
5 
5I"6ll9599!,dDG <z4QY>Z[ : ] ]G" bx7':': #'v,,y"9"="=%0$$@B_B_B_#` #> #b #b 526-	2J2P.P+t444 .,,($8>4QcYaQcQc:de - g g 1.2mI.F.L*LG'LL4L000!, 	-(,,6FTW5UWsWsWs4t,uuG -*.*@*F&F#t,,,%0 	-(,,6FTW5UWrWrWr4s,ttG -*.*D*J&J#t,,,>$ 	-)--6FTW5U-VVG -*..*>&>#t,,,#. 	- $::: .,,&T2FFF -   !/333EE -*.*B*H&H#t,,,>$ 	-(,,,>>G -*..*>&>#t,,,) 	-(,,5M5M5MP]_bdhOi4j,kkG -*.*=*C&C#t,,,?% 	-(,,5M5M5MP]_bdhOi4j,kkG -*./*?&?#t,,,>$ 	-(,,5V5V5VYfhkmqXr4s,ttG -*..*>&>#t,,,=# 	-(,,5L5L5L}^acgNh4i,jjG -*.-*=&=#t,,,,,		- 	-- -r   c                 N    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/    ww**,, 0
 0
 0
 
 	
r   c                     | j         j        s| j        j        rt          d           | j        dk    rd| _        | j        dk    r	d| _        d S | j        dk    r	d| _        d S d S )Nu<   Нельзя менять родителя у проектаr  zCmfWiki:Classr   zCmfProject:Class)r   r   r   r   r   rp   r   r   s    r   _calc_parentzCmfProject._calc_parent  s    ;! 	VT%5%@ 	VTUUU	)),DN	))"1D)++"4D ,+r   c                     | j         j        sd S t          j                            | j         j        | j        j                  | _         d S r   )r  r   r   r   confluence_convertr   r   r   s    r   
_calc_textzCmfProject._calc_text  s:    y# 	F&99$)/47=YY			r   c                    dd l | sdS t          j        |           }  j        dd|                                           }|                    d          }dt          |          dk    r d                    d |D                       n|d         d d         t          j	        
                    dd	gd	d
                                 dg          }t          d |D                       }t          |          }                                |v rHt          fd|D             d          }|r#t          t          |          dz             z  ndz                                  S )Nr   r<  z\W+-rr  c                     g | ]
}|d          S )r   r  )r8  chunks     r   
<listcomp>z3CmfProject.get_prefix_from_name.<locals>.<listcomp>  s    ;;;5eAh;;;r   ro  z--rO  ILIKE%r   r~   c                 @    g | ]}|j                                         S r  )rO  lower)r8  r   s     r   r  z3CmfProject.get_prefix_from_name.<locals>.<listcomp>  s'    QQQW06688QQQr   c           
          g | ]s}|                                                               ) j        d d|                                                                                    d                    tS )z\Dr<  )r  r  subreplace)r8  pprefixres     r   r  z3CmfProject.get_prefix_from_name.<locals>.<listcomp>  s      "W  "W  "W_`yz  zF  zF  GM  GS  GS  GU  GU  zV  zV  "W&"&AGGII4E4EfllnnVX4Y4Y"Z"Z  "W  "W  "Wr   )default1)r  r   translit_stripr  r  r   lenr@  r   r`   r{  setr   maxstrintupper)	r   slugchunksprojectsprefixesexisting_prefixesmax_prefix_numr  r  s	          @@r   get_prefix_from_namezCmfProject.get_prefix_from_name  s   			 	2%d++rvfc4::<<00Cv;;??WW;;F;;;<<FFAYrr]F$**,-&FLLNN1E1E1EF + 
 
 QQQQQRR NN<<>>...   "W  "W  "W  "W  "Wdu  "W  "W  "W  ab  c  c  cN #c.11A5666#||~~r   c                    | j         j        s| j        j        sd S | j         j        r | j         j                                        | _         | j         dk    s&| j         dk    s| j         dk    s| j         | j        k    rt          d| j          d           t          j        	                    dd| j
        gd	d
| j         ggdgd          }|r"t          d| j          d|j         dd           t          j        	                    dd| j          dgdd| ggdgd          }|r%t          d| j          d|j        j         d           | j        rd S t          d           t          t          j        j        | j
        j        g           d S )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  sK   !,	3>	 F  +  	u$($9$?$E$E$G$GD!$--,33,;;,0@@@|eiez||  EI  J  J  J  J"("3"7"7tTW-0BCI^/_`x $ #8 # #
 # & <D$9 < <  nA  nF < < < $& & & &
 155D,A)E)E)EFTXZ^H_`&' $ 6  I
  u  tD$9 t ts|  tE  tJ t t t u u u ; 	F  H  	I  	I  	IfnETW]O\\\\\\r   c                 d   ddl m} | j                                          || j        j        pddd          }d t          j        d|          D             d	d
         }t          |          dk    r|d         d	d
         }nd                    d |D                       }|	                                }d}t          j                            dd| | gdd| j        gg          r:|sd}|dz  }t          j                            dd| | gdd| j        gg          :| | | _        d	S )u  
        Генерируем автоматически Префикс для кода задач для Разделов (там он не очень важен)
        TODO1: возможно, выводить на форме создания разделов поле ввода Префикса
        Важно! Этот метод разрешен только для Разделов!
        r   )translitr  ruT)language_codereversedc                     g | ]}||S r  r  r8  cs     r   r  zACmfProject._calc_task_code_prefix_for_section.<locals>.<listcomp>#  s    UUU1STUQUUUr   z(?:\b|_)([A-Za-z0-9]{1,4})Nro  rr  r<  c              3   &   K   | ]}|d          V  dS )r   Nr  r  s     r   r9  z@CmfProject._calc_task_code_prefix_for_section.<locals>.<genexpr>'  s&      33A1Q4333333r   rO  r  r   rs   r   )transliterater  r   r   r   r  findallr  r@  r  r   r`   sgetr   rO  )r   r  ry   	code_listis        r   "_calc_task_code_prefix_for_sectionz-CmfProject._calc_task_code_prefix_for_section  s|    	+*****	x	05tTTTUU
+H$ O OUUUVXWXVXY	y>>QQ<#DD773333333Dzz||$$+ST,1,,?$dgAVW % 
 
 	  FA $$+ST,1,,?$dgAVW % 
 
 	 $(r   c                     |                     d          s|rt          dd           dS | j        }| j        j        r| j        s| j        j        }||vr|rt          dd           dS dS )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_admin2  s     %%%AA 	   N        5!4"- 	=dk 	=!%!8!<+++ "  x " " " "5tr   c                 h   | j         sd S t          j                            | d          }|s0t                              | d          }|                                 t          j                            | d          }|s2t                              | d          }|                                 d S d S )Nwhite)r   r&  black)r  r   rX   r   r   )r   wlbls      r   _calc_white_black_listsz"CmfProject._calc_white_black_listsH  s    { 	F $$Dw$?? 	$$Dw$??BGGIII $$Dw$?? 	$$Dw$??BGGIIIII	 	r   c                     | j         sL| j        j        rB| j        r=t          j                            | d          }|s|                                  d S d S d S d S d S )Nr/  r   )r  r  r   r   rL   r  r<  )r   r   s     r   _calc_structure_scaffoldz#CmfProject._calc_structure_scaffoldU  s     { 	*t2= 	*$BU 	*%**$*MMF *'')))))	* 	* 	* 	* 	* 	** *r   c                    | j         rZt          j        j        sIt          j        s=t          j        s1t          j                            d          st          dd           | j         r$| j        	                    t          j                   | j         s| j        j
        rt          j                            g d          }|j                                        }| j        j        D ]^}}}|dk    r||vrt#          j                    5  |j        	                    |           |                                 d d d            n# 1 swxY w Y   |t          j        k    r)t          j                            |j        j                   |                    d          st          d	| d
           | j         rt          j                            dd| j        gdd| j        gg          }|rt          d| j         dd           nt|                                 r`|                     |                                           }	|	j        r2|	                    d| j         dt?          j                     d           d}
| j        j
        r| !                    dg           | j        st          d           | "                                 | j        j#        r3|                     | j        j#                  r| $                                 | j%        r/d| j         | j%        _        | j%                            d           | j         r| j        s| j&        | _        d}
| j         s| '                                 | j(        sV| j)        dk    r&t          j*                            d          | _(        n%t          j*                            d          | _(        | j+        s%t          j,                            d          | _+        | j-        sIt          j.                            d          }|s t          j.                            d          }|| _-        | /                                 | 0                                 | j1        s1| j2        dk    r| 3                                 nt          d d           | 4                                 | 5                                 | 6                                  to                      j        |i |}| j         sH| j(        j
        s<| j8        j
        s0| j9        j
        s$| j:        j
        s| j;        j
        s| j<        j
        rt          j*        =                                 | >                                 |                    d!d          rd}
|
r| ?                                 | j@        j
        r| A                                 | jB        j
        r| jB        r| C                                 | jD        j
        r| jD        r| E                                 | jF        j
        r| jF        r| G                                 | j         s| j+        j
        rt          j,        =                                 t          jH        I                    d"d#d$d%ggd"g&          }|D ]}d$|_J        |                    d            | K                                 |S )'NProjectCreatorsr  u   Для создания проектов попросите Администратора системы добавить Вас в группу Создатели проектовTr   )ry   rq   r  r   r   u   Пользователь uO    добавлен в группу Администраторы проектовr   rq   r   rs      Проект     уже существуетr?  _%Y-%m-%d-%H%M%SFr  <   Имя проекта не может быть пустым.rk  r   rx   servicedesk:defaultr   system.open:defaultsystem:default)rl  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   r]  rP  rB  rd  renamer   nowr\  r|  r   rename_project_dirr  ry   r  r  rw   CmfProjectPermSchemer  r  rd  ro  r  r   rO  r   r  r  r   r   r   servicedesk_publicrY  cmf_owner_assistants
spectatorsr  trigger_reloadr  r  rX  rb  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  rd  project_dir_rfileshould_be_scaffoldedrd  resultonboardings
onboardingr   s                  r   r   zCmfProject.save]  s   ; 	Rq~6 	R) RQ-= R~55AR5SS R ELPR R R R ; 	;#**1>::: ; 	]$1< 	]#)#8#<#<DcDcDc#<#d#d +?+J+U+U+W+W(/3/F/O 
] 
]+x! H,,'CCC$022 8 80;BB8LLL0557778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 $q~557;;<P<S<YZZZ'77CT7UU ]%  '\(  '\  '\  '\  ]  ]  ] ; 		c&**FD$)3LtUY[_[bNc2d*eeF cQ$)QQQY]^^^^^,,.. c(,8H8H8J8J(K(K%(/ c)001aTY1a1a1a1a1abbb$9 
	=234449 ZXYYY,,...y} *!:!:49=!I!I *'')))& =/F49/F/F',',,t,<<<; 	(9 & I	#' { 	&##%%%' 	g $999+1+F+J+JPe+J+f+f((+1+F+J+JPe+J+f+f( ! 	Z!'!>!B!BHX!B!Y!YD } 	%)--->>H I!-117G1HH$DM!!!$ 	c I--779999U]abbbb##%%%))+++!!###t.v..; 		9+6		9*5		9 >,		9 ,7			9
 ?-		9 >,		9 '66888$$&&&::ou-- 	)#(  	MMOOO( 	&##%%%!, 	)1G 	)&&(((%0 	-T5O 	-**,,,=# 	) 	)&&((( ; 	;$,7 	;)88:::',,5H(U]_gTh4i  tG  sH,  I  I% 	, 	,J+3J(OOdO++++%%'''s   /EE
	E
	returnc                     |                      |                     | j        j                            }|                    |                                            d S r   )rP  rB  r   r   r  )r   	old_rfiles     r   r  zCmfProject.rename_project_dir  sK    OOD$4$4TY]$C$CDD	))++,,,,,r   c                    | j         rt          j                            dd| j        gdd| j        gg          }|rt          d| j         dd	           nt|                                 r`|                     | 	                                          }|j
        r2|                    d
| j         dt          j                    d           | j        j        r&t!          j        | j        j        dg          | _        | j        j        r&t!          j        | j        j        dg          | _        d}| j        j        r| j        st          d           |                                  | j        j        rx|                     | j        j                  rY|                     | 	                    | j        j                            }|                    | 	                                           | j         r| j        s| j        | _        d}| j         s|                                  | j        sV| j        dk    r&t          j                            d          | _        n%t          j                            d          | _        | j        s%t          j                            d          | _        |                                  |                                  | j        sD| j         dk    r| !                                 n$| "                    | j        j                  | _        | #                                 | $                                  tK                      j&        |i |}|r| '                                 t          j(        )                    ddddggdg          }|D ]}	d|	_*        |	+                    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   r]  rP  rB  rd  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   rd  r  r  r  r  r  r  r   s             r   r   zCmfProject._save_import  s   ; 		c&**FD$)3LtUY[_[bNc2d*eeF cQ$)QQQY]^^^^^,,.. c(,8H8H8J8J(K(K%(/ c)001aTY1a1a1a1a1abbb $/ 	q(/(:4;T;Zinho(p(p(pD%$/ 	q(/(:4;T;Zinho(p(p(pD%$9 	59 ZXYYY,,...y} 5!:!:49=!I!I 5 OOD,<,<TY],K,KLL	  !1!1!3!3444; 	(9 & I	#' { 	&##%%%' 	g $999+1+F+J+JPe+J+f+f((+1+F+J+JPe+J+f+f(! 	Z!'!>!B!BHX!B!Y!YD!!!$ 	S I--779999(,(A(A$)/(R(R%##%%%))+++%%t6v66 	MMOOO',,5H(U]_gTh4i  tG  sH,  I  I% 	, 	,J+3J(OOdO++++r   c                 r   t          t          |                    d          d                   }|                    |g d          }|j        rO|                    d          r|j                            d|           n1|j                            d|           n|                                 |o-t          t          |                    d          d                   }|o|                    |d	g          }|r|j        j	        pd}|o-t          t          |                    d          d                   }	|	o|	                    |d	g          }
|
r|
j        j	        pd}|r |r|t          ||z
  d
z            z   |_        n|r|dz   |_        n|r
|dz
  |_        |                    d           d S )N:r   )r3  r   r   r   r   zCmfTask:zPPP-TSK-ORDERr   zPPP-OBJ-ORDERr3  rq  ra  Tr   )r  r   r   r   r   r  rh   check_edit_permr3  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'	  s    VW]]3%7%7%:;;
~~1Q1Q1Q~RR < 	#!!*-- R66D6QQQQ66D6QQQQ   """ MWVY__S5I5I!5L%M%MT,"2"2i"2"T"T8FN$8=AGs1C1CA1F!G!G
Q:>>Wi[>#Q#Q	 <Y%6%<A 	/y 	/)C1NRS0S,T,TTDLL 	/)D0DLL 	/'$.DL		D	!!!!!r   c                     d S r   r  r   s    r   
_calc_codezCmfProject._calc_codeH	  s	     	r   c                     d S r   r  r   s    r   get_code_prefixzCmfProject.get_code_prefixM	  s    r   F	recursiveTEXKOM_db_deletec                   | j                                         r0|s.t          dt          j         dt                       dd           | j        j        }|rg | _        d | _	        | 
                    d           dD ]}t          t                    |                             dd	| gdd
          D ]y}t                              d|            t          t                    |                             |j        dd          r%|                    dd           t'                       zt          j                            | dd          D ]6}t                              d|            |                    dd           7t          j                            | dd          D ]6}	t                              d|	            |	                    dd           7t          j                            | dd          D ]6}
t                              d|
            |
                    dd           7t          j                            dd	| j        gdd i           t          j                            dd	| j        gdd i           t          j                            dd| j        ggdd
          D ]O}t                              d|            |j                            |            |
                    d           P t;                      j        |||ddd|}|                     |          r5t          j                             |          }|r|!                                 |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  r>  )r6  force)r   r  r>  
project_id)r~   r  r  r;  u   Удаляем из кеша F)r5  r6  r>  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   r]  rI  r   move_to_trash)r   r5  r6  r   r   cur_namecls_namerC  
gantt_task	task_codedoc_historycust_field_confrf  rB  r   s                 r   _old_deletezCmfProject._old_deleteQ	  s   ?!! 		*: 		P".P P
 *OOP P P     9? 7	5')D$&*D#III%%% , ,.  <<166xt>Tfj{6  A  A , ,CGG3c33444F||H-22cfdcg2hh ,

D
EEE)+++	,
 %166tUYjn6oo E E
6*66777!!4t!DDDD#6;;DZ^os;tt D D	5)55666  $d CCCC%8==d\`qu=vv F F7+77888""D"EEEE ,,\44Q5A44H - J J J ,,\44Q5A44H - J J J $*#:#?#?($	: $# $@ $ $ 5 5
 IIIJJJ.55d;;;$$t$4444eggndiJZ,0J JBHJ J$$X.. 	, /--h77K ,))+++
r   )r5  r6  use_jobc                X   |                      ddg           | j        rt          dd           | j        r0|s.t          dt          j         dt                       dd           |                     |                                            d| _	        | j
        j        r| j
        j        n| j
        }|                     |          r|                                  |                                  | j        j        ||d	|}|rt%          | j        |
           d S  | j        di | d S )Nrl  rA  u@   Нельзя удалять проект по умолчаниюTr   r8  r9  r:  )r@  r5  r6  r   r  )r\  rl  r   rA  rB  rC  rD  apply_delete_prefixgenerate_delete_prefixcmf_deletedr   r   r   r]  r  	save_datar   jsonr  _delete_job)r   r5  r6  rU  r   r   project_name
job_kwargss           r   r  zCmfProject.delete	  s   ,5666? 	fX`deeee ? 		#3 		P".P P
 *OOP P P     	  !<!<!>!>???(,	(<Kty}}$)$$\22 	&##%%% '," 0
 
 	

  	+!$"2:FFFFFFD**z*****r   rm  r@  u   Удаление проекта)r-  	only_onceonly_once_argsdescriptionshow_bg_progressbarc                v   t           j                            | d          }|rt          j        j        |g|R d|i| nt          j        j        |g|R d|i| |j        j        }|                    |          r9t           j                            |          }|r|	                    d           d S d S d S )NTr   r  r5  F)	is_rename)
r   r`   r   
_db_delete_move_to_trashr   r   r]  rI  rM  )r@  r5  r6  r   r   r   rN  rB  s           r   r]  zCmfProject._delete_job	  s     #'':t'LL 	\(W4WWW9WPVWWWW,W[t[[[y[TZ[[[<%''11 	; /--h77K ;))E):::::	; 	;; ;r   c                    dd| j         j        gg dg}t          D ]q}t          j        |          }|dk    r-|                    |          D ]}|                                 |                    |ddid           t                       rd| _	        | 
                                 t          j                            | j         j                   t          j        j                            | d	           t          j                            d	d
t(          j        | | j        j        | j        j                   t                       d S )Nr@  r  )rZ  r  Fr   r   rZ  T)r~   r  include_dummyr  r`   operaterP  r  r   parent_nameparent_code)r   r   PROJ_MODELSr   get_model_by_namer   delete_filerI  
cmf_commitrZ  r[  r   r`   _remove_proj_objs_from_indexingcmfapp	CMF_CACHE
invalidateCmfAuditaudit_eventrY  current_personr   ry   )r   r5  r   r   _filter	classnamer   attachs           r   rh  zCmfProject._move_to_trash	  s[    3
 01'''
 % 	 	I-i88EO++#jjj88 ) )F&&((((%t,"     LLLL"99'*:JKKK 	$$Wh777 	##''** 	$ 	
 	
 	
 	r   c                 (   | j         j        }t          t          j        j        t          |                     t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    d	d|i           t                       t          j        j        j        	                                
                    d
d|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    dd|i           t                       t          j        j        j        	                                
                    d d|i           t                       t          j        j        j        	                                
                    d!d|i           t                       t          j        j        j        	                                
                    d"d|i           t                       t          j        j        j        	                                
                    d#d|i           t                       t          j        j        j        	                                
                    d$d|i           t                       t          j        j        j        	                                
                    d%d|i           t                       t          j        j        j        	                                
                    d&d|i           t                       t          j        j        j        	                                
                    d'd|i           t                       t          j        j        j        	                                
                    d(d|i           t                       t          j        j        j        	                                
                    d)d|i           t                       t          j        j        j        	                                
                    d*d|i           t                       t          j        j        j        	                                
                    d+d|i           t                       t          j        j        j        	                                
                    d,d|i           t                       t          j        j        j        	                                
                    d-d|i           t                       t          j        j        j        	                                
                    d.d|i           t                       t          j        j        j        	                                
                    d/d|i           t                       t          j        j        j        	                                
                    d0d|i           t                       t          j        j        j        	                                
                    d1d|i           t                       t          j        j        j        	                                
                    d2d|i           t                       t          j        j        j        	                                
                    d3d|i           t                       t          j        j        j        	                                
                    d4d|i           t                       t          j        j        j        	                                
                    d5d|i           t                       t          j        j        j        	                                
                    d6d|i           t                       t          j        j        j        	                                
                    d7d|i           t                       t          j        j        j        	                                
                    d8d|i           t                       t          j        j        j        	                                
                    d9d|i           t                       t          j        j        j        	                                
                    d:d|i           t                       t          j        j        j        	                                
                    d;d|i           t                       t          j        j        j        	                                
                    d<d|i           t                       t          j        j        j        	                                
                    d=d|i           t                       t          j                            d>d?|gd>d id@A           t                       t          j                            dd?|gdd id@A           t                       t          j                            dBd?|gdBd id@A           t                       t          j                            dCd?|gdCd id@A           t                       t          j                            dd?|gdd id@A           t                       t          j                            dDd?|gd@E           t                       t          j                            |           t          j        t          j        t          j        t          j        t          j        t          j        t          j        fD ]-}|                    dd?|gdd id@A           t                       .dFD ]?}t9          j        |          }|                    dd?|gd@d@G           t                       @t          j        t          j        fD ]+}|                    dDd?|gd@d@G           t                       , t?          t          |           j         ||d@dH| t                       tB          j"        j#        $                    | dI           t          j%        &                    dIdJtN          j(        | | j)        j        | j*        j        K           t                       d S )LN)r@  rW  z
                DELETE FROM cmf_kanban_board_column_cmf_status_code s
                USING cmf_kanban_board_column c
                WHERE s.left_id = c.id AND c.project_id = :project_id;
            r@  z
                DELETE FROM cmf_list_cmf_task lt
                USING cmf_task t
                WHERE lt.right_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_list_cmf_task lt
                USING cmf_list l
                WHERE lt.left_id = l.id AND l.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_git_branch tg
                USING cmf_task t
                WHERE tg.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_git_commit tg
                USING cmf_task t
                WHERE tg.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_git_merge_request tg
                USING cmf_task t
                WHERE tg.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_cust_field_conf_cmf_project cp
                USING cmf_project p
                WHERE cp.right_id = p.id AND p.id = :project_id;
            z
                DELETE FROM cmf_roadmap_cmf_task_filter rt
                USING cmf_roadmap r
                WHERE rt.left_id = r.id AND r.project_id = :project_id;
            z
                DELETE FROM cmf_s_desk_request_type_cmf_s_desk_request_group m2m
                USING cmf_s_desk_request_type t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_active_entity_filter_cmf_tag m2m
                USING cmf_active_entity_filter t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_component m2m
                USING cmf_component c
                WHERE m2m.right_id = c.id AND c.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_testcase m2m
                USING cmf_task t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_component m2m
                USING cmf_task t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_document m2m
                USING cmf_task t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_task m2m
                USING cmf_task t
                WHERE (
                    m2m.left_id = t.id OR m2m.right_id = t.id
                ) AND t.project_id = :project_id;
            z
                DELETE FROM cmf_task_cmf_person m2m
                USING cmf_task t
                WHERE m2m.left_id = t.id AND t.project_id = :project_id;
            ai  
                DELETE FROM cmf_kanban_board_column_cmf_status_code m2m
                WHERE left_id IN (
                    SELECT kbc.id AS left_id
                    FROM cmf_kanban_board_column kbc
                    JOIN cmf_kanban_board kb ON kbc.parent_id = kb.id
                    WHERE kb.project_id = :project_id
                );
            zEDELETE FROM cmf_task_filter_cmf_project WHERE right_id = :project_id;z
                DELETE FROM cmf_roadmap_cmf_list m2m
                USING cmf_list l
                WHERE m2m.right_id = l.id AND l.project_id = :project_id;
            z
                DELETE FROM cmf_roadmap_cmf_task m2m
                USING cmf_task t
                WHERE m2m.right_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_roadmap_cmf_bql_filter m2m
                USING cmf_roadmap r
                WHERE m2m.left_id = r.id AND r.project_id = :project_id;
            z
                DELETE FROM cmf_document_cmf_key_phrase m2m
                USING cmf_key_phrase kp
                WHERE m2m.right_id = kp.id AND kp.project_id = :project_id;
            zQDELETE FROM cmf_automation_crud_trigger_cmf_project WHERE right_id = :project_id;zCDELETE FROM cmf_project_cmf_plugin_git WHERE left_id = :project_id;zCDELETE FROM cmf_project_cmf_bql_filter WHERE left_id = :project_id;z
                DELETE FROM cmf_relation_option r
                USING cmf_task t
                WHERE
                    (r.in_link_id = t.id OR r.out_link_id = t.id)
                    AND t.project_id = :project_id;
            z
                DELETE FROM cmf_list_history_o_t_r lh
                USING cmf_list l
                WHERE lh.task_list_id = l.id AND l.project_id = :project_id;
            z
                DELETE FROM cmf_list_history_r_t_e lh
                USING cmf_list l
                WHERE lh.task_list_id = l.id AND l.project_id = :project_id;
            z
                DELETE FROM cmf_task_code_history tc
                USING cmf_task t
                WHERE tc.task_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_form_field ff
                USING cmf_form f
                WHERE ff.form_id = f.id AND f.project_id = :project_id;
            a  
                DELETE FROM cmf_task_res_assign_timephase
                WHERE resource_assignment_id IN (
                    SELECT a.id as resource_assignment_id
                    FROM cmf_task_res_assign a
                    JOIN cmf_task t ON a.parent_id = t.id
                    WHERE t.project_id = :project_id OR a.project_id = :project_id
                );
            z
                DELETE FROM cmf_task_res_assign a
                USING cmf_task t
                WHERE a.parent_id = t.id AND t.project_id = :project_id;
            a  
                UPDATE cmf_task t1
                SET op_gantt_task_id = null
                FROM cmf_gantt_task gt
                JOIN cmf_task t2 ON t2.id = gt.task_id
                WHERE gt.id = t1.op_gantt_task_id AND t2.project_id = :project_id;
            z
                DELETE FROM cmf_gantt_task gt
                USING cmf_task t
                WHERE gt.task_id = t.id AND t.project_id = :project_id;
            z
                DELETE FROM cmf_kanban_board_column kbc
                USING cmf_kanban_board kb
                WHERE kbc.parent_id = kb.id AND kb.project_id = :project_id;
            z
                DELETE FROM cmf_access_rule ar
                USING cmf_access_list al
                WHERE ar.parent_id = al.id AND al.project_id = :project_id;
            z
                UPDATE cmf_comment c1
                SET tree_parent_id = null
                FROM cmf_comment c2
                WHERE c1.tree_parent_id = c2.id AND c2.project_id = :project_id;
            z
                UPDATE cmf_task t1
                SET epic_id = null
                FROM cmf_task t2
                WHERE t1.epic_id = t2.id AND t2.project_id = :project_id;
            z
                UPDATE cmf_list_history_r_t_e lh
                SET timetracker_history_id = null
                FROM cmf_time_tracker_history tth
                WHERE lh.timetracker_history_id = tth.id AND tth.project_id = :project_id;
            z
                UPDATE cmf_list_history_r_t_e lh
                SET task_id = null
                FROM cmf_task t
                WHERE lh.task_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_list_history_o_t_r lh
                SET task_id = null
                FROM cmf_task t
                WHERE lh.task_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_document d
                SET cur_published_version_id = null
                FROM cmf_document_history dh
                WHERE d.cur_published_version_id = dh.id AND dh.project_id = :project_id;
            z
                UPDATE cmf_document d
                SET cur_workflow_version_id = null
                FROM cmf_document_history dh
                WHERE d.cur_workflow_version_id = dh.id AND dh.project_id = :project_id;
            z
                UPDATE cmf_shadow_link sl
                SET task_id = null
                FROM cmf_task t
                WHERE sl.task_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_task t
                SET main_list_id = null
                FROM cmf_list l
                WHERE t.main_list_id = l.id AND l.project_id = :project_id;
            z
                UPDATE cmf_gantt_task gt
                SET gantt_project_id = null
                FROM cmf_task t
                WHERE gt.gantt_project_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_project p
                SET main_gantt_project_id = null
                FROM cmf_task t
                WHERE p.main_gantt_project_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_task t1
                SET gantt_project_id = null
                FROM cmf_task t2
                WHERE t1.gantt_project_id = t2.id AND t2.project_id = :project_id;
            z
                UPDATE cmf_gantt_task gt
                SET parent_task_id = null
                FROM cmf_task t
                WHERE gt.parent_task_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_task t1
                SET parent_task_id = null
                FROM cmf_task t2
                WHERE t1.parent_task_id = t2.id AND t2.project_id = :project_id;
            z
                UPDATE cmf_task t1
                SET subproject_id = null
                FROM cmf_task t2
                WHERE t1.subproject_id = t2.id AND t2.project_id = :project_id;
            z
                UPDATE cmf_task t
                SET request_type_id = null
                FROM cmf_s_desk_request_type rt
                WHERE t.request_type_id = rt.id AND rt.project_id = :project_id;
            z
                UPDATE cmf_chat_topic ct
                SET group_id = null
                FROM cmf_chat_group cg
                WHERE ct.group_id = cg.id AND cg.project_id = :project_id;
            z
                UPDATE cmf_document d
                SET perm_acl_id = null
                FROM cmf_access_list a
                WHERE d.perm_acl_id = a.id AND a.project_id = :project_id;
            z
                UPDATE cmf_task_filter t
                SET perm_acl_id = null
                FROM cmf_access_list a
                WHERE t.perm_acl_id = a.id AND a.project_id = :project_id;
            z
                UPDATE cmf_checklist_item c
                SET cache_task_id = NULL
                FROM cmf_task t
                WHERE c.cache_task_id = t.id AND t.project_id = :project_id;
            z
                UPDATE cmf_project p
                SET perm_acl_id = null
                FROM cmf_access_list a
                WHERE p.perm_acl_id = a.id AND a.project_id = :project_id;
            z
                UPDATE cmf_task t
                SET op_gantt_task_id = NULL
                FROM cmf_gantt_task gt
                WHERE t.op_gantt_task_id = gt.id AND gt.project_id = :project_id;
            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  rj  r4  r  r`   rk  )+r   r   r  r   r`   _delete_attachments_files_jobr   rJ  rK  Sessionexecuterr  r=  rI  CmfPipelineCmfRoleCmfTagCmfWhatsappCmfMailHandlerbulk_deleters  CmfDealCmfLeadr   rK   rG  rH  rJ  r   rp  r   r   r  rt  ru  rv  rw  rx  ry  rY  rz  r   ry   )r   r5  r   r   r@  r   r|  r   s          r   rg  zCmfProject._db_delete
  s(   Z%
;:...	
 	
 	
 	
 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022:: :&		
 		
 		
 	 	(0022::
 :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022::S:&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::_:&	
 	
 	
 	 	(0022::Q:&	
 	
 	
 	 	(0022::Q:&	
 	
 	
 	 	(0022:: :&		
 		
 		
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022:: :&		
 		
 		
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022::
 :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	(0022:: :&	
 	
 	
 	 	$$(#z:($/  	% 	
 	
 	

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

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

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

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

 	 	))j1  	* 	
 	
 	
 	99*EEE NN %  	
 	 	E $c:6$d+ $    
 LLLLR
 Y	 Y	If -i88E$c:6 $"    
 LLLL  
 		 		E #S*5 $"    
 LLLL 	*j'"")49W[ff_efff 	$$Wh777 	##''** 	$ 	
 	
 	
 	r   c                     dD ]R}t           j        j        j                                                            d| dd| i           t                       Sd S )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
                r@  )r   r`   rJ  rK  r  r  rr  )r@  tables     r   rs  z*CmfProject._remove_proj_objs_from_indexing  s|    
 	 	E  ,4466>>     z*   LLLL+	 	r   u;   Жесткое удаление файлов проекта)r`  ra  rb  c                   d t           j                            | dgd          D             }t           j        j        j                                        j        }|D ]l}t          d          t          j
        |          z  |d d         z  |z  }|                    t          |                    }	|	r|	                                 md S )Nc                 &    h | ]}|j         j        S r  )rp   r   )r8  as     r   	<setcomp>z;CmfProject._delete_attachments_files_job.<locals>.<setcomp>  s)       Aak'   r   rp   T)r@  order_byr  r   i)r   r   r   rI  rJ  rK  rL  rootr   r   get_class_name_by_idfind_child_by_idr  r  )
r@  r5  r6  r   r   
parent_idsr  rp   rN  rfs
             r   r  z(CmfProject._delete_attachments_files_job  s     1E1J1J!!]  2K 2
 2
   

 !-4466;# 	 	I;;!=i!H!HH9UYVYUY?Z]ffD&&s4yy11B 			 	r   c                     | j         j        } t                      j        dddi|}| j         j        }t          j                            ||                                 |           |                                  |S )Nr>  T)name_before
target_dir
name_afterr  )	r   r   r   restorer   rI  restore_from_trashrB  rb  )r   r   r  rf  r  r   s        r   r  zCmfProject.restore  s    ioeggo<<T<V<<Y_
**#''))! 	+ 	
 	
 	

 	!!!
r   c                     t          j        t          j                  }|t	          d          z  }t
          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  s    lhl+++yr""""##dDG,"C-555***	  $ 

 

 r   c           
         | j         rd S |                                 }|sd S t          d| j        j        j                    t          j                            | j        d| d| j         d| j         j	         dd           d S )Nu&   Отправляем карточку u   Рекомендацияu   
            В проекте u(   есть задачи с планом, но без будильника.
            Назначьте будильник, или список с планом,
            чтобы задачи появились у исполнителя в ленте.
            (сброшен флаг "z")
            rq  )r  r   r   msgr-  )
auto_alarm_dater  printrY  r   r   r   	CmfNotifyplace_notifycaption)r   r  s     r   '_notify_project_owner_not_planned_tasksz2CmfProject._notify_project_owner_not_planned_tasks  s     	F..00 	FRt~7J7PRRSSS%%>+#y  (,';'C	    	& 	
 	
 	
 	
 	
r   z@daily)r`  
system_jobschedulec                      t           j                            d          D ];} |                                 }|D ]"}|j        |_        |                                 #<d S )NT)r  )r   r`   r   r  r  r  r   )r   r  tasks      r   cron_auto_alarm_datezCmfProject.cron_auto_alarm_date  so     (--d-CC 	 	G5577E  "&"6			 	r   c                  v    t           j                            dg          D ]} |                                  dS )u   DEPRICATED есть две реализации механизма штатными средствами через подписку на фильтры или через крон в автоматизациях
        **r[  N)r   r`   r   r  r   s    r   &notify_project_owner_not_planned_tasksz1CmfProject.notify_project_owner_not_planned_tasks  sH    
 (--dV-<< 	> 	>G;;====	> 	>r   	task_tagsc                    |sdS d |D             }t           j                            | j        d          }t           j                            | j        d          }|r|sdS d t           j                            |j                  D             }t           j                            dd	gd
d| j        gg dg          D ]}|j        j        |v r|                    |j        j                  }|j	        
                                r|                    |j	        j        j                  }|sMt                               | ||j	        j                                                  }|||j	        j        j        <   |j        |j        k    r |j        |_        |                                 |j        |j        k    r |j        |_        |                                  |                                D ]Q\  }	}|j	        
                                rt                              |  d| d|j	                    |                    |j	        j        j                  }|sOt                               | ||j	        j                                      d          }|||j	        j        j        <   t                               |d|j         d| |          }|                                 t                              |  d|            t                               |d|j         d| |          }|                                 SdS )u   
        Вызывается если у задачи проекта изменяются тэги.
        Если появился тэг, для которого нет фильтра - создадим его.
        TODO
        Nc                 (    i | ]}|j         j        |S r  )r   r   )r8  tags     r   
<dictcomp>z5CmfProject.hook_task_tags_changed.<locals>.<dictcomp>  s    DDD3SV\3DDDr   r  )rp   r   tagsc                 (    i | ]}|j         j        |S r  )r   r   r8  r   s     r   r  z5CmfProject.hook_task_tags_changed.<locals>.<dictcomp>  s5     Q Q Q KvQ Q Qr   )r   filter_tag_idr   rp   rq   )r   rq   r  r  )r   r   r   z: Create new filter for z with category Fr   #r  )r   r   r   r	  
filter_tag)r   rL   r   r   r   r  r  r   r   tag_categoryr   r   r   r   itemsrY  rE  )
r   r  task_tags_id_dicttasks_filtertags_foldercategory_folders	ae_filterr  category_foldertag_ids
             r   hook_task_tags_changedz!CmfProject.hook_task_tags_changed  s     	FDD)DDD'++dg	+RR&**TWv*NN 	 	FQ Q *//|/OOQ Q Q  5::')9:$dDG46O6O6OP ; R R 	) 	)I &,0AAA'++I,C,IJJ#((** )&6&:&:3;K;P;V&W&WO* X*0*:*:#'\HXH] +; +_ +__c_c_e_e (HW()9)>)DE /?3EEE3B3E	0!((( /;>AA3>>	0!((( -2244 	! 	!KFC$$&& !4____SM]__```"2"6"6s7G7L7R"S"S& T&,&6&6#CDTDY '7 '[ '[[_[_gl[_[m[m $DS$S%5%:%@A"88 /n#(nnu"&3 9 8 8	      4>>>>???"88 +.ch..5`dqt 9 v v	    %	! 	!r   c                     d S r   r  )r   r  s     r   hook_new_tagzCmfProject.hook_new_tag6  s    r   c                     dS )NTr  r   s    r   has_tree_nodes_hookzCmfProject.has_tree_nodes_hook:  s    tr   c                     d S r   r  )r   r   r   s      r   public_listzCmfProject.public_list=  s	     tr   c                     g d}||d<   t          j        j        |i |}|sd S 	 |                                 n# t          $ r Y d S w xY w|S )N)%r   r   ry   cmf_owner_idr	  activity_idrw   rv   zworkflow.namerY  cmf_created_atr   rO  rb  	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_getB  s    &
 &
 &
P ,x#'888 	4	##%%%%! 	 	 	44	 s   : 
AAc                 6    t          j        j        | g|R i |S r   )r   r  rh   )r   r   r   s      r   rh   z$CmfProject.check_project_role_accessx  s'    *DT[D[[[TZ[[[r   c                    | j         s	| j        sd S | j         rd S | j        rt                      }|                     d          D ]k}|j        |                                 vrN|j                            d          s4|j                            d          s|                    |j                   ldD ]}||v r|	                    |           t          j        st          j        r4|                     d| g           t          | d|           rt          dd           |                     t          j                   d	D ]}||v r||	                    |           t          j        st          j        r4t          | |          }|j        r|j        st          d
d           |                     t          j                   |r|                     d|            d S d S d S )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  rL  rY  r  r  r\  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 	F; 	 F? ,	I&)ee#55 B B(0N0N0P0PPP % 0 ; ;H E E Q % 0 9 9% @ @ Q ,//0@AAA(? : :# '*AAA+223FGGG, !0@ ! $$&H3F&H&H%IJJJt%G2E%G%GHH i!  #\  dh  i  i  i  i))!.999(I : :# '*AAA+223FGGG, !0@ ! &9::Au tQU t!  #g  os  t  t  t  t))!.999& I..~4.HHHHHY,	I ,	IVI Ir   c                 D    t                                                      S r   )r   check_delete_permr   s    r   r   zCmfProject.check_delete_perm  s    ww((***r   c                 (   |D ]}t                                           }| |_        |                    d          |_        |                    d           |                    d          D ]}|                     |                    d          |                    d          |                    d          |                    d          ||                    d          |                    d	          |                    d
                     d S )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_groupr2  s        r   r  z&CmfProject._create_sdesk_request_group  s    	 	E"7799M#'M !&6!2!2Me,,, %		' 2 2 
 
//%))&11%))&11+//==)--j99'!-!1!1.!A!A#/#3#34D#E#E'3'7'78L'M'M 0 	 	 	 	
	 	r   c	                    t                                           }	| |	_        ||	_        ||	_        ||	_        ||	_        ||	_        ||	_        |||	_	        ||	j
                            |           |	                                 d S r   )r   r4   r   r   r  rv   r  r  r  request_categoryr  r   r   )
r   r   r  rv   r  r  r  r  r  r2  s
             r   r  z%CmfProject._create_sdesk_request_type  s     1133"  ",$0!&4#*<',4L)&--e444r   c                 4    | 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k    r#|d d          d|                    |d           }|S )Nr   )cmf_hashlib      r  ro  )cmf.utilr  r   gen_coder  short_str_enc)r   r  res_coder   s      r   r  zCmfProject.gen_code  sk    ((((((77##%%x==""3B3-RR+*C*CHa*P*PRRHr   c                    |s
| j         dz   }t                              |          }d}|                     d          D ]z}|j        |v sS|j                            d          s9|j                            d          st          |t          j	        j
                  r_t          ||j        |j                   {|                                D ]\  }}||j	        v rt          |||            |S )N    Копияr@  )%attachmentschat_groupscmf_archivedr  rZ  rA  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   rt  r   
CmfBackrefr  r   r  )r   r   r   new_projectskip_fieldsrG  attrr   s           r   clonezCmfProject.clone  s    	-9},D''T'22
 [[D[11 	@ 	@E K//#,,U33 0#..w77 0 eSZ%:;; 0
 K!15;????!<<>> 	2 	2KD%{)))T5111r   c                 `   |rt           j                            |           dk    s$t           j                            |           dk    rRt	          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_idrW  r   ry   rO  r7  r8  r  )r   r   countr   r   r  r   rY  rz  r   r  create_from_template_jobdo_create_from_template)r   r   ry   rO  r7  r8  r   r_  s           r   ri   zCmfProject.create_from_template  s     	!''t'44r99V^=Q=QY]=Q=^=^ac=c=c! J#dg,,%)GW/=efeuexe~J J CIJ J
 &d&CJWWWW+t+ jDSc;IU^j jbhj j 	jr   u3   Создание проекта по шаблону)r`  rb  rc  c                    	 t                               | dg          }|                    |||||          }	d|	j         d}
d}n# t          $ r}t                       t                               |           }	d|	 }
| d	t                                           }t          	                    d
t                                           d           Y d }~nd }~ww xY wt          j                            |	||
|dd           d S )Nr   r#  r:  u   Проект "u   " успешно созданu-   Создан проект по шаблонуr   uA   Ошибка создания проекта по шаблону rL  uB   Ошибка создания проекта по шаблону: T)r?  rr  )r   r  r   r  force_notify_current_personr-  )r`   r   r=  r   r   rollback_purge_event	traceback
format_excrY  rE  r   r  r  )r6  r   r9  ry   rO  r7  r8  _kwargsr   r0  notify_name
notify_msges                r   r<  z#CmfProject.create_from_template_job  sK   	 nnn>>G!99t$aq;IU^ : ` `KZ;+;ZZZKHJJ 	 	 	 """$..G.44Kk^ikkK99!5!5!7!799JGGqYbYmYmYoYoqqy}G~~~~~~~~	 	%%#(, 	& 	
 	
 	
 	
 	
s   AA 
CBCCc                    d dfd	d }d fddfd	}d fd|rd	}t           j                            | j        d
g          }	g |	_        g |	_        |	                    |p	|	j        dz   |||           }
|
                    dd|           |ri } |
|
t          |	j
                  |           |ri ||
|	|            ||
           |	j        rHt           j                            |
|	j        j                  |
_        |
                    ddd	           |
j        st                                           }t           j                            d          |_        |
|_        d|
j         |_        d	|_        |                    dd           ||
_        |
                    dd           |
S )Nc                     |                                   |                                  |                                  |                                  |                                  d S 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_acl/  sb    %%'''--///&&(((""$$$,,.....r   c                 ~   |i }|D ]3}t          |t          j        t          j        t          j        t          j        f          r@|                    dg           |                    |j        d          }||_	        | |_
        | |_        |j        |_         |           t          |dd          dk    r9t                              |           }|                    dd           ||_        |                    ddd	           |||j        j        <    | |t%          |j                  |           5d S )
Nr   T)r   copy_attachmentsr   Fr  r  r   emit)noitfyrS  r   )r   r   r  r   rJ   r   r\  r   r   r   r   r   r   r  r   r  r   r   r   r   )	r0  
new_parentorig_childrentree_parent_mapping
orig_child	new_childr
  rO  _copy_tree_nodess	          r   rZ  z<CmfProject.do_create_from_template.<locals>._copy_tree_nodes6  sd   "*&(#+ k k
j6+GY_Yl+1+>+@ A A &&~666&OOSWOXX	(2	%#.	 $/	! $.#4	  	)$$$9j%88IEE%+%8%8%8%L%LN"''u5'AAA/=I,e%4HHH <E#JM$78  ij>S9T9TVijjjj3k kr   c                 V   t           j                            dd| gdg          D ]}t           j                            |j        j        dg          D ]S}t           j                            |j                  }|	                    |j
        j        |j        |j                  }Td S )	Nr   rq   cloned_fromr  r  )out_linkr   )r\  )r]  in_link)r   r   r{  r+   r   r\  r   r  r^  r   r   r   )r   r  relin_tasknew_rels        r   _copy_relation_optionszBCmfProject.do_create_from_template.<locals>._copy_relation_optionsV  s    ,,Yg4NXeWf,gg ] ]!388$BRBU_c^d8ee ] ]C$n11ck1JJG!hhsx~QXQ[h\\GG]] ]r   c                    |j         |j        |j        |j        d}|                                D ]{\  }}|D ]s}|j        |j        k    rt          | |                              |           t          | |          	                    ||j
         d|j        j                             t|| j        r0|| j        j        j
         d| j        j        j                  | _        g | _        g | _        |                     ddd           dS )uT   Обрабатывает параметры задачи (lists, fix_versions, etc.))r  fix_versionsaffected_versionsrt  r"  FTrS  r   r   N)r  rd  re  rt  r  r   r   r  rL  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\  sO    # ) 6%.%@'2	 L $0#5#5#7#7 z z
C z zD{i&777 Hj1188>>>Hj11889PTXTcQwQwfjfofuQwQw9xyyyy	z
 ! G%<@R@X@c  >F  >Ffnfxf}  gD  >F  >F  &G""$H!#HMMuUdMCCCCCr   c                 4   | j                                         }| j         j        |_        | j         j        |_        ||_        d|_        d|_        d|_        d|_        d|_	        d|_
        d|_        t          d          |_        t          d          |_        | j        s|                                   |            | |_        |                    dd           |j        | _        |j        | _        || _         |                     ddd           dS )uP   Настраивает gantt_task для скопированной задачиNr   z0.00FrS  r   Trf  )op_gantt_taskr3  rY  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  )rh  r0  ri  rq  rO  s       r   _setup_gantt_taskz=CmfProject.do_create_from_template.<locals>._setup_gantt_taskp  s   $288::M&.&<&FM#'/'='HM$$/M!(,M%()M%,-M),-M)/0M,.2M+/3M,(/M%/6vM,' $))+++	(###!)ME%888"+"6H!*!4H%2H"MMuUdMCCCCCr   c                    |i }d t           j                            | d          D             }|                    d t           j                            | d          D                        i }|j                                        }|                    dg            ||           }d| j         |_        d |_	        d|_
        |                    dd           |                                 |                    dd           || _        |                     dd           |||j        <   t           j                            |g d	
          }i }g }	g }
|D ]n}||k    r	|j        dv r|
                    |           ( ||           } |||            || |           |	                    |           |||j        <   o|
D ]V} ||           } |||            || |           |||j        <   |||j        <   |||j        j        <   |||j        <   W|
D ]b}||j        j                 }|j        r/|j        j        j        |v r||j        j        j                 |_        |                    ddd           c|                                D ],}d}|j        r|                    |j        j        d           }|r/t           j                            |j        j                  |_        |                                  |           |j        |j	        _        d}|j        ra|                    |j        j        d           }|r*t           j                            |j        j                  }||_        ||j	        _        d}|r3|                    ddd           |j	                            d           . | ||           d S )Nc                 <    i | ]}|j          d |j        j         |S r"  r   r   r   )r8  rm  s     r   r  zKCmfProject.do_create_from_template.<locals>._copy_tasks.<locals>.<dictcomp>  sA     'j 'j 'jUX#.'K'K38>'K'KS 'j 'j 'jr   T)r   include_archivedc                 <    i | ]}|j          d |j        j         |S r  r  )r8  comps     r   r  zKCmfProject.do_create_from_template.<locals>._copy_tasks.<locals>.<dictcomp>  sB     ,t ,t ,t]at,R,R,R,RTX ,t ,t ,tr   ***rk  Frp  )r  lists.parentattachments.urlzfix_versions.parentzaffected_versions.parentzcomponents.parentr  r  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  rU  rf  r?  )r   rS  r   r   )r   r   r   updaterI   r  r   r\  r   rq  r   r   r{  ry   r   rw   r   r   r   r   r  rr  r   _calc_gantt_pathr  )r0  orig_projectrW  rj  tasks_by_orig_idorig_main_gantt_projectnew_main_gantt_project
orig_tasksparent_tasksr  
epic_tasksri  rh  r  
needs_savenew_parent_tasknew_gantt_projectrO  
_copy_task_copy_task_filtersrn  r|  s                    r   _copy_tasksz7CmfProject.do_create_from_template.<locals>._copy_tasks  s   "*&(#'j 'j*0.*=*=[cg*=*h*h'j 'j 'j##** ,t ,t/5/B/G/G{mq/G/r/r,t ,t ,t u u u  " '3&E&J&J&L&L##//888%/Z0G%U%U"*Hk6F*H*H"'37"0,0")"''U5'AAA"33555"''U5'AAA-CK*%666=S49:,,L Jx Jx Jx, y yJ LEJ ( 
@ 
@	 777)-MMM%%i0000)zy[QQQH((9>UVVV%%hYGGGLL***7?$Y^44 ( < <	%:9MMM$$Xy:QRRR!!(KCCC/7Y^,3; 0:B#IL$673; 00 ( H H	.y|/AB( _Y-B-E-KOb-b-b+>y?T?W?]+^H(5$GGGG(//11 < <"
# &&6&:&:4;K;PRV&W&WO& [+1>+=+=ASAY+=+Z+Z())+++Ih'''595ED&2!%J% &(8(<(<T=O=TVZ([([%( ^,2N,>,>BSBVB\,>,],])):D&7HD&4!%J <IIU$IGGG&++d+;;;{L:QRRRRRr   c                 d   |                                  }| j        |_        | j        |_        ||_        ||_        |j        dv r7| j        r0t          j        	                    | j        j
        |          |_        |                                |_        | j        r|                     |           |S )Nr  r   r   )r3  rY  r  r   r   rw   r   r   rL   r   r   r  ry   r  rQ  )r  rU  rh  s      r   r  z6CmfProject.do_create_from_template.<locals>._copy_task  s     zz||H!%H"&/H(HO)H$(HHH# o+1+;+?+?TEUEZcm+?+n+nH($--//HM 0%%h///Or   c                    dd| g}|                     d t          j                            |          D                        dd| g}|                     d t          j                            |          D                        ddd| gg dg}|                     d t          j                            |          D                        t          j                            |d	g
          }|D ]}|                                }| |_        | |_	        |j
        rC|j
        |k    r| |_
        n0t          j                            |j
        j        |           |_
        | g|_         	|           |                    dd           d S )Nr   rq   c                 <    i | ]}|j          d |j        j         |S r  r  r  s     r   r  zRCmfProject.do_create_from_template.<locals>._copy_task_filters.<locals>.<dictcomp>  s=     , , ,GM6$::v{'8::F, , ,r   r   c                 <    i | ]}|j          d |j        j         |S r  r  )r8  docs     r   r  zRCmfProject.do_create_from_template.<locals>._copy_task_filters.<locals>.<dictcomp>  s;     , , ,>A3>44CHN44c, , ,r   AND)rw   rq   r  c                 <    i | ]}|j          d |j        j         |S r  r  )r8  rv  s     r   r  zRCmfProject.do_create_from_template.<locals>._copy_task_filters.<locals>.<dictcomp>	  s;     , , ,AE4?66TY_66, , ,r   r  r  r  FrR  )r  r   rL   r   r   r   r   r3  r   r   r   r   r   ft_projectsr   )
r0  r  rj  _folder_filter_doc_filter_epics_filterorig_project_task_filtersorig_task_filternew_task_filterrO  s
            r   r  z>CmfProject.do_create_from_template.<locals>._copy_task_filters  s
    'k:N#** , ,QWQaQfQfn|QfQ}Q}, , ,    $T;7K#** , ,EKEWE\E\doE\EpEp, , ,    #Xt[$A$G$G$GIM#** , ,IOI\I\dqI\IrIr, , ,   
 )/(;(@(@#w )A ) )%
 %> ? ? "2"8"8":":*5')4&#/ _'3|CC6A336<6F6J6JP`PlPqR] 7K 7_ 7_3/:m+ 	/***$$E$>>>>)? ?r   Tr  r#  r  )r   ry   rO  r\  F)rS  r   r  )r0  rU  rV  rW  )r0  r  rW  r  r4  rf  rj  r   rk  rp  r   )r   r`   r   r   chat_topicsr  r3  r   r   r   r   ro   r   r  r   r  rv   r   r   )r   r   ry   rO  r7  r8  r   rb  r  r  r0  rW  r  rO  r  r  rZ  rn  r|  s                @@@@@@r   r=  z"CmfProject.do_create_from_template-  s   	/ 	/ 	/	k 	k 	k 	k 	k 	k 	k@	] 	] 	]	D 	D 	D(	D 	D 	D 	D 	D8Z	S Z	S Z	S Z	S Z	S Z	S Z	S Z	S Z	S Z	Sx	 	 	$-	? -	? -	? -	? -	?^  	"!N(,,,HH#% #% "((:*]:-	 ) 
 
 	eEPPP 
	O"$*.|/F*G*G]pr r r r  O,dwxxxx&&{;;;;, O/5~/A/A[g[t[y/A/z/zK,$$%$NNN- 		7%+^^%5%5"060C0G0GMi0G0j0j"-,7")*Hk6F*H*H"',0")"''U5'AAA-CK*%666r   obj_id)r`  ra  
str | Nonec                     t           j                            |           }|                    dd          }t           j                            | d          }|D ]}|                    dd           |S )Nr?  T)skip_tree_moverj   Fr@  r  )r   r`   r   r  r   r   r  r   rf  r  r  s        r   rj   zCmfProject.archive_projectR  s}     #''6'22ooT4oHH ##vE#JJ 	D 	DDLLdLCCCC
r   c                     t           j                            |           }|                                }t           j                            | d          }|D ]}|                                 |S )Nr?  Tr  )r   r`   r   archive_restorer   r   r  s        r   rk   z"CmfProject.archive_restore_project_  ss     #''6'22%%'' ##vD#II 	# 	#D  """"
r   c                 z    t           j                            | ddg          }|                    dd           |S )NTrZ  )r   r  r   F)r?  r5  )r   r`   r   r  r  r   s     r   rl   zCmfProject.delete_projectm  s>    #''64Q^P_'``TU333r   u)   Востановление проекта)rb  rc  r`  ra  c                     t           j                            | d          }|                    d|j        j                  S )NTre  )r5  prefix_name)r   r`   r   r  r   r   r  s     r   rm   zCmfProject.restore_projects  s:     #''64'HH7<;MNNNr   z@hourlyc                  x    t           j                            d          }|D ]}|                                 d S )NT)rX  )r   r`   r   rb  )_argsrD  project_listr   s       r   $celery_hourly_sync_rdisk_folder_hookz/CmfProject.celery_hourly_sync_rdisk_folder_hooky  sK     (--D-AA# 	) 	)G&&((((	) 	)r   c                     t           j                            | | d          }|rd S t                               | | ddd          }|                    d           d S )Nr  r%  u   ТребованияTr'  Fr   r(  )r   req_registrys     r   r  z CmfProject.scaffold_req_registry  su    )--TtRZ-[[ 	F))' * 
 
 	'''''r   )NNN)NN)r   Nr   )r   T)r   r   )T)r  N)NNNNN)NNNFF)r  r  )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-  r<  rB  rG  staticmethodrP  rV  rb  r]  rg   r  r  r  r  r  r  r|  r  rU  r  r  r  r  r  r  r  r  r  r  r   r  r   rd   r1  r3  rT  r  cmf_deferred_jobr]  rh  rg  rs  r  r  r  r  r  r  r   r  r  r  r  r  rh   r%  r   r  r  propertyr
  r  r3  ri   r<  r=  rj   rk   r  rl   rm   r  r  __classcell__)r   s   @r   r`   r`   f   s	       /(4?K

+,
 
 

K$ X X X X X [X0# # # # #
" " " " "	9 	9 	9\ \ \7 7 7 J J J [J@ ^ ^ ^ ^ ^ [^" *.4`d 8 8 8 8 [8t $7 $7 $7 [$7L  $ $ $ $8   ." " "# # #J( ( (, , ,L L L\   
: : : :x % % \%
] ] ]& & &8> > > >
 /8$       [O! O! O!b& & &*^* ^* ^*@		 	 	  "d d dLe e e p p [p E E E E E [Eb- b- b-H
 
 
 
 
&	5 	5 	5Z Z Z
   \B,] ,] ,]\- - -0   ,  * * *F F F F FP- - - -< < < < <| " " " ["@  
   ,0% L L L L L L L\ '+UD  +  +  +  +  +D $~5    26 ; ; ; ;  \;2 0 0 \0d j j j j \jX   \0 $~Q  
 DHZ_      \ 
 
 
 
 
  "
 
 
0 III  JI \ > > \>;! ;! ;! ;! ;!|   [     [ 3 3 [3j\ \ \5I 5I 5In+ + + + +  ( jnKO   ( > > X>       < KO=B
j 
j 
j 
j 2g  ~B  C  C  C
 
 C  C \
. NR@Ec c c cJ	 hZ@@@	 	 	 	 A@ \	 hZ@@@
 
 
 
 A@ \
 s    \
 "Mcgsw  JR  IS  T  T  TO O O O T  T \O 	JJJ) ) KJ \)( ( ( ( ( ( (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  ro  r   r   r  r`   r  r   r   <module>r     s!               2 2 2 2 2 2 2 2 2 2             H H H H H H     ) ) ) ) ; ; ; ; ; ;       				Rjj@( j@( j@( j@( j@('3>@U j@( j@( j@( j@( j@(r   