U
    3qh                     @   s6   d dl m Z  d dlT d dlmZ G dd dejZdS )    )datetime)*)cmf_course_progressc                       sl   e Zd Z fddZdd Zdd Zedd Zeed	d	d
ddd Z	eed	d	dddd Z
  ZS )CmfCourseProgressc                    sT   |  dg | jjr>| jdkr*| j  n| jdkr>| j  |   t j||S )Ncourse.namein_progress)doneexpiredfailed)	load_fieldsstatus
is_changedZstatus_in_progress_startZset_nowZstatus_closed_at_calc_course_progress_notifysupersave)selfargskwargs	__class__ -./modules/learn/models/cmf_course_progress.pyr      s    


zCmfCourseProgress.savec                 C   s   d}d}| j jr>| j dkr>d}d| jj d| j j| j   }n&| j jrd| j jdkrdd}d| jj }|r|rtjj| | j	j
j||d	d
d d S )N )r   r
   u    Вы завершили курсu   Вы завершили u   . Результат: canceledu   Курс отмененu   Курс отменен    TobjZpersonnamemsgpriorityZforce_notify_current_person)r   r   courser   choicesvaluemodels	CmfNotifyplace_notifyresponsibleid)r   notify_name
notify_msgr   r   r   r      s"     z.CmfCourseProgress._calc_course_progress_notifyc                 C   s   |  ddg |  }d}d}d}|D ]L}|j  |jj| jjkrL|d7 }|jdkr`|d7 }q&|jdkr&|d7 }q&|| d | _|| | jjkrd| _n|dkrd| _| 	  d S )	Nztree_nodes.statuscourse.success_course_pctr   r   r   r   d   r
   )
r   Zget_tree_nodes_recursiver   loadr'   r"   progress_pctr    success_course_pctr   )r   ZnodesZtotal_amountZprogressr   Znoder   r   r   _lms_update_progress)   s&    




z&CmfCourseProgress._lms_update_progressc                 C   s"   | j  }|dkrtddd d S )N)r   r	   r
   r   u&   Данный курс завершёнT)abort)r   r,   Z	cmf_alert)course_progressr   r   r   r   check_completed_course_progressM   s    
z1CmfCourseProgress.check_completed_course_progressTz@hourly)Z	only_onceZ
system_jobZschedulec                  C   s   t d t } tjjdddgdd| ggddgd	d
gd}|sDd S |D ],}|j|jj	d
 krfd|_
nd|_
|  qHt  qd S )Nu   Запуск крона на отмечание незаконченных прогрессов по курсу с просроченными дедлайнами как просроченныеr   =r   plan_end_date<r-   r*   r   r+   )filterfieldsslicer   r	   )gdebugr   nowr#   r   listr-   r    r.   r   r   Z
cmf_commit)r;   course_progressesr1   r   r   r   cron_mark_expiredT   s"    
	
z#CmfCourseProgress.cron_mark_expiredz@dailyc               	   C   s   t d d} d}tjjdddgddd	gd
g| | | gd}|sDd S | |7 } |D ]T}|jrPd|jj }d|jj d|jj	d }tj
j||jjj||ddd qPqd S )Nz*Run CmfCourseProgress.cron_notify_deadliner   r+   r   r3   r   r&   r   r4   r'   )r6   r7   Zorder_byr8   u   Завершите курс u    до z%d.%m.%Yr   Tr   )r9   r:   r#   r   r<   r4   r    r   r"   strftimer$   r%   r&   r'   )startlimitr=   r1   r(   r)   r   r   r   cron_notify_deadlineq   s0    

z&CmfCourseProgress.cron_notify_deadline)__name__
__module____qualname__r   r   r/   staticmethodr2   Zcmf_deferred_jobr>   rB   __classcell__r   r   r   r   r      s   $
r   N)r   Zcmf.includeZmodules.learn.fieldsr   r   r   r   r   r   <module>   s   