B
    fq                @   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jjjjjddddddddg 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d0d1 Zd2d3 Zdd4d5Ze	dd	d6 fd7d8
Z d9d: Z!d;d< Z"d=d> Z#d?d@ Z$dAdB Z%dCdD Z&dEdF Z'e	dGdH Z(e	d fdIdJ	Z)dKdL Z* fdMdNZ+dOdP Z,dQdR Z-edSdT Z.dUdV Z/dWdX Z0ddZd[Z1 fd\d]Z2 fd^d_Z3e	dd`daZ4dbdc Z5ddde Z6dYdfdg fdhdi
Z7 fdjdkZ8dldm Z9dndo Z:e	dpdq Z;e	drds Z<e=dtdudvZ>e	dwdx Z?dydz Z@e	d{d| ZAe	d}d~ ZBdd ZCdd ZD fddZEdd ZFdddZGeHdd ZI fddZJdddZKd	d	d	dfdfdddZLeeMdYdYdddd ZN  ZOS )
CmfProjectget_obj_treeZdelete_node	move_itemZget_public_tree_leafget_tree_leafget_full_treecheck_project_role_accesscreate_from_templateNc                sB   |dkr&|sg }|dd|gdddgg}t  j|f|||d|S )Ndefault_list	parent_idz==cache_status_typez!=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_idzCmfProject:changed)idvalueZcmf_emit_server_event)selfdatar   r   r   invalidate_cache"   s    zCmfProject.invalidate_cachezCmfProject:changed)Zchannelc             K   s   | d t jkrt j| d = d S )Nr   )ZAPP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 )N)	scheme_wfr   _calc_scheme_wf)r!   )r   r   r   r*   1   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codez==)r   )cust_field_conf_scheme
is_changedis_nullmodelsZCmfCustFieldConfSchemegetr'   r+   oldZ
cache_hooknew)r!   r   r   r   _calc_cust_field_conf_scheme7   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_schemeB   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_alert)r!   r   r   r   _calc_default_listJ   s    

zCmfProject._calc_default_listc             K   s   t ddS tt| j|dgd}|s,g S |}g }x&|rZ||jj |jj	dgd}q6W ddd|gd	d|gg}	x>| 
 D ]2}
|
j}||}|r|| |	g||< q||	||< q|W | jf |d
d|}| j||dS )u_   
        Построение дерева от не корневого обьекта
        
DepricatedNtree_parent)r   fields)r?   ORtree_parent_idINr   T)filtersfilter_project)rA   )	Exceptiondictvarsr/   r0   appendr   r    r>   r:   _get_node_models
class_name_get_tree_dataZ_create_tree)r   Z	obj_modelZ
obj_filterrC   rA   r   objr9   Z
parents_idZparent_filtermodel
model_namemodel_filter	tree_datar   r   r   r
   W   s*      
zCmfProject.get_obj_treeprojectc       	         s|   t dd S ddd|gdd|gg}x>|  D ]2}|j}||}|rV|| |g||< q,|||< q,W t j||fd|i|S )Nr=   r@   rA   z==r   rC   )rE   rF   rI   rJ   r0   r   r   )	r   rA   project_typerC   r   Zparent_filtrM   rN   rO   )r   r   r   r   x   s      
zCmfProject.get_tree_leaf)r?   rC   rR   rD   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}	xP|D ]H}
tt|
 }||
 pg }|tjkr|ddd gg}|j||jd |	|
< qjW |	S )!Nr=   ordernonamecmf_owner_id	cmf_ownerrR   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_policyz==r	   )r   r?   Zorder_bysys_type=)r   r?   )	rE   r0   popr/   r	   listrG   CmfListZtree_fields)r   r?   rC   rR   rD   argsr   Zproject_filterZproject_fieldsrP   rN   rM   rO   r   r   r   rK      s`                                




zCmfProject._get_tree_datac             C   s   t dd S D ]"}|jdkr|jjjdd d qW |rxL||	dd	  D ]6}|j
|krLt|d
shg S t|tjr||| |gS qLW g S x|tjj D ]}|| qW |tjj S )Nr=   c             S   s   xt | jjD ]~}d|jkr\t|dd r\d|j | jkr\t| d|j ds\| jj| t|tj	rd| jkrt| dds| jj| qW d S )Nrk   show_Tr\   )
r   
tree_nodesr    r?   getattrrk   remove
isinstancer/   CmfChatGroup)rQ   noder   r   r   hide_project_parts   s    

z5CmfProject._get_tree_root.<locals>.hide_project_partstagsc             S   s   | j S )N)rT   )rw   r   r   r   <lambda>       z+CmfProject._get_tree_root.<locals>.<lambda>)key:r   rr   )rE   r0   r/   	CmfFolderrJ   rk   rr   r    sortsplitr   hasattrru   r	   )r   rP   rA   rx   folderrL   rQ   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)r9   rk   u   КорзинаT)r>   rT   rk   systemrd   F)notify)r/   r~   r0   r8   )r!   r   r   r   r   scaffold_trashcan   s
    zCmfProject.scaffold_trashcanc             C   sL   d}t j| d| j d|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]]]uA   Фильтр для доски "Активные спринты" rQ   )r9   rT   Z
view_scopeft_add_ubqlF)r   u   Активные спринтыT)r>   rT   Zkanban_filterr   )r/   CmfTaskFilterr+   r8   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}xF|jD ]<}	t|	tjr|	j	r|	j	j
| j
kr|	jdkr|jj|	 qW ||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/}xB|D ]:\}}||tjt||d0d1td2||j  | dd qzW ||tjtd ddd3d4td5| dd ||tjtdd6d7td8| d9d:d d S )<Nc                sj   x6| j D ], t |rt fdd| D r S qW |f d| i||}|jdd | j j| |S )Nc             3   s   | ]\}} | |kV  qd S )Nr   ).0kv)ir   r   	<genexpr>  s    zNCmfProject.scaffold_backlog.<locals>.add_node_if_not_exists.<locals>.<genexpr>r>   F)r   )rr   ru   allitemsr8   r    rH   )r>   
node_classnode_filter_kwargsnode_create_kwargsrw   r   )r   r   add_node_if_not_exists  s    $z;CmfProject.scaffold_backlog.<locals>.add_node_if_not_existsu   Задачиzproject.agileZBacklog)r9   F)r   backlog)rk   i T)rT   filter_parent
tmp_filterrS   r   )r>   r   r   r   ry   u   Тэги)rT   Zdatesu   Даты
   )rT   rS   r   ZfalseZnot_assigned)filter_responsible_setrk   u   #НеНазначено)rT   r   )tz   )monthdayhourminutesecondZmicrosecondc                s   g | ]} j |d qS ))r   )replace)r   r   )start_of_yearr   r   
<listcomp>b  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   r   d  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_maxrk   #Zno_alarm_date)r   Zfilter_plan_start_date_setZfilter_alarm_date_setrk   u   #БезДатыZnot_approved)Zfilter_approvedrk   u   #Согласоватьu  В фильтр "#Согласовать" попадают все идеи, пожелания, задачи от пользователей.
Владелец проекта обрабатывает список и переносит задачи в другие списки.
В идеале этот список должен быть обработан, то есть оставаться пустым к концу рабочего дня владельца проекта.

примеры  списков, куда можно перенести задачи из "#Согласовать":
todo0 Срочно до мвп
todo1 В течение года
todo2 Через год
Отклонено
Версия октябрь 2021)rT   r   text)NNNN)logic_prefixr/   r   r8   r~   rF   rr   ru   CmfActiveEntityFilter
filter_tagra   Zcache_select_countr    rt   r   nowr   utcr   rangezipr   )r!   rp   r   r   Zfld_tasks_namebacklog_filterZ	fld_tasksZfld_tagsZ	fld_datesrw   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/)rT   )r!   rT   r   r   r   project_dir  s    zCmfProject.project_dirc             C   s   t jjj }|| S )N)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   create)r!   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 }x(| jdgdD ]}|d|j d7 }qhW |d	7 }| |  }||_d S )
Nz(owner: null
rules:
- all deny read,writezowner: zowner: nullz
rules:login)r?   z
- z allow read,writez
- all deny read,write)	rdisk_enabledis_project_dir_existr   r   perm_strr   rV   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 )N)rT   r   r   exists)r!   rT   r   r   r   r     s    zCmfProject.is_project_dir_exist)rR   rC   c               sF   t dd S t jf ||d|}x|D ]}|  |  q*W |S )Nr=   )rR   rC   )rE   rF   r   r   r   r   )r   rR   rC   rp   r   resrQ   )r   r   r   r     s      
zCmfProject.get_full_treec             C   s  | j   | j r|   tjjdd}tjjdd}tjjdd}tjjdd}tjjdd}t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rPt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_#x |j$% D ]}	|	jdd qW 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_#x |j$% D ]}	|	jdd qjW d| _>d| _?d| _@d| _Ad| _Bd| _Cd| _'d| _&d| _(d| _)d| _Dd| _Ed| _F| jddd, tjGjHjI}
xX|
D ]P}|dUkrqtjG|
| |j<||j:dV|_J|dWkr,d|jJ_|jJjdd qW | j
dXkrTtjjd| jd|_tj| dYd"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| dZd<dd|_0tj1|j0d[d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=_#x |j$% D ]}	|	jdd qW d| _>d| _?d| _&d| _'d| _(d| _)d| _Dd| _Ed| _@d| _F| jddd, tjGjHjI}
xF|
D ]>}|dUkr$qtjG|
| |j<||j:dV|_J|jJjdd qW | j
dkrtjLjd\d| _M| Nd]d^}| Nd_d`}| Ndadb}dcdddetjjdfddg|||dhdidjtjjdfddg|||dhdkdltjjdmddn|||dhdodptjjdmddn|||dhgdqdrdidjtjjdfddg|||dhdsdttjjdfddg|||dhgdqg}| O| | jPdudvtjjdwd|||dgdx tj| dydzdd|_Qtj7| d{| j d|d}| jR d~d|_StjT|jQ| |jSdd|_Utj7| d{| j dd}| jR dd|_VtjT|jQ| |jVdd|_Wtj7| d{| 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=_#x |j$% D ]}	|	jdd 
qW d| _>d| _?d| _&d| _'d| _(d| _)d| __d| _`d| _ad| _bd| _cd| _Dd| _Ed| _F| jddd, tjGjHjI}
xD|
D ]<}|ddr*tjG|
| |j<||j:dV|_J|jJjdd q*W | e  | f  | g  | h  d"S )uU    Добавляем структуру папок в новый проект
        zlist.pfeed:default)r+   ztask.epic:defaultzlist.agile_sprint:defaultzlist.release:defaultzlist.base:defaultuc   Вызываем разворачивание чтобы появилась папка задачиr   )make_dataclassZ	DataEmptyzproject.servicedeskztask.gantt_project:defaultu	   Гант TF)r   u   Дискdisk)r>   rT   rk   r   u
   Архивarchiveu
   Лентаu   Лента проекта pfeed)r>   rT   r   	list_typer'   r   u   Чат )r>   	executorsrT   r   zproject.wikir   )rk   rA   u   Документ1)r>   rT   u   ДокументыN)r>   rT   rk   u   Документ2i i i" iI i i  i )r6   r   zproject.agileZEpicsepiczEpic 1)r9   r>   rT   r'   ZSprintssprintzSprint 1Zkanban)r>   rT   r   r'   ZReleasesreleaseu   Релиз 1rn   ZRoadmapsroadmapu   Roadmap Проекта)r>   rT   r   )r>   rT   rk   workflow)r>   rT   r   u   Все задачиfilter_all_tasks)rT   rk   r>   u   ФильтрыrC   u   Фильтр 1u   Фильтр 2u   Отчетыreportsu   Компоненты
componentsi i i q i0 i@ iP4 i`[ ip i mark)rT   r>   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
   Общееu"   Получить ИТ помощьuZ   Получите помощь по общим ИТ-проблемам и вопросам.ztask.sd_service_request:defaultzservice-requests)rT   r   r'   categoryui_form_viewui_form_createui_form_view_inneru9   Запросить новую учетную записьuP   Запросите новую учетную запись для системы.u7   Сообщить о системной проблемеu   Дайте нам знать, если что-то не работает должным образом, и постарайтесь быстро восстановить его работоспособность.ztask.sd_incident:defaultZ	incidentsu?   Сообщить о сломанном оборудованииu   Сообщите об оборудовании, которое может быть неисправным или сломанным, например разбитый экран компьютера или поврежденный сервер.)rT   typesu+   Логины и учетные записиu<   Запросить доступ администратораuY   Например, если вам нужно администрировать EvaProject.u3   Запрос по электронной почтеuu   Запрос получен от вашего канала поддержки по электронной почте.ztask.sd_emailed_request:default)rT   r   r'   r   r   r   r   u   Очередиqueuez[["parent_id", "=", "z*"], ["cache_status_type", "!=", "CLOSED"]]zproject = "z!" and cache_status_type != CLOSED)r9   bqlubql2u   Все обращения)r>   r9   Ztask_filterrT   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)r>   rT   rk   rh   r   u   КатегорииZknowlage_base_categoriesu   Статьиu   Каналыservicedesk_channelsu   Клиентыservicedesk_clientsZanalysis)ir   r:   r   r/   CmfLogicTyper0   ZlogginginfoZdataclassesr   r   r   main_gantt_projectCmfTaskr'   r9   rT   r   r8   r~   r   r   ro   r   rv   chatr   r   r   r   CmfDocumentZdoc1ZdocsZ
docs__doc2rS   rd   __dict__valuesr[   rY   rZ   r\   ZepicsZepics__epic1ZsprintsZsprints__sprint1ZreleasesZreleases__release1ZroadmapsZ
CmfRoadmapZroadmaps__roadmap1r   Z
docs__doc1r   Zkanban_boardr   r   rC   Zfilters__filter1Zfilters__filter2r   r   rX   rW   r`   r]   r_   r^   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scaffold_mark)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  sb   


















zCmfProject.scaffoldc             C   s~   d}t jj| |dgd}|szt j| d| j dd| j dd}|jd	d
 t j| t jj| ddd|d|d}|jd	d
 d S )Nu6   Оценка качества обслуживанияr   )r9   rT   r?   z["parent_id", "=", "z"]zproject = "")r9   r   r   F)r   r   T)r>   rk   r   r   )r9   r>   rT   r   r   )r/   r   r0   r   r   r+   r8   r~   )r!   report_namereportr   r   r   r   r  p  s    zCmfProject.scaffold_markc             C   s  dddddddddgd	d
dddddddddddgidgd	dddddddddddgd	dddddgdd d!d"dddgd#d d!d$dd%dgd&d d!d'dddgd(d d!d)dd*dgd+d d!gd	d,d-d.dd-ddd.d/ddgd	d0d1ddd2d3gd4d5d!d6dd%d2d3gd6d5d!d7ddd2d3gd7d5d!gd	d8dddd9gdd d!d"ddd9gd#d d!d$dd%d9gd&d d!d'ddd9gd(d d!d)dd*d9gd+d d!gd	g}x0|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}x|D ]z}t }t }	||	_	| d:|	_
| dJ|	_| dK|	_| dL}
|
rtjj | |
dM|	_g }g }|dN| j  |dO| j d> | dPg }x|D ]}|dkrdQdRdS || D }|| dT| dU tjjdVdW|| gdX}g }x|D ]}||jj qPW dY}dQdZdS |D }|d[| d\| d] n|d^krtjj | || dM}|rz|| d_|j d@ |d[| d`|jj d> n|dakrDtjjj}|| d_|||   d@ |d[| d`||  d> n6|| d_||  d@ |d[| d`||  d> qW db|}dcdd| de }||_||_|jdBdC ||	_|	jdBdC qLW |jdBdC qW d S )fNu`   Анализ SD. Отчет по созданным задачам против решенныхu   СозданоZcreatedz#f15c75)rT   
value_typecoloru   РешенныеZdonez#7bc1a1)rT   rowsu5   Анализ SD. Отчет время решенияu   Все задачиZaveragez#8eb021u   Время решения)rT   r	  r
  slau   Инцидентыz#ea632br'   ztask.sd_incident:default)rT   r	  r
  r  
row_filteru]   Анализ SD. Отчет по выполненным SLA против нарушенныхu   ВыполненоZsd_sla_processedz#14892cu   НарушеноZsd_sla_breachedz#d04437uQ   Анализ SD. Отчет по инцидентам по приоритетамu   Критичныйr   r   )r'   priority)rT   r	  r
  r  u   Высокийr   u   Обычныйz#815b3ar   u   Низкийu   Минимальныйz#d39c3fu>   Анализ SD. Отчет по уровню успеха SLAu+   Время до первого ответаZsd_sla_compliance_percentz#59afe1uO   Анализ SD. Отчет по запросам на обслуживаниеu3   Все запросы на обслуживаниеztask.sd_service_request:defaultz'task.sd_service_request_approve:defaultu   Все)r'   request_typeu"   Получить ИТ помощьu9   Запросить новую учетную записьuM   Анализ SD. Отчет по проблемам по приоритетуztask.sd_problem:defaultrT   r   )r9   rT   r?   z["parent_id", "=", "z"]zproject = "r  )r9   r   r   F)r   r   T)r>   rk   r   
line_chart)r9   r>   rT   r   r   r  r
  r	  r  )r9   rT   z
project = z["parent", "=", "r  z, c             s   s   | ]}d | d V  qdS )r  Nr   )r   r   r   r   r   r     s    z1CmfProject.scaffold_line_chart.<locals>.<genexpr>z in ()r+   rB   )r    c             s   s   | ]}d | d V  qdS )r  Nr   )r   r   r   r   r   r     s    z["z
", "IN", [z]]r  z = "z	", "=", "r  z and [z ,])r0   r/   r   r   r   r+   r8   r~   ZCmfRepLineChartRowr9   rT   r
  r	  CmfSDeskSlar  rH   joinr   rn   r    CmfSDeskRequestTyper   r  r   r   r   r  )r!   r  Zchartr  r  r   r  rowZrow_task_filterZ	chart_rowr  Zubql_filterZ
bql_filterr  fieldZvalsZlogic_typesZbql_valsltr  r  r   r   r   r     sL   

















"
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 )
N)r+   u3   Отсутствует экранная форма T)r7   z: r   F)r6   r   )Zobj_copy)	r/   Z	CmfUiFormr0   r;   task_code_prefixrT   Zcmf_model_namer8   r   )r!   r+   action_nameZui_formZ_ui_formr   r   r   r     s    zCmfProject._create_ui_view_formc             C   sf   t jjdd}t jjdd}t  }| |_||_|jtj	 |
  t  }| |_||_|
  d S )Nzsdesk-client:default)r+   zsdesk-agent:default)r/   CmfProjectRoler0   CmfProjectRoleAssignr9   Zproject_rolemembersrH   gcurrent_userr8   )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:default)r+   u   Время решенияr   )r9   rT   Zwidget_typei     z+request_type.request_category = 'incidents')r9   rS   Z	goal_timeZubqlcalendari  i  z2request_type.request_category = 'service-requests'i  i`	  z7request_type.request_category = 'post-incident-reviews'i  r  startzissue-created)r9   trigger_typetrigger_conditionzresolution-clearedstopzresolution-setu+   Время до первого ответаx   zcomment-for-reporterzstatus-type-changedZsd_waiting_for_customer)r9   r'  r(  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   r  r8   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 )NrT   rl   r   z!=)r   u   Проект с именем uA    уже существует. Укажите другое имя.T)r7   u-   Раздел на диске с именем uF    уже занят. Укажите другое имя проекта.)r/   r	   slistrT   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 )	Nr@   rT   z==r+   )r   u7    с таким именем уже существуетT)r7   )rH   r0   r;   Zverbose_name)r   rT   r+   Z
prj_filterr   r   r   _check_unique-  s
    zCmfProject._check_uniquec                s$   |  || t j|||d|S )N)rT   r+   )r/  r   r   )r   rT   r+   rp   r   )r   r   r   r   6  s    zCmfProject.createc             C   sb  ddddddddd	d
ddddddddg}ddg}x|D ]}d| }| j | jr6x|D ]|}tt| jdd| jgdd|ggd}|s|dkrtt| jdd| jgdddggd}|rV| j | j |_|jdd qVW tj	jdd| jgddd| ggd}|r6| j | j |_|jdd q6W | j
jr^tjjdd | jgd}|r^| j
j |_|jdd d S )!NtasksZapprovedr   r   r   r   r   r   r   r   r   r   r   rC   r   r   r   r   r~   r   rq   r   z==rk   )r   r   T)r6   r   zlist.rA   rl   )r   r-   rG   r/   r0   r   r    rd   r8   ro   r\   rv   )r!   Z	sys_typesZnode_modelsrk   Z	fieldnameZ	nodeclassZsysnoder   r   r   _calc_hidden_nodes;  sR    


 
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   r%  r,   r4   cmf_project_admins)r   save_preload_fields)r!   )r   r   r   r4  l  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:ClassrQ   zCmfProject:Class)r9   r-   r>   r;   rR   r   rA   )r!   r   r   r   _calc_parent}  s    


zCmfProject._calc_parentc             C   s(   | j jsd S tj| j j| jj| _ d S )N)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   r  z\W+-r   c             S   s   g | ]}|d  qS )r   r   )r   chunkr   r   r   r     s    z3CmfProject.get_prefix_from_name.<locals>.<listcomp>r   z--r  ZILIKE%)r?   r   c             S   s   g | ]}|j  qS r   )r  lower)r   rQ   r   r   r   r     s    c          
      s8   g | ]0}|   rd d|   dqS )z\Dr  )r   r;  subr   )r   p)prefixrer   r   r     s    )default1)r?  r   Ztranslit_stripr<  r;  r   lenr  r/   r	   r-  setrn   maxstrintupper)rT   ZslugZchunksZprojectsprefixesZexisting_prefixesZmax_prefix_numr   )r>  r?  r   get_prefix_from_name  s*    

zCmfProject.get_prefix_from_namec             C   s,  | j js| jjsd S | j jr| j j | _ | j dksT| j dksT| j dksT| j | jkrhtd| j  dd tjj	dd| j
gd	d
| j ggdgdd}|rtd| j  d|j ddd tjj	dd| j  dgdd| ggdgdd}|rtd| j  d|jj d | jr
d S td ttjj| j
jgd d S )NTSKAZ	NOPROJECTuH   Нельзя использовать системный префикс T)r7   r   z!=r  rl   rT   )r   r?   include_deletedu   Код u2    уже используется проектом u   . Выберите другойr+   ZLIKEz-%rQ   zproject.nameu8    ранее использовался проектом u   . Это может привести к пропускам в нумерации кодов. Если это нежелательно - укажите другой префиксur   Запущен фоновый процесс смены префиксов кодов у задач проекта)rp   )r  r-   Ztask_code_use_logic_type_prefixr    rG  Zcode_prefixr;   r/   r	   r0   r   rT   CmfTaskCodeHistoryrQ   is_newZschedule_deferred_jobr   Zrecalculate_codes_celery)r!   Zproject_with_prefixZ	code_usedr   r   r   _calc_task_code_prefix  s6    


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}x<t
jjdd| | gdd| jggdr|sd}|d7 }qW | | | _d
S )u  
        Генерируем автоматически Префикс для кода задач для Разделов (там он не очень важен)
        TODO1: возможно, выводить на форме создания разделов поле ввода Префикса
        Важно! Этот метод разрешен только для Разделов!
        r   )translitrJ  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   r  c             s   s   | ]}|d  V  qdS )r   Nr   )r   rS  r   r   r   r     s    z@CmfProject._calc_task_code_prefix_for_section.<locals>.<genexpr>ZWIKIr  rl   r   z!=)r   )ZtransliteraterP  rT   r:   r    r?  findallrB  r  rG  r/   r	   sgetr   r  )r!   rP  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)
group_codeu   Для редактирования параметров проекта Вам необходимо находиться в группе Администраторы проектовT)r7   Fu   Для редактирования параметров проекта Вам необходимо быть Администратором проекта)in_person_groupr;   r3  r-   rN  r1   )r!   personZraise_exceptionr3  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 }x| jjD ]x^}}}|d
kr~||kr~t  |j	| |  W d Q R X |tjkrtj|jj |jdds~td| d q~W | j rtjjdd| jgdd| jggd	}|rBtd| j ddd n>|  r| |  }	|	jr|	d| j dt  d d}
| jj
r| !dg | jstd | "  | jj#r| | jj#r| | | jj#}||   | j$rd| j | j$_| j$jdd | j r0| js,| j%| _d}
| j s@| &  | j'sv| j(dkrftj)jdd| _'ntj)jdd| _'| j*stj+jdd| _*| j,stj-jdd}|stj-jdd}|| _,| .  | /  | j0s| j1d kr| 2  ntd!dd | 3  | 4  | 5  | 6  t7 j||}| j sj| j'j
sj| j8j
sj| j9j
sj| j:j
sj| j;j
sj| j<j
rttj)=  |d"drd}
|
r| >  | j?j
r| @  | j s| j*j
rtj+=  tjAjBd#d$d%d&ggd#gd'}x |D ]}d%|_C|jdd qW |S )(NZProjectCreators)rX  u   Для создания проектов попросите Администратора системы добавить Вас в группу Создатели проектовT)r7   r+   z==rW  )r   rH   u   Пользователь uO    добавлен в группу Администраторы проектовrT   r   z!=u   Проект u    уже существуетr   _z%Y-%m-%d-%H%M%SFr   u<   Имя проекта не может быть пустым.u	   Гант )r6   zproject.servicedeskzservicedesk:default)r+   zsystem.open:defaultzsystem:default)Z
is_defaultr5  u8   Укажите Префикс для кода задачdont_scaffoldonboarding_statuszNOT INr   cancel)r   r?   )DrN  r"  r#  Zis_admindisable_permissionsacl_admin_moderY  r;   r3  rH   r-   r/   CmfPersonGroupr0   Z
rg_membersZ
all_nestedZ_changesr   Zdisable_aclr8   Zcurrent_person__member_ofaddr   r    r	   rT   r   r   r   r   renamer   r   load_fieldsr.  r1   r   r+   r1  r2  r   CmfProjectPermSchemer   r   r%  r+  r7  r<   r  rR   rV  rO  r3   r5   r#   r   Zservicedesk_publicrV   rb   
spectatorsr   Ztrigger_reloadr  r   r   
CmfLicensern   r^  )r!   rp   r   Zproject_admins_groupZproject_admins_group_membersZchange_actionZpr_adminr\  r   project_dir_rfileshould_be_scaffolded	old_rfiler%  resultonboardings
onboarding)r   r   r   r8     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}x |D ]}	d|	_*|	j+dd q W |S )NrT   z==r   z!=)r   u   Проект u    уже существуетT)r7   r   r\  z%Y-%m-%d-%H%M%SZdiv)Ztags_extendFu<   Имя проекта не может быть пустым.zproject.servicedeskzservicedesk:default)r+   zsystem.open:defaultzsystem:defaultr5  r^  zNOT INr   r_  )r   r?   )r6   ),rN  r/   r	   r0   rT   r   r;   r   r   r   r   rd  r   r   document_header_textr-   r   Z
html_stripr    document_footer_textr.  r1   r+   r1  r2  r   rf  r   r   r7  r<   r  rR   rV  rI  rO  r3   r   _save_importr  rh  rn   r^  r8   )
r!   rp   r   r   ri  rj  rk  rl  rm  rn  )r   r   r   rq    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   rS   rQ   )r   r?   zCmfTask:zPPP-TSK-ORDER)rL   zPPP-OBJ-ORDERr   i  T)r6   )rs   r/   r   r0   rQ   r   r   check_edit_permrS   r    rF  r8   )r   Zitem_idZ	anchor_idZnext_idZ
item_modelr  Zanchor_modelZanchorZanchor_ordernoZ
next_modelZ	next_itemZnext_ordernor   r   r   r     s(    

zCmfProject.move_itemc             C   s   d S )Nr   )r!   r   r   r   
_calc_code  s    zCmfProject._calc_codec             C   s   d S )Nr   )r!   r   r   r   get_code_prefix  s    zCmfProject.get_code_prefixF)	recursiveTEXKOM_db_deletec               s  | j j}|rd | _| jdd xrdD ]j}xdtt| jdd| gdddD ]B}td|  tt| j	|j
dddrJ|jddd	 t  qJW q&W x8tjj| ddd
D ]"}td|  |jddd	 qW x8tjj| ddd
D ]"}	td|	  |	jddd	 qW x:tjj| ddd
D ]$}
td|
  |
jddd	 qW tjjdd| j
gdd id tjjdd| j
gdd id xNtjjdd| j
ggdddD ].}td|  |j|  |jdd qW t j|||ddd|}| |rtj|}|r|  |S )NT)r6   )CmfComponentrv   r   CmfAttachmentZCmfImportDownloadr   ro   ZCmfTransZ	CmfStatusZCmfWorkflowZCmfSchemeWfr,  r  r   Z	CmfPersonrb  r   r   r~   r9   z==)r   rL  include_systemu   Удаляем )r   rL  ry  )rv  force)rQ   rL  ry  r   )r   r   r$   rB   u   Удаляем из кеша F)ru  rv  ry  r   )rT   r    r   r8   rG   r/   rn   r"  debugrU  r   deleteZcommit_with_eventZCmfGanttTaskrM  ZCmfDocumentHistoryZCmfAccessRuleZbulk_updateZCmfAccessListZCmfCustFieldConfr$   rt   r   r   r   r0   Zmove_to_trash)r!   ru  rv  rp   r   Zcur_nameZcls_namer  Z
gantt_taskZ	task_codeZdoc_historyZcust_field_confr   r   )r   r   r   r|    sJ    
$zCmfProject.deletec                s8   t  jf ddi|}tj| jj|   |   |S )Nry  T)	r   restorer/   r   Zrestore_from_trashrT   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 )N)r   r   )Zhoursr   z==plan_start_date<r   z!=ZCLOSED
alarm_dater   )r   r?   )	r   r   r   r   r   r/   r   rn   r   )r!   r   r0  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   )rZ  rT   rL   msgr  )
auto_alarm_dater  printrV   rT   r    r/   Z	CmfNotifyZplace_notifyZcaption)r!   r0  r   r   r   '_notify_project_owner_not_planned_tasks3  s    z2CmfProject._notify_project_owner_not_planned_tasksc             C   sB   x<t jjddD ]*}| }x|D ]}|j|_|  q"W qW d S )NT)r  )r/   r	   rn   r  r~  r  r8   )r   rQ   r0  taskr   r   r   _cron_auto_alarm_dateK  s
    
z CmfProject._cron_auto_alarm_datec             C   s$   x| j dgdD ]}|  qW d S )Nz**)r?   )rn   r  )r   rQ   r   r   r   &notify_project_owner_not_planned_tasksT  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 }xt 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|_|  qW x| 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}|  q6W dS )u   
        Вызывается если у задачи проекта изменяются тэги.
        Если появился тэг, для которого нет фильтра - создадим его.
        TODO
        Nc             S   s   i | ]}||j jqS r   )r   r    )r   tagr   r   r   
<dictcomp>b  s    z5CmfProject.hook_task_tags_changed.<locals>.<dictcomp>r   )r   rk   ry   c             S   s   i | ]}||j jqS r   )rT   r    )r   r   r   r   r   r  g  s   )rA   filter_tag_idrA   r   z==rk   r  )r?   r   )r9   r>   rT   z: Create new filter for z with category F)r   r   )r>   rT   rk   r   r   )r/   r~   r0   r   rn   r   r  r    rm   Ztag_categoryr:   rT   r8   rA   r   r"  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_changedY  sT    


z!CmfProject.hook_task_tags_changedc             C   s   d S )Nr   )r   r  r   r   r   hook_new_tag  s    zCmfProject.hook_new_tagc             C   s   dS )NTr   )r!   r   r   r   has_tree_nodes_hook  s    zCmfProject.has_tree_nodes_hookc             O   s   d S )Nr   )r   rp   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 y|  W n tk
r   d S X |S )%Nr   rT   r+   rU   rb   Zactivity_idr   r'   zworkflow.namerV   cmf_created_atrR   r  descriptionre   rf   rg   rh   ri   rj   r   Zpublic_html_schemero  rp  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?   )r/   r	   r0   Z_acl_check_readZCmfPermissionError)r   rp   r   Zfields_to_returnrQ   r   r   r   
public_get  sZ    zCmfProject.public_getc             O   s   t jj| f||S )N)r/   rf  r   )r!   rp   r   r   r   r   r     s    z$CmfProject.check_project_role_accessc             C   sR  | j s| jsd S | j rd S | jrNt }xF| jddD ]6}|j|  kr6|jds6|jds6||j q6W xfdD ]^}||krv|	| t
jsvt
jrqv| d| g t| d| rtddd | t
j qvW x`d	D ]X}||kr|	| t
jst
jrqt| |}|jr*|js*td
dd | t
j qW |rN| jd| d d S )NT)r-   Zcache__id)r3  r)   r   Zsecurity_level_schemer4   r2  Z
protected_uv   Поле защищено от изменения, обратитесь к Администратору системы)r7   )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-ADMIN)rL   )rN  r-   rC  r   rJ   Zproject_perm_allow_fieldsr   endswithrc  rt   r"  r`  ra  re  rs   r;   r[  r#  r1   r2   r   )r!   Zchanged_fields_to_checkr  Zadmin_require_fieldfr   r   r   rr    s>    




zCmfProject.check_edit_permc                s
   t   S )N)r   check_delete_perm)r!   )r   r   r   r    s    zCmfProject.check_delete_permc             C   s   x|D ]}t  }| |_|d|_|jdd xV|dD ]H}| j|d|d|d|d||d|d	|d
d q<W qW d S )NrT   F)r   r   r   r'   r   r   r   r   )rT   r   r'   r   groupr   r   r   )r/   ZCmfSDeskRequestGroupr9   r0   rT   r8   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 )N)r/   r  r9   rT   r   r'   r   r   r   Zrequest_categoryr  rH   r8   )
r!   rT   r   r'   r   r  r   r   r   r  r   r   r   r   *  s    z%CmfProject._create_sdesk_request_typec             C   s   | j  d| j d| j S )Nr   )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      r8  r   )cmf.utilr  r   gen_coderB  Zshort_str_enc)r!   r  Zres_code)r   r   r   r  B  s
    
zCmfProject.gen_codec             K   s   |s| j d }tj|d}d}xH| jddD ]8}|j|ks,|jds,|jdrTq,t||j|j q,W x*|	 D ]\}}||j
krrt||| qrW |S )Nu    Копия)rT   )%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_forrc   r   Zimport_originalZimport_raw_jsonZlocal_linksZlocal_links_docs_inZlocal_links_tasks_inrT   rf   r   statusZstatus_closed_atZstatus_in_progress_endZstatus_in_progress_startZstatus_modified_atZstatus_review_atr  r0  rr   Ztask_filtersT)Z
is_definedr  Zperm_)rT   r/   r	   r   rJ   r  r   setattrr    r   r?   )r!   rT   r   new_projectZskip_fieldsr  attrr    r   r   r   cloneJ  s    

zCmfProject.clone)rT   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 )N)Z_calc_perm_parentZ_calc_perm_inherit_acl_idZ_calc_perm_has_aclZ_calc_perm_aclZ_calc_perm_effective_acl)rL   r   r   r   	_calc_aclg  s
    z2CmfProject.create_from_template.<locals>._calc_aclc                s   x|D ]}t |tjtjtjtjfr&q|dg |j|jdd}||_	| |_
| |_|j|_ | t|dddkrtj| d}|jddd ||_|jdddd	 | |t|j qW d S )
Nrr   T)rT   Zcopy_attachmentsrk   Fr   )r9   )r   emit)Znoitfyr  r6   )ru   r/   r   r   rv   r   re  r   rT   r>   r9   rQ   r   rs   r8   r   rn   rr   )r  
new_parentorig_childrenZ
orig_child	new_childr   )r  _copy_tree_nodesr   r   r  n  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 }xP|D ]F}||krqֈ|| d}	|j|j|j|jd}
xj|
 D ]^\}}xR|D ]J}|j|kr4q t|	|| t|	|||j d|jj   q W qW |	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||	 qW xp|t|  D ]\}|jr4|j|krT||_n| |jjd |_|!  |   |	 |j
dddd q4W | || d S )Nc             S   s"   i | ]}||j  d |jj qS )r}   )rJ   rT   r    )r   lstr   r   r   r    s    zHCmfProject.create_from_template.<locals>._copy_tasks.<locals>.<dictcomp>T)r9   Zinclude_archivedc             S   s"   i | ]}||j  d |jj qS )r}   )rJ   rT   r    )r   compr   r   r   r    s    z***u	   Гант F)r  r   zlists.parentzattachments.urlzfix_versions.parentzaffected_versions.parentzcomponents.parent)r9   r?   )r  r  )listsfix_versionsaffected_versionsr   r}   )r  r   r6   )z	task.epicztask.subproject)r   r  r6   )"r/   ro   rn   updaterw  r   r:   re  rT   Zop_gantt_taskr8   Z_calc_gantt_taskr   r  r  r  r   r   r9   rs   rt   rH   rJ   r    Z	main_listr  rg  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_tasksr0  Z	orig_tasknew_taskZparams_listsZ
param_namer  r  r  )r  
_copy_task_copy_task_filtersr   r   _copy_tasks  sv    




0 z4CmfProject.create_from_template.<locals>._copy_tasksc          
   S   s   |   }| j|_| j|_||_||_|jdkrDtjj| j	j
|d|_	| |_| jrxX| jD ]N}t|jd,}tj||j
d}||  |  W d Q R X ||| q\W |jdddd |S )N)z	task.epicztask.subproject)rT   r9   rb)r9   rT   FT)r  r   r6   )r  rV   Z
cmf_authorr9   rQ   r   r/   r~   r0   r>   rT   r  r+   r  openZfull_path_filerx  Zupload_filereadr8   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}x|D ]}| }	| |	_| |	_	|j
r|j
|kr| |	_
ntjj|j
j| d|	_
| g|	_xv|D ]n}
xft||
D ]X}|j	|kr4q t|	|
| ||j d|jj d }|r t|	|
| q W qW  |	 |	jddd qW d S )Nr9   z==c             S   s"   i | ]}||j  d |jj qS )r}   )rJ   rT   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}   )rJ   rT   r    )r   docr   r   r   r    s   ZANDr   z	task.epicc             S   s"   i | ]}||j  d |jj qS )r}   )rJ   rT   r    )r   r   r   r   r   r    s   Z
ft_sprintsZft_tagsZft_listZ
ft_releaseZft_componentsZft_epicsz***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>)r9   r?   )rT   r9   r}   F)r   r  )r  r/   r~   rn   r   r   r   r  rQ   r9   r>   r0   rT   Zft_projectsrs   rt   rJ   r    rH   r8   )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    sD    









z;CmfProject.create_from_template.<locals>._copy_task_filtersTz***)r   r?   u    Копия)rT   r+   r  Zcloned_fromF)r  r   r]  )r  r  r  )r  r  )r9   rT   )r  r   r6   ztask.gantt_project:default)r+   u	   Гант )r  r   )r/   r	   r0   r   r  rT   r8   rn   rr   r   ro   r   r   r   r'   r9   r   )r!   rT   r+   r  r  r  rp   r   r  r  r  r  r   )r  r  r  r  r   r   d  s@    K/zCmfProject.create_from_templatez@hourly)Z	only_onceZ
system_jobZschedulec              O   s(   t jjdd}x|D ]}|  qW d S )NT)r   )r/   r	   rn   r   )Z_argsr%   Zproject_listrQ   r   r   r   $celery_hourly_sync_rdisk_folder_hookC	  s    
z/CmfProject.celery_hourly_sync_rdisk_folder_hook)NNN)NN)rQ   N)N)N)N)NN)T)NN)NNNNN)N)P__name__
__module____qualname__modulesrQ   r?   cmf_projectr	   Zapi_methodsclassmethodr   r#   staticmethodZon_server_eventr&   r(   r*   r3   r5   r<   r
   r   rK   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   r.  r/  r   r1  r4  r6  r7  rI  rO  rV  r[  r8   rq  r   rs  rt  r|  r}  r  r  r  r  rn   r  r  r  r  r  r   rr  r  r   r   propertyr  r  r  r   Zcmf_deferred_jobr  __classcell__r   r   )r   r   r	      s    :& ,

     "f	1".
|> -	>57 

 _r	   )r   r   r   r   r%  r   builtinsZcmf.includeZ"modules.project.fields.cmf_projectr  r  r   rQ   r?   r  r	   r   r   r   r   <module>   s   