
    ,i1                        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
 d dlmZ d dlmZ d d	lmZ  G d
 dej                        Z edg       ee
g      d               Zd dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 d d	lmZ  edg       ee
g      d               Zd dlmZ  edg       ee
g      d               Zd dlmZ  edg       ee
g      d               Z edg       ee
g      d               Zd dlmZmZ d dl	m
Z
 d d	lmZ d dlmZm Z m!Z! d dlZ edg       ee
g      d               Z" edg       ee
g      d               Z# edg       ee
g      d               Z$ edg       ee
g      d               Z% edg       ee
g      d               Z& edg       ee
g      d               Z'd d l mZm(Z(m)Z) d d!l*m+Z+m,Z,m-Z-m.Z.m/Z/ d d"l0m1Z1m2Z2m3Z3m4Z4m5Z5 d d#l6m7Z7m8Z8m9Z9m:Z:m;Z; d d$l<m=Z=  G d% d&ej                        Z> G d' d(ej                        Z? G d) d*ej                        Z@ G d+ d,ej                        ZA G d- d.ej                        ZBy)/    )viewsets   SourceNetwork)NetworkSourceSerializer)api_viewpermission_classes)IsAuthenticated)datetime)actionResponsec                   h    e Zd Zej                  j                         ZeZ e	ddg      dd       Z
y)NetworkSourceViewSetTpost)detailmethodsNc                 X    | j                         }t        dd|j                   di      S )NstatuszScraper for z triggered.)
get_objectr   title)selfrequestpksources       %/var/www/extractly/extractly/views.pyrun_scraperz NetworkSourceViewSet.run_scraper   s/     " \&,,{#KLMM    )N)__name__
__module____qualname__r   objectsallquerysetr   serializer_classr   r    r   r   r   r   
   s9    $$((*H.4&*N +Nr   r   POSTc                    | j                   j                  d      }| j                   j                  d      }| j                   j                  di       }|r/ddlm} 	 |j                  j                  |      }|j
                  }i }|rt        |      |d<   |r||d<   yy# |j                  $ r t        dd| d	id
      cY S w xY w)zB
    POST body: { "source_id": int, "source_name": str, ... }
    	source_idsource_nameparamsr   r   )r   erroru#   Nie znaleziono źródła o nazwie ''  r   N)	datagetextractly.modelsr   r"   idDoesNotExistr   int)r   r)   r*   r+   r   r   celery_kwargss          r   start_scraperr7      s       -I,,""=1K\\h+F 2	i"**..[.AF		I
 M%(^k""(h  )) 	iW(KK=XY&Z[dghh	is   (B "CCN)settingsGETc                    t         j                  j                  dd      }|j                  d      }|d   j                  d      \  }}t	        |      dkD  rt        |d         nd}t        j                  |||      }d}|j                  |      }g }	t        |      D ]  }
	 |j                  ||
      }|rwt        j                  |      }|	j                  |j                  d	i       j                  d
      |j                  d	i       j                  d      |j                  d      d        t#        |	|d      S # t        $ r&}|	j                  dt!        |      i       Y d}~d}~ww xY w)uL   
    Wyświetla listę zadań oczekujących w kolejce Celery (pending).
    zredis:// /r   :r   )hostportdbceleryheaderstaskr3   body)namer3   argsr,   N)pending_taskstotal)r8   CELERY_BROKER_URLreplacesplitlenr5   redisRedisllenrangelindexjsonloadsappendr1   	Exceptionstrr   )r   	redis_urlhost_port_dbr>   r?   r@   r
queue_namelengthtasksiitemr0   es                 r   celery_queuer`   ?   sR    **22:rBI??3'La&&s+JD$!$\!2Q!6\!_	ABDR0A JVVJFE6]	,88J*Dzz$' HHY377?((9b155d; HHV,       	,LL'3q6*++	,s   #BD>>	E-E((E-)
TaskResultc                     t         j                  j                  d      dd }t        |D cg c]<  }|j                  |j
                  |j                  |j                  |j                  d> c}      S c c}w )u;   
    Lista wszystkich tasków z bazy (celery-results).
    z
-date_doneN2   )task_id	task_namer   	date_doneresult)	ra   r"   order_byr   rd   re   r   rf   rg   )r   r\   ts      r   celery_task_historyrj   j   sy     ''5cr:E 	 A yyhhhh	
 	 	 	 	s   AA4)current_appc                 t    t         j                  j                         }|j                         }t	        |      S )u/   
    Lista aktywnych/wykonywanych tasków.
    )rk   controlinspectactiver   )r   r]   ro   s      r   celery_activerp      s.     	##%AXXZFFr   c                 &    t        dgdgdgd      S )N.)queuehistoryro   r   )r   s    r   celery_statusrt      s%    
 5%  r   )PeriodicTaskIntervalScheduleCrontabSchedulec           
         | j                   }d}d|v r5t        j                  j                  |d   d   |d   d         \  }}d}|}nd|v rt        j                  j                  |d   j                  dd      |d   j                  d	d      |d   j                  d
d      |d   j                  dd      |d   j                  dd      d      \  }}d}|}nt        ddid      S t        j                  |j                  dg             }t        j                  |j                  di             }|j                  d      }	|j                  d      }
|j                  dd      }t        j                  j                  |	|
|dk(  r|nd|dk(  r|nd|||d      \  }}t        |j                  |j                  |j                  |j                  d      xs |j                  d      |||d      S )a  
    Tworzy nowy cykliczny task Celery (PeriodicTask).
    POST body:
    {
        "name": "Playwright run o 2 w nocy",
        "task": "extractly.tasks.run_playwright_scraper",
        "interval": {"every": 1, "period": "hours"},      # LUB
        "crontab": {"minute": "0", "hour": "2", "day_of_week": "*", "day_of_month": "*", "month_of_year": "*"},
        "args": [5],
        "kwargs": {"source_id": 5, "params": {...}},
        "enabled": true
    }
    Nintervaleveryperiodrz   r{   crontabminute*hourday_of_weekday_of_monthmonth_of_yearUTCr~   r   r   r   r   timezoner,   z'Wymagany schedule: interval lub crontabi  r/   rF   kwargsrE   rC   enabledT)rC   ry   r}   rF   r   r   )rE   defaults)r3   rE   r   schedulerF   r   created)r0   rv   r"   get_or_createrw   r1   r   rR   dumpsru   update_or_creater3   rE   r   )r   r0   r   ry   r   schedule_typer}   rF   r   rE   rC   r   periodic_tasks                r   create_periodic_taskr      s     <<DHT,44BBz"7+
#H- C 
' #	d	*22@@	?&&x5i$$VS1Y++M3?i,,^SAy/--osC A 
 ""KLUXYY::dhhvr*+DZZ2./F88FD88FDhhy$'G)11BB$1Z$?T#0I#=x4
 C 
M7 "" ((HHZ(?DHHY,?  r   c                    t         j                  j                         j                  d      }g }|D ]  }|j	                  |j
                  |j                  |j                  |j                  |j                  rt        |j                        nd |j                  rt        |j                        nd |j                  |j                  d        t        |      S )Nz-idr3   rE   rC   r   ry   r}   rF   r   )ru   r"   r#   rh   rT   r3   rE   rC   r   ry   rV   r}   rF   r   r   )r   r\   outri   s       r   list_periodic_tasksr      s       $$&//6E
C

$$FFFFyy+,::AJJ4)*s199~FFhh	
 		  C=r   c                    	 t         j                  j                  |      }t	        |j
                  |j                  |j                  |j                  |j                  rt        |j                        nd |j                  rt        |j                        nd |j                  |j                  d      S # t         j                  $ r t	        ddid      cY S w xY w)Nr   r,   Task nie istniejer.   r/   r   )ru   r"   r1   r4   r   r3   rE   rC   r   ry   rV   r}   rF   r   r   r   ri   s      r   get_periodic_taskr      s    D  $$$+ dd99'(zzC

Ot%&YY3qyy>D((	 	 	 $$ D"56sCCDs    B4 4"CCPATCHc                 ~   	 t         j                  j                  |      }| j
                  }d|v r
|d   |_        d|v r
|d   |_        d|v r
|d   |_        d	|v rt        j                  |d	         |_        d
|v rt        j                  |d
         |_        d|v r=|d   }t        j                  j                  |d   |d         \  }}||_        d |_        d|v r|d   }t"        j                  j                  |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd      |j                  dd            \  }}||_        d |_        |j%                          t	        ddi      S # t         j                  $ r t	        ddid      cY S w xY w)Nr   r,   r   r.   r/   rE   rC   r   rF   r   ry   rz   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   updated)ru   r"   r1   r4   r   r0   rE   rC   r   rR   r   rF   r   rv   r   ry   r}   rw   save)	r   r   ri   r0   interval_datary   _crontab_datar}   s	            r   update_periodic_taskr   	  s   D  $$$+ <<D~Vqv~VqvDd9o!)~

4< 8qv4DJJtH~$>TZ(&..<<( * = 
! 
	DI$,,::##Hc2!!&#.$((<%)).#>&**?C@!%%j%8 ; 

 	
FFHXy)**= $$ D"56sCCDs    F "F<;F<DELETEc                     	 t         j                  j                  |      }|j                          t	        d|i      S # t         j
                  $ r t	        ddid      cY S w xY w)Nr   deletedr,   r   r.   r/   )ru   r"   r1   deleter   r4   r   s      r   delete_periodic_taskr   /  sc    D  $$$+	
B(($$ D"56sCCDs   <? "A$#A$c                    	 t         j                  j                  |      }|j                   |_        |j	                          t        ||j                  d      S # t         j                  $ r t        ddid      cY S w xY w)Nr   )r3   r   r,   r   r.   r/   )ru   r"   r1   r   r   r   r4   r   s      r   toggle_periodic_taskr   :  su    D  $$$+		M		raii899$$ D"56sCCDs   AA "B B)r   permissionsfilters)
SourceHtmlSourceManualNetworkMonitoredPage	AdsManualAds)HtmlNetworkSourceSerializerManualDataSourceSerializerNetworkMonitoredPageSerializer!NetworkMonitoringManualSerializerNetworkMonitoringSerializer)HtmlNetworkSourceFilterManualDataSourceFilterNetworkMonitoredPageFilterNetworkMonitoringManualFilterNetworkMonitoringFilter)StandardResultsSetPaginationc                   f    e Zd Zej                  j                         ZeZe	Z
ej                  gZeZy)HtmlNetworkSourceViewSetN)r   r    r!   r   r"   r#   r$   r   r%   r   filterset_classr   AllowAnyr	   r   pagination_classr&   r   r   r   r   g  s6    !!%%'H2-O%../3r   r   c                   f    e Zd Zej                  j                         ZeZe	Z
ej                  gZeZy)ManualDataSourceViewSetN)r   r    r!   r   r"   r#   r$   r   r%   r   r   r   r   r	   r   r   r&   r   r   r   r   n  s6    ##'')H1,O%../3r   r   c                   f    e Zd Zej                  j                         ZeZe	Z
ej                  gZeZy)NetworkMonitoredPageViewSetN)r   r    r!   r   r"   r#   r$   r   r%   r   r   r   r
   r	   r   r   r&   r   r   r   r   u  s6    #++//1H50O%5563r   r   c                   f    e Zd Zej                  j                         ZeZe	Z
ej                  gZeZy)NetworkMonitoringManualViewSetN)r   r    r!   r   r"   r#   r$   r   r%   r   r   r   r
   r	   r   r   r&   r   r   r   r   |  s6      $$&H83O%5563r   r   c                   f    e Zd Zej                  j                         ZeZe	Z
ej                  gZeZy)NetworkMonitoringViewSetN)r   r    r!   r   r"   r#   r$   r   r%   r   r   r   r
   r	   r   r   r&   r   r   r   r     s2    {{ H2-O%5563r   r   )Crest_frameworkr   modelsr   serializersr   rest_framework.decoratorsr   r	   rest_framework.permissionsr
   r   r   rest_framework.responser   ModelViewSetr   r7   rM   rR   django.confr8   r`   django_celery_results.modelsra   rj   rA   rk   rp   rt   django_celery_beat.modelsru   rv   rw   r   r   r   r   r   r   r   r   r2   r   r   r   r   r   extractly.serializersr   r   r   r   r   extractly.filtersr   r   r   r   r   extractly.paginationr   r   r   r   r   r   r&   r   r   <module>r      s   # ! 0 B 6  , ,N800 N 
6(_%&) ' ):     B 6 ,	5'_%&# ' #N 4	5'_%& ' " 	5'_%& '  
5'_%& '  C 6 , U U 	6(_%&@ ' @H 
5'_%& ' " 
5'_%& ' " 
7)_%&!+ ' !+H 
8*_%&D ' D 
6(_%&D ' D& : 9    >4x44 44h33 44("7"7 44X%:%: 44x44 4r   