U
    s3f                    @   sl   d dl m Z  d dlmZmZmZ d dlmZ d dlZd dlT d dlZ	d dl
mZ G dd de	jjjjZdS )	    )copy)datetimetimezone	timedelta)
monthrangeN)*)cmfutilc                       s  e Zd Zed fdd	Zdd Zeedddd	 Z fd
dZ	 fddZ
dd Zdd Zdd ZedddZed fdd	ZedddddddZedddZdd Zd d! Zd"d# Zdd$d%Zed&d' Zd(d) Zd*d+ Zdd,d-Zeddd. fd/d0
Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z ed=d> Z!ed fd?d@	Z"dAdB Z# fdCdDZ$dEdF Z%dGdH Z&edIdJ Z'dKdL Z(dMdN Z)ddPdQZ* fdRdSZ+ fdTdUZ,eddVdWZ-dXdY Z.dZd[ Z/dOd\d] fd^d_
Z0 fd`daZ1dbdc Z2ddde Z3edfdg Z4edhdi Z5e6djdkdlZ7edmdn Z8dodp Z9edqdr Z:edsdt Z;dudv Z<dwdx Z= fdydzZ>d{d| Z?dd}d~Z@eAdd ZB fddZCdddZDdddd\d\dddZEeeFdOdOdddd ZG  ZHS )
CmfProjectNc                    sB   |dkr&|sg }|dd|gdddgg}t  j|f|||d|S )Ndefault_list	parent_id==cache_status_type!=closed)object_fields	object_idfilter)superfield_options_list)clsZrelation_field_namer   r   r   kwargs	__class__ './modules/project/models/cmf_project.pyr      s     zCmfProject.field_options_listc                 C   s   d| j ji}td| d S )N
project_idCmfProject:changed)idvalueZcmf_emit_server_event)selfdatar   r   r   invalidate_cache   s    zCmfProject.invalidate_cacher   )Zchannelc                 K   s   | d t jkrt j| d = d S )Nr   )ZAPPZcache_projects)r    _kwargsr   r   r   on_project_change   s    zCmfProject.on_project_changec                    s   | j r
d S t   d S N)
logic_typer   _calc_logic_typer   r   r   r   r&   !   s    zCmfProject._calc_logic_typec                    s   | j r
d S t   d S r$   )	scheme_wfr   _calc_scheme_wfr'   r   r   r   r)   &   s    zCmfProject._calc_scheme_wfc                 C   s`   | j js| j jsd S | j s4tjjdd| jjgd| _ | j jrH| j j	  | j j
r\| j j
	  d S )Ncoder   r   )cust_field_conf_scheme
is_changedis_nullmodelsZCmfCustFieldConfSchemegetr%   r*   oldZ
cache_hooknewr'   r   r   r   _calc_cust_field_conf_scheme,   s    z'CmfProject._calc_cust_field_conf_schemec                 C   s.   | j js| j jsd S | j s*tjjdd| _ d S )Nzui_form_scheme:defaultr*   )ui_form_schemer-   r.   r/   ZCmfUiFormSchemer0   r'   r   r   r   _calc_ui_form_scheme7   s    zCmfProject._calc_ui_form_schemec                 C   s|   | j jsd S | j jr.d| j j_| j jjdd | j jrx| j jj  | j jj| kr^tddd d| j j_| j jjdd d S )NFT	only_datauc   Нельзя указать Спипок по-умолчанию из другого проектаabort)	r
   r-   r1   Zis_default_listsaver2   parentload	cmf_alertr'   r   r   r   _calc_default_list?   s    

zCmfProject._calc_default_listc                 K   s   t ddS tt| j|dgd}|s,g S |}g }|rX||jj |jj	dgd}q4ddd|gd	d|gg}	| 
 D ]2}
|
j}||}|r|| |	g||< qv|	||< qv| jf |d
d|}| j||dS )u_   
        Построение дерева от не корневого обьекта
        
DepricatedNtree_parentr   fieldsrC   ORtree_parent_idINr   T)filtersfilter_projectrF   )	Exceptiondictvarsr/   r0   appendr   r   rA   r=   _get_node_models
class_name_get_tree_dataZ_create_tree)r   Z	obj_modelZ
obj_filterrH   rF   r   objr<   Z
parents_idZparent_filtermodel
model_namemodel_filter	tree_datar   r   r   get_obj_treeL   s*      

zCmfProject.get_obj_treeprojectc           	         sx   t dd S ddd|gdd|gg}|  D ]2}|j}||}|rT|| |g||< q*|||< q*t j||fd|i|S )Nr@   rE   rF   r   r   rH   )rK   rL   rO   rP   r0   r   get_tree_leaf)	r   rF   project_typerH   r   Zparent_filtrS   rT   rU   r   r   r   rY   m   s      

zCmfProject.get_tree_leaf)rC   rH   rZ   rI   c                O   s   t dd S |rdd|g}|drF|r8||dg}n|rF|d}dtjj||| ddgdi}	|D ]H}
tt|
 }||
 pg }|tjkr|ddd gg}|j||jd |	|
< qh|	S )!Nr@   ordernonamecmf_owner_id	cmf_ownerrZ   show_approved
show_tasksshow_archive
show_pfeed	show_disk	show_chat	show_epicshow_sprintshow_releaseshow_roadmapactivitycmf_owner_assistantshas_tree_nodestree_hidden	is_publicsharelink_hashperm_policy_anonymousperm_policy_guestperm_policy_sharelinkperm_policyr   r	   )r   rC   Zorder_bysys_type=rB   )	rK   r0   popr/   r	   listrM   CmfListZtree_fields)r   rC   rH   rZ   rI   argsr   Zproject_filterZproject_fieldsrV   rT   rS   rU   r   r   r   rQ      sh                                 


 
zCmfProject._get_tree_datac                 C   s   t dd S D ]"}|jdkr|jjjdd d q|r||	dd	  D ]>}|j
|krHt|d
shg   S t|tjr||| |g  S qHg S |tjj D ]}|| q|tjj S )Nr@   c                 S   s   t | jjD ]~}d|jkrZt|dd rZd|j | jkrZt| d|j dsZ| jj| t|tj	rd| jkrt| dds| jj| qd S )Nrs   show_Trd   )
r   
tree_nodesr   rC   getattrrs   remove
isinstancer/   CmfChatGroup)rX   noder   r   r   hide_project_parts   s"    


z5CmfProject._get_tree_root.<locals>.hide_project_partstagsc                 S   s   | j S r$   r\   )r   r   r   r   <lambda>       z+CmfProject._get_tree_root.<locals>.<lambda>)key:r   rz   )rK   r0   r/   	CmfFolderrP   rs   rz   r   sortsplitr   hasattrr}   r	   )r   rV   rF   r   folderrR   rX   r   r   r   _get_tree_root   s$     



zCmfProject._get_tree_rootc                 C   s8   t jj| dd}|s4t j| ddddd}|jdd |S )Ntrashcan)r<   rs   u   КорзинаT)rA   r\   rs   systemrl   Fnotify)r/   r   r0   r;   )r   r   r   r   r   scaffold_trashcan   s
    zCmfProject.scaffold_trashcanc                 C   s@   d}t j| |d}|jdd t j| d|dd}|jdd |S )NzX[lists, EXISTS, [[cache_status_type = IN_PROGRESS], [logic_prefix = list.agile_sprint]]])r<   ft_add_ubqlFr   u   Активные спринтыT)rA   r\   Zkanban_filterr   )r/   CmfTaskFilterr;   CmfKanbanBoard)r   r   Zactive_sprints_filterZactive_sprints_boardr   r   r   scaffold_active_sprints   s    z"CmfProject.scaffold_active_sprintsc                    s  d;dd}d}| j dkrd}tj| d}|jdd || tjtd	d
t|| |dddd}||tjtdd
tddd}||tjtdd
tdddd}|jD ]<}	t|	tjr|	j	r|	j	j
| j
kr|	jdkr|jj|	 q||tjtdddtd| dd tjtjd}
|
jddddddd  fdd tdd!D }d"d  |D }t||}d#d$d%d&d'd(d)d*d+d,d-d.d/}|D ]:\}}||tjt||d0d1td2||j  | dd qt||tjtd ddd3d4td5| dd ||tjtdd6d7td8| d9d:d d S )<Nc                    sj   | j D ]0 t |rt fdd| D r   S q|f d| i||}|jdd | j j| |S )Nc                 3   s   | ]\}} | |kV  qd S r$   r   ).0kvir   r   	<genexpr>   s     zNCmfProject.scaffold_backlog.<locals>.add_node_if_not_exists.<locals>.<genexpr>rA   Fr   )rz   r}   allitemsr;   r   rN   )rA   
node_classnode_filter_kwargsnode_create_kwargsr   r   r   r   add_node_if_not_exists   s    
$
z;CmfProject.scaffold_backlog.<locals>.add_node_if_not_existsu   Задачиproject.agileZBacklogr<   Fr   backlog)rs   順 T)r\   filter_parent
tmp_filterr[   r   )rA   r   r   r   r   u   Тэгиr   Zdatesu   Даты
   )r\   r[   r   ZfalseZnot_assigned)filter_responsible_setrs   u   #НеНазначено)r\   r   Ztz   )monthdayhourminutesecondZmicrosecondc                    s   g | ]} j |d qS ))r   )replacer   r   Zstart_of_yearr   r   
<listcomp>R  s     z/CmfProject.scaffold_backlog.<locals>.<listcomp>   c                 S   s,   g | ]$}|j t|j|jd  ddddqS )r      ;   )r   r   r   r   )r   r   Zyearr   r   r   r   r   r   S  s   u   Январьu   Февральu   Мартu   Апрельu   Майu   Июньu   Июльu   Августu   Сентябрьu   Октябрьu   Ноябрьu   Декабрь)r                        	   r         date)Zfilter_plan_start_date_minZfilter_plan_start_date_maxrs   #Zno_alarm_date)r   Zfilter_plan_start_date_setZfilter_alarm_date_setrs   u   #БезДатыZnot_approved)Zfilter_approvedrs   u   #Согласоватьu  В фильтр "#Согласовать" попадают все идеи, пожелания, задачи от пользователей.
Владелец проекта обрабатывает список и переносит задачи в другие списки.
В идеале этот список должен быть обработан, то есть оставаться пустым к концу рабочего дня владельца проекта.

примеры  списков, куда можно перенести задачи из "#Согласовать":
todo0 Срочно до мвп
todo1 В течение года
todo2 Через год
Отклонено
Версия октябрь 2021)r\   r   text)NNNN)logic_prefixr/   r   r;   r   rL   rz   r}   CmfActiveEntityFilter
filter_tagri   Zcache_select_countr   r|   r   nowr   utcr   rangezipr   )r   rx   r   r   Zfld_tasks_namebacklog_filterZ	fld_tasksZfld_tagsZ	fld_datesr   r   Zstarts_of_monthsZends_of_monthsZmonth_rangesZmonth_namesZmonth_startZ	month_endr   r   r   scaffold_backlog   s        


	
     

zCmfProject.scaffold_backlogc                 C   s   |s
| j }d| S N/r   r   r\   r   r   r   project_dir  s    zCmfProject.project_dirc                 C   s   t jjj }|| S r$   )r/   CmfRFileZdpZdata_driverZget_rdZ	get_rfile)pathZrdiskr   r   r   
_get_rfile  s    zCmfProject._get_rfilec                 C   s   |  |  jdddd dS )u   Создадим папку проекта, если её нет. Может так же нужно проверять "Документы"? T)is_direxist_okparentsN)r   r   creater'   r   r   r   ensure_project_dir  s    zCmfProject.ensure_project_dirc                 C   s   | j s&|  r"| |  }d|_d S |  s6|   | jrLd| jj }nd}|d7 }| jdgdD ]}|d|j d7 }qf|d	7 }| |  }||_d S )
Nz(owner: null
rules:
- all deny read,writezowner: zowner: nullz
rules:loginrD   z
- z allow read,writez
- all deny read,write)	rdisk_enabledis_project_dir_existr   r   perm_strr   r^   r   Zall_relation_persons)r   Z	dir_rfiler   userr   r   r   _sync_rdisk_folder  s"    zCmfProject._sync_rdisk_folderc                 C   s   |s
| j }| | |jS r$   )r\   r   r   existsr   r   r   r   r     s    zCmfProject.is_project_dir_existrZ   rH   c                   sB   t dd S t jf ||d|}|D ]}|  |  q(|S )Nr@   r   )rK   rL   r   get_full_treer   r   )r   rZ   rH   rx   r   resrX   r   r   r   r     s      
zCmfProject.get_full_treec                 C   sJ  | j   | j r|   tjjdd}tjjdd}tjjdd}tjjdd}tjjdd}td dd	lm	} |d
g  }| j
dkr|   | jst }tjjdd|_| |_d| j |_d|_|jdd || _tj| dddd|_tj| dddd|_tj| dd| j d|dd|_tj| | gd| j dd|_|  |_| j
dkrLtjjd| jd|_tj| dd |_tj| d!d"d#|_ tj|j d$d |_!d%|j_"d&|j _"d'|j_"d(|j_"d)|j_"d*|j_"d+|j_"d|j_#d|j_#d|j_#d|j_#d|j_#d|j_#|j$% D ]}	|	jdd qd| _&d| _'d| _(d| _)| jddd, | j
d-kr&tj| d.d/dd|_*tj| |j*d0|d1|_+tj| d2d3dd|_,tj|j,d4d5|d6|_-tj| d7d8dd|_.tj|j.d9d:|d6|_/tj| d;d<dd|_0tj1|j0d=dd>|_2tj| d!d"| j3d?|_ tj|j d| j3d@|_4| 5 |_6tjjd| jd|_tj7dAdB| dC|_8tj| dDdEdd|_9tj7|j9dFd |_:tj7|j9dGd |_;tj| dHdIdd|_<tj| dJdKdd|_=d%|j_"dL|j0_"dM|j*_"d&|j._"d'|j,_"d(|j6_"dN|j _"d)|j8_"d*|j9_"dO|j<_"dP|j_"dQ|j_"dR|j_"dS|j_"dT|j=_"d+|j_"d|j_#d|j_#d|j_#d|j_#|j$% D ]}	|	jdd qdd| _>d| _?d| _@d| _Ad| _Bd| _Cd| _'d| _&d| _(d| _)d| _Dd| _Ed| _F| jddd, tjGjHjI}
|
D ]B}tjG|
| |j<||j:dU|_J|dVkrd|jJ_|jJjdd q| j
dWkr$tjjd| jd|_tj| dXd"d#|_Ktj| d!d"d#|_ tj|j dd |_4tj| dDdEdd|_9tj7|j9dFd |_:tj7|j9dGd |_;tj| dHdIdd|_<tj| dJdKdd|_=tj| dYd<dd|_0tj1|j0dZdd>|_2d%|j_"dL|jK_"dM|j _"d&|j_"d'|j_"d(|j9_"dN|j<_"d)|j_"d*|j_"dO|j=_"d+|j_"d|j_#d|j_#d|j_#d|j=_#|j$% D ]}	|	jdd qd| _>d| _?d| _&d| _'d| _(d| _)d| _Dd| _Ed| _@d| _F| jddd, tjGjHjI}
|
D ]0}tjG|
| |j<||j:dU|_J|jJjdd q| j
dkrFtjLjd[d| _M| Nd\d]}| Nd^d_}| Nd`da}dbdcddtjjdeddf|||dgdhditjjdeddf|||dgdjdktjjdlddm|||dgdndotjjdlddm|||dggdpdqdhditjjdeddf|||dgdrdstjjdeddf|||dggdpg}| O| | jPdtdutjjdvd|dfdw tj| dxdydd|_Qtj7| dz| j d{d|| jR d}d~|_StjT|jQ| |jSdd|_Utj7| dz| j dd|| jR dd~|_VtjT|jQ| |jVdd|_Wtj7| dz| j dd|| jR dd~|_XtjT|jQ| |jXdd|_Ytj| ddddd|_Ztj|jZddd#|_[tj|jZdd |_\tj| dHdIdd|_<tj| dDdEdd|_9tj7|j9dFd |_:tj7|j9dGd |_;tj| dddd|_]tj| dddd|_^tj| dJdKdd|_=d%|jQ_"dL|jZ_"dM|j]_"d&|j^_"d'|j9_"d(|j<_"dN|j_"d)|j_"d*|j_"dO|j_"dP|j=_"d|j_#d|j_#d|j_#d|j_#d|j_#d|j=_#|j$% D ]}	|	jdd 
qld| _>d| _?d| _&d| _'d| _(d| _)d| __d| _`d| _ad| _bd| _cd| _Dd| _Ed| _F| jddd, tjGjHjI}
|
D ]<}|dd
rtjG|
| |j<||j:dU|_J|jJjdd 
q| e  | f  | g  d"S )uU    Добавляем структуру папок в новый проект
        zlist.pfeed:defaultr4   ztask.epic:defaultzlist.agile_sprint:defaultzlist.release:defaultzlist.base:defaultuc   Вызываем разворачивание чтобы появилась папка задачиr   )make_dataclassZ	DataEmptyproject.servicedesktask.gantt_project:default	   Гант TFr   u   Дискdisk)rA   r\   rs   r   u
   Архивarchiveu
   Лентаu   Лента проекта pfeed)rA   r\   r   	list_typer%   r   u   Чат )rA   	executorsr\   r   zproject.wikir   )rs   rF   u   Документ1)rA   r\   u   ДокументыN)rA   r\   rs   u   Документ2r   i i" iI i i  i r8   r   r   ZEpicsepiczEpic 1)r<   rA   r\   r%   ZSprintssprintzSprint 1Zkanban)rA   r\   r   r%   ZReleasesreleaseu   Релиз 1rv   ZRoadmapsroadmapu   Roadmap Проекта)rA   r\   r   )rA   r\   rs   workflow)rA   r\   r      Все задачиfilter_all_tasks)r\   rs   rA   u   ФильтрыrH   u   Фильтр 1u   Фильтр 2u   Отчетыreportsu   Компоненты
componentsi i i q i0 i@ iP4 i`[ ip i )r\   rA   report_typereport_filterZagile_sprintzproject.baseu   В работеu   Дорожные картыu   Дорожная карта 1zsystem:servicedeskz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:defaultZ	incidentsu?   Сообщить о сломанном оборудованииu   Сообщите об оборудовании, которое может быть неисправным или сломанным, например разбитый экран компьютера или поврежденный сервер.)r\   typesu+   Логины и учетные записиu<   Запросить доступ администратораuY   Например, если вам нужно администрировать EvaProject.u3   Запрос по электронной почтеuu   Запрос получен от вашего канала поддержки по электронной почте.ztask.sd_emailed_request:default)r\   r   r%   r   r   u   Очередиqueuez[["parent_id", "=", "z*"], ["cache_status_type", "!=", "CLOSED"]]project = "z!" and cache_status_type != CLOSEDr<   bqlubql2u   Все обращения)rA   r<   Ztask_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)rA   r\   rs   rp   r   u   КатегорииZknowlage_base_categoriesu   Статьиu   Каналыservicedesk_channelsu   Клиентыservicedesk_clientsZanalysis)hr   r=   r   r/   CmfLogicTyper0   ZlogginginfoZdataclassesr   r   r   main_gantt_projectCmfTaskr%   r<   r\   r   r;   r   r   r   rw   r   r~   chatr   r   r   r   CmfDocumentZdoc1ZdocsZ
docs__doc2r[   rl   __dict__valuesrc   ra   rb   rd   ZepicsZepics__epic1ZsprintsZsprints__sprint1ZreleasesZreleases__release1ZroadmapsZ
CmfRoadmapZroadmaps__roadmap1r   Z
docs__doc1r   Zkanban_boardr   r   rH   Zfilters__filter1Zfilters__filter2r   r   r`   r_   rh   re   rg   rf   Zshow_filtersZshow_reportsZshow_componentsCmfTaskReportr   choicesZreports__report1Zin_workCmfProjectNotifySchemenotify_scheme_create_ui_view_form_create_sdesk_request_group_create_sdesk_request_typer  r*   Zqueue__queue1_task_filterZCmfTaskQueueZqueue__queue1Zqueue__queue2_task_filterZqueue__queue2Zqueue__queue3_task_filterZqueue__queue3r  Zknowlage_base__categoriesZknowlage_base__articlesZchannelsZclientsZshow_trashcanZ
show_queueZshow_knowlage_baseZshow_servicedesk_channelsZshow_servicedesk_clients
startswith_create_assign_to_project_create_sdesk_slascaffold_line_chart)r   Zlt_pfeedZlt_epicZ	lt_sprintZ
lt_releaseZlt_baser   tgantt_projectr   r   itemZ_ui_form_viewZ_ui_form_createZ_ui_form_view_innerZrequest_groupsr   r   r   scaffold  s   


  
                

 
     
 

,
D

 
 
 
    
 zCmfProject.scaffoldc                 C   s  dddddddddgd	d
dddddddddddgidgd	dddddddddddgd	dddddgdd d!d"dddgd#d d!d$dd%dgd&d d!d'dddgd(d d!d)dd*dgd+d d!gd	d,d-d.dd-ddd.d/ddgd	d0d1ddd2d3gd4d5d!d6dd%d2d3gd6d5d!d7ddd2d3gd7d5d!gd	d8dddd9gdd d!d"ddd9gd#d d!d$dd%d9gd&d d!d'ddd9gd(d d!d)dd*d9gd+d d!gd	g}|D ]}| d:}tjj | |d;gd<}|stj| d=| j d>d?| j d@dA}|jdBdC tj| tjj | dDdEdF|dG|dH}|jdBdC | dI}|D ]p}t }t }	||	_	| d:|	_
| dJ|	_| dK|	_| dL}
|
rtjj | |
dM|	_g }g }|dN| j  |dO| j d> | dPg }|D ]}|dkrdQdRdS || D }|| dT| dU tjjdVdW|| gdX}g }|D ]}||jj qBdY}dQdZdS |D }|d[| d\| d] n|d^krtjj | || dM}|rj|| d_|j d@ |d[| d`|jj d> n|dakr4tjjj}|| d_|||   d@ |d[| d`||  d> n6|| d_||  d@ |d[| d`||  d> qdb|}dcdd| de }||_||_|jdBdC ||	_|	jdBdC qD|jdBdC qd S )fNu`   Анализ SD. Отчет по созданным задачам против решенныхu   СозданоZcreatedz#f15c75)r\   
value_typecoloru   РешенныеZdonez#7bc1a1)r\   rowsu5   Анализ SD. Отчет время решенияr   Zaveragez#8eb021   Время решения)r\   r"  r#  slau   Инцидентыz#ea632br%   r   )r\   r"  r#  r&  
row_filteru]   Анализ SD. Отчет по выполненным SLA против нарушенныхu   ВыполненоZsd_sla_processedz#14892cu   НарушеноZsd_sla_breachedz#d04437uQ   Анализ SD. Отчет по инцидентам по приоритетамu   Критичныйr   r   )r%   priority)r\   r"  r#  r'  u   Высокийr   u   Обычныйz#815b3ar   u   Низкийu   Минимальныйz#d39c3fu>   Анализ SD. Отчет по уровню успеха SLA+   Время до первого ответаZsd_sla_compliance_percentz#59afe1uO   Анализ SD. Отчет по запросам на обслуживаниеu3   Все запросы на обслуживаниеr   z'task.sd_service_request_approve:defaultu   Все)r%   request_typer   r   uM   Анализ SD. Отчет по проблемам по приоритетуztask.sd_problem:defaultr\   r   )r<   r\   rC   z["parent_id", "=", "z"]r  "r  Fr   r   T)rA   rs   r   
line_chart)r<   rA   r\   r   r   r$  r#  r"  r&  r<   r\   z
project = z["parent", "=", "r'  z, c                 s   s   | ]}d | d V  qdS r-  Nr   r   r   r   r   r   r   U  s     z1CmfProject.scaffold_line_chart.<locals>.<genexpr>z in ()r*   rG   r+    c                 s   s   | ]}d | d V  qdS r0  r   r1  r   r   r   r   ^  s     z["z
", "IN", [z]]r,  z = "z	", "=", "r(  z and [z ,])r0   r/   r  r   r   r*   r;   r   ZCmfRepLineChartRowr<   r\   r#  r"  CmfSDeskSlar&  rN   joinr  rv   r   CmfSDeskRequestTyper  r(  r  r  r  r'  )r   r.  ZchartZreport_nameZreportr   r$  rowZrow_task_filterZ	chart_rowr&  Zubql_filterZ
bql_filterr'  fieldZvalsZlogic_typesZbql_valsltr,  r(  r   r   r   r  Y  s    



3

!



  N









 
zCmfProject.scaffold_line_chartc                 C   sj   t jj|d}|s$td| dd t  }| j d| j d| |_d|_|jddd |j|d	 |S )
Nr4   u3   Отсутствует экранная форма Tr9   z: r  Fr   )Zobj_copy)	r/   Z	CmfUiFormr0   r>   task_code_prefixr\   Zcmf_model_namer;   r   )r   r*   action_nameZui_formZ_ui_formr   r   r   r  y  s    zCmfProject._create_ui_view_formc                 C   sf   t jjdd}t jjdd}t  }| |_||_|jtj	 |
  t  }| |_||_|
  d S )Nzsdesk-client:defaultr4   zsdesk-agent:default)r/   CmfProjectRoler0   CmfProjectRoleAssignr<   Zproject_rolemembersrN   gcurrent_userr;   )r   Zsdesk_clientZsdesk_agentZprr   r   r   r    s    z$CmfProject._create_assign_to_projectc                 C   sb  t jjdd}t j| ddd}|  t j|ddd|d	}|  t j|d
dd|d	}|  t j|ddd|d	}|  t j|dd d|d	}|  t j|ddd}|  t j|ddd}|  t j|ddd}	|	  t j| ddd}|  t j|ddd|d	}|  t j|d
dd|d	}|  t j|dd d|d	}|  t j|ddd}|  t j|ddd}|  t j|ddd}	|	  t j|ddt jjddd}
|
  t j| ddd}|  t j|ddd |d	}|  t j|d
d d|d	}|  t j|ddd}|  t j|ddd}|  t j|ddt jjd!dd}	|	  t j| d"dd}|  t j|ddd#|d	}|  t j|d
d d|d	}|  t j|ddt jjd$dd}|  t j|ddt jjd!dd}|  t j|ddt jjd%dd}	|	  t j|ddt jjd&dd}
|
  t j|ddt jjd'dd}|  d S )(Nzfulltime:defaultr4   r%  r   )r<   r\   Zwidget_type     z+request_type.request_category = 'incidents')r<   r[   Z	goal_timeZubqlcalendari  i  z2request_type.request_category = 'service-requests'i  i`	  z7request_type.request_category = 'post-incident-reviews'i  r3  startzissue-created)r<   trigger_typetrigger_conditionzresolution-clearedstopzresolution-setr+  x   zcomment-for-reporterzstatus-type-changedZsd_waiting_for_customer)r<   rG  rH  Ztrigger_condition_status_codeu;   Время закрытия после разрешенияi  zBrequest_type.request_category in ['incidents', 'service-requests']r   u/   Время на проведение ревьюz)request_type.request_category = 'changes'Z	in_reviewZsd_declinedZsd_implementingZsd_planning)r/   CmfCalendarr0   r6  r;   ZCmfSDeskSlaGoalZCmfSDeskSlaTriggerCmfStatusCode)r   Zdefault_calendarr&  Zgoal1Zgoal2Zgoal3Zgoal4Ztrigger1Ztrigger2Ztrigger3Ztrigger4Ztrigger5r   r   r   r    s    













zCmfProject._create_sdesk_slac                 C   sZ   t jjdd| jgdd| jggdr8td| j ddd	 |  rVtd
| j ddd	 d S )Nr\   rt   r   r   r+   u   Проект с именем uA    уже существует. Укажите другое имя.Tr9   u-   Раздел на диске с именем uF    уже занят. Укажите другое имя проекта.)r/   r	   slistr\   r   r>   r   r'   r   r   r   _check_project_dir_conflict  s    "z&CmfProject._check_project_dir_conflictc                 C   sF   ddd|gg}|r"| dd|g | j|drBt| j ddd d S )	NrE   r\   r   r*   r+   u7    с таким именем уже существуетTr9   )rN   r0   r>   Zverbose_name)r   r\   r*   Z
prj_filterr   r   r   _check_unique  s
    zCmfProject._check_uniquec                    s$   |  || t j|||d|S )N)r\   r*   )rO  r   r   )r   r\   r*   rx   r   r   r   r   r   
  s    zCmfProject.createc                 C   sZ  ddddddddd	d
ddddddddg}ddg}|D ]}d| }| j | jr4|D ]|}tt| jdd| jgdd|ggd}|s|dkrtt| jdd| jgdddggd}|rR| j | j |_|jdd qRtj	jdd| jgddd| ggd}|r4| j | j |_|jdd q4| j
jrVtjjdd | jgd}|rV| j
j |_|jdd d S )!NtasksZapprovedr   r   r   r  r   r   r   r   r   r  r   rH   r  r   r	  r
  r   r   ry   r   r   rs   r+   r   Tr7   r   zlist.rF   rt   )r  r-   rM   r/   r0   r   r   rl   r;   rw   rd   r~   )r   Z	sys_typesZnode_modelsrs   Z	fieldnameZ	nodeclassZsysnoder   r   r   _calc_hidden_nodes  sZ    

zCmfProject._calc_hidden_nodesc                    s(   t   ddddddddd	d
dddg S )NZdefault_list_workflowZdefault_epic_workflowZdefault_subproject_workflowZdefault_release_workflowZdefault_sprint_workflowZdefault_document_workflowZdefault_task_workflowproject_perm_schemer  rE  r,   r5   cmf_project_admins)r   save_preload_fieldsr'   r   r   r   rT  @  s    zCmfProject.save_preload_fieldsc                 C   sN   | j js| jjrtd | jdkr(d| _| jdkr:d| _n| jdkrJd| _d S )Nu<   Нельзя менять родителя у проектаsectionzCmfWiki:ClassrX   zCmfProject:Class)r<   r-   rA   r>   rZ   r   rF   r'   r   r   r   _calc_parentQ  s    


zCmfProject._calc_parentc                 C   s(   | j jsd S tj| j j| jj| _ d S r$   )r   r-   r/   r  Zconfluence_convertr   r   r'   r   r   r   
_calc_text\  s    zCmfProject._calc_textc                    s   dd l | sdS t| } dd|  }|d}d t|dkr\ddd |D  n|d d d  tj	j
d	d
gd
d   dgd}tdd |D }t|}  |krt fdd|D dd}|r tt|d 7  n d7    S )Nr   r3  z\W+-r   c                 S   s   g | ]}|d  qS )r   r   )r   chunkr   r   r   r   l  s     z3CmfProject.get_prefix_from_name.<locals>.<listcomp>r   z--r<  ZILIKE%rC   r   c                 S   s   g | ]}|j  qS r   )r<  lower)r   rX   r   r   r   r   v  s     c              
      s8   g | ]0}|   rd d|   dqS )z\Dr3  )r  r\  subr   )r   pprefixrer   r   r   z  s      )default1)ra  r   Ztranslit_stripr]  r\  r   lenr7  r/   r	   rM  setrv   maxstrintupper)r\   ZslugchunksZprojectsprefixesZexisting_prefixesZmax_prefix_numr   r_  r   get_prefix_from_namea  s,    

zCmfProject.get_prefix_from_namec                 C   s,  | j js| jjsd S | j jr| j j | _ | j dksT| j dksT| j dksT| j | jkrhtd| j  dd tjj	dd| j
gd	d
| j ggdgdd}|rtd| j  d|j ddd tjj	dd| j  dgdd| ggdgdd}|rtd| j  d|jj d | jr
d S td ttjj| j
jgd d S )NTSKAZ	NOPROJECTuH   Нельзя использовать системный префикс Tr9   r   r   r<  rt   r\   )r   rC   include_deletedu   Код u2    уже используется проектом u   . Выберите другойr*   ZLIKEz-%rX   zproject.nameu8    ранее использовался проектом u   . Это может привести к пропускам в нумерации кодов. Если это нежелательно - укажите другой префиксur   Запущен фоновый процесс смены префиксов кодов у задач проекта)rx   )r<  r-   Ztask_code_use_logic_type_prefixr   ri  Zcode_prefixr>   r/   r	   r0   r   r\   CmfTaskCodeHistoryrX   is_newZschedule_deferred_jobr  Zrecalculate_codes_celery)r   Zproject_with_prefixZ	code_usedr   r   r   _calc_task_code_prefix  sF    

z!CmfProject._calc_task_code_prefixc                 C   s   ddl m} | j  || jjp"dddd}dd td	|D d
d }t|dkrh|d d
d }nddd |D }d|	  }d}t
jjdd| | gdd| jggdr|sd}|d7 }q| | | _d
S )u  
        Генерируем автоматически Префикс для кода задач для Разделов (там он не очень важен)
        TODO1: возможно, выводить на форме создания разделов поле ввода Префикса
        Важно! Этот метод разрешен только для Разделов!
        r   )translitrm  ruT)Zlanguage_codereversedc                 S   s   g | ]}|r|qS r   r   r   cr   r   r   r     s      zACmfProject._calc_task_code_prefix_for_section.<locals>.<listcomp>z(?:\b|_)([A-Za-z0-9]{1,4})Nr   r   r3  c                 s   s   | ]}|d  V  qdS )r   Nr   rv  r   r   r   r     s     z@CmfProject._calc_task_code_prefix_for_section.<locals>.<genexpr>ZWIKIr<  rt   r   r   r+   )Ztransliteraters  r\   r=   r   ra  findallrd  r7  ri  r/   r	   sgetr   r<  )r   rs  r*   Z	code_listr   r   r   r   "_calc_task_code_prefix_for_section  s     

z-CmfProject._calc_task_code_prefix_for_sectionTc                 C   s\   |j dds |rtddd dS | j}| jjr<| js<| jj}||krX|rTtddd dS dS )NProjectAdminsZ
group_codeu   Для редактирования параметров проекта Вам необходимо находиться в группе Администраторы проектовTr9   Fu   Для редактирования параметров проекта Вам необходимо быть Администратором проекта)in_person_groupr>   rS  r-   rq  r1   )r   personZraise_exceptionrS  r   r   r   is_project_admin  s"    zCmfProject.is_project_adminc              
      s  | j r4tjjs4tjs4tjs4tjjdds4tddd | j rH| j	tj | j sV| jj
rtjjdddgd	}|j }| jjD ]l^}}}|d
kr|||kr|t  |j	| |  W 5 Q R X |tjkrtj|jj td| d q|| j rptjjdd| jgdd| jggd	}|r2td| j ddd n>|  rp| |  }	|	jrp|	d| j dt  d d}
| jj
r| jstd | !  | jj"r| | jj"r| | | jj"}||   | j r| js| j#| _d}
| j s| $  | j%s4| j&dkr$tj'jdd| _%ntj'jdd| _%| j(sLtj)jdd| _(| j*s|tj+jdd}|svtj+jdd}|| _*| ,  | -  | j.s| j/dkr| 0  ntddd | 1  | 2  | 3  | 4  t5 j||}| j s(| j%j
s(| j6j
s(| j7j
s(| j8j
s(| j9j
s(| j:j
r2tj';  |ddrDd}
|
rR| <  | j=j
rd| >  | j sv| j(j
rtj);  tj?j@d d!d"d#ggd gd$}|D ]}d"|_A|jdd% q|S )&NZProjectCreatorsr|  u   Для создания проектов попросите Администратора системы добавить Вас в группу Создатели проектовTr9   r*   r   r{  r+   rN   u   Пользователь uO    добавлен в группу Администраторы проектовr\   r   r      Проект     уже существуетr   _%Y-%m-%d-%H%M%SF<   Имя проекта не может быть пустым.r   servicedesk:defaultr4   system.open:defaultsystem:default)Z
is_defaultrU  u8   Укажите Префикс для кода задачdont_scaffoldonboarding_statusNOT INr   cancelrB   r7   )Brq  rA  rB  Zis_admindisable_permissionsacl_admin_moder}  r>   rS  rN   r-   r/   CmfPersonGroupr0   Z
rg_membersZ
all_nestedZ_changesr   Zdisable_aclr;   Zcurrent_person__member_ofaddr   r   r	   r\   r   r   r   r   renamer   r   rN  r1   r*   rQ  rR  r   CmfProjectPermSchemer  r  rE  rK  rW  r?   r<  rZ   rz  rr  r3   r6   r!   r   Zservicedesk_publicr^   rj   
spectatorsr   Ztrigger_reloadr!  r   r   
CmfLicenserv   r  )r   rx   r   Zproject_admins_groupZproject_admins_group_membersZchange_actionZpr_adminr  r   project_dir_rfileshould_be_scaffolded	old_rfilerE  resultonboardings
onboardingr   r   r   r;     s    


"


	


zCmfProject.savec           
         s<  | j r~tjjdd| jgdd| jggd}|rDtd| j ddd	 n:|  r~| | 	 }|j
r~|d
| j dt d | jjrtj| jjdgd| _| jjrtj| jjdgd| _d}| jjr| jstd |   | jjr| | jjr| | 	| jj}|| 	  | j r6| js2| j| _d}| j sF|   | js|| jdkrltjjdd| _ntjjdd| _| jstjjdd| _|   |   | js| j dkr| !  n| "| jj| _| #  | $  t% j&||}|r| '  tj(j)ddddggdgd}|D ]}	d|	_*|	j+dd q|S )Nr\   r   r   r   r+   r  r  Tr9   r   r  r  Zdiv)Ztags_extendFr  r   r  r4   r  r  rU  r  r  r   r  rB   r7   ),rq  r/   r	   r0   r\   r   r>   r   r   r   r   r  r   r   document_header_textr-   r   Z
html_stripr   document_footer_textrN  r1   r*   rQ  rR  r   r  r  r  rW  r?   r<  rZ   rz  rl  rr  r3   r   _save_importr!  r  rv   r  r;   )
r   rx   r   r   r  r  r  r  r  r  r   r   r   r  U  s`    "

zCmfProject._save_importc                 C   s,  t t|dd }|j|ddgd}|jrZ|drH|jjd|d qb|jjd	|d n|  |oxt t|dd }|o|j|dgd}|r|jj	pd}|ot t|dd }	|	o|	j|dgd}
|
r|
jj	pd}|r|r|t
|| d
  |_n"|r|d |_n|r|d |_|jdd d S )Nr   r   r[   rX   r   rC   zCmfTask:zPPP-TSK-ORDERrR   zPPP-OBJ-ORDERr   rC  Tr7   )r{   r/   r   r0   rX   r  check_project_role_accesscheck_edit_permr[   r   rh  r;   )r   Zitem_idZ	anchor_idZnext_idZ
item_modelr   Zanchor_modelZanchorZanchor_ordernoZ
next_modelZ	next_itemZnext_ordernor   r   r   	move_item  s(    

zCmfProject.move_itemc                 C   s   d S r$   r   r'   r   r   r   
_calc_code  s    zCmfProject._calc_codec                 C   s   d S r$   r   r'   r   r   r   get_code_prefix  s    zCmfProject.get_code_prefixF)	recursiveTEXKOM_db_deletec                   s<  | j j}|rd | _| jdd dD ]f}tt| jdd| gdddD ]B}td|  tt| j	|j
dddrD|jddd	 t  qDq"tjj| ddd
D ]"}td|  |jddd	 qtjj| ddd
D ]"}	td|	  |	jddd	 qt j|||ddd|}
| |r8tj|}|r8|  |
S )NTr7   )CmfComponentr~   r?  CmfAttachmentZCmfImportDownloadr  rw   ZCmfTransZ	CmfStatusZCmfWorkflowZCmfSchemeWfrL  r>  r  Z	CmfPersonr  r   r   r   r<   r   )r   ro  include_systemu   Удаляем )r   ro  r  )r  force)rX   ro  r  F)r  r  r  r   )r\   r   r  r;   rM   r/   rv   rA  debugry  r   deleteZcommit_with_eventZCmfGanttTaskrp  r   r   r   r0   Zmove_to_trash)r   r  r  rx   r   Zcur_nameZcls_namer9  Z
gantt_taskZ	task_coder   r   r   r   r   r    s6    "
 zCmfProject.deletec                    s8   t  jf ddi|}tj| jj|   |   |S )Nr  T)	r   restorer/   r   Zrestore_from_trashr\   r   r   r   )r   r   r   r   r   r   r    s    zCmfProject.restorec                 C   sT   t jtjd}|tdd7 }tjjdd| jgdd|gdd	d
gddd ggdgd}|S )Nr   r   )Zhoursr   r   plan_start_date<r   r   ZCLOSED
alarm_dater   rB   )	r   r   r   r   r   r/   r  rv   r   )r   r   rP  r   r   r   _list_tasks_need_to_start  s    
z$CmfProject._list_tasks_need_to_startc              	   C   s^   | j r
d S |  }|sd S td| jjj  tjj| jd| d| j d| j j	 ddd d S )Nu&   Отправляем карточку u   Рекомендацияu   
            В проекте u(   есть задачи с планом, но без будильника.
            Назначьте будильник, или список с планом,
            чтобы задачи появились у исполнителя в ленте.
            (сброшен флаг "z")
            r   )r~  r\   rR   msgr(  )
auto_alarm_dater  printr^   r\   r   r/   Z	CmfNotifyZplace_notifyZcaption)r   rP  r   r   r   '_notify_project_owner_not_planned_tasks  s"    z2CmfProject._notify_project_owner_not_planned_tasksc                 C   s:   t jjddD ]&}| }|D ]}|j|_|  qqd S )NT)r  )r/   r	   rv   r  r  r  r;   )r   rX   rP  taskr   r   r   _cron_auto_alarm_date	  s
    z CmfProject._cron_auto_alarm_datec                 C   s    | j dgdD ]}|  qd S )Nz**rD   )rv   r  )r   rX   r   r   r   &notify_project_owner_not_planned_tasks  s    z1CmfProject.notify_project_owner_not_planned_tasks)	task_tagsc           
      C   s  |sdS dd |D }t jj| jdd}t jj| jdd}|rB|sFdS dd t jj|jdD }t jjd	d
gdd| jgdddggdD ]}|jj|kr||jj}|j	
 r
||j	jj}|st j| ||j	jd }|||j	jj< |j|jkr&|j|_|  q|j|jkr|j|_|  q| D ]\}	}|j	
 rt|  d| d|j	  ||j	jj}|st j| ||j	jdjdd}|||j	jj< t j|d|j d| |d}|  n8t|  d|  t j|d|j d| |d}|  q0dS )u   
        Вызывается если у задачи проекта изменяются тэги.
        Если появился тэг, для которого нет фильтра - создадим его.
        TODO
        Nc                 S   s   i | ]}|j j|qS r   )r   r   )r   tagr   r   r   
<dictcomp>   s      z5CmfProject.hook_task_tags_changed.<locals>.<dictcomp>r   )r   rs   r   c                 S   s   i | ]}|j j|qS r   )r\   r   r   r   r   r   r   r  %  s    rJ   filter_tag_idrF   r   r   rs   r  r[  )r<   rA   r\   z: Create new filter for z with category Fr   r   )rA   r\   rs   r   r   )r/   r   r0   r   rv   r   r  r   ru   Ztag_categoryr=   r\   r;   rF   r   rA  r  )
r   r  Ztask_tags_id_dictZtasks_filterZtags_folderZcategory_foldersZ	ae_filterr  Zcategory_folderZtag_idr   r   r   hook_task_tags_changed  sz    
  


   
  
 
   z!CmfProject.hook_task_tags_changedc                 C   s   d S r$   r   )r   r  r   r   r   hook_new_tagU  s    zCmfProject.hook_new_tagc                 C   s   dS )NTr   r'   r   r   r   has_tree_nodes_hookY  s    zCmfProject.has_tree_nodes_hookc                 O   s   d S r$   r   )r   rx   r   r   r   r   public_list\  s    zCmfProject.public_listc              $   O   s   ddddddddd	d
ddddddddddddddddddddddd d!d"d#g$}||d$< t jj||}|sjd S z|  W n tk
r   Y d S X |S )%Nr   r\   r*   r]   rj   Zactivity_idr   r%   zworkflow.namer^   cmf_created_atrZ   r<  descriptionrm   rn   ro   rp   rq   rr   r   Zpublic_html_schemer  r  z*public_html_scheme.header_background_colorz$public_html_scheme.header_text_colorz+public_html_scheme.content_background_colorz%public_html_scheme.content_text_colorz*public_html_scheme.footer_background_colorz$public_html_scheme.footer_text_colorz+public_html_scheme.sidebar_background_colorz%public_html_scheme.sidebar_text_colorzpublic_html_scheme.footer_textzpublic_html_scheme.custom_csszpublic_html_scheme.custom_jsrC   )r/   r	   r0   Z_acl_check_readZCmfPermissionError)r   rx   r   Zfields_to_returnrX   r   r   r   
public_geta  s\    'zCmfProject.public_getc                 O   s   t jj| f||S r$   )r/   r  r  )r   rx   r   r   r   r   r    s    z$CmfProject.check_project_role_accessc                 C   sD  | j s| jsd S | j rd S | jr@t }| jddD ]6}|j|  kr4|jds4|jds4||j q4dD ]^}||krp|	| t
jspt
jrqp| d| g t| d| rtddd | t
j qpd	D ]V}||kr|	| t
jst
jrqt| |}|jr|jstd
dd | t
j q|r@| jd| d d S )NT)r-   Zcache__id)rS  r(   r  Zsecurity_level_schemer5   rR  Z
protected_uv   Поле защищено от изменения, обратитесь к Администратору системыr9   )Zprotected_cmf_project_adminsZprotected_scheme_wfZprotected_notify_schemeZprotected_security_level_schemeZprotected_ui_form_schemeZprotected_project_perm_schemeu   Для снятия защиты изменения поля, обратитесь к Администратору системыzPPP-PR-ADMINr  )rq  r-   re  r  rP   Zproject_perm_allow_fieldsr  endswithr  r|   rA  r  r  load_fieldsr{   r>   r  rB  r1   r2   r  )r   Zchanged_fields_to_checkr:  Zadmin_require_fieldfr   r   r   r    sD    




zCmfProject.check_edit_permc                    s
   t   S r$   )r   check_delete_permr'   r   r   r   r    s    zCmfProject.check_delete_permc                 C   s   |D ]~}t  }| |_|d|_|jdd |dD ]H}| j|d|d|d|d||d|d	|d
d q8qd S )Nr\   Fr   r  r   r%   r   r   r   r   )r\   r   r%   r   groupr   r   r   )r/   ZCmfSDeskRequestGroupr<   r0   r\   r;   r  )r   groupsr  request_groupr,  r   r   r   r    s     z&CmfProject._create_sdesk_request_groupc	           
      C   s`   t  }	| |	_||	_||	_||	_||	_||	_||	_|d k	r@||	_	|d k	rT|	j
| |	  d S r$   )r/   r8  r<   r\   r   r%   r   r   r   Zrequest_categoryr  rN   r;   )
r   r\   r   r%   r   r  r   r   r   r,  r   r   r   r    s    z%CmfProject._create_sdesk_request_typec                 C   s   d| j  d| j d| j S r   )Z	ui_moduleZui_namer*   r'   r   r   r   href  s    zCmfProject.hrefc                    sD   ddl m} t  }t|dkr@|d d  d||d }|S )Nr   )cmf_hashlib      rX  r   )cmf.utilr  r   gen_coderd  Zshort_str_enc)r   r  Zres_coder   r   r   r     s
    
zCmfProject.gen_codec                 K   s   |s| j d }tj|d}d}| jddD ]8}|j|ks*|jds*|jdrRq*t||j|j q*|	 D ]\}}||j
krlt||| ql|S )N    Копияr   )%attachmentsZchat_groupsZcmf_archivedr  Zcmf_deletedZ
cmf_importZcmf_locked_atZcmf_locked_byZcmf_modified_atZcmf_modified_byZcmf_viewed_atr*   Zcommentsr
   Z	documentsZext_idZfavorite_forrk   r   Zimport_originalZimport_raw_jsonZlocal_linksZlocal_links_docs_inZlocal_links_tasks_inr\   rn   r  statusZstatus_closed_atZstatus_in_progress_endZstatus_in_progress_startZstatus_modified_atZstatus_review_atr<  rP  rz   Ztask_filtersT)Z
is_definedr  Zperm_)r\   r/   r	   r  rP   r  r  setattrr   r   rC   )r   r\   r   new_projectZskip_fieldsr:  attrr   r   r   r   clone  s    
	

zCmfProject.clone)r\   r*   r<  structure_copy	full_copyc                   s6  dd   fdd fdd}dd  fd	d
|rBd}t jj| jdgd}	|	j|pf|	jd ||| d}
|
jdd|d |rֈ|
|
t|	jd |r||
|	d |	j	rt j
j|
|	j	jd|
_	|
jdddd |
js2t  }t jjdd|_|
|_d|
j |_d|_|jddd ||
_|
jddd |
S )Nc                 S   s,   |    |   |   |   |   d S r$   )Z_calc_perm_parentZ_calc_perm_inherit_acl_idZ_calc_perm_has_aclZ_calc_perm_aclZ_calc_perm_effective_aclr  r   r   r   	_calc_acl%  s
    z2CmfProject.create_from_template.<locals>._calc_aclc                    s   |D ]}t |tjtjtjtjfr$q|dg |j|jdd}||_	| |_
| |_ | t|dddkrtj| d}|jddd ||_|jdddd	 | |t|j qd S )
Nrz   T)r\   Zcopy_attachmentsrs   Fr   r   r   emit)Znoitfyr  r8   )r}   r/   r   r  r~   r   r  r   r\   rA   r<   rX   r{   r;   r   rv   rz   )r  
new_parentorig_childrenZ
orig_child	new_childr   )r  _copy_tree_nodesr   r   r  ,  s"    z9CmfProject.create_from_template.<locals>._copy_tree_nodesc              
      s  dd t jj| ddD }|dd t jj| ddD  |j }|dg || }d| j |_d |_	|j
ddd	 |  |j
ddd	 || _| j
ddd	 t jj|dd
ddddd
dgd}i }g }|D ]>}||krq҈|| d}	|j|j|j|jd}
|
 D ]Z\}}|D ]J}|j|kr,qt|	|| t|	|||j d|jj   qq|	jr||	jjj d|	jjj  |	_d |	_d |	_	g |	_g |	_|	j
dddd |	js|	   |	 |j|	_|j|	_|	j
dddd |	jdkr|	||j< q||	 q|t|  D ]\}|jr$|j|krD||_n| |jjd |_|!  |   |	 |j
dddd q$| || d S )Nc                 S   s"   i | ]}|j  d |jj |qS r   rP   r\   r   )r   lstr   r   r   r  D  s      zHCmfProject.create_from_template.<locals>._copy_tasks.<locals>.<dictcomp>T)r<   Zinclude_archivedc                 S   s"   i | ]}|j  d |jj |qS r  r  )r   compr   r   r   r  F  s      ***r   Fr  r   zlists.parentzattachments.urlzfix_versions.parentzaffected_versions.parentzcomponents.parentr<   rC   )r  r  )listsfix_versionsaffected_versionsr   r   r  r   r8   	task.epicztask.subproject)r   r  r8   )"r/   rw   rv   updater  r  r=   r  r\   Zop_gantt_taskr;   Z_calc_gantt_taskr  r  r  r  r   r   r<   r{   r|   rN   rP   r   Z	main_listr  r  r   Zparent_taskr   r*   r  r0   Z_calc_gantt_path)r  orig_projectnew_project_params_dictZorig_main_gantt_projectnew_main_gantt_projectZ
orig_tasksZparent_tasksrP  Z	orig_tasknew_taskZparams_listsZ
param_namer  r   r  )r  
_copy_task_copy_task_filtersr   r   _copy_tasksA  s    


   
, z4CmfProject.create_from_template.<locals>._copy_tasksc              
   S   s   |   }| j|_| j|_||_||_|jdkrDtjj| j	j
|d|_	| |_| jr| jD ]N}t|jd,}tj||j
d}||  |  W 5 Q R X ||| qZ|jdddd |S )Nr  r\   r<   rbr/  FTr  )r  r^   Z
cmf_authorr<   rX   r   r/   r   r0   rA   r\   r  r*   r  openZfull_path_filer  Zupload_filereadr;   Z_replace_attachment)r  r  r  Zattachr  Z
new_attachr   r   r   r    s"    


z3CmfProject.create_from_template.<locals>._copy_taskc                    s  dd| g}| dd tjj|dD  dd| g}| dd tjj|dD  ddd| gddd	gg}| d
d tjj|dD  ddddddg}tjj|dgdd |D  d}|D ]}| }	| |	_| |	_	|j
r|j
|kr| |	_
ntjj|j
j| d|	_
| g|	_|D ]j}
t||
D ]X}|j	|kr,qt|	|
| ||j d|jj d }|rt|	|
| qq
 |	 |	jddd qd S )Nr<   r   c                 S   s"   i | ]}|j  d |jj |qS r  r  r  r   r   r   r    s     zOCmfProject.create_from_template.<locals>._copy_task_filters.<locals>.<dictcomp>r+   c                 S   s"   i | ]}|j  d |jj |qS r  r  )r   docr   r   r   r    s     ZANDr   r  c                 S   s"   i | ]}|j  d |jj |qS r  r  )r   r   r   r   r   r    s     Z
ft_sprintsZft_tagsZft_listZ
ft_releaseZft_componentsZft_epicsr  c                 S   s   g | ]}|d  qS )z.parentr   )r   r:  r   r   r   r     s     zOCmfProject.create_from_template.<locals>._copy_task_filters.<locals>.<listcomp>r  r  r   Fr  )r  r/   r   rv   r  r  r   r  rX   r<   rA   r0   r\   Zft_projectsr{   r|   rP   r   rN   r;   )r  r  r  Z_folder_filterZ_doc_filterZ_epics_filterZ
field_listZorig_project_task_filtersZorig_task_filterZnew_task_filterr:  r   Znew_item)r  r   r   r    sP    






z;CmfProject.create_from_template.<locals>._copy_task_filtersTr  r  r  )r\   r*   r<  Zcloned_fromF)r  r   r  )r  r  r  )r  r  r/  r  r   r4   r   r  )r/   r	   r0   r   r  r\   r;   rv   rz   r
   rw   r  r  r  r%   r<   r   )r   r\   r*   r<  r  r  rx   r   r  r  r  r  r   )r  r  r  r  r   create_from_template"  sD    K/zCmfProject.create_from_templatez@hourly)Z	only_onceZ
system_jobZschedulec                  O   s$   t jjdd}|D ]}|  qd S )NT)r   )r/   r	   rv   r   )_argsr"   Zproject_listrX   r   r   r   $celery_hourly_sync_rdisk_folder_hook  s    z/CmfProject.celery_hourly_sync_rdisk_folder_hook)NNN)NN)rX   N)N)N)N)NN)T)NN)NNNNN)N)I__name__
__module____qualname__classmethodr   r!   staticmethodZon_server_eventr#   r&   r)   r3   r6   r?   rW   rY   rQ   r   r   r   r   r   r   r   r   r   r   r!  r  r  r  r  rN  rO  r   rQ  rT  rV  rW  rl  rr  rz  r  r;   r  r  r  r  r  r  r  r  r  r  rv   r  r  r  r  r  r  r  r  r  r  propertyr  r  r  r  Zcmf_deferred_jobr  __classcell__r   r   r   r   r	      s    :& ,


  |  "f
1
!.
v> 

>


47    


  \r	   )r   r   r   r   rE  r   builtinsZcmf.includeZ"modules.project.fields.cmf_projectmodulesr  r   rX   rC   Zcmf_projectr	   r   r   r   r   <module>   s   