
    h&                        d dl m Z  d dlmZmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
T d dlZd dlmZ d d	lmZ  G d
 dej        j        j        j        e	          ZdS )    )copy)datetimetimezone	timedelta)Decimal)
monthrange)CmfPluginConvertMixin)*N)CmfActiveEntity)cmfutilc                       e Zd Zej        j        j        j        j        e	j        z   g dz   Ze
dj fd	            Zd Ze ed          d                         Z fdZ fd	Zd
 Zd Zd Ze
dkd            Ze
dl fd	            Ze
dddddd            Ze
dmd            Zd ZdndZdodZd Zd Zd Zd Zd Z dmdZ!dmd Z"ed!             Z#d" Z$d# Z%dmd$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
dk fd/	            Z0d0 Z1 fd1Z2d2 Z3d3 Z4ed4             Z5d5 Z6d6 Z7dpd7Z8d8 Z9d9 Z: fd:Z; fd;Z<e
dkd<            Z=d= Z>d> Z?dd?d@ fdA
Z@ fdBZAdC ZBdD ZCe eDdddEF          dG                         ZEedH             ZFdIeGfdJZHe
dK             ZIdL ZJe
dM             ZKe
dN             ZLdO ZMdP ZN fdQZOdR ZP	 	 dqdSZQeRdT             ZS fdUZTdmdVZU	 	 drdWZVe eDddXdY          dZ                         ZW	 	 drd[ZXe eDdd\g]          dmdsd_                        ZYe eDdd\g]          dmdsd`                        ZZe eDdaddd\gb          d\e[fdc                        Z\ed\e[fdd            Z]e eDdeddd\gb          dmdsdf                        Z^e eDdddgF          dh                         Z_di Z` xZaS )t
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}|dk    r|sg }|dd|gg dg} t                      j        |f|||d|S )Ndefault_list	parent_id==)cache_status_type!=closeddefault_list_if_empty)object_fields	object_idfilter)superfield_options_list)clsrelation_field_namer$   r%   r&   kwargs	__class__s         './modules/project/models/cmf_project.pyr(   zCmfProject.field_options_list"   s    .00 {D)<>c>c>cdF"999 {D)<>c>c>cdF)uww)*= X]4=fX XPVX X 	X    c                 B    d| j         j        i}t          d|           d S )N
project_idCmfProject:changed)idvaluecmf_emit_server_event)selfdatas     r-   invalidate_cachezCmfProject.invalidate_cache/   s'    dgm,2D99999r.   r1   )channelc                 X    | d         t           j        v rt           j        | d         = d S d S )Nr0   )APPcache_projects)r6   _kwargss     r-   on_project_changezCmfProject.on_project_change3   s5     !333"4#5666 43r.   c                 Z    | j         rd S t                                                       d S N)
logic_typer'   _calc_logic_typer5   r,   s    r-   rA   zCmfProject._calc_logic_type9   s.    ? 	F  """""r.   c                 Z    | j         rd S t                                                       d S r?   )	scheme_wfr'   _calc_scheme_wfrB   s    r-   rE   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 )Ncoder   r&   )cust_field_conf_scheme
is_changedis_nullmodelsCmfCustFieldConfSchemegetr@   rG   old
cache_hooknewr5   s    r-   _calc_cust_field_conf_schemez'CmfProject._calc_cust_field_conf_schemeD   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rG   )ui_form_schemerJ   rK   rL   CmfUiFormSchemerN   rR   s    r-   _calc_ui_form_schemezCmfProject._calc_ui_form_schemeO   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)	r   rJ   rO   is_default_listsaverQ   parentload	cmf_alertrR   s    r-   _calc_default_listzCmfProject._calc_default_listW   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varsrL   rN   appendr2   r3   tree_parentra   _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-   r   zCmfProject.get_obj_treed   s     %%%r.   projectc                 "    t          d          Nre   )rf   rg   rk   rl   rN   r'   r   )
r)   rr   project_typerq   r+   parent_filtrv   rw   rx   r,   s
            r-   r   zCmfProject.get_tree_leaf        %%%r.   )fieldsrq   r}   filter_projectc                     t          d          r|   )	rf   rN   poprL   r   listrh   CmfListtree_fields)r)   r   rq   r}   r   argsr+   project_filterproject_fieldsry   rw   rv   rx   s                r-   rm   zCmfProject._get_tree_data        %%%r.   c                      t          d          r|   )rf   rN   rL   	CmfFolderrl   sys_type
tree_nodesr3   sortsplitr2   hasattr
isinstancer   )r)   ry   rr   hide_project_partsfolderrs   rz   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)rj   namer   systemtree_hiddenFnotify)rL   r   rN   r_   )r5   r   s     r-   scaffold_trashcanzCmfProject.scaffold_trashcan   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]]]    Фильтр для доски "" rz   project = ""["project.id", "=", ""]r`   r   
view_scopeubqlbqlFr   zboard.scrum:defaultzboard.simple:default)project.agileproject.simple-boardrj   r   r@   kanban_bql_filterr   )rL   CmfBqlFilterrG   r2   r_   rN   logic_prefixCmfKanbanBoard)r5   r   r   ft_add_ubqlactive_sprints_filterlt_mapltactive_sprints_boards           r-   scaffold_active_sprintsz"CmfProject.scaffold_active_sprints  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   rz   r   r   r   r   r   Fr   Tr   )is_scaffold_kanban_boardr   )rL   r   r   rG   r2   r_   r   )r5   kanban_namer@   r   kanbans        r-   scaffold_kanban_boardz CmfProject.scaffold_kanban_board  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)rj   r   r   tmp_bql_filterfilter_parentr   )rL   r   r_   r   )r5   r   r+   backlog_filterr   s        r-   scaffold_backlogzCmfProject.scaffold_backlog4  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:defaultrU   u   Простая доскаu)   Простая доска проекта r   T)rj   r   text	list_typeui_view_formr@   r   Fr   ztask.base:defaultu*   БП Задач Простой доски )r   templatehiddenworkflow=rG   NOT IN)openin_progress	in_reviewr"   rH   )rL   CmfLogicTyperN   r   r   r_   CmfWorkflowrG   	CmfStatusr   deletedefault_task_workflow)	r5   r   r+   lt_boardsimple_boardr   wfunneeded_statusesstatuss	            r-   scaffold_simple_boardz CmfProject.scaffold_simple_boardC  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 )NCmfDocumentr`   rj   typeu!   Реестр документовTr`   rj   r   r   r   Fr   rL   CmfRegistryrN   r_   )r5   doc_registrys     r-   scaffold_doc_registryz CmfProject.scaffold_doc_registryh  su    )--TtR_-`` 	F))4 * 
 
 	'''''r.   c                     t           j                            | | d          }|rd S t                               | | ddd          }|                    d           d S )N
CmfCompanyr   u%   Реестр контрагентовTr   Fr   r   )r5   company_registrys     r-   scaffold_company_registryz$CmfProject.scaffold_company_registryv  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rj   r   r   r   Fr   u
   Курсы	CmfCourse順 rj   r`   r   r   r   ordernou   ВопросыCmfQuestion@ u   Набор вопросовCmfQuestionFolderi    Отчеты	CmfReporti  u?   Отчет. Отчет по результатам курсовlms_course_summary)r   rj   report_typer   u.   Отчет. Сводка по ученикамlms_student_summaryu.   Отчет. Сводка по заданиямlms_jobu+   Отчет. Результаты тестаlms_exam_resulti )rL   r   r_   r   r   )r5   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   r5   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)rj   r`   r   r   r   r   u   Тест-кейсыCmfTestcaser   r   u   Тест-планыCmfTestplani u!   Выполнение тестовCmfTestcycleip u   КонфигурацииCmfTestConfigurationiX )rj   r   r`   r   r   r   u   ПараметрыCmfTestParami@ u   ОкруженияCmfTestEnvironmenti( )rL   r   r   r_   )r5   rj   s     r-   scaffold_testszCmfProject.scaffold_tests  s    	 **    +  K 	#& 	 	
 	
 $&&&#& 	 	
 	
 $&&&#4 	 	
 	
 $&&&#+' 	 	
 	
 $&&&#% 	 	
 	
 $&&&#%% 	 	
 	
 $&&&r.   c                 |    t           j        j        j                                        }|                    |           S r?   )rL   CmfRFiledpdata_driverget_rd	get_rfile)pathrdisks     r-   
_get_rfilezCmfProject._get_rfile  s/     ".5577t$$$r.   c                     |                      |                                                               ddd           dS )u   Создадим папку проекта, если её нет. Может так же нужно проверять "Документы"? T)is_direxist_okparentsN)r  r  createrR   s    r-   ensure_project_dirzCmfProject.ensure_project_dir  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_fieldsr  is_project_dir_existr  r  perm_strr  r   r!  all_relation_persons)r5   	dir_rfiler%  users       r-   _sync_rdisk_folderzCmfProject._sync_rdisk_folder  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   r  r  existsr  s     r-   r$  zCmfProject.is_project_dir_exist9  s4     	9Dt//5566==r.   )r}   rq   c                "    t          d          r|   )rf   rg   r'   r   r   r  )r)   r}   rq   r   r+   resrz   r,   s          r-   r   zCmfProject.get_full_tree>  r   r.   c                 5   | j                                          | j         r|                                  t          j                            d          }t          j                            d          }t          j                            d          }t          j                            d          }t          j                            d          }t                              d           dd	lm	}   |d
g                       }| 
                                 | j        sxt                                          }t          j                            d          |_        | |_        d| j         |_        d|_        |                    d           || _        t          j                            d          j        }	t                              | 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&d| j         d'          |_        t                              | | d(d)d          |_         t                              | d*d+d          |_!        t          "                    | d,d-.          |_#        t                              | d/d0d          |_$        t                              | d1d2d          |_%        t                              | d3d4d          |_&        t                              | d5d6d          |_'        t                              | d7d8d          |_(        t          j                            d9| j)        :          |_*        t                              | | d;d<d          |_+        t          ,                    | d=d>| j         d?|d@          |_-        t                              | dAdBd          |_.        t                              | dCdDd          |_/        t          0                    | | gdE| j         dF          |_1        | 2                                |_3        | j4        dGk    s| 5                                |_6        | j4        dHk    r| 7                                |_8        nf| j4        dIk    r| 9                                |_8        nA| j4        dJk    r| 9                    dKdLM          |_8        n| :                                |_8        t          "                    | dN| j         | j;        | j<        O          |_=        |j=        | _>        | j?        rNt                              |j        dPd| j         dQ          |_@        | j4        dRv}
|
r&t          ,                    |j+        dST          |_A        t          B                    |j!        dUT          |_C        t          "                    |j#        dVT          |_D        |
rxt                              | |j$        dW|X          |_E        t          ,                    |j%        dYdZ|[          |_F        t          ,                    |j&        d\d]|[          |_G        t          H                    |j(        d^d_          |_I        d`|j8        _J        da|j(        _J        db|j*        _J        dc|j        _J        dd|j        _J        de|j!        _J        df|j#        _J        dg|j$        _J        dh|j&        _J        di|j%        _J        dj|j+        _J        dk|j'        _J        dl|j-        _J        dm|j.        _J        dn|j/        _J        do|j3        _J        dp|j1        _J        dq|j         _J        | j4        drk    r| K                                |_L        d|j8        _M        d|j(        _M        d|j*        _M        d|j        _M        d|j!        _M        d|j$        _M        d|j&        _M        d|j%        _M        d|j'        _M        d|j.        _M        d|j/        _M        d|j3        _M        d|j1        _M        d|j-        _M        d|j        _M        d|j6        _M        | jN        dsk    rdnd|jL        _M        |jO        P                                D ]}|                    d           d| _Q        d| _R        d| _S        d| _T        d| _U        d| _V        d| _W        d| _X        d| _Y        d| _Z        d| _[        d| _\        d| _]        d| _^        d| __        d| _`        d| _a        d| _b        d| _c        d| _d        d| _e        | jN        dsk    rdnd| _f        |                     ddt           | j4        duk    rd|j.        _M        d|j/        _M        d|j1        _M        d|j3        _M        d|j-        _M        |jO        P                                D ]}|                    d           d| _R        d| _Q        d| _S        d| _T        d| _U        d| _V        d| _W        d| _X        d| _Y        d| _Z        d| _[        d| _\        d| _]        d| _^        d| __        d| _`        d| _a        d| _b        d| _c        d| _d        d| _e        |                     ddt           t          jg        jh        ji        }|D ]}}|dvk    r	t          g                    ||         |j'        |w          |_j        dx|jO        v r|j@        |jj        _k        |dyk    rd|jj        _        |jj                            d           ~| j4        dGk    rd|j         _M        d|j(        _M        d|j*        _M        d|j        _M        d|j$        _M        d|j&        _M        d|j%        _M        d|j+        _M        d|j'        _M        d|j-        _M        d|j.        _M        d|j/        _M        d|j1        _M        d|j3        _M        d|j        _M        d|j#        _M        d|j8        _M        |jO        P                                D ]}|                    d           d| _R        d| _Q        d| _S        d| _T        d| _U        d| _W        d| _X        d| _Y        d| _Z        d| _[        d| _\        d| _]        d| _^        d| __        d| _`        d| _a        d| _b        d| _c        d| _d        d| _e        |                     ddt           | 5                    |            | j4        dIk    rd|j$        _M        d|j&        _M        d|j.        _M        d|j/        _M        d|j1        _M        d|j*        _M        d|j3        _M        d|j-        _M        d|j6        _M        |jO        P                                D ]}|                    d           t          jl                            dz          | _m        d| _Q        d| _S        d| _T        d| _U        d| _V        d| _W        d| _X        d| _Y        d| _Z        d| _[        d| _\        d| _]        d| _^        d| __        d| _`        d| _a        d| _b        d| _c        d| _d        d| _e        |                     ddt           t          jg        jh        ji        }|D ]}}|dvk    r	t          g                    ||         |j'        |w          |_j        dx|jO        v r|j@        |jj        _k        |dyk    rd|jj        _        |jj                            d           ~| j4        d{k    rd|j8        _M        d|j(        _M        d|j&        _M        d|j.        _M        d|j/        _M        d|j1        _M        d|j*        _M        d|j3        _M        d|j-        _M        d|j6        _M        |jO        P                                D ]}|                    d           d| _Q        d| _S        d| _T        d| _U        d| _V        d| _W        d| _X        d| _Y        d| _Z        d| _[        d| _\        d| _]        d| _^        d| __        d| _`        d| _a        d| _b        d| _c        d| _d        d| _e        |                     ddt           t          jg        jh        ji        }|D ]k}|dvk    r	t          g                    ||         |j'        |w          |_j        dx|jO        v r|j@        |jj        _k        |jj                            d           l| j4        dHk    rd|j         _M        d|j(        _M        d|j*        _M        d|j        _M        d|j!        _M        d|j$        _M        d|j&        _M        d|j%        _M        d|j+        _M        d|j'        _M        d|j-        _M        d|j.        _M        d|j/        _M        d|j1        _M        d|j3        _M        d|j        _M        d|j6        _M        |jO        P                                D ]}|                    d           d| _R        d| _Q        d| _S        d| _T        d| _U        d| _W        d| _X        d| _Y        d| _Z        d| _[        d| _\        d| _]        d| _^        d| __        d| _`        d| _a        d| _b        d| _c        d| _d        d| _e        |                     ddt           | j4        dJk    r)t          jn                            d|          | _o        t          jp                            d}          | _q        | r                    d~d          }| r                    dd          }| r                    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}| s                    |           | t                    ddt          j                            d          |||d           t                              | ddd          |_u        t                              | d| j)         dd| j         d          |_v        t          w                    |ju        | |jv        d          |_x        t                              | d| j)         dd| j         d          |_y        t          w                    |ju        | |jy        d          |_z        t                              | d| j)         dd| j         d          |_{        t          w                    |ju        | |j{        d          |_|        t                              | dddd          |_}        t                              |j}        dd.          |_~        t                              |j}        dT          |_        t                              | ddd          |_        t                              | ddd          |_        | K                                |_L        d`|ju        _J        da|j8        _J        db|j}        _J        dc|j        _J        dd|j        _J        de|j        _J        df|j'        _J        dg|j3        _J        dh|j/        _J        di|j.        _J        dj|j1        _J        dk|j!        _J        d|j(        _M        d|j8        _M        d|j*        _M        d|j#        _M        d|j$        _M        d|j&        _M        d|j%        _M        d|j+        _M        d|j-        _M        d|j3        _M        d|j.        _M        d|j1        _M        d|j/        _M        d|j!        _M        d|j         _M        d|j        _M        d|j6        _M        d|jL        _M        |jO        P                                D ]}|                    d           d| _c        d| _        d| _Q        d| _S        d| __        d| _        d| _        d| _        d| _b        d| _T        d| _U        d| _W        d| _X        d| _d        d| _        d| _        d| _        d| _        d| _Y        d| _\        d| _a        d| _V        d| _R        d| _f        d| _e        |                     ddt           t          jg        jh        ji        }|D ]y}|                    d          rbt          g                    ||         |j'        |w          |_j        dx|jO        v r|j@        |jj        _k        |jj                            d           z|                                  |                                  |                                  |                                  d-S d-S )uU    Добавляем структуру папок в новый проект
        zlist.pfeed:defaultrU   ztask.epic:defaultzlist.agile_sprint:defaultzlist.release:defaultzlist.base:defaultuc   Вызываем разворачивание чтобы появилась папка задачиr   )make_dataclass	DataEmptytask.gantt_project:default	   Гант TFr   r"   u   Фильтрыrq   r   u   ЗадачиCmfTask)rj   r`   r   r   r   u$   Мои открытые задачиr   z?" and responsible in (currentUser()) and cache_status_type != "r   )rj   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" and cmf_modified_at >= "-1w"u   БлогCmfDocument-blogu   Компоненты
componentsu   ДокументыN)rj   r   r   EpicsepicReleasesreleaseSprintssprintr   reportsRoadmapsroadmapr   )r   rr   u   Спискиr   u
   Лентаu   Лента проекта pfeed)rj   r   r   r   r@   r   u   Дискdisku
   Архивarchiveu   Чат )rj   	executorsr   r   project.evatestr   zproject.kanbanproject.servicedesku
   Доскаzboard.sd_kanban:default)r   r@   z	HomePage )r`   r   r   
cmf_authoru   Фильтр1z$" and responsible in (currentUser()))rD  project.wikirC  u   Список1)rj   r   u   Компонент1u   Документ1Epic1)r`   rj   r   r@   u   Релиз1r   )rj   r   r   r@   Sprint1r   u   Roadmap Проекта)rj   r   r   r   i i i i" iI i q i i  i0 r   iP4 i`[ ip i i i i rF  sectionr[   r   r   mark)r   rj   r   filters_filter1agile_sprintzkanban:defaultzproject.basezsystem:servicedeskzui_form_scheme_sd:defaultzui_form.sd_view:defaultu   Просмотрzui_form.sd_create:defaultu   Созданиеzui_form.sd_view_inner:defaultu(   Просмотр в приложенииu
   Общее"   Получить ИТ помощьuZ   Получите помощь по общим ИТ-проблемам и вопросам.task.sd_service_request:defaultzservice-requests)r   r   r@   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   r@   rQ  rR  rS  rP  u   Очередиqueuez[["parent_id", "=", "z*"], ["cache_status_type", "!=", "CLOSED"]]z!" and cache_status_type != CLOSEDr`   r   r   u   Все обращения)rj   r`   
bql_filterr   zT"], ["responsible", "=", "__G_CURRENT_USER"], ["cache_status_type", "!=", "CLOSED"]]zC" and responsible = "currentUser()" and cache_status_type != CLOSEDu   Назначенные мнеz)"], ["cache_status_type", "=", "CLOSED"]]z " and cache_status_type = CLOSEDu#   Закрытые обращенияu   База знанийknowlage_basereadonly)rj   r   r   perm_policy_guestr   u   Категорииknowlage_base_categoriesu   Статьиu   Каналыservicedesk_channelsu   Клиентыservicedesk_clientsanalysis)r  ra   r)  rL   r   rN   logginginfodataclassesr/  r   main_gantt_projectr3  r@   r`   r   r   r_   CmfStatusCoder   rq   r   tasksr   rG   tasks__filter2tasks__filter3tasks__filter4tasks__filter5tasks__filter6tasks__filter7tasks__filter8blogr5  r   docsepicsreleasessprintsr<  roadmapsr2   r   listsr   r?  r@  rA  CmfChatGroupchatr   r   r   r  r  r   kanban_boardr   r   r   rE  homepagedescr_documentsl_create_examplesfilters__filter1lists__list1CmfComponentcomponents__component1
docs__doc1epics__epic1releases__release1sprints__sprint1
CmfRoadmaproadmaps__roadmap1r   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_learnCmfTaskReportr   choicesreports__report1report_bql_filterCmfSchemeWfrD   CmfProjectNotifySchemenotify_schemerW   rV   _create_ui_view_form_create_sdesk_request_group_create_sdesk_request_typerX  queue__queue1_task_filterCmfTaskQueue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
startswith_create_assign_to_project_create_sdesk_slascaffold_line_chartscaffold_mark)r5   lt_pfeedlt_epic	lt_sprint
lt_releaselt_baser/  tgantt_projectclosed_status_namecreate_list_examplesvr   item_ui_form_view_ui_form_create_ui_form_view_innerrequest_groupss                     r-   scaffoldzCmfProject.scaffoldN  s@    	!!! 	&##%%%&**0D*EE%))/B)CC'++1L+MM	(,,2H,II
%))/B)CC 	z{{{......+NN;++-- 	 & 	4"NN,,M'-':'>'>D`'>'a'aM$#'M !8TY!8!8M#'M e,,,&3D##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 / 
 

 "..8HtyHHH / 
 
 ##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$(AI!"&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%%% 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   rY  Fr   r<  Trj   r   r   rK  r`   rj   r   r   r  )rL   r  rN   r   r2   rG   r_   r   )r5   report_namereportr  s       r-   r  zCmfProject.scaffold_mark  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#ea632br@   rU  )r   r  r  r  
row_filteru]   Анализ SD. Отчет по выполненным SLA против нарушенныхu   Выполненоsd_sla_processedz#14892cu   Нарушеноsd_sla_breachedz#d04437uQ   Анализ SD. Отчет по инцидентам по приоритетамu   Критичныйr     )r@   priority)r   r  r  r  u   Высокий   u   Обычныйz#815b3ar   u   Низкийu   Минимальныйz#d39c3fu>   Анализ SD. Отчет по уровню успеха SLA+   Время до первого ответаsd_sla_compliance_percentz#59afe1uO   Анализ SD. Отчет по запросам на обслуживаниеu3   Все запросы на обслуживаниеrO  z'task.sd_service_request_approve:defaultu   Все)r@   request_typerN  rT  uM   Анализ SD. Отчет по проблемам по приоритетуztask.sd_problem:defaultr   r  r  r  r   r   r   rY  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   N .0r  s     r-   	<genexpr>z1CmfProject.scaffold_line_chart.<locals>.<genexpr>  s*      ,Q,Q!XXXX,Q,Q,Q,Q,Q,Qr.   z in ()rG   INrH    c              3   "   K   | ]
}d | d V  dS r  r  r  s     r-   r  z1CmfProject.scaffold_line_chart.<locals>.<genexpr>  s*      ,H,H!XXXX,H,H,H,H,H,Hr.   z["z
", "IN", [z]]r  z = "z	", "=", "r  z and [z ,])rN   rL   r  r   r2   rG   r_   r   CmfRepLineChartRowr`   r   r  r  CmfSDeskSlar  ri   joinr   r   r3   CmfSDeskRequestTyper3  r  r  r   r   row_bql_filter)r5   r  chartr  r  r  r  rowrow_task_filter	chart_rowr  ubql_filterrZ  r  fieldvalslogic_typesbql_valsr   r  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 )
NrU   u3   Отсутствует экранная форма Tr\   : r3  FrJ  )obj_copy)	rL   	CmfUiFormrN   rb   task_code_prefixr   cmf_model_namer_   r   )r5   rG   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:defaultrU   zsdesk-agent:default)rL   CmfProjectRolerN   CmfProjectRoleAssignr`   project_rolemembersri   gcurrent_userr_   )r5   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:defaultrU   r  date)r`   r   widget_type     z+request_type.request_category = 'incidents')r`   r   	goal_timer   calendari  i  z2request_type.request_category = 'service-requests'i  i`	  z7request_type.request_category = 'post-incident-reviews'i  r  startzissue-created)r`   trigger_typetrigger_conditionzresolution-clearedstopzresolution-setr  x   zcomment-for-reporterzstatus-type-changedsd_waiting_for_customer)r`   r"  r#  trigger_condition_status_codeu;   Время закрытия после разрешенияi  zBrequest_type.request_category in ['incidents', 'service-requests']r"   u/   Время на проведение ревьюz)request_type.request_category = 'changes'r   sd_declinedsd_implementingsd_planning)rL   CmfCalendarrN   r  r_   CmfSDeskSlaGoalCmfSDeskSlaTriggerrf  )r5   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   r2   r!   rH   u   Проект с именем uA    уже существует. Укажите другое имя.Tr\   u-   Раздел на диске с именем uF    уже занят. Укажите другое имя проекта.)rL   r   slistr   r2   rb   r$  rR   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   r   rG   rH   u7    с таким именем уже существуетTr\   )ri   rN   rb   verbose_name)r)   r   rG   
prj_filters       r-   _check_uniquezCmfProject._check_unique  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   rG   )r?  r'   r  )r)   r   rG   r   r+   r,   s        r-   r  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)approvedrA  r?  rg  r@  rw  r7  r;  r9  r>  r   r[  r<  rq   rX  r5  r_  r`  r  r   r   CmfActiveEntityFiltershow_r   r   r   rH   rg  )r   r   r   TrZ   r   zlist.rr   r   )r   r   r   )r   r   r   r   rj   )zlogic_type.coder   r   )rj   )r   r   r3  )r   r   r   )r   r   r4  )r   r   CmfReq)r  rJ   rh   rL   rN   r2   r3   r   r_   r   show_doc_registryr   show_company_registryr  rv  r  r   r   r  r   r  r  r  r  )r5   	sys_typesnode_modelsr   	fieldname	nodeclasssysnodes          r-   _calc_hidden_nodeszCmfProject._calc_hidden_nodes  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  r   rI   rV   cmf_project_adminsr  r}   )r'   save_preload_fieldsrB   s    r-   rW  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<   Нельзя менять родителя у проектаrI  zCmfWiki:Classrz   zCmfProject:Class)r`   rJ   rj   rb   r}   r   rr   rR   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   rJ   rL   r   confluence_convertr3   r2   rR   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        |           }                     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+-r  c                     g | ]
}|d          S )r   r  )r  chunks     r-   
<listcomp>z3CmfProject.get_prefix_from_name.<locals>.<listcomp>2  s    ;;;5eAh;;;r.      z--r  ILIKE%r   r&   c                 @    g | ]}|j                                         S r  )r  lower)r  rz   s     r-   ra  z3CmfProject.get_prefix_from_name.<locals>.<listcomp><  s'    QQQW06688QQQr.   c           
          g | ]x}|                                                               )                    d d|                                                                                    d                    yS )z\Dr  )r  rg  subreplace)r  pprefixres     r-   ra  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)rm  r   translit_stripri  rg  r   lenr  rL   r   r9  setr   maxstrintupper)	r   slugchunksprojectsprefixesexisting_prefixesmax_prefix_numrl  rm  s	          @@r-   get_prefix_from_namezCmfProject.get_prefix_from_name'  s   			 	2%d++vvfc4::<<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\   r2   r!   r  r   r   )r&   r   include_deletedu   Код u2    уже используется проектом u   . Выберите другойrG   LIKEz-%rz   zproject.nameu8    ранее использовался проектом u   . Это может привести к пропускам в нумерации кодов. Если это нежелательно - укажите другой префиксur   Запущен фоновый процесс смены префиксов кодов у задач проекта)r   )r  rJ   task_code_use_logic_type_prefixr3   rv  code_prefixrb   rL   r   rN   r2   r   CmfTaskCodeHistoryrz   is_newschedule_deferred_jobr3  recalculate_codes_celery)r5   project_with_prefix	code_useds      r-   _calc_task_code_prefixz!CmfProject._calc_task_code_prefixI  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                 p   ddl m} | j                                          || j        j        pddd          }d t
                              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  r  cs     r-   ra  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})Nrb  r  r  c              3   &   K   | ]}|d          V  dS )r   Nr  r  s     r-   r  z@CmfProject._calc_task_code_prefix_for_section.<locals>.<genexpr>  s&      33A1Q4333333r.   r  r   r2   r!   rH   )transliterater  r   ra   r3   rm  findallrq  r  rv  rL   r   sgetr2   r  )r5   r  rG   	code_listis        r-   "_calc_task_code_prefix_for_sectionz-CmfProject._calc_task_code_prefix_for_sectionw  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_grouprb   rV  rJ   r  rO   )r5   personraise_exceptionrV  s       r-   is_project_adminzCmfProject.is_project_admin  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  rL   CmfEmailListrN   r_   )r5   wlbls      r-   _calc_white_black_listsz"CmfProject._calc_white_black_lists  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  rJ   rL   r   r  r   )r5   r   s     r-   _calc_structure_scaffoldz#CmfProject._calc_structure_scaffold  s     { 	*t2= 	*$BU 	*%**$*MMF *'')))))	* 	* 	* 	* 	* 	** *r.   c                 f   | 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#        rx|                     | j        j#                  rY|                     |                     | j        j#                            }|                    |                                            | 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          }|| _,        | .                                 | /                                 | j0        s1| j1        dk    r| 2                                 nt          d d           | 3                                 | 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\   )rG   r   r  rH   ri   u   Пользователь uO    добавлен в группу Администраторы проектовr   r   r2   r!      Проект     уже существуетr  _%Y-%m-%d-%H%M%SFre  <   Имя проекта не может быть пустым.r2  rZ   rD  servicedesk:defaultrU   system.open:defaultsystem:default)
is_defaultrI  u8   Укажите Префикс для кода задачdont_scaffoldonboarding_statusr   r"   cancelr&   r   )Lr  r  r  is_admindisable_permissionsacl_admin_moder  rb   rV  ri   rJ   rL   CmfPersonGrouprN   
rg_members
all_nested_changesr   disable_aclr_   current_person__member_ofaddr2   r3   r   r   r$  r  r  r+  renamer   nowr#  r:  rO   re  rG   rM  rU  r   CmfProjectPermSchemer  r  r   r+  r\  rc   r  r}   r  r  rS   rX   r7   r'   servicedesk_publicr   cmf_owner_assistants
spectatorsrB  trigger_reloadr  r  r  r)  rF  r   rG  r   r  scaffold_req_registry
CmfLicenser   r  r  )r5   r   r+   project_admins_groupproject_admins_group_memberschange_actionpr_adminr  r+  project_dir_rfileshould_be_scaffolded	old_rfiler   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} 5!:!:49=!I!I 5 OOD,<,<TY],K,KLL	  !1!1!3!3444& =/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
	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   r   r2   r!   rH   r  r  Tr\   r  r  r  div)tags_extendFr  rD  r  rU   r  r  rI  r  r   r"   r  r  rZ   ),r  rL   r   rN   r   r2   rb   r$  r  r  r+  r  r   r  document_header_textrJ   r   
html_cleanr3   document_footer_textr:  rO   rG   rM  rU  r   r  r  r  r\  rc   r  r}   r  r}  r  rS   r'   _save_importr  r  r   r  r_   )r5   r   r+   r+  r  r  r  r  r  r  r,   s             r-   r  zCmfProject._save_importC  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   )r   rz   r`   r2   r   zCmfTask:zPPP-TSK-ORDERrs   zPPP-OBJ-ORDERr   r  r  TrZ   )getattrrL   r   rN   rz   r  r   check_edit_permr   r3   ru  r_   )r)   item_id	anchor_idnext_id
item_modelr  anchor_modelanchoranchor_orderno
next_model	next_itemnext_ordernos               r-   r   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  rR   s    r-   
_calc_codezCmfProject._calc_code  s	     	r.   c                     d S r?   r  rR   s    r-   get_code_prefixzCmfProject.get_code_prefix  s    r.   F)	recursiveTEXKOM_db_deletec                   | j                                         r0|s.t          dt          j         dt                       dd           | j        j        }|rd | _        | 	                    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 t9                      j        |||ddd|}|                     |          r5t          j                            |          }|r|                                  |S )Nu   Данный проект был импортирован из внешней системы. Удаление импортированных проектов доступно через <a href="u@  " target="_blank">службу технической поддержки</a>.<br />Если Вам необходимо обновить данные проекта, пожалуйста, воспользуйтесь процедурой повторного импорта проектов через меню <a href="u"   settings/import">Импорт</a>.Tr\   rZ   )r~  rv  r  CmfAttachmentCmfImportDownloadr3  r   CmfTransr   r   r  rf  r  r   	CmfPersonr  r   CmfTaskFilterr  r   r   r`   r   )r&   r  include_systemu   Удаляем )r2   r  r  )r  force)rz   r  r  r0   )r&   r  r;   r  u   Удаляем из кеша F)r  r  r  r   )!
cmf_importra   rb   configSUPPORT_URLapp_base_hrefr   r3   re  r_   rh   rL   r   r  debugr  r2   r   commit_with_eventCmfGanttTaskr  CmfDocumentHistoryCmfAccessRulebulk_updateCmfAccessListCmfCustFieldConfr;   remover'   r$  r  rN   move_to_trash)r5   r  r  r   r+   cur_namecls_namer  
gantt_task	task_codedoc_historycust_field_confr-  r  r,   s                 r-   r   zCmfProject.delete  s   ?!! 		*: 		P".P P
 *OOP P P     9? 5	5&*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.   c                      t                      j        dddi|}t          j                            | j        j        |                                            |                                  |S )Nr  Tr  )	r'   restorerL   r  restore_from_trashr   r3   r  r)  )r5   r+   r-  r,   s      r-   r  zCmfProject.restore  sb    eggo<<T<V<<**49?D<L<L<N<NOOO!!!
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   )hoursr   r   plan_start_date<)r    r!   CLOSED)
alarm_dater   Nr
   r  )	r   r  r   utcr   rL   r3  r   r2   )r5   r  rg  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")
            r  )r  r   rs   msgr  )
auto_alarm_dater  printr   r   r3   rL   	CmfNotifyplace_notifycaption)r5   rg  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)	only_once
system_jobschedulec                      t           j                            d          D ];} |                                 }|D ]"}|j        |_        |                                 #<d S )NT)r!  )rL   r   r   r  r  r  r_   )rz   rg  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)rL   r   r   r&  rz   s    r-   &notify_project_owner_not_planned_tasksz1CmfProject.notify_project_owner_not_planned_tasks0	  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  )r2   r3   )r  tags     r-   
<dictcomp>z5CmfProject.hook_task_tags_changed.<locals>.<dictcomp>A	  s    DDD3SV\3DDDr.   r   )r   r   tagsc                 (    i | ]}|j         j        |S r  )r   r3   r  r   s     r-   r5  z5CmfProject.hook_task_tags_changed.<locals>.<dictcomp>F	  s5     Q Q Q KvQ Q Qr.   )rr   filter_tag_idrr   r   r   )r   r   r4  re  )r`   rj   r   z: Create new filter for z with category Fr   #r4  )rj   r   r   r   
filter_tag)rL   r   rN   r2   r   rC  r9  r3   r   tag_categoryra   r   r_   rr   itemsr  r  )
r5   r1  task_tags_id_dicttasks_filtertags_foldercategory_folders	ae_filterr4  category_foldertag_ids
             r-   hook_task_tags_changedz!CmfProject.hook_task_tags_changed8	  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)   r4  s     r-   hook_new_tagzCmfProject.hook_new_tagv	  s    r.   c                     dS )NTr  rR   s    r-   has_tree_nodes_hookzCmfProject.has_tree_nodes_hookz	  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)$r2   r   rG   cmf_owner_idr  activity_idr   r@   zworkflow.namer   cmf_created_atr}   r  description	is_publicsharelink_hashperm_policy_anonymousr]  perm_policy_sharelinkperm_policyrN  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_jsr   )rL   r   rN   _acl_check_readCmfPermissionError)r)   r   r+   fields_to_returnrz   s        r-   
public_getzCmfProject.public_get	  s    %
 %
 %
N ,x#'888 	4	##%%%%! 	 	 	44	 s   : 
AAc                 6    t          j        j        | g|R i |S r?   )rL   r  r   )r5   r   r+   s      r-   r   z$CmfProject.check_project_role_access	  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)rJ   cache__id)rV  rD   r  security_level_schemerV   rU  
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  rJ   rr  r  rl   project_perm_allow_fieldsr  endswithr  r
  r  r  r  r#  r  rb   r  r  rO   rQ   r   )r5   changed_fields_to_checkr  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_permrB   s    r-   rm  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   rW  r   r@   rP  rQ  rR  rS  )r   r   r@   rP  grouprQ  rR  rS  )rL   CmfSDeskRequestGroupr`   rN   r   r_   r  )r5   groupsro  request_groupr  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?   )rL   r  r`   r   r   r@   rQ  rR  rS  request_categoryrr  ri   r_   )
r5   r   r   r@   rP  ro  rQ  rR  rS  r  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_namerG   rR   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^  rb  )cmf.utilrz  r'   gen_coderq  short_str_enc)r5   rz  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_archivedrO  cmf_deletedr  cmf_locked_atcmf_locked_bycmf_modified_atcmf_modified_bycmf_viewed_atrG   commentsr   	documentsext_idfavorite_forhas_tree_nodesr2   import_originalimport_raw_jsonlocal_linkslocal_links_docs_inlocal_links_tasks_inr   rR  re  r   status_closed_atstatus_in_progress_endstatus_in_progress_startstatus_modified_atstatus_review_atr  rg  r   task_filtersT)
is_definedr^  perm_)r   rL   r   r  rl   rh  r  r   cmfr   
CmfBackrefsetattrr3   r=  )r5   r   r+   new_projectskip_fieldsr  attrr3   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   rG   r  structure_copy	full_copynotify_person_idr+   r   rG   r  r  r  r  )rL   r   countr3  rg   rt  r2   r  current_personr3   r  create_from_template_jobdo_create_from_template)r5   r   rG   r  r  r  r+   
job_kwargss           r-   r   zCmfProject.create_from_templateG
  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'  rP  show_bg_progressbarc                    	 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-   Создан проект по шаблонуr2   uA   Ошибка создания проекта по шаблону r  uB   Ошибка создания проекта по шаблону: T)r  r  )rs   r  r   r   force_notify_current_personr  )r   rN   r  r   rf   rollback_purge_event	traceback
format_excr  r  rL   r#  r$  )r  r   r  rG   r  r  r  r<   rz   r  notify_name
notify_msges                r-   r  z#CmfProject.create_from_template_jobS
  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                 r   d fdd }fd}d fd|rd}t           j                            | j        dg	          }	g |	_        g |	_        |	                    |p	|	j        d
z   |||           }
|
                    dd|           |r |
|
t          |	j
                             |rh ||
|	            ||
           |	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_acln
  sb    %%'''--///&&(((""$$$,,.....r.   c                 V   |D ]#}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	            | |t!          |j                             %d S )
Nr   T)r   copy_attachmentsr   Fr   r   r   emit)noitfyr  r[   )r   rL   rC  r3  rv  r   r#  r   r   rj   r`   rz   r   r  r_   r   r   r   )r  
new_parentorig_children
orig_child	new_childr   r  _copy_tree_nodess         r-   r  z<CmfProject.do_create_from_template.<locals>._copy_tree_nodesu
  sB   + V V
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  ij>S9T9TUUUU+V V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 )	Nrz   r   cloned_fromr  r.  )out_linkr   )r  )r  in_link)rL   r3  r9  CmfRelationOptionr   r  r2   r  r  r   r   r3   )rz   r+  relin_tasknew_rels        r-   _copy_relation_optionszBCmfProject.do_create_from_template.<locals>._copy_relation_options
  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           	      	   d t           j                            | d          D             }|                    d t           j                            | d          D                        |j                                        }|                    dg            ||           }d| j         |_        d |_	        |
                    dd           |                                 |
                    dd           || _        | 
                    dd           t           j                            |g d	
          }i }g }|D ]a}||k    r
 ||           }	|j        |j        |j        |j        d}
|
                                D ]v\  }}|D ]n}|j        |k    rt'          |	|                              |           t'          |	|                              ||j         d|j        j                             ow|	j        r0||	j        j        j         d|	j        j        j                  |	_        d |	_        |	j	                                        }|	j	        j        |_        |	j	        j        |_        | |_        d |_        d|_        d|_         d|_!        d|_"        d |_#        d |_$        tK          d          |_&        tK          d          |_'        g |	_(        g |	_)        |	
                    ddd           |	j        s|	                                  |	           |	|_*        |
                    dd           |j(        |	_(        |j)        |	_)        ||	_	        |	
                    ddd           |	j+        dv r|	||j,        <   L|                    |	           c|t          |-                                          z   D ]}|j        r|j        |k    r||_        nQ|.                    |j        j,        d           }|r/t           j        .                    |j/        j                  |_        |0                                 |                                  |	           |
                    ddd           |j        |j	        _        |j	        
                    d            | ||           d S )Nc                 <    i | ]}|j          d |j        j         |S r  rl   r   r3   )r  lsts     r-   r5  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  )r  comps     r-   r5  zKCmfProject.do_create_from_template.<locals>._copy_tasks.<locals>.<dictcomp>
  sB     ,t ,t ,t]at,R,R,R,RTX ,t ,t ,tr.   ***r2  Fr  r   )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   )r+  r  )ru  fix_versionsaffected_versionsr5  r  r   z0.00r  r   r[   	task.epicztask.subprojectr  )r   r  r[   rZ   )1rL   r   r   updater~  re  ra   r#  r   op_gantt_taskr_   _calc_gantt_taskr3  ru  r  r  r5  r=  r`   r  r
  ri   rl   r3   	main_listr  r  r   rE  rz   parent_taskactual_workactual_durationactual_completeactual_myself_workactual_start_dateactual_finish_dater   actual_costactual_myself_costr  rB  r+  r   rG   r  rN   r2   _calc_gantt_path)r  orig_projectnew_project_params_dictorig_main_gantt_projectnew_main_gantt_project
orig_tasksparent_tasksrg  	orig_tasknew_taskparams_lists
param_namer  r  r  r+  new_parent_taskr  
_copy_task_copy_task_filterss                    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"''U5'AAA"33555"''U5'AAA-CK*%666,,L Jx Jx Jx, y yJ LE' 2+ 2+	 777%:9MMM&_$-$:)2)D"+"6	    (4'9'9';'; ~ ~OJ # ~ ~;,66$*55<<TBBB*55<<=TX\XgU{U{jnjsjyU{U{=|}}}}	~
 % K)@HDVD\Dg  BJ  BJjrj|  kB  kH  BJ  BJ  *KH&)-& ( 6 < < > >*2*@*J'+3+A+L((3%,0),-)01-01-34026/370,3FOO)3:6??0&(#%'"5$GGG+ (--///Ih'''%-"""e"<<<&/&:#%.%8")6&5$GGG(,LLL3;L00LL****\%8%8%:%: ; ;; < <# <'+BBB+A((*6*:*:4;K;PRV*W*W* _/5~/A/A_EWE]/A/^/^D,))+++))+++Ih'''IIU$IGGG595ED&2&++d+;;;{L:QRRRRRr.   c                 V   |                                  }| j        |_        | j        |_        ||_        ||_        |j        dv r0t          j                            | j	        j
        |          |_	        |                                |_        | j        r|                     |           |S )Nr  r   r`   )r  r   rE  r`   rz   r   rL   r   rN   rj   r   r~  rG   r  r  )r+  r  r  s      r-   r  z6CmfProject.do_create_from_template.<locals>._copy_task
  s     zz||H!%H"&/H(HO)H$(HHH'-'7';';AQAV_i';'j'j$$--//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`   r   c                 <    i | ]}|j          d |j        j         |S r  r  r8  s     r-   r5  zRCmfProject.do_create_from_template.<locals>._copy_task_filters.<locals>.<dictcomp>
  s=     , , ,GM6$::v{'8::F, , ,r.   rH   c                 <    i | ]}|j          d |j        j         |S r  r  )r  docs     r-   r5  zRCmfProject.do_create_from_template.<locals>._copy_task_filters.<locals>.<dictcomp>  s;     , , ,>A3>44CHN44c, , ,r.   AND)r   r   r  c                 <    i | ]}|j          d |j        j         |S r  r  )r  r7  s     r-   r5  zRCmfProject.do_create_from_template.<locals>._copy_task_filters.<locals>.<dictcomp>  s;     , , ,AE4?66TY_66, , ,r.   r  r  r  Fr  )r  rL   r   r   r   r3  r   r  rz   r`   rj   rN   r   ft_projectsr_   )
r  r  r  _folder_filter_doc_filter_epics_filterorig_project_task_filtersorig_task_filternew_task_filterr  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   rG   r  r  F)r  r   r  )r  r  r  )r  r  r/  r  r  r1  rU   r2  r  )rL   r   rN   r2   chat_topicsr  r  r   r_   r   r   r   r   re  r3  r   r@   r`   r   )r5   r   rG   r  r  r  r+   r  r  r  r  r  r  r  r  r  s               @@@@r-   r  z"CmfProject.do_create_from_templatel
  s   	/ 	/ 	/	V 	V 	V 	V 	V 	V2	] 	] 	]_	S _	S _	S _	S _	S _	S _	SB	 	 	"-	? -	? -	? -	? -	?^  	"!N(,,,HH#% #% "((:*]:-	 ) 
 
 	eEPPP 		O*.|/F*G*GI I I I  O,OOOO&&{;;;;, 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'  only_once_args
str | Nonec                     t           j                            |           }|                    dd          }t           j                            | d          }|D ]}|                    dd           |S )Nr  T)skip_tree_mover   Fr0   r  )rL   r   rN   rA  r3  r   r  rz   r-  rg  r+  s        r-   r   zCmfProject.archive_project]  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  )rL   r   rN   archive_restorer3  r   r  s        r-   r   z"CmfProject.archive_restore_projectj  ss     #''6'22%%'' ##vD#II 	# 	#D  """"
r.   u   Удаление проекта)rP  r  r'  r  c                 p    t           j                            | d          }|                                 d S )NTr2   r  )rL   r   rN   r   r  rz   s     r-   
job_deletezCmfProject.job_deletex  s5     #''64'HHr.   c                     t           j                            |           }|                    dd           t	          t           j        j        d| i           |S )Nr  TF)r  r  r  r  )rL   r   rN   r   r  r!  r   s     r-   r   zCmfProject.delete_project  sT    #''6'22TU333f/:HfCUVVVVr.   u)   Востановление проектаc                 p    t           j                            | d          }|                    d          S )NTr  )r  )rL   r   rN   r  r   s     r-   r   zCmfProject.restore_project  s3     #''64'HH...r.   z@hourlyc                  x    t           j                            d          }|D ]}|                                 d S )NT)r  )rL   r   r   r)  )_argsr<   project_listrz   s       r-   $celery_hourly_sync_rdisk_folder_hookz/CmfProject.celery_hourly_sync_rdisk_folder_hook  sK     (--D-AA# 	) 	)G&&((((	) 	)r.   c                     t           j                            | | d          }|rd S t                               | | ddd          }|                    d           d S )NrE  r   u   ТребованияTr   Fr   r   )r5   req_registrys     r-   r  z CmfProject.scaffold_req_registry  su    )--TtRZ-[[ 	F))' * 
 
 	'''''r.   )NNN)NN)rz   Nr?   )r   T)r   r   )T)NNNNN)NNNFF)r  r  )b__name__
__module____qualname__modulesrz   r   cmf_projectr   api_methodsr	   classmethodr(   r7   staticmethodon_server_eventr=   rA   rE   rS   rX   rc   r   r   rm   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  rM  rW  rY  r\  r}  r  r  r  r  r  r_   r  r   r  r  r   r  r  r&  cmf_deferred_jobr,  r0  r   rE  rG  rI  rK  rZ  r   r  rm  r  r  propertyrx  r~  r  r   r  r  r   r   rt  r!  r   r   r'  r  __classcell__)r,   s   @r-   r   r      s/	       /(4?K

+,
 
 

K$ 
X 
X 
X 
X 
X [
X: : : _12227 7 32 \7# # # # #
" " " " "	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$       [E
! E
! E
!N& & &*^* ^* ^*@		 	 	  "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   ,  * * *G G G G GR< < < < <| " " " ["@  
   '+U J J J J J J JX      "
 
 
0 III  JI \ > > \>;! ;! ;! ;! ;!|   [     [ 2 2 [2h\ \ \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o o o ob hZ@@@	 	 	 	 A@ \	 hZ@@@
 
 
 
 A@ \
 "CY]im  @H  I  J  J  J3    J  J \
 s    \ "Mcgsw  JR  IS  T  T  T/ / / / T  T \/ 	JJJ) ) KJ \)( ( ( ( ( ( (r.   r   )r   r   r   r   decimalr   r   r   &common.models.cmf_plugin_convert_mixinr	   cmf.include"modules.project.fields.cmf_projectr-  common.models.cmf_active_entityr   r}  r   rz   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     ) ) ) ) ; ; ; ; ; ;      T.( T.( T.( T.( T.('3>@U T.( T.( T.( T.( T.(r.   