B
    Zf%                 @   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)	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      s0    

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   z!==)filterT)r   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   z!=r   r(   r   )r)   FT)r   pauseN)
r,   r+   r#   r   r   r   r   r   r   r   )r$   r&   r&   r'   r	   S   s    z CmfTimeTracker.timetracker_pausec             C   sf   t jjdd|ddgd}d}xD|D ]<}tjtjj|_|j|j 	 d |_
|jdd	 d}q"W d
S )u   
        Вызываем из внутренних методов и с фронтенда периодически по активной задаче
        r   Zfactr   r   )r   Zhistory_typer   r   F<   T)r   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*   r.   T)r   )r+   r#   r   r!   r   r   r   r   r   r   r    r   r   r0   r1   r   op_gantt_tasktimetracker_add_work_hookdelete)r$   r3   r&   r&   r'   r,      s    z)CmfTimeTracker._timetracker_history_close   ДобавленоNc          
   C   s   |  dg | jr"| jj||d |dkr|rJ| j|}|t|d }ntjtjj	}|t|d }t
j|||d|| d|d}|r||_|  |S dS )u   
        Вызываем из внутренних методов и с фронтенда для изменения списанного и оставшегося времени
        start_date - строка
        r4   )remaining_estimater   )minutesr*   N)r   r   r1   r   textr   r   r8   )r+   r4   r5   Z
alarm_datecastr   r   r   r   r    r   r!   	cmf_ownerr   )r#   r1   r8   r:   r   r<   r   r%   r&   r&   r'   timetracker_task_change_time   s,    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 )N)r9   r*   uR   Изменение фактических трудозатрат по задаче)r   r   r1   r   r:   r   r   Z
cmf_author)r   r   r   r    r   r   r   gZcurrent_userr   r!   r   )r2   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   sD   t jjdd|gddddgdddgggd}x|D ]}|  q0W d S )Nr#   z==ORr   r   r-   )r)   )r   r   r/   r   )r2   r#   Ztracker_listZtrackerr&   r&   r'   timetracker_task_change_status   s    *
z-CmfTimeTracker.timetracker_task_change_status)r7   NN)__name__
__module____qualname__r   r   Zapi_methodsr   r   r	   classmethodr
   r,   staticmethodr=   r?   rA   r&   r&   r&   r'   r      s   %&r   )Zcmf.includer   r   Zcmfr   Zmodules.person.fieldsr   r   r&   r&   r&   r'   <module>   s
   