U
    *h                    @   s
  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dl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 d d	l	m	Z	mZ zd d
lmZ W n  ek
r   d d
lmZ Y nX d dlmZ d dlm  mZ  d dl!m  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- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4 d dl5m6Z6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZB d dlCmDZDmEZEmFZF d dl2mGZG d dlHmIZI d dlZd dlZd dlZd dlZd dlJZJd dl	Z	d dlKmLZL d dl2mMZM d dlNmOZO d dl2mGZG d dl0m1Z1 d d lPmQZQmRZR d d!l.mSZSmTZTm/Z/mUZU d d"lCmDZDmEZE d d#l:mVZV d d$lWmXZX d d%lYmZZZ d d&l[m\Z\m]Z] d d'l^m_Z_ d d(l`maZa d d)lbmcZc d d*l5mdZdm6Z6m7Z7 d d+lemfZfmgZgmhZh d d,limjZj d-d.lkmIZImlZlmmZmmnZnmoZo epeqZrd/d0d1d2d3gZsd dltZtd d4lumvZv d dl<m=Z= d dlJZJd dlNmOZO d d5lwmxZx d d6lymzZz d d$lWmXZX d d'l^m_Z_ d d7l{m|Z| d d8l}m~Z~ d d9lmZmZmZ d d:lmZmZmZ d d;lmZ d d<lmZmZmZ d d=lmZmZmZ d dlKmLZL eXezd>d?d@G dAdB dBeLZG dCdD dDe_eLZdEdF ZdGdH ZddJdKZdLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdXdY ZdZd[ Zd\d] Zd^d_ Zd`da Zdbdc Zddde Zdfdg Zdhdi Zdjdk Zdldm Zdndo Zdpdq Zdrds Zdtdu Zdvdw Zdxdy Zdzd{ Zd|d} Zd~d Zdd Zdd Zdd{ Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    )contextN)exp)nan)Path)pprint)slugify)StringIOBytesIOdatetime	timedelta)broadcast_arrays)etree)FTP_TLS
error_perm)APIView)Thread)ThreadPoolExecutor)template)Max)messages)modelsIntegrityError)renderredirect)Session)ValidationError)render_to_string)AbstractBaseSession)SessionStore)HttpResponseJsonResponseHttpResponseRedirect)transaction)
check_user)View
connection)timezone)reverse_lazyreverse)QCountr   Min)r    r!   )PermissionDenied)method_decorator)csrf_protect)ListView
UpdateView)LoginRequiredMixin)login_required)require_http_methods)get_object_or_404r   r   )	Paginator	EmptyPagePageNotAnInteger)is_ajax_request   )r$   	FTPClientfetch_xml_from_urlparse_xml_contentextract_data_by_attributesz#C152B6z#EA792Dz#499E59z#23A8E2z#974BEF)settings)cache)
cache_page)User)Verifs)ChannelChannelZoneChannelZoneRelation)AgencyBrand
Advertiser)Activity)	CampaignsCampaignStatusPending)Impressions	AnalyticsAnalyticsSource   dispatchnamec                   @   s   e Zd ZdZdd ZdS )HealthCheckViewzm
    Health check endpoint for monitoring.
    
    Returns application health status and basic metrics.
    c              
   C   s   z^t j }d}t|dd t|}dt  d|dkrBdnd|t	t
ddd	}t|W S  tk
r } z8td
|  tdt|t  ddd W Y S d}~X Y nX dS )z
        Handle GET request for health check.
        
        Args:
            request: HTTP request object
            
        Returns:
            JsonResponse: Health check data
        Zhealth_check_testtest<   healthy	connecteddisconnectedZAPP_VERSIONz1.0.0)status	timestampdatabaserA   
user_countversionzHealth check failed: Z	unhealthy)r\   errorr]     r\   N)rC   objectscountrA   setgetr(   now	isoformatgetattrr@   r!   	Exceptionloggerra   str)selfrequestr_   	cache_keyZ
cache_testZhealth_datae rr   */var/www/html/Focus/src/apps/core/views.pyrg   {   s,    




	

zHealthCheckView.getN)__name__
__module____qualname____doc__rg   rr   rr   rr   rs   rV   s   s   rV   c                       s   e Zd ZdZdgZdZdddddZ fd	d
Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Z  ZS )/DashboardViewa  
    Dashboard Page View

    This view is responsible for rendering the dashboard page of the application.
    It extends the Django View class and defines the HTTP GET method to handle
    the request and return the rendered dashboard page template.

    Methods:
        get(request): Handles the HTTP GET request and returns the rendered
            dashboard page template.

    Template:
        - 'index.html': The HTML template used to render the dashboard page.

    rg   zdashboard/index.htmlzDashboard - Adtlasz Adtlas Development TeamzsDashboard for Adtlas TV advertising solutions. This dashboard provides insights into your TV advertising campaigns.zRAdtlas, dashboard, TV advertising solutions, campaign insights, data visualization)titleZauthordescriptionkeywordsc                    s$   t  jf |}|dtdi |S )z2
        Add dashboard page context data.
        ry   Z	Dashboard)superget_context_dataupdate_)rn   kwargsr   	__class__rr   rs   r}      s     zDashboardView.get_context_datac           	      O   s   |j ddkr| |S tjj|jd}t|| |}|j	dd}z|
|}W n< tk
rt   |
d}Y n  tk
r   |
|j}Y nX | |||}t|| j|S )z
        Handles the HTTP GET request and returns the rendered dashboard page template.

        Args:
            request (HttpRequest): The HTTP request object.

        Returns:
            HttpResponse: The rendered dashboard page template.
        zX-Requested-WithXMLHttpRequestcampaign_managerpager;   )headersrg   _handle_ajax_requestrL   rd   filteruserr7   _get_items_per_pageGETget_pager9   r8   	num_pages_build_contextr   template_name)	rn   ro   argsr   queryset	paginatorpage_numberpage_objr   rr   rr   rs   rg      s    
zDashboardView.getc                 C   sh   |j }|j|||jdk| || || || || ||  | 	|| 
 |j|j|jd}|S )a  
        Build template context with all necessary data.
        
        Args:
            request: Django HTTP request object
            page_obj: Paginated page object
            paginator: Paginator instance
            
        Returns:
            dict: Template context
        r;   )	campaignsr   r   is_paginatedchannelszonesagenciesadvertisersfilter_paramsZsort_optionsstats
date_rangeZtotal_resultsZcurrent_pageZtotal_pages)r   object_listr   _get_user_channels_get_available_zones_get_agencies_get_advertisers_get_current_filters_get_sort_options
_get_stats_get_date_rangere   number)rn   ro   r   r   r   r   rr   rr   rs   r      s$    zDashboardView._build_contextc                 C   s   t jjdd ddS )z
        Get zones available to the current user.
        
        Args:
            user: Current user object
            
        Returns:
            QuerySet: Available zones
        T)	is_activerU   code)rF   rd   r   distinctorder_byrn   r   rr   rr   rs   r     s    

 z"DashboardView._get_available_zonesc                 C   s   t j dS )z
        Get channels available to the current user.
        
        Args:
            user: Current user object
            
        Returns:
            QuerySet: User's channels
        rU   )rE   rd   allr   r   rr   rr   rs   r   $  s    z DashboardView._get_user_channelsc                 C   s   t jj|ddS )z
        Get agencies available to the current user.
        
        Args:
            user: Current user object
            
        Returns:
            QuerySet: Available agencies
        )ownerrU   )rH   rd   r   r   r   rr   rr   rs   r   1  s    
zDashboardView._get_agenciesc                 C   s   t jj|ddS )z
        Get advertisers available to the current user.
        
        Args:
            user: Current user object
            
        Returns:
            QuerySet: Available advertisers
        r   brand__name)rJ   rd   r   r   r   rr   rr   rs   r   =  s    
zDashboardView._get_advertisersc                 C   s   |j dd|j dd|j dd|j dd|j dd|j dd|j d	d|j d
d|j dd|j dd|j dddS )z
        Get current filter parameters for template.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            dict: Current filter values
        search channelr   agency
advertiserzoner\   	date_fromdate_tor   sort_by-created_atper_pageZ20)r   r   r   r   r   r\   r   r   r   r   r   )r   rg   )rn   ro   rr   rr   rs   r   I  s    z"DashboardView._get_current_filtersc                 C   s   ddddddgS )zv
        Get available sorting options.
        
        Returns:
            list: Sort options for template
        r   zNewest First)valuelabel
created_atzOldest Firstrr   )rn   rr   rr   rs   r   a  s    zDashboardView._get_sort_optionsc              
   C   s   t jj|d}t  }|tjdd }| |jt	j
|d |jt	j|d |j|d |j|d |j|d |jt	j
|d |j|d d	S )
z
            Get campaigns statistics for dashboard.

            Args:
            user: Current user object

            Returns:
            dict: Campaigns statistics
        r      days)r\   end_date__gte)Zend_date__lt)end_date)r   )r\   Zend_date__gt)Ztotal_campaignsZactive_campaignsZpending_campaignsZexpired_campaignsZtodays_campaignsZrecent_campaignsZupcoming_campaignsZpast_campaigns)rL   rd   r   r(   rh   dater   r   re   rM   In_progress	Prebooked)rn   r   Zbase_querysettodayZweek_agorr   rr   rs   r   n  s6    zDashboardView._get_statsc              	   C   sZ   t   }||tjdd |tj| d |jdd|tjdd |tjdd dS )zz
        Get date range information for filtering.
        
        Returns:
            dict: Date range options
        r;   r   )dayim  )r   	yesterday
week_startZmonth_startZmin_dateZmax_date)r(   rh   r   r   r   weekdayreplace)rn   r   rr   rr   rs   r     s    
zDashboardView._get_date_rangec                 C   sX   |j d}|dkr| |S |dkr0| |S |dkrB| |S |dkrT| |S dS )z
        Handle AJAX requests for dynamic updates.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with data
        actionZ	get_zonesZget_agenciesZget_advertisersZquick_statsN)r   rg   _get_zones_for_channel_ajax_get_agencies_ajax _get_advertisers_for_agency_ajax_get_quick_stats_ajax)rn   ro   r   rr   rr   rs   r     s    



z"DashboardView._handle_ajax_requestc              	   C   s~   |j d}|stdddS z4t|}tjj|dddd}td	t|d
W S  t	t
fk
rx   tddd Y S X dS )z
        Get zones for a specific channel via AJAX.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with zone data
        
channel_idFzChannel ID requiredsuccessra   )id_channel_idid_zone_channelnetworknameregionT)r   r   zInvalid channel IDN)r   rg   r!   intrF   rd   r   valueslist
ValueError	TypeError)rn   ro   r   r   rr   rr   rs   r     s$    
  
z)DashboardView._get_zones_for_channel_ajaxc                 C   s*   |j }| |}tdt|dddS )z
        Get agencies available to the current user via AJAX.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with agency data
        TZ	id_agencyrU   )r   r   )r   _get_available_agenciesr!   r   r   )rn   ro   r   r   rr   rr   rs   r     s    

z DashboardView._get_agencies_ajaxc                 C   s   t jj|dS )z
        Get agencies available to the current user.
        
        Args:
            user: Current user object
            
        Returns:
            QuerySet: QuerySet of available agencies
        id_user)rH   rd   r   r   rr   rr   rs   r     s    
z%DashboardView._get_available_agenciesc              	   C   s   |j }|jd}|s$tdddS z2t|}tjj|d}tdt|	ddd	W S  t
tfk
r|   tdd
d Y S X dS )z
        Get advertisers available to the current user via AJAX.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with advertiser data
        	agency_idFzAgency ID requiredr   )Zbrand__agency__idTidrU   )r   r   zInvalid agency IDN)r   r   rg   r!   r   rJ   rd   r   r   r   r   r   )rn   ro   r   r   r   rr   rr   rs   r     s    

z.DashboardView._get_advertisers_for_agency_ajaxc                 C   s   |j }| |}td|dS )z
        Get quick statistics via AJAX.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with statistics
        T)r   r   )r   r   r!   )rn   ro   r   r   rr   rr   rs   r     s    

z#DashboardView._get_quick_stats_ajaxc                 C   s,   |  |}tdd|  dd| dS )z
        Export playlist data via AJAX.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            JsonResponse: JSON response with export status
        TzExport prepared for z
 playlists#)r   messageZdownload_urlre   )Z_get_filtered_querysetr!   re   )rn   ro   r   rr   rr   rs   _export_campaigns_data_ajax,  s    
z)DashboardView._export_campaigns_data_ajaxc              	   C   sD   z$t |jdd}tdt|dW S  ttfk
r>   Y dS X dS )z
        Get number of items per page from request or default.
        
        Args:
            request: Django HTTP request object
            
        Returns:
            int: Items per page
        r      
   d   N)r   r   rg   maxminr   r   )rn   ro   r   rr   rr   rs   r   B  s
    
z!DashboardView._get_items_per_page)rt   ru   rv   rw   http_method_namesr   extra_contextr}   rg   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__rr   rr   r   rs   rx      s6   
%))rx   c                 C   s  ddl m }m} dddd}tjj| jd d}| |dd }|d}z$tt	jj||d	d
 }|j
j}W n   | Y S X |dd}	tjj||dd}
dd |
D }
t|
dkr|S |
D ].}|dkr|d  d7  < q|d  d7  < q|d d t|
 }t|d|d< |S )Nr   r
   )	delivered	cancelledpurcentr   r   r;   r   %Y-%m-%d)id_channel__inbroadcastdate-r   )r   broadcastDateairStatuscodec                 S   s   g | ]}|d  qS r   rr   .0irr   rr   rs   
<listcomp>  s     zplaylists.<locals>.<listcomp>0001r   r   r      r   )r   r   rE   rd   r   sessionrh   strftimer   	Playlists
id_channelchannel_namer   rD   values_listlenround)ro   r   r   resultr   r   r   playlistr   r   verifsr   r   rr   rr   rs   	playlists  s2    

r  c                 C   s   t jj| jd ddd}g }|D ]r}i }tjj|d d}tjj|dd}tjj|d	}|d
 |d< t||d< t||d< t|dkr$|	| q$|S )Nr   r   r  r  r   r  T)Zid_adpost__inbooked)Zid_adspot__inr;   r   r  avail)
rE   rd   r   r   r  AdspotsrL   AdspotsInAvailr  append)ro   r   r  r   radspotr  r  rr   rr   rs   booked_adbreaks)  s    r  0c               
   C   s  t jj|d}tjj|d}tj| d}|d}t|}	tjjt	||t| |j
d|d}
td}|dd	 |d
|	 |d| d  |d| d  |d|j |d|j |d| |dd |dd tjj|
jdd}i }d}d}|D ]}t|jdd}|d }td||< || d| || d|j tjj|jd}t|dkr|||  i }d}|D ]X}t|jdd}|d }t|| d||< || d | || d!|j || d"d tjj|jd# d$}i }d}|D ]}|d%7 }t!d&t!"t	|j#j$}t|| d'||< || d(d) || d*t| || d+t|j% || d,| || d-|j#j& || d.t|j#j$d/  || d0d1 q|d%7 }q|d%7 }q|d%7 }t'|}t(|	 t(|j t(|j) t(|
j* |	d2 |j d2 |j) d2 |
j* d3 }t(| d4}t+j,-|sxt+.| t/|d5}|j0|d6d7d8 W 5 Q R X |S )9Nr  )r   r   %Y%m%dr  )r   r`   r   r   is_draftdraft_versionSchedulexmlnsz&http://www.scte.org/schemas/118-3/201Xr   begDateTimezT00:01:00+00:00endDateTimezT23:59:59+00:00networkNamezoneNamerevisionlevelschemaVersionz http://www.w3.org/2001/XMLSchemaid_playlistwindow_startr    Tz+00:00WindowwindowStartwindowDuration	id_windowAvail
availStartavailInWindowavailNumid_avail	id_adspotr;   %H%M%S00Spot	eventTypeLOI	trafficIdpositionInAvaillengthspotIdadIdsecschedSourceLocalr   z.schfiles/DAI-Managementwbutf-8T)encodingxml_declaration)1rE   rd   rg   rF   r   strptimer  rm   r  r   r   xmlElementrf   r   zonenameWindowsr   r#  r   r$  r   window_durationAvailsr+  r  r  avail_start
SubElementavailinwindowr  r1  select_relatedtimegmtimer2  durationpositioninavailfilenameElementTreeprintr  r`   ospathexistsmakedirsopenwrite) r   r   Zid_zonenamer`   r  r   channel_zonedatetimeobject	dayformatZdayformat_stringr	  rootwindowsZwindows_arrayZwin_i	trafficidwindowZwindowStartxmlavailsZavails_arrayZav_ir  ZavailStartxmlZadspotsinAVZadspots_arrayZads_ir  Zadspot_durationtreefileNamerW  filesrr   rr   rs   GenerateXMLfromDatabase;  s    
"






&
rg  c                 C   s   t tdddS )Nz
2021-08-16Z2M1)r    rg  ro   rr   rr   rs   testGenerateFromDatabase  s    rj  c                 C   sP   t dD ]@\}}}|D ]0}| |krt j||}t||}|    S qq
d S )N/)rV  walkrW  joinrZ  )rS  moderW  subdirsrf  rU   filefrr   rr   rs   getfile  s    
rr  c                 C   s   t | ||}d|_|| tt D ]Z\}}}|D ]J}	||	kr:tj||	}
t	|
 t
|
d}|d| | W 5 Q R X q:q,|  d S )NrA  rbSTOR )ftplibFTPrB  cwdrV  rl  getcwdrW  rm  rU  rZ  
storbinaryquit)hostr   passwordrS  
path_inftpftprW  ro  rf  rU   rp  rq  rr   rr   rs   
uploadFTP2  s    
 r  c           
   	   C   s   t | ||}d|_|| |}|d | }t| z.t|d}	|d| |	j W 5 Q R X W n( tk
r   td| t	
| Y nX |  d S )NrA  rk  r@  zRETR ERR)ru  rv  rB  rw  rU  rZ  Z
retrbinaryr[  r   rV  unlinkrz  )
r{  r   r|  Zfilepath_inftpZ
file_inftpZ	localpathr~  rS  	localfilerp  rr   rr   rs   downloadFTP  s    
"
r  c                 C   s   t tddddddS )Nuk06.tmd.cloudtestftp@epgsano.comI?#=s3FfnSu_z/2M/schedules/ztest.txtz5/var/www/html/DAI-Management/DAIManagement/FTP_files/)r    r  ri  rr   rr   rs   test_download  s    r  c           
   	   C   sp   |rt | |||nt | ||}|| tjt}d}t|d}	|d| |	 W 5 Q R X |	  d S )Nr?  rs  rt  )
ru  rv  rw  rV  rW  dirname__file__rZ  ry  rz  )
r{  portr   r|  rS  r}  r~  
module_dirrW  rp  rr   rr   rs   	uploadFTP  s    "
r  c           	   
   C   s   ddl m} zb|| P}||| t|d}|d| | W 5 Q R X td| d| d W 5 Q R X W n0 tk
r } ztd|  W 5 d }~X Y nX d S )	Nr   )rv  rs  rt  zFile 'z' uploaded to 'z' on the FTP server.zError: )ru  rv  loginrZ  ry  rU  rk   )	r{  usernamer|  Zlocal_file_pathZremote_file_pathrv  r~  rp  rq   rr   rr   rs   AlmaFtp  s    
$r  c                 C   sN  z^t | ||}|| tjt}d}t|d}	|d| |	 W 5 Q R X |	  W dS  t
k
rH }
 ztdt|
  td zdt | ||}|| tjt}d}t|d}	|d| |	 W 5 Q R X |	  W W Y PdS  t
k
r6 }
 z(tdt|
  td W Y 
W Y dS d }
~
X Y nX W 5 d }
~
X Y nX d S )	Nr?  rs  rt  Tz%suF   ⚠️ Connectivity issue with Enensys server, trying again ... ⚠️u=   ⛔️ update was not pushed, please check OpenVPN or EnensysF)ru  rv  rw  rV  rW  r  r  rZ  ry  rz  rk   rU  typesend_msg_telegram2)r{  r  r   r|  rS  r}  r~  r  rW  rp  rq   rr   rr   rs   
uploadFTP4  s2    

r  c                 C   s"  d}t |}|jd}|jd}|jd}|jd}|d}g }|D ]}	|	d}
|	d}|	d	}|d
d}|dd}|	d}|	d}|	d}z$tjj||||
||||||d
 W qP t	k
r } z*tjj
||||
|||||d	j|d}W 5 d }~X Y qPX qPtdS )Nz%files/results/20210906-2005-00001.xmlr  r  r   verCompleter4  r7  r:  airTimer&  r%  +02:00r   	airLengthairStatusCoder  
r   rG  r   r7  r:  r  r  r   r  vercomplete)	r   rG  r   r7  r:  r  r  r   r  )r  zdata has been inserted)xml2parse
firstChildgetAttributegetElementsByTagNamer   rD   rd   update_or_creater   r   r~   r    )ro   rW  docr   rG  r   r  Spotsresultsspotr7  r:  r  
newAirTimenewAirTime2r  r  r`   rq   Z	insertionrr   rr   rs   
saveXML2db4  s,    







$:r  c                 C   s   t tdddddS )Nr  r  r  z,/files/DAI-Management/20210815-2005-2M-1.schz2M/schedules/France)r    r  ri  rr   rr   rs   test_uploadT  s    r  c                    s&   dd | j D   fdd|  D S )z'Return all rows from a cursor as a dictc                 S   s   g | ]}|d  qS r   rr   )r   colrr   rr   rs   r   b  s     z dictfetchall.<locals>.<listcomp>c                    s   g | ]}t t |qS rr   )dictzip)r   rowcolumnsrr   rs   r   c  s     )rz   fetchall)cursorrr   r  rs   dictfetchall`  s    r  c                 C   s.   |  d}|d d |d  d |d  }|S )Nr   r   r   r;   )split)r   r   rr   rr   rs   	date_time  s    
 r  c                 C   s  dd l }dd l}dd l}dd l}ddlm} |j| dddgd}g }|d D ]&}||j|j 	t
|d   qL|j  }	|j|	 d  }
||d	< |j|d	 |
k }tdt|d |_dd
lm} ddlm} ddlm} d}|||| }||jdd}||d dd}||| ||}|jdgd |	|jdd7 }	|d }tdt|D ]*}td|	|| t|| d}|  qj||fS )Nr   )ARIMADayMinutePurcentr  r   r;   ZDay_Week)PolynomialFeatures)make_pipeline)LinearRegression   r   )subset   r   z2M Maroc)sfr_channel_namer   minuter   ) r   pandasnumpycalendarZstatsmodels.tsa.arima_modelr  	DataFramer  day_namerD  rm   r   rh   locranger  indexZsklearn.preprocessingr  Zsklearn.pipeliner  Zsklearn.linear_modelr  arrayZreshapeZfitpredictZdrop_duplicatesr   ZSfr_predictabssave)valr   pdZnpr  r  dfweekr   r   Zday_weekZdf_finalr  r  r  ZdegreeZpolyregXyr  r   linerr   rr   rs   r    s<    $

r  c                 C   s0   | j d}|dkrd}nd}|| jd< tdS )Ncurrent_modelightr   z	dark-mode
theme_mode)r   rg   r   r    )ro   r  Zbody_class_themerr   rr   rs   r  :  s    
r  c                   C   s.   t  jdt t   td qd S )Nz00:00r;   )	scheduleeveryr   atdoZpredict_adbreakrun_pendingrO  sleeprr   rr   rr   rs   func_predictE  s    r  c           #      C   s  d}t jj| d}t|j||| t|dk rtjj| d}tjj| dd}tjjdd}t	jj||dj|d	
 }	t	jj|d
 }
d
}|	rt|	jj}t| td d}td t|	jj |	j}ddlm} t| tj|d}t|	 |tjdd }|
  t|
 ddlm} | }t|	jjdd}|	j}t|	jj}t|	jj}|dd}d}||f}||| | }|
r|D ]b}|d }t|d  tjj|d d}t| |
|_|j}|
j|_ tdt|j   |  qtjj|d}t|j!d |_!|  ttjj|dj!}ttjj|dj"}|}|} t#|| |j$t|t|}!|j%d |j& }"|dkrtd d S )N%Y-%m-%d %H:%M:%Sr     2005r  rG  r   r"  window_start__ltewindow_end__gteZid_playlist__inr   6   📣 Short adbreak detected, updating the playlist ...r   I'm heeeerer      minutesr&   r   r   a  
                              SELECT Adspots_in_avail.id_avail FROM Avails
                              left join Adspots_in_avail on Adspots_in_avail.id_avail = Avails.id_avail
                              left join Verifs on ( Verifs.broadcastDate = %s and Verifs.trafficId = Adspots_in_avail.trafficId )
                              where (Verifs.airStatusCode <> 0001 or Verifs.airStatusCode is null) and Avails.id_window= %s
                          r0  the new avail winodws : r;   /schedules/   ✅ Playlist updated)'rE   rd   rg   send_msg_telegramr  r   r  r   rF   rH  lastr#  Zinsertion_results_getterr  rU  
window_endr   r   rD  r  	django.dbr'   r  rm   r   r   r+  executer  rJ  r   r$  rK  r`   r  rg  r   ftp_channel_namer   )#r  start_atrQ  msgFMT
my_channelr	  r\  Zotherplaylistrb  
new_windowupdate_statustheid_playlistpreview_window_endr   r'   r  broadcastDateForQueryid_windowForQuerydaydatedaydate_xmlqueries
data_tupler  r  availoor  winddddpplaynew_versionnew_version_draftmax_version_draftmax_versionxmlfilenamer}  rr   rr   rs   realtime_filterM  st    


r	  c           %      C   sD  d}t jj| d}t|j||| t|dk r@tjj| d}tjj| dd}t	jj||dj|d
 }d}	|r.td	 d
}	td t|jj |j}
d
dlm} t| tj|d}||_|j}tjt|j|tjt|j| }tjt|d}|d}||_|  t| |tjdd }tjt|
|tjt|| }tdt|  tdt|
  tdt|  tjt|d}|d}t	|jj||
|d}|  |jj}t| d
dlm} | }t|jjdd}|j}t|jj}t|jj}|dd}d}||f}||| | }|r|D ]b}|d
 }t|d
  tjj|d
 d}t | ||_|j}|j|_!tdt|j!  |  qJtjj|d}t|j"d |_"|  ttjj|dj"}ttjj|dj#} | }!|}"t$|| |j%t|t|!}#|j&d |j' }$|	dkr@td d S )Nr  r  r  r  r  r  r  r   r  r   r  r  %H:%M:%Sr3  r  r  r  r  new window duration Zid_playlist_idr$  r  rI  r&   r   r     
                              SELECT Adspots_in_avail.id_avail FROM Avails
                              left join Adspots_in_avail on Adspots_in_avail.id_avail = Avails.id_avail
                              left join Verifs on ( Verifs.broadcastDate = %s and Verifs.trafficId = Adspots_in_avail.trafficId )
                              where Avails.id_window= %s
                          r0  r  r"  r;   r  r  (rE   rd   rg   r  r  r   r  r   rF   rH  r  r  rU  r#  r  r   r   rD  rm   r$  r  rI  r  r  r'   r  r   r   r+  r  r  rJ  r   rK  r`   r  rg  r   r  r   )%r  r  rQ  r  r  r  r	  r\  rb  r  r  r   endorI  new_window_durationr  r  r'   r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r}  rr   rr   rs   realtime_filter_new  s    (
$


r  c           $      C   s  d}t jj| d}t|j||| t|dk rtjj| d}tjj| dd}t	jj||dj|d
 }d}	|rtd	 d
}	td t|jj |j}
d
dlm} t| tj|d}||_|j}tjt|j|tjt|j| }tjt|d}|d}||_|  t| |tjdd }tjt|
|tjt|| }tdt|  tdt|
  tdt|  tjt|d}|d}t	|jj||
|d}|  |jj}t| d
dlm} | }t|jjdd}|j}t|jj}t|jj}|dd}d}||f}||| | }|r|D ]b}|d
 }t|d
  tjj|d
 d}t | ||_|j}|j|_!tdt|j!  |  qJttjj|dj"}ttjj|dj#}|} |}!t$|| |j%t|t| }"|j&d |j' }#|	dkrtd d S )Nr  r  r  r  r  r  r  r   r  r   r  r  r
  r3  r  r  r  r  r  r  r&   r   r   r  r0  r  r"  r  r;   r  r  )$r  r  rQ  r  r  r  r	  r\  rb  r  r  r   r  rI  r  r  r  r'   r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r}  rr   rr   rs   realtime_filter_old2  s    (
$


r  c           
      C   sD   ddl m} dd l}g }t|}i }d}d} t|  ddi}d}	|S )Nr   )BeautifulSoupa  http://ads.stickyadstv.com/www/delivery/swfIndex.php?reqType=AdsSetup&protocolVersion=2.0&zoneId=33011444&playerSize=720x576&_fw_gdpr=0&_fw_us_privacy=1---&_fw_did_idfv=8D9E1F6C-5A2B-7143-9038-62471DC58C24&_fw_atts=0&ltlg=48.856,2.352&_fw_deviceMake=settopbox&_fw_devicemodel=set-top_box&_fw_content_genre=generalist&_fw_content_rating=+14&_fw_is_lat=1&_fw_coppa=0&withOMSDK=false&_fw_gdpr=0&_fw_gdpr_consent=0&_fw_gdpr_consented_providers=0z
User-AgentzfMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36 )Zbs4r  concurrent.futuresr   rU  )
urlrQ  r  
concurrentZlist_idr  dict_allcteZ
my_headersre   rr   rr   rs   get_info_from_vast_file  s    Tr  c           3      C   s  |}t jj|d}td tj d}tj|d d}tj|d d}tj }	t	|	
dd }
tj tjd	d
 }t	|
dd }tj tjdd
 }t	|
dd }tjj|d}|rtjj|ddd }|j}t|d }||_|  d}tjj|d}|D ]F}tjj|jd}|D ]*}tjj|jd}|D ]}|d7 }qNq6qztjj||
|
d}W n* tjk
r   tjj||
|
d}Y nX |r$|j}|j}tjj|jd }t|d }d}tjt	|j|tjt	|j| }tjt	|d}|d}nztjj|||d}W n* tjk
rd   tjj|||d}Y nX |rt|j} n|} ztjj|||d}!W n* tjk
r   tjj|||d}!Y nX |!r|!j}"n|}"d}t|j| |"|d}#|#  |#j}|#j}d}t||||	d}$|$  |st|d||||	dddd	}|  t|jt	|t	|dd}%|%  d}d}|%j}|%j}t||d|	d}$|$  t||}&d}'|& D ]\}(})|'d7 }'|)d d }*|*dd}*ztjj|*d}+W n& tjk
r   tjj|*d}+Y nX |+r,|d7 }t|$j|+j |'|d },|,  nN|)d! }-|)d d }t!jj|-|d"" st!|-|d"}.|.  t#d#| d$  qd%}/t$jj||/d&}0t%|||0j&t	|}1|j'd' |0j( }2d S )(Nr  z/echo 'inside the task function' > a_log/log.txtr   z	 00:01:00r  z	 23:59:00.r   r   r  r   )r   z-versionr;   r"  r*  r0  )r#  r  r  r
  r3  Z00120000r  )Zid_window_idrK  rM  r   r  )	r   r`   r   
start_dater   Zcreation_datetimeZid_zone_channel_idr  r  Z23580000	MediaFiler  r%  r   )url_from_vast)Zid_avail_idZid_adspot_idrR  ra  Creative_idcreative_idr  'New Creative Detected in VAST <a href=''>(Video_link)</a>r  r  r  ))rE   rd   rg   rV  systemr   rh   r  rD  rm   r  r   r  r   r   r`   r   r  rH  rJ  r+  r  r1  DoesNotExistr$  re   r  r#  r  itemsr   r  	id_adpostrN   rX  r  rF   rg  r   r  r   )3ro   r  rQ  r  r   ZchanneldataZto_day_dater  r   rh   Znow_strZ
now_minus2Z
now_plus10check_valuePlaylistr  r  Zcurrent_traffic_totalZall_windowsZwindZ
all_availsavZ	all_spotsadrb  r+  rK  ZnumberofavailsrM  r  rI  Zprev_windowZnew_widdow_startZnext_windowZnew_widdow_endr  r,  r'  r  rR  keyr   ZCreative_urladpostZAdspotsInAvr   pandingrG  r\  r  r}  rr   rr   rs   task
  s    

(

r.  c           
      C   sp   t ||}d}| D ]T\}}|d }|d d }tjj||d st||d}	|	  td| d  qd S )Nr   r  r  r  r  r!  r"  )r  r%  rN   rd   r   rX  r  r  )
ro   r  rQ  r  r  rR  r+  r   r   r-  rr   rr   rs   	loop_vast  s    
r/  c           	   	   C   s   dd l }dd l}d}d}d}td ||||}t|| d td|j||f  t|d}|d	|j| | W 5 Q R X td
 |	  d S )Nr   r  r  r  zConnecting to FTP...)dirpathz$Transferring %s and storing as %s...rs  zSTOR %szClosing session.)
rV  ru  rU  rv  chdirrW  basenamerZ  ry  rz  )	Z
DST_FOLDERZSRC_FILEPATHrV  ru  ZFTP_ADDRUSERNAMEPASSWORDr   rp  rr   rr   rs   send_adspot  s    "r5  c                 C   sf   t | |dkrLtd|  |d}| |d  | |d d |d   td|  | | dS )zChange to directory.FzCreating folder %s...rk  r   r;   zChanging to directory %s...N)directory_existsrU  r  Zmkdrw  )r   r0  Zfoldersrr   rr   rs   r1    s    
r1  c                 C   sD   g }|  d|j |D ](}| d |kr| dr dS qdS z!Check if remote directory exists.LISTr   DTFZ	retrlinesr  r  upper
startswithr   r0  filelistrq  rr   rr   rs   r6    s    r6  c                 C   sZ   d| d |  d | d | d }t j}tj|d d}|jd|d	  |tjjd
 d S )Nz5
    ====================
    New Adbreak Detected: [z]
    - channel: 
    - Time: [z]
    - Duration : []
    ====================
    	bot_tokentoken@%sr  chat_idtextZ
parse_moder@   TELEGRAMtelegramBotsend_messageZ	ParseModeZHTML)r  r  rQ  r  r   telegram_settingsbotrr   rr   rs   r    s.     r  c                 C   sB   d|  d }t j}tj|d d}|jd|d  |tjjd d S )N
    []
    rA  rB  rD  r  rE  rH  r  r   rM  rN  rr   rr   rs   r    s     r  c                 C   s<   d|  d }t j}tj|d d}|jd|d  |d d S )NrO  rP  rA  rB  rD  r  )rF  rG  )r@   rI  rJ  rK  rL  rQ  rr   rr   rs   send_msg_telegram3	  s    rR  c                 C   sJ   d| d |  d }t j}tj|d d}|jd|d  |tjjd d S )	Nz/
    ====================
    Adspot detected: r?  r@  rA  rB  rD  r  rE  rH  )r  r  r   rM  rN  rr   rr   rs   send_ad_telegram	  s     rS  c                 C   sD   g }|  d|j |D ](}| d |kr| dr dS qdS r7  r:  r=  rr   rr   rs   r6  	  s    c           
         s   ddl m} dd ltjj| d}tjj|ddj|dd	d}d  fd	d
t
t|D }g }g }t|D ]:}|tjj|d dj |t|d d d d qx|||d }}	|S )Nr   r,   r   r   id_brand)re   z-count0123456789ABCDEFc              	      s"   g | ]}d d  d qS r   r   r  rm  sampler   charsrandomrr   rs   r   )	  s     zads_brand.<locals>.<listcomp>pkre   r      r   r   datacolor)django.db.modelsr,   r]  rE   rd   r   r  r   annotater   r  r  r   r  rI   rg   
brand_namer  )
r   r,   r   adsrc  r   rb  r*  brandr
  rr   r[  rs   	ads_brand#	  s     &
ri  c                 C   sP   t jjddd}dd |D }|d|d|dd t| d	}|S )
Nr;   r   pacingc                 S   s   g | ]}|d  qS r   rr   )r   prr   rr   rs   r   ;	  s     z#campaign_pacing.<locals>.<listcomp>TFr   )truefalser   )rL   rd   r   r  re   r  )ro   rj  r  rr   rr   rs   campaign_pacing9	  s    rn  c                    s   ddl m  dd ltjj| jd djddjdddd	}fd
d|D } }d}d}d}|D ]8}||d k r|d7 }qj||d k r|d7 }qj|d7 }qj|||g}d  fddt	dD }dddg}	|	||d}
|
S )Nr   r   r   r   r   )Zstart_day__exact)Zend_day__exactZ	start_dayZend_dayc                    s,   g | ]$}  |d  d  |d dfqS )r   r   r;   )rD  )r   r   ro  rr   rs   r   I	  s     z#campaign_avtive.<locals>.<listcomp>r;   rW  c              	      s"   g | ]}d d  d qS rX  rY  r   r[  rr   rs   r   W	  s        ZFinishedzIn progresszNot startedra  )
r   r]  rL   rd   r   r   excluder  rh   r  )ro   Zetatrh   finishedZ	not_startstartr   rb  rc  r   r  rr   )r\  r   r]  rs   campaign_avtiveD	  s.    ,




rt  c                    s   ddl m} dd ltjj| jd ddj|dd	d}g }g }d  fd	d
t
t|D }|D ],}|tjj|d dj ||d  ql|||d}|S )Nr   rT  r   r   rV  dcount-dcountrW  c              	      s"   g | ]}d d  d qS rX  rY  r   r[  rr   rs   r   k	  s     z!campign_brand.<locals>.<listcomp>r^  rv  ra  )rd  r,   r]  rL   rd   r   r   r   re  r   r  r  r  rI   rg   rf  )ro   r,   rh  rb  r   rc  r   r  rr   r[  rs   campign_brandc	  s    ,rx  c           	         s   ddl m} dd ltjj| jd d}tjj|ddj	|dd
d}d	  fd
dtt|D }g }g }|D ],}|tjj|d dj ||d  qz|||d}|S )Nr   rT  r   r   rU  r  ru  rw  rW  c              	      s"   g | ]}d d  d qS rX  rY  r   r[  rr   rs   r   	  s     z channels_ads.<locals>.<listcomp>r  rv  ra  )rd  r,   r]  rE   rd   r   r   r  r   re  r   r  r  r  rg   r  )	ro   r,   r   rg  rc  r   rb  r*  r  rr   r[  rs   channels_ads{	  s     &ry  c                    s   dd l dd l}ddlm} tjj| jd dd}dd |D }t	jj|ddd	d
}|j
|dddgd}g }g }tt|d }d  fddtt|D }|D ]B}|j|d |k jddgd }	|t|	d  || q|||d}
|
S )Nr   rT  r   r   r  c                 S   s   g | ]}|d  qS r   rr   r   r   rr   rr   rs   r   	  s     z$channels_adbreak.<locals>.<listcomp>)Zchannel_name__inr   rO  rE   r  Timer  rW  c              	      s"   g | ]}d d  d qS rX  rY  r   r[  rr   rs   r   	  s     byra  )r]  r  rd  r,   rE   rd   r   r   r  ZAdbreakHistoryr  r   rf   r  r  r  groupbyre   r  r   )ro   r  r,   r   rb  r  r   rc  r   df2r  rr   r[  rs   channels_adbreak	  s*    "r  c                    s   dd l dd l}tjj| jdd}dd |D }tjj|ddd}|j|dd	gd
}dd |d	 D }||d	< t	t
jjddjtt
jjddj|jdgd }t|j}fdd|jD }d  fddtt|D }	|||	d}
|
S )Nr   r   r  c                 S   s   g | ]}|d  qS r   rr   rz  rr   rr   rs   r   	  s     z channels_sfr.<locals>.<listcomp>)sfr_channel_name__inr   rE   r  r  c                 S   s   g | ]}t |qS rr   )floatr   rr   rr   rs   r   	  s     r   r^  r|  c                    s   g | ]}|d     qS r   rr   r   )market_share_purcenttotal_usersrr   rs   r   	  s     rW  c              	      s"   g | ]}d d  d qS rX  rY  r   r[  rr   rs   r   	  s     ra  )r]  r  rE   rd   r   r   r  ZSfrAnalyticsr  r   rO   rg   r  r  r  r~  Zmeanr   r  r   r  r  )ro   r  r   Zsfrr  r   r  r   rb  rc  r  rr   )r\  r  r]  r  rs   channels_sfr	  s(    
r  c                 C   s    t jj| jd}t| dd|iS )Nr   zcore/charts.htmlr   )rE   rd   r   r   r   )ro   r   rr   rr   rs   charts_test	  s    r  c           "         s  | j d}| j d}| j d}td| |d krT|}tj|d}|d}ntj }|d}|d krtjj	|dd j
}t| nd}|d krttjj	| j|d	jd
dd}nttjj	| jdjd
dd}tjj	||t|d}	g }
g }tjjdd}|D ]p}|	j	|ddd}t|dkr
t|jt|j  dd |D } fdd|D }|
| || q
dd l}t}tjj	| jdd}dd |D }tjj	ddd}g }|D ]}|j|kr|j|jt|jdd d}tjj	|jdd }|j
|d< t|jdd d }|d d  |d  d! }||d< d"|d#< t|j dkrd$|d%< d&|d#< tjj	|d' |d d(D ]N}|d |j!krtjjdd}t|j"t|j t|j  t# |d)< qn\t|j d*krd+|d%< d,|d)< n:t|j d-kr,d.|d%< d,|d)< d/|d#< nd0|d%< d,|d)< || qtt$jj	| j%d1 d2}tt$jj	| j%d1 dd3}t&| }t'| }t(| }t)| } t*j+ ,d4dd5 }!tjj	| j%d1 d2}td6 t-||
||d7S )8Nr   r   r  zload_charts ====== r   )Zzonename__containsr   France)r   r  r  T)flatr   )r  r   r   rh  r^  )r  r  r   c                 S   s   g | ]}|d  qS r   rr   r   xrr   rr   rs   r   	  s     zload_charts.<locals>.<listcomp>c                    s    g | ]}t t|d    qS )r;   )r   r  r  nbrr   rs   r   	  s     rU   c                 S   s   g | ]}|d  qS r   rr   r  rr   rr   rs   r   
  s     r   Z20211024)r   r   r%  )r   rU   r   )rG  r;   :z:00z	#00800000rc  zAired Successfullyr\   z	#2c2c8cb3r   )r   r  Znb_wachZ0008zFailed, Adspot cutr   Z1005zNot aired yetz	#c7c7c7b3zFailed, Other Reason..r   r   )r   rj  z-id_activity   zend of loadchart)labelsr  r  rc  ).r   rg   rU  r   rD  r  rh   rF   rd   r   r   r   rE   r   r  ChannelsrP   rm   rO   r  r  r  r  r  r]  colorsrD   r   r:  r  r  rG  r   r  r   r   rL   r   Zmost_advertisersr  Zactive_agencyr  rK   r   r   r!   )"ro   r   r   r  r   r^  rG  r  ZChannel_sfrr  r  Zchannel_sfrr   r   resr  rb  r]  rc  r   linesZdata2r  rk  r   r  r   r   Zcampaigns_activer   ZbookedsZagencesr	  Z	activitesrr   r  rs   load_charts	  s    



"




r  c                 C   s  t jj| jd d}d}|j}|j}|}tt d}t	jj|||d
 }|}td |d | d }	d	| d
 }
d| d }tj|st| t|d	 |	  rt|d	 |	 }|d}|jd}g }|D ]
}|d}|d}|d}|dd}|dd}|d}|d}|d}zlt	jj|||||d}|r~||_||_||_||_||_|  n$t	||||||||||d
}|  W q t	jk
r   td t	||||||||||d
}|  Y qX qd S )Nr   r   r  r  )r   rG  r   zWait I'm in ftpr   z
-00001.verrk  z/verifs/zfiles/results/z/verifsr4  r  r7  r:  r  r&  r%  r  r   r  r  r  )r   rG  r   r7  r:  r  Zoups)rE   rd   r   r   r  r   r   r  rh   rD   r  rU  rV  rW  rX  rY  r   r  r  r  r  r  r   rg   r  r  r   r  r  r  r$  )ro   r   r   r  r   rG  r   r  ZbroadcastDate_verifZfilename_in_ftpZpath_in_ftpZpath_in_appr  r  r  r  r  r7  r:  r  r  r  r  r  r`   Zverif_to_updateZnew_ad_verifrr   rr   rs   insertion_verifs>
  sV    









r  c                 C   s>   dd l }dd l}||j|j}|ddt| f |  d S )Nr   i,  r;   )schedrO  	schedulerr  enterr  run)ro   r  rO  srr   rr   rs   verifs_timer_insertx
  s    r  c                    sb   ddl m  m t| }|jdkrZ| d | d d } fdd|D }|S d S d S )Nr   r
      rb  c                    s~   g | ]v}d |kr|d  dkr|d d d  d| dd  d  d| dd ddd dd	qS )
ZisPubrh  r   r%  rs  r   z%Y-%m-%d %H:%M:%S.%fr;   )weeks)headr   Zid_start_combinedZstart_minus_one_week)rg   rD  r  )r   itemr   Z	head_datar   rr   rs   r   
  s     0z'fetch_playlist_data.<locals>.<listcomp>)r   r   requestsrg   status_codejson)r  responseZplaylist_dataZprocessed_datarr   r  rs   fetch_playlist_data
  s    


r  c              	   C   s  dd l m  m} ddlm} dd l}dd l}dd l}|d}| d }td| | d d }| d d }	|	d| |	d	| |	d
|	 |
|d}
d}tjjdd}t|  |D ]}t| t|j |t|j t| d d krtdt| d d  |
|
d}|	dt|j |	d|j  |	dt|j td|j ||j7 }tdt| d d |  d qtdt| d d |  d qd}||j|dd  }d}| }|d}tj||}tj|dd t| dddd dt|  d }tj||}t|d!dd}| | W 5 Q R X td" d#}d$}d%}d&}d'}t!||||d(}|"|| d}d S ))Nr   ro  r	  r   zDate: r   ZsubIdZplaylistDateZsynthesiaIdZsynthesiaSubIdrb  zTGTG_30_16x9.mp4rT   rQ  zwe Have new Ad :mediarW  zinsert ad: zWe still have :z EmptyzDone and we have  :z'<?xml version="1.0" encoding="UTF-8"?>
rA  )rB  z1/var/www/html/DAI27/Adtlas_DAI/files/vast/pitchonr   T)exist_okr%  r   r  z.xmlwzUploading to FTP...z	/PLAYLISTztvpitchoun-stor.easytools.tvZ
advmanagerzDFG$_Rv!934   )
ftp_serverr  r  r|  )#xml.etree.ElementTreer   rT  r   uuidr]  astrF  rU  rf   rL  AlmaAdsrd   r   re   rQ  r   rm   r   ads_pathrU   tostringdecoderh   r  rV  rW  rm  rY  r   uuid4rZ  r[  r<   Zupload_file)rb  ETr   r  r]  r  r	  Zplaylist_dateZsynthesia_idZsynthesia_sub_idZdata_elementZtotal_durationZalma_replacement_adsZvideoZmedia_elementrC  
xml_stringbase_dirr   date_folderZfolder_pathrS  	file_pathxml_fileZ
remote_dirr  r  r|  r  Z
ftp_clientrr   rr   rs   create_playlist_xml
  sd    


 
""
0r  c                 C   s0   t | r"tddtdddddS t| dddS )	z
    Custom 404 error handler.
    
    Args:
        request: HTTP request object
        exception: Exception that caused 404
        
    Returns:
        HttpResponse: 404 error page
    Fra   zPage not foundz	Not Foundr   r  r   ry   i  rc   zerrors/404.htmlr:   r!   r   r   ro   	exceptionrr   rr   rs   
handler404
  s    r  c                 C   s0   t | r"tddtdddddS t| dddS )	z
    Custom 500 error handler.
    
    Args:
        request: HTTP request object
        
    Returns:
        HttpResponse: 500 error page
    Fra   zInternal server errorzServer Errorr  rb   rc   zerrors/500.htmlr  ri  rr   rr   rs   
handler500  s    r  c                 C   s0   t | r"tddtdddddS t| dddS )	z
    Custom 403 error handler.
    
    Args:
        request: HTTP request object
        exception: Exception that caused 403
        
    Returns:
        HttpResponse: 403 error page
    Fra   	ForbiddenzAccess Deniedr  i  rc   zerrors/403.htmlr  r  rr   rr   rs   
handler403&  s    r  c                 C   s0   t | r"tddtdddddS t| dddS )	z
    Custom 400 error handler.
    
    Args:
        request: HTTP request object
        exception: Exception that caused 400
        
    Returns:
        HttpResponse: 400 error page
    Fra   zBad requestzBad Requestr  i  rc   zerrors/400.htmlr  r  rr   rr   rs   
handler400=  s    r  )r  )multiprocessingr   rV  r  rO  pytzr]  loggingargparser   r  	threadingmathr   r  r   pathlibr   r   r   ior   r	   r   Znumpy.lib.stride_tricksr   ImportErrorZlxmlr   xml.dom.minidomdomminidomr  r  rT  rE  ru  r   r   rest_framework.viewsr   r   r  r   djangor   rd  r   django.contribr   r  r   r   Zdjango.shortcutsr   r   Zdjango.contrib.sessions.modelsr   django.core.exceptionsr   django.template.loaderr   $django.contrib.sessions.base_sessionr   #django.contrib.sessions.backends.dbr   ZDBStoredjango.httpr    r!   r"   r#   Zapps.core.utilsr$   r  django.viewsr%   r'   django.utilsr(   django.urlsr)   r*   r+   r,   r-   r.   django.utils.decoratorsr/   django.views.decorators.csrfr0   django.views.genericr1   r2   Zdjango.contrib.auth.mixinsr3   Zdjango.contrib.auth.decoratorsr4   Zdjango.views.decorators.httpr5   r6   django.core.paginatorr7   r8   r9   Zapps.common.utilsr:   utilsr<   r=   r>   r?   	getLoggerrt   rl   r  rJ  django.confr@   django.core.cacherA   django.views.decorators.cacherB   apps.accounts.modelsrC   apps.playlists.modelsrD   apps.channels.modelsrE   rF   rG   apps.agencies.modelsrH   rI   rJ   apps.activities.modelsrK   apps.campaigns.modelsrL   rM   rN   Zapps.reports.modelsrO   rP   rQ   rV   rx   r  r  rg  rj  rr  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r  r.  r/  r5  r1  r6  r  r  rR  rS  ri  rn  rt  rx  ry  r  r  r  r  r  r  r  r  r  r  r  r  rr   rr   rr   rs   <module>   s$  
1      l
^	<  0%ylio 



o:d