o
    Ci                     @   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mZ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mZ d dlm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$ 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.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl-m5Z5 d dlZedd Z6G dd deZ7G dd  d eZ8G d!d" d"eZ9d d#l)m:Z:m*Z* d d$l;mZ d d%lmZmZ d d&l<m=Z= d d'l)m*Z*m:Z:m>Z> d dl?m'Z@ G d(d) d)eZAG d*d+ d+eZBG d,d- d-eZCdS ).    )render)APIView)csrf_exempt)transaction)token_function)airflow_tokencount_by_datetime_ago)settings)Response)JsonResponsestatus)utcN)timezonedatetime	timedelta)now)flow_statustask_status)	FlowBoard)TaskPlan)CustomPaginator   )
RunHistory)Count)ceil)require_permissionrequire_any_permissionCustomIsAuthenticated)method_decorator)OAuth2Authentication)has_permissionc              
   C   s   | j dkrTtj}tjtjd}z(tj||ddid}|jdkr/| }t	d|
did	d
W S t	ddidd
W S  tyS } zt	dt|idd
W  Y d }~S d }~ww t	ddidd
S )NGET)usernamepasswordzContent-Typezapplication/json)jsonheaders   tokenaccess_token   r   errorUnauthorizedi  i  zInvalid request methodi  )methodr
   airflow_urlairflow_usernameairflow_passwordrequestspoststatus_coder&   r   get	Exceptionstr)request	login_urlpayloadresponsedatae r>   $/var/www/Datamplify/Monitor/views.pyairflow_token_api    s(   

 r@   c                   @   s,   e Zd ZegZegZee	 dd Z
dS )Trigger_dagc              
   C   s  |j j}|jdd}| dkrd}nd}t||}|s&tdditjdS | dkr9d}t	j
j|d}|j}nd}tj
j|d	}|j}t }	tj d
| d}
dd|	 i}dd l}t|j}|dd d d }i | d}tj|
||d}|jdkr| }|d|dd}tj
j|d| ||d|d |d t|tjdS |jdkrtd| itjdS td| itjdS )Ntype	flowboardzflowboard.executeztaskplan.executemessagezPermission Deniedr   )Flow_id)Task_id/api/v2/dags/z/dagRunsAuthorizationBearer r   z%Y-%m-%dT%H:%M:%S.%fZ)conflogical_date)r'   r&   r+   
dag_run_iddag_id)run_idrO   running)rP   source_type	source_idnamer   
started_atfinished_atuser_idi  )useridquery_paramsr5   lowerr"   r   r   HTTP_401_UNAUTHORIZEDr   objects	Flow_namer   	Task_namer   r
   airflow_hostpytzr   r   r   strftimer2   r3   r4   r&   r   createHTTP_200_OKHTTP_404_NOT_FOUNDHTTP_400_BAD_REQUEST)selfr8   rY   rW   rB   required_permhad_perm
model_datarT   	air_tokenurlr'   ra   r   iso_timer:   r;   r<   respr>   r>   r?   r3   >   sZ   




zTrigger_dag.postN)__name__
__module____qualname__r!   authentication_classesr   permission_classesr   r   atomicr3   r>   r>   r>   r?   rA   :   s    rA   c                   @   0   e Zd ZegZegZeZe	e
 dd ZdS )DataFlow_statusc                 C   sZ  |j j}| j|jd}|jddr|jd }|jd }t }tj d| d| d}d	d
| i}t	j
||d}	|	jdkr|	 }
ddd |
d D i}tj d| d| }d	d
| i}t	j
||d}	|	jdkr|	 }
|

d}||d< tjj|||dj| ttjd t|tjdS t|	 tjdS t|	 tjdS tdditjdS )Nr<   Traise_exceptionrO   rP   rG   	/dagRuns/z/taskInstancesrH   rI   r'   r+   tasksc                 S   s   g | ]}|d  |d dqS )task_idstate)taskr~   r>   ).0r   r>   r>   r?   
<listcomp>   s    z(DataFlow_status.post.<locals>.<listcomp>task_instancesr~   r   )rP   rS   rW   )r   rV   r   rD   Serializer Error)rX   rY   serializer_classr<   is_validvalidated_datar   r
   r`   r2   r5   r4   r&   r   r]   filterupdater[   r   r   ra   r   r   r   rd   rf   )rg   r8   rW   
serializerrO   rP   rk   rl   r'   r;   r<   response_datafinal_statusr>   r>   r?   r3      s6   






(zDataFlow_status.postN)ro   rp   rq   r!   rr   r   rs   r   r   r   r   rt   r3   r>   r>   r>   r?   rv   ~   s    rv   c                   @   ru   )Dataflow_Task_statusc           
      C   s   | j |jd}|jddrS|jd }|jd }|jd }t }tj d| d| d	| d
}dd| i}tj||d}	|	j	dkrJt
|	 tjdS t
|	 tjdS t
dditjdS )Nrw   Trx   rO   rP   r}   rG   rz   z/taskInstances/z/logs/1?map_index=-1rH   rI   r{   r+   r   rD   r   )r   r<   r   r   r   r
   r`   r2   r5   r4   r   r&   r   rd   rf   )
rg   r8   r   rO   rP   r}   rk   logs_urlr'   r;   r>   r>   r?   r3      s   




zDataflow_Task_status.postN)ro   rp   rq   r!   rr   r   rs   r   r   r   r   rt   r3   r>   r>   r>   r?   r      s    r   )Qr   )r   )r   r   )
cache_page)r   r   Maxc                   @       e Zd ZegZegZdd ZdS )DashboardStatsAPIViewc           0      O   s:  |j }|j}|j}t|jdd}t }|t|d }	|td| d }
d|v }d|v }|s9|s9tddid	d
S t	j
j||
d}t|ddjtdt|	ddtdt|	ddd}dd |D }dd |D }dd }||dd}||dd}||dd}||dd}|| }|| }|| }|r|| d nd}|r|| d nd}||dd||dd }||dd||dd }|| }|r|| d nd}|r|| d nd}dd } d||ddd d!||ddd d"||dd"d g}!d||ddd d||ddd d"||dd"d g}"|rtj
j|d# nd}#|r(tj
j|d# nd}$|rIt|jd|	d$d%jtdtd&d'd(d d) ng }%|rjt|jd|	d$d%jtdtd&d'd(d d) ng }&t|j|	dd%ddd*d+d d, }'|rd-d tj
j|d#D ni }(|rd.d tj
j|d#D ni })g g g g d/}*|'D ];}+|+jdkr|(|+jd0n|)|+jd0\},}-|,|+j|+j|-t|+jd1}.|*d2 |. |+j|*v r|*|+j |. qt|d3| ||d4d5d6t|d3| ||d4d7d6|#|#d4d8d6|$|$d4d9d6g}/t|/|%|&d:|!|"d;|*d<S )=Nperiod   days   zflowboard.viewztaskplan.viewdetailzPermission deniedi  r   )rW   started_at__gterR   r   rY   )r   )r   )started_at__ltcurrentpreviousc                 S   (   i | ]}|d   d|d  |d qS )rR   __r   r   r>   r   ar>   r>   r?   
<dictcomp>       z-DashboardStatsAPIView.get.<locals>.<dictcomp>c                 S   r   )rR   r   r   r   r>   r   r>   r>   r?   r     r   c                 S   s   |  | d| dS )Nr   r   )r5   )mtsr>   r>   r?   g
  s    z$DashboardStatsAPIView.get.<locals>.gtaskplansuccessrC   failedd   r   c                 S   s.   |dkr| dkr
dS dS t | | | d dS )Nr   r   r   )roundr   r>   r>   r?   
calc_trend(  s   z-DashboardStatsAPIView.get.<locals>.calc_trend)rT   valuefailurerQ   )rW   )rR   r   rS   rT   )
total_runsrT   z-total_runs   rU   z-started_at   c                 S      i | ]
}|j |j|jfqS r>   )rE   r^   rY   )r   fr>   r>   r?   r   g      c                 S   r   r>   )rF   r_   rY   )r   r   r>   r>   r?   r   l  r   )recentr   r   rQ   )UnknownN)rT   rB   r   rY   rU   r   r   upzSuccess Rate)r   changetrendtitlezFailure RatezTotal FlowboardszTotal Taskplans)rC   r   )r   rC   )kpisbarstatus_distributionrecent_activity)rX   rY   custom_permissionsintrZ   r5   r   r   r   r   r]   r   listvaluesannotater   r   r   countr   r   order_byonlyrR   rS   r   r	   rU   appendr   )0rg   r8   argskwargsrX   rW   
user_permsperiod_daystodaycurrent_startprevious_starthas_flow_permhas_task_permrun_qsaggcurrent_mapprev_mapr   task_successflow_successtask_failedflow_failedtotal_successtotal_failuretotal_currentsuccess_ratefailure_rateprev_successprev_failure
prev_totalprev_success_rateprev_failure_rater   taskplan_dataflowboard_datatotal_flowboardtotal_taskplantop_flowboardstop_taskplansrecent_runsflow_maptask_mapactivityrunsource_namerS   rowr   r>   r>   r?   r5     s0  



			


zDashboardStatsAPIView.getNro   rp   rq   r!   rr   r   rs   r5   r>   r>   r>   r?   r         r   c                   @   r   )
Kpi_valuesc                 C   s   |j }|j}|g}|jr||j ttj}|tdd }t	j
j||d}t|}|d }	|d }
|d }|	d |	d |	d	 |
d |
d	 d
}t|tjdS )Nr   r   )r   user_id__incountsrater   rQ   r   r   )Runningr   r   r   r   r   )rX   rY   created_by_idr   r   r   ra   r   r   r   r]   r   r   r   r   rd   )rg   r8   rX   rW   accessible_user_idsr   r   current_datakpi_datar   rates
Total_runsr>   r>   r?   r5     s&   zKpi_values.getNr   r>   r>   r>   r?   r     r   r   c                   @   s,   e Zd ZegZegZeeddd Z	dS )Rescent_Runszmonitor.viewc              	   C   s*  |j }|j}|g}|jr||j t }|j|jd}|j|jd}|jdd	 }t
jj|dd}	|r@|	j|d}	|	 }
zt|}tt||j}W n ttfye   tdd	id
d Y S w t|
| }|d | }|}|	dddddd|||  }	|	||
||d}td|itjdS )Nr   i  search )r   z-updated_at)name__icontainsr,   zInvalid pagination parametersi  r   rP   rR   rS   rT   r   rU   )r<   total_pagestotal_recordspage_number	page_size	runs_list)rX   rY   r   r   r   rZ   r5   page_query_parampage_size_query_paramstripr   r]   r   r   r   r   minmax_page_size
ValueError	TypeErrorr   r   r   r   rd   )rg   r8   rX   rW   r   	paginatorr  r  r   	Runs_data
Runs_countr  offsetlimit	Runs_listr>   r>   r?   r5     s<    zRescent_Runs.getN)
ro   rp   rq   r!   rr   r   rs   r    r   r5   r>   r>   r>   r?   r     s
    
r   )Ddjango.shortcutsr   rest_framework.viewsr   django.views.decorators.csrfr   	django.dbr   authentication.utilsr   Monitor.utilsr   r   r	   
Datamplifyr
   rest_framework.responser   django.httpr   rest_frameworkr   ra   r   r2   r   r   r   django.utils.timezoner   Monitor.serializersr   r   FlowBoard.modelsr   TaskPlan.modelsr   Service.utilsr   modelsr   django.db.modelsr   mathr   authentication.permissionsr   r   r   django.utils.decoratorsr    &oauth2_provider.contrib.rest_frameworkr!   r"   r@   rA   rv   r   r   django.utilsdjango.views.decorators.cacher   r   authentication.modelsauth_modelsr   r   r   r>   r>   r>   r?   <module>   s\    
D. H . ) H