o
    CiO                     @   s  d dl mZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlZd dl	mZm	Z	 d dlmZ d dl m!Z! d dl"m#Z# d dl$m%Z%m&Z& ddl'm(Z(m)Z) d dl*Z*d dl+Z+d dl,m-Z- d dl.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl.m5Z5 G dd deZ6G dd deZ7G d d! d!eZ8G d"d# d#eZ9G d$d% d%eZ:dS )&    )render)timezone)ceil)tz)	timedelta)APIView)csrf_exempt)transaction)token_function)UserProfile)settings)Responsestatus)utcN)r   datetime)	FlowBoard)TaskPlan)Schedule)CustomPaginatorUUIDEncoder   )Create_Schedulersschedule_update)calculate_next_run)require_permissionCustomIsAuthenticated)method_decorator)OAuth2Authentication)has_permissionc                   @   s   e Zd ZegZegZeZe	e
ede dd Ze	e
edejdd ZeZe	e
edejdd	 Ze	e
ed
ejdd ZdS )
Schedulerszscheduler.createc                 C   sl  |j }|j}|g}t|dr|jr||jj | j|jd}|jddr|jd }|jd }|jd }|jd }	|jd	 }
t	j
j|d
}t| ||}tj
j|
d r`tdditjdS tj
j|	 |
||||d d|d	}|	 dkrtj
j|
|d rtj
j|
|d}tj dt|jj }tj||j d}t|d}t |}W d    n1 sw   Y  |j|d< t|d}tj!||dt"d W d    n1 sw   Y  |j#}|j}
ntdditj$dS |	 dkrkt%j
j|
|d rbt%j
j|
|d}tj dt| }tj||j& d}t|d}t |}W d    n	1 s2w   Y  |j|d< t|d}tj!||dt"d W d    n	1 sVw   Y  |j'}|j}
ntdditj$dS tdditj(dS ||_)|*  |	 dkrtj
j|
|dj+d|jd  nt%j
j|
|dj+d|jd  t| d!|jd"tj,dS tdd#itj(dS )$N
created_bydataTraise_exceptionscheduler_typecron_tabr   source_type	source_id)id)r)   messagez,Task is already scheduled. Please update it.r   active)	r(   r)   schedule_typeschedule_valuer   next_runlast_runr   user_id	flowboardr*   user_id__in/FlowBoard/.jsonrschedule_idw   )indentclszFlow Board Doesn't Existstaskplan)r*   r1   
/TaskPlan/messgaezSource is Invalid)	scheduledr8   z Scheduled Succesfullyr+   Schedule_idSerializer Error)-userr*   hasattrr!   appendserializer_classr#   is_validvalidated_datar   objectsgetr   lowerr   filterexistsr   r   HTTP_406_NOT_ACCEPTABLEcreater   r   
config_dirstrr1   ospathjoinFlow_idopenjsonloaddumpr   	Flow_nameHTTP_404_NOT_FOUNDr   Task_id	Task_nameHTTP_400_BAD_REQUESTsource_namesaveupdateHTTP_200_OK)selfrequestrD   r1   accessible_user_ids
serializerr&   r'   r   r(   r)   r/   Schedule_creation	Flow_dataconfigs_dir	file_pathfr#   name	Task_data ro   ,/var/www/Datamplify/Tasks_Scheduler/views.pypost&   s   






zSchedulers.postscheduler.viewc              
   C   sF  |j }|j}|g}|jr||j t }|j|jd}|j|j|j	}|jdd}|jdd}	zt
|}tt
||j}W n ttfyU   tddidd	 Y S w tjj|d
d}
|rh|
j|d}
|	dkrr|
j|	d	}
|
 }t|| }|d | }|}|
dddddddd|||  }t|||||dtjd	S )Nr   search r   allerrorInvalid pagination parameters  r   r4   z-updated_at)source_name__icontainsr*   r0   r/   r`   r(   r.   )	schedulestotal_pagestotal_recordspage_number	page_size)rD   r*   created_by_idrF   r   query_paramsrK   page_query_parampage_size_query_paramr   intminmax_page_size
ValueError	TypeErrorr   r   rJ   rM   order_bycountr   valuesr   rc   )rd   re   rD   r1   rf   	paginatorr~   r   rs   status_filterschedule_datatotal_schedulesr|   offsetlimitr#   ro   ro   rp   rK   r   sJ   


zSchedulers.getscheduler.editc                 C   s   |j }|j}|g}t|dr|jr||jj ztjj||dd}W n tjy6   t	ddit
jd Y S w | j|jd}|jdd	rT|jd
 }|jd }	|jd }
n	t	ddit
jdS ||_|	|_|
|_t||	|
|_|  t	d|dt
jdS )Nr!   r,   )r*   r4   r   r+   Schedule not foundr   r"   Tr$   r&   r'   r   rC   zSchedule updated successfullyrA   )rD   r*   rE   r!   rF   r   rJ   rK   DoesNotExistr   r   r\   rG   r#   rH   rI   r_   r-   r.   r   r   r/   ra   rc   )rd   re   r8   rD   r1   rf   schedulerg   r&   r'   r   ro   ro   rp   put   s,   

zSchedulers.putzscheduler.deletec                 C   s  |j }|j}|g}t|dr|jr||jj z
tjj||d}W n tjy5   t	ddit
jd Y S w |jdkrqtjj|j|d}t|jdrN|jjn|j}tj dt| }	tj|	|j d	}
d
|_d |_|  nD|jdkrtjj|j|d}t|jdr|jjn|j}tj dt| }	tj|	|j d	}
d
|_d |_|  n	t	ddit
jdS tj|
rt|
d}t |}W d    n1 sw   Y  d |d< t|
d}tj!||dd W d    n1 sw   Y  |"  t	ddit
j#dS )Nr!   r3   r+   r   r   r2   r*   r5   r6   Fr=   r>   zInvalid source typer7   r8   r9   r:   )r;   zSchedule deleted successfully)$rD   r*   rE   r!   rF   r   rJ   rK   r   r   r   r\   r(   r   r)   r1   r   rQ   rR   rS   rT   rU   rV   r@   r8   ra   r   r]   r_   rN   rW   rX   rY   rZ   deleterc   )rd   re   r8   rD   r1   rf   r   ri   flow_owner_idrj   rk   rn   task_owner_idrl   	file_dataro   ro   rp   r      sJ   



zSchedulers.deleteN)__name__
__module____qualname__r   authentication_classesr   permission_classesr   rG   r   r   r   r	   atomicrq   rK   r   update_serializerr   r   ro   ro   ro   rp   r    !   s*    
I
3
0
r    c                   @   6   e Zd ZegZegZeee	de
jdd ZdS )UpcomingRunsrr   c                 C   sN  |j }|j}|g}|jr||j t }|j|jd}|j|j|j	}|jdd}t
 }	zt|}tt||j}W n ttfyR   tddidd Y S w tjj|dd	d
}
|rm|
jd|d|||  }
|
 }t|| }|d | }|}g }|
D ]}|jsqzt|j}|j|}W n ty   |j}Y nw ||	 }| dkrd}nQ|tddk rt| d }d| d|dkrdnd }n3|tddk rt| d }d| d|dkrdnd }n|tddk rd| d }n| d}||j|j!|j"|j#|j$|j| d|d qt|||||dt%j&dS )Nr   rs   rt   rv   rw   rx   r   r,   r4   r   z	-next_run)r   rz   r   zDue now<   )minuteszin z minutes   )hoursi  z hour   )daysztomorrow at z%I:%M %pz%d-%b-%Y %I:%M %pz%Y-%m-%d %I:%M %p)r*   r`   r(   r-   r.   r   r/   time_remaining)r#   r|   r}   r~   r   )'rD   r*   r   rF   r   r   rK   r   r   r   dj_timezonenowr   r   r   r   r   r   r   rJ   rM   r   r   r   r/   r   gettzr   
astimezone	Exceptiontotal_secondsr   strftimer`   r(   r-   r.   r   rc   )rd   re   rD   r1   rf   r   r~   r   rs   now_utcupcoming_schedulesr   r   r   r|   resultscheduser_tznext_run_local	time_diffhuman_readableminsr   ro   ro   rp   rK     s~   


zUpcomingRuns.getNr   r   r   r   r   r   r   r   r   r   r	   r   rK   ro   ro   ro   rp   r         
r   c                   @   r   )ScheduleKPIrr   c           	      C   s   |j }|j}|g}t|dr|jr||jj tjj|d }tjj|dd }tjj|dd }|||d}t	|t
jdS )Nr!   ry   r,   r   inactive)r   active_schedulesinactive_schedulesr   )rD   r*   rE   r!   rF   r   rJ   rM   r   r   r   rc   )	rd   re   rD   r1   rf   total_countactive_countinactive_countr#   ro   ro   rp   rK   f  s   zScheduleKPI.getNr   ro   ro   ro   rp   r   b  r   r   c                   @   r   )ScheduleDetailrr   c                 C   s   |j }|j}|g}t|dr|jr||jj z
tjj||d}W n tjy5   t	ddit
jd Y S w |j|j|j|j|j|j|j|j|j|j
d
}t	|t
jdS )Nr!   r3   r+   r   r   )
r*   r`   r(   r)   r-   r.   r   r/   r0   r   )rD   r*   rE   r!   rF   r   rJ   rK   r   r   r   r\   r`   r(   r)   r-   r.   r   r/   r0   rc   )rd   re   r8   rD   r1   rf   r   r#   ro   ro   rp   rK     s,   zScheduleDetail.getNr   ro   ro   ro   rp   r     r   r   c                   @   r   )UpdateScheduleStatusr   c                 C   s  |j }|j}|g}t|dr|jr||jj |jd}|jdd }|r-|dvr6tddit	j
dS z
tjj||d	}W n tjyS   tdd
it	jd Y S w |j	|krftdd| dit	jdS ||_	|jdgd td|j d| dt|j|j	dt	jdS )Nr!   r8   r   rt   )r,   r   r+   zHInvalid input. Required: schedule_id and valid status (active/inactive).r   r3   z!Schedule not found for this user.zSchedule is already .)update_fieldsz	Schedule z updated successfully to )r+   r8   
new_status)rD   r*   rE   r!   rF   r#   rK   rL   r   r   r_   r   rJ   r   r\   rc   ra   r`   rR   )rd   re   rD   r1   rf   r8   r   r   ro   ro   rp   patch  s>   

zUpdateScheduleStatus.patchN)r   r   r   r   r   r   r   r   r   r   r	   r   r   ro   ro   ro   rp   r     r   r   );django.shortcutsr   django.utilsr   r   mathr   dateutilr   r   r   rest_framework.viewsr   django.views.decorators.csrfr   	django.dbr	   authentication.utilsr
   authentication.modelsr   
Datamplifyr   rest_framework.responser   rest_frameworkr   pytzr   requestsFlowBoard.modelsr   TaskPlan.modelsr   Tasks_Scheduler.modelsr   Service.utilsr   r   serializersr   r   rS   rX   Tasks_Scheduler.utilsr   authentication.permissionsr   r   django.utils.decoratorsr   &oauth2_provider.contrib.rest_frameworkr   r   r    r   r   r   r   ro   ro   ro   rp   <module>   sB     pR (