U
    Įwh&                     @   sJ   d dl T d dlZd dlmZ d dlmZ d dlmZ G dd dejZdS )    )*N)	timedeltafields)cmf_time_trackerc                   @   sr   e Zd Zejjddddg Zdd Zdd Zd	d
 Ze	dd Z
dd ZedddZe	dd Ze	dd ZdS )CmfTimeTrackertimetracker_starttimetracker_stoptimetracker_pausetimetracker_recalcc                 C   s   t jj|dddgd}|s&tddd |js8tddd | j d	krN|   d|_|j	d
krt|j
d
d |  n|jdd tjtjj}t j||d|| d}|jdd d	| _|| _|| _| jdd dS )uH   
        Нажатие кнопки плей по задаче
        responsibletimetracker_is_runningcache_status_type)idr   u    Задача не найденаT)abortuV   У задачи нет исполнителя, нельзя начать работу!in_progressZIN_PROGRESS)Zstatus_typeZ	only_dataopen)
start_dateend_datestatusparenttimetrackerN)modelsZCmfTaskget	cmf_alertr   r   loadr
   r   r   Zset_default_statussavedatetimenowtimezoneutcCmfTimeTrackerHistoryplay_start_datetask)selfZtask_idZactive_taskr   
tt_history r'   +./modules/person/models/cmf_time_tracker.pyr      s2    

z CmfTimeTracker.timetracker_startc                 C   s   | j dddgd | jdkr$|   | jrvd}tjjdd| jgdd	dgdd	| jggd
sdd| j_d}|rv| jj	dd d| _d| _d| _
| j	dd dS )uH   
        Нажатие кнопки стоп по задаче
        r$   ztask.timetracker_cache_statusr   r   r   Fr   !==filterTr   closedN)load_fieldsr   _timetracker_history_closer$   r   r   r   r   r   r   r#   )r%   Ztask_changedr'   r'   r(   r	   5   s"    

zCmfTimeTracker.timetracker_stopc                 C   sr   |    | jdgd | jr\tjjdd| jgdddgdd| jggds\d	| j_| jjd
d d| _	| jd
d dS )uJ   
        Нажатие кнопки пауза по задаче
        r$   r   r   r)   r   r*   r   r+   FTr   pauseN)
r/   r.   r$   r   r   r   r   r   r   r   )r%   r'   r'   r(   r
   S   s    
z CmfTimeTracker.timetracker_pausec                 C   sb   t jjdd|ddgd}d}|D ]<}tjtjj|_|j|j 	 d |_
|jdd	 d}q d
S )u   
        Вызываем из внутренних методов и с фронтенда периодически по активной задаче
        r   Zfactr   r   )r   Zhistory_typer   r   F<   Tr   N)r   r"   listr   r   r    r!   r   r   total_seconds
time_spentr   )clsr$   Zopen_history_listZhave_changesopen_historyr'   r'   r(   r   b   s    z!CmfTimeTracker.timetracker_recalcc                 C   s   | j dgd | jrtjjd| j| ddgd}|s>td d S d|_tjtj	j
|_|j|j  d	 |_|jr|jd
d | jjr| jj|j n|  d S )Nr$   r   r   r   r   )r   r   r   r   u   DEV: WARNING. Не найден текущий активный отрезок времени при паузе timetracker. Возможно, пытались остановить уже остановленную задачу.r-   r1   Tr   )r.   r$   r   r"   r   r   r   r   r   r    r!   r   r   r3   r4   r   op_gantt_tasktimetracker_add_work_hookdelete)r%   r6   r'   r'   r(   r/      s    z)CmfTimeTracker._timetracker_history_close   ДобавленоNc           	      C   s   |  dg | jr>| jj||d |r>| | }| j| |dkr|rf| j|}|t|d }ntj	tj
j}|t|d }tj|||d|| d||d	}|  |S dS )u   
        Вызываем из внутренних методов и с фронтенда для изменения списанного и оставшегося времени
        start_date - строка
        r7   )remaining_estimater   Zminutesr-   N)	r   r   r4   r   textr   r   r;   	cmf_owner)r.   r7   r8   Zrate_per_minuteZtimetracker_add_cost_hookZ
alarm_datecastr   r   r   r    r!   r   r"   r   )	r$   r4   r;   r=   r   r>   Z
cost_deltar   r&   r'   r'   r(   timetracker_task_change_time   s2    z+CmfTimeTracker.timetracker_task_change_timec              
   C   s^   t j t jj}|t|d }|j  |j}|s8tj}t	j
|||dd|d |d}|  d S )Nr<   r-   uR   Изменение фактических трудозатрат по задаче)r   r   r4   r   r=   r   r   Z
cmf_author)r   r   r    r!   r   r   r   gZcurrent_userr   r"   r   )r5   r$   Z
work_deltar   r   Zhistory_authorr&   r'   r'   r(   "_op_gantt_actual_work_changed_hook   s"    

z1CmfTimeTracker._op_gantt_actual_work_changed_hookc                 C   s@   t jjdd|gddddgdddgggd}|D ]}|  q.d S )Nr$   z==ORr   r   r0   r+   )r   r   r2   r	   )r5   r$   Ztracker_listZtrackerr'   r'   r(   timetracker_task_change_status   s    *z-CmfTimeTracker.timetracker_task_change_status)r:   NN)__name__
__module____qualname__r   r   Zapi_methodsr   r	   r
   classmethodr   r/   staticmethodr@   rB   rD   r'   r'   r'   r(   r      s$   %
'
r   )Zcmf.includer   r   Zcmfr   Zmodules.person.fieldsr   r   r'   r'   r'   r(   <module>   s
   