U
    9Yhe                     @   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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ddlmZmZmZm Z m!Z! e"e#Z$G dd deZ%G dd deZ&G dd deZ'G dd deZ(G dd deZ)G dd deZ*G dd deZ+G dd dej,Z-G dd  d ej,Z.G d!d" d"ej,Z/e0eG d#d$ d$ej1Z2e0eG d%d& d&ej1Z3e0eG d'd( d(ej1Z4e0e G d)d* d*ej1Z5e0e!G d+d, d,ej1Z6G d-d. d.ej7Z8dS )/    )admin)format_html)gettext_lazy)reverse)	mark_safe)CountQMax)SimpleListFilter)	ModelFormValidationError)timezone)MinValueValidator)	timedeltatimedatetimeN   )	PlaylistsWindowsAvailsAdspotsInAvailVerifsc                   @   s(   e Zd ZedZdZdd Zdd ZdS )PlaylistStatusFilterStatusstatusc                 C   s"   dt dfdt dfdt dffS )NdraftDraft	published	PublishedactivezCurrently Active_selfrequestmodel_admin r&   //var/www/html/Focus/src/apps/playlists/admin.pylookups   s    


zPlaylistStatusFilter.lookupsc                 C   sX   |   dkr|jddS |   dkr0|jddS |   dkrTt }|jd||dS |S )Nr   Tis_draftr   Fr   )r*   start_date__lteend_date__gte)valuefilterr   now)r#   r$   querysetr/   r&   r&   r'   r0      s    zPlaylistStatusFilter.querysetN__name__
__module____qualname__r!   titleparameter_namer(   r0   r&   r&   r&   r'   r      s   r   c                   @   s(   e Zd ZedZdZdd Zdd ZdS )BroadcastDateFilterzBroadcast PeriodZbroadcast_periodc                 C   s6   dt dfdt dfdt dfdt dfd	t d
ffS )NtodayTodaytomorrowZTomorrow	this_weekz	This Week	next_weekz	Next WeekpastzPast Broadcastsr    r"   r&   r&   r'   r(   2   s    




zBroadcastDateFilter.lookupsc                 C   s   t   }|  dkr$|j|dS |  dkrF|j|tdd dS |  dkr|t| d }|tdd }|j||gdS |  d	kr|td
|  d }|tdd }|j||gdS |  dkr|j|dS |S )Nr8   )broadcast_dater:   r   )daysr;      )Zbroadcast_date__ranger<      r=   )Zbroadcast_date__lt)r   r/   dater-   r.   r   weekday)r#   r$   r0   r8   Z
start_weekZend_weekZstart_next_weekZend_next_weekr&   r&   r'   r0   ;   s     zBroadcastDateFilter.querysetNr1   r&   r&   r&   r'   r7   .   s   	r7   c                   @   s(   e Zd ZedZdZdd Zdd ZdS )VerificationStatusFilterzVerification StatusZverification_statusc                 C   s,   dt dfdt dfdt dfdt dffS )	NcompleteCompletependingPending
successfulzSuccessful BroadcastfailedzFailed Broadcastr    r"   r&   r&   r'   r(   S   s
    



z VerificationStatusFilter.lookupsc                 C   s   |   dkr:|tddtddB tddB tddB S |   dkrt|tddtddB tddB tddB S |   dkr|tdd	td
d	B tdd	B tdd	B tdd	B S |   dkr|tdd	td
d	B tdd	B tdd	B tdd	B S |S )NrE   )Zvercomplete__iexactyes1truerG   rI   success)ZairStatuscode__iexactok200aired	broadcastrJ   )r-   r.   r   excluder#   r$   r0   r&   r&   r'   r0   [   sZ    z!VerificationStatusFilter.querysetNr1   r&   r&   r&   r'   rD   O   s   rD   c                   @   s(   e Zd ZedZdZdd Zdd ZdS )BroadcastTimeFilterzBroadcast TimeZbroadcast_timec                 C   s,   dt dfdt dfdt dfdt dffS )	NmorningzMorning (06:00-12:00)	afternoonzAfternoon (12:00-18:00)eveningzEvening (18:00-24:00)nightzNight (00:00-06:00)r    r"   r&   r&   r'   r(      s
    



zBroadcastTimeFilter.lookupsc                 C   s   |   dkr(|jtddtddgdS |   dkrP|jtddtd	dgdS |   d
krx|jtddtddgdS |   dkr|jtddtddgdS |S )NrV   r@   r      ;   )Zair_time__rangerW         rX         rY      )r-   r.   r   rT   r&   r&   r'   r0      s    zBroadcastTimeFilter.querysetNr1   r&   r&   r&   r'   rU   }   s   rU   c                       s*   e Zd ZG dd dZ fddZ  ZS )PlaylistAdminFormc                   @   s   e Zd ZeZdZdS )zPlaylistAdminForm.Meta__all__N)r2   r3   r4   r   modelfieldsr&   r&   r&   r'   Meta   s   re   c                    sB   t   }|d}|d}|r>|r>||kr>tdtdi|S )N
start_dateend_datez"End date must be after start date.supercleangetr   r!   )r#   cleaned_datarf   rg   	__class__r&   r'   rj      s    


 zPlaylistAdminForm.cleanr2   r3   r4   re   rj   __classcell__r&   r&   rm   r'   ra      s   ra   c                       s*   e Zd ZG dd dZ fddZ  ZS )WindowAdminFormc                   @   s   e Zd ZeZdZdS )zWindowAdminForm.Metarb   N)r2   r3   r4   r   rc   rd   r&   r&   r&   r'   re      s   re   c                    sB   t   }|d}|d}|r>|r>||kr>tdtdi|S )Nwindow_start
window_endz)Window end time must be after start time.rh   )r#   rl   rr   rs   rm   r&   r'   rj      s    


 zWindowAdminForm.cleanro   r&   r&   rm   r'   rq      s   rq   c                       s*   e Zd ZG dd dZ fddZ  ZS )VerificationAdminFormc                   @   s   e Zd ZeZdZdS )zVerificationAdminForm.Metarb   N)r2   r3   r4   r   rc   rd   r&   r&   r&   r'   re      s   re   c                    s:   t   }|d}|d}|r6|s6tdtdi|S )N	trafficIdspotIdz0Spot ID is required when Traffic ID is provided.rh   )r#   rl   
traffic_idspot_idrm   r&   r'   rj      s    


 zVerificationAdminForm.cleanro   r&   r&   rm   r'   rt      s   rt   c                   @   s2   e Zd ZeZeZdZdZdZ	dd Z
ede
_dS )WindowsInliner   )rr   rs   window_durationavails_count)r{   c                 C   s6   |j r2| }|dkr.td}td||j |S dS dS )Nr   !admin:playlists_avails_changelistz/<a href="{}?window__id__exact={}">{} avails</a>z0 avails-)pkget_avails_countr   r   r#   objcounturlr&   r&   r'   r{      s      zWindowsInline.avails_countr   N)r2   r3   r4   r   rc   rq   formextrard   readonly_fieldsr{   r!   short_descriptionr&   r&   r&   r'   ry      s   ry   c                   @   s.   e Zd ZeZdZdZdZdd Ze	de_
dS )AvailsInliner   )avail_startavailinwindowadspots_count)r   c                 C   s6   |j r2| }|dkr.td}td||j |S dS dS )Nr   z)admin:playlists_adspotsinAvail_changelistz-<a href="{}?avail__id__exact={}">{} spots</a>z0 spotsr}   )r~   get_adspots_countr   r   r   r&   r&   r'   r      s      zAvailsInline.adspots_countAd SpotsN)r2   r3   r4   r   rc   r   rd   r   r   r!   r   r&   r&   r&   r'   r      s   r   c                   @   s   e Zd ZeZdZdZdZdS )AdspotsInAvailInliner   )adspotpositioninavail	trafficidr   N)r2   r3   r4   r   rc   r   rd   autocomplete_fieldsr&   r&   r&   r'   r      s   r   c                   @   s  e Zd ZeZdZeeddddfZdZ	dZ
dZed	d
difedd
difedd
difeddddffZdZegZdddgZdd Zede_de_dd Zede_de_dd  Zed!e_d"d# Zed$e_d%d& Zed'e_d(d) Zed*e_d+d, Zed-e_d.d/ Zed0e_d1S )2PlaylistsAdmin)	idversionchannelr>   status_badgeduration_displaywindows_counttotal_avails
created_atr   zone_channelr   
updated_at)r   channel__channel_nameZzone_channel__regionxml_filer>   )z-created_at-broadcast_datezBasic Informationrd   )r   r   r   zBroadcast Schedule)r>   rf   rg   zStatus & Versioning)r*   draft_versionr   Metadatar   r   collapserd   classespublish_playlistscreate_copiesmark_as_draftc                 C   s   |j r|j jS tdS )Nz
No Channel)r   channel_namer!   r#   r   r&   r&   r'   r   #  s    zPlaylistsAdmin.channel_nameChannelZchannel__namec                 C   s,   |j rd}td}nd}td}td||S )Noranger   greenr   5<span style="color: {}; font-weight: bold;">{}</span>)r*   r!   r   r#   r   colortextr&   r&   r'   r   (  s    
 zPlaylistsAdmin.status_badger   r*   c                 C   s   |j }|r| dS dS )Nhr}   )duration_hours)r#   r   hoursr&   r&   r'   r   7  s    
zPlaylistsAdmin.duration_displayDurationc                 C   s,   |  }|dkr(td}td||j|S dS )Nr   z"admin:playlists_windows_changelistz*<a href="{}?playlist__id__exact={}">{}</a>0)get_windows_countr   r   r~   r   r&   r&   r'   r   >  s      zPlaylistsAdmin.windows_countr   c                 C   s   |  }|dkrtd|S dS )Nr   z<strong>{}</strong>r   )get_total_avails_countr   r#   r   r   r&   r&   r'   r   I  s    
zPlaylistsAdmin.total_availszTotal Availsc                 C   sF   d}|j ddD ]}|j|jdr|d7 }q| |td| d S )Nr   Tr)   userr   z$Successfully published {} playlists.)r.   publishr   message_userr!   format)r#   r$   r0   updatedplaylistr&   r&   r'   r   Q  s    
z PlaylistsAdmin.publish_playlistszPublish selected playlistsc                 C   sV   d}|D ]2}|j  dt d }|j|d |d7 }q| |td| d S )Nr   Z_copy_z%Y%m%d_%H%M)new_versionr   z(Successfully created {} playlist copies.)r   r   r/   strftimecreate_copyr   r!   r   )r#   r$   r0   Zcopies_createdr   r   r&   r&   r'   r   ]  s    
zPlaylistsAdmin.create_copiesz#Create copies of selected playlistsc                 C   s&   |j dd}| |td| d S )NTr)   z*Successfully marked {} playlists as draft.)updater   r!   r   )r#   r$   r0   r   r&   r&   r'   r   j  s
    zPlaylistsAdmin.mark_as_draftz Mark selected playlists as draftN)r2   r3   r4   ra   r   list_displayr   r7   list_filtersearch_fieldsdate_hierarchyorderingr!   	fieldsetsr   ry   inlinesactionsr   r   admin_order_fieldr   r   r   r   r   r   r   r&   r&   r&   r'   r      sd          



	




r   c                   @   s   e Zd ZeZdZdZdZdZe	dddife	ddd	ife	d
dddffZ
dZegZdd Ze	de_de_dd Ze	de_dd Ze	de_dd Ze	de_dS )WindowsAdmin)r   playlist_inforr   rs   r   r{   total_adspots)Zplaylist__channelZplaylist__is_draftrr   )playlist__versionZplaylist__channel__channel_name)Zplaylist__broadcast_daterr   zPlaylist Associationrd   )r   zWindow Timing)rr   rs   rz   r   r   r   r   c                 C   sJ   |j rBtd|j jgd}|j jr(tdntd}td||j j|S tdS )Nz admin:playlists_playlists_changeargsr   r   z'<a href="{}">{}</a> <small>({})</small>zNo Playlist)r   r   r~   r*   r!   r   r   )r#   r   r   r   r&   r&   r'   r     s      zWindowsAdmin.playlist_infoPlaylistr   c                 C   s<   |j r8|j  }t|d }t|d }| d| dS dS )N<   zm sr}   )rz   total_secondsintr#   r   r   minutessecondsr&   r&   r'   r     s    
zWindowsAdmin.duration_displayr   c                 C   s,   |  }|dkr(td}td||j|S dS )Nr   r|   z(<a href="{}?window__id__exact={}">{}</a>r   )r   r   r   r~   r   r&   r&   r'   r{     s      zWindowsAdmin.avails_countr   c                 C   s   |  }|dkr|S dS )Nr   r   )get_total_adspots_countr   r&   r&   r'   r     s    zWindowsAdmin.total_adspotsr   N)r2   r3   r4   rq   r   r   r   r   r   r!   r   r   r   r   r   r   r   r   r{   r   r&   r&   r&   r'   r   s  s:     	

	
r   c                   @   s   e Zd ZdZdZdZdZedddifeddd	ifed
dddffZdZ	e
gZdd Zede_de_dd Zede_dd Zede_dS )AvailsAdmin)r   window_infor   r   r   availability_status)Zwindow__playlist__channelZwindow__playlist__is_draftr   )Zwindow__playlist__versionr   Z'window__playlist__channel__channel_name)Z window__playlist__broadcast_dateZwindow__window_startr   zWindow Associationrd   )windowzAvail Details)r   r   r   r   r   r   c                 C   sD   |j r<td|j jgd}td||j j|j jp.d|j jp8dS tdS )Nzadmin:playlists_windows_changer   z3<a href="{}">Window {}</a> <small>({} - {})</small>r}   z	No Window)r   r   r~   r   rr   rs   r!   r#   r   r   r&   r&   r'   r     s     

zAvailsAdmin.window_infoWindowZ
window__idc                 C   s(   |  }|dkr$d}td||j|S dS )Nr    z'<a href="{}?avail__id__exact={}">{}</a>r   )r   r   r~   r   r&   r&   r'   r     s      zAvailsAdmin.adspots_countr   c                 C   s(   |  rtdtdS tdtdS d S )Nu)   <span style="color: green;">✓ {}</span>Z	Availableu'   <span style="color: red;">✗ {}</span>ZOccupied)is_availabler   r!   r   r&   r&   r'   r     s    zAvailsAdmin.availability_statusr   N)r2   r3   r4   r   r   r   r   r!   r   r   r   r   r   r   r   r   r   r&   r&   r&   r'   r     s4     



r   c                   @   s   e Zd ZdZdZdZdZedddifeddd	ifed
dddffZdZ	dZ
dd Zede_de_dd Zede_de_dS )AdspotsInAvailAdmin)r   
avail_infoadspot_infor   r   r   )Z avail__window__playlist__channelZ!avail__window__playlist__is_draftr   )Z avail__window__playlist__versionZadspot__namer   )Z'avail__window__playlist__broadcast_dateZavail__avail_startr   zPlacement Detailsrd   )availr   r   zTraffic Integration)r   r   r   r   r   r   c                 C   s:   |j r2td|j jgd}td||j j|j jp.dS tdS )Nzadmin:playlists_avails_changer   z-<a href="{}">Avail {}</a> <small>({})</small>r}   zNo Avail)r   r   r~   r   r   r!   r   r&   r&   r'   r   "  s      
zAdspotsInAvailAdmin.avail_infoAvailZ	avail__idc                 C   sL   |j rDz&td|j jgd}td|t|j W S    t|j  Y S X tdS )Nzadmin:campaigns_adspots_changer   z<a href="{}">{}</a>z
No Ad Spot)r   r   r~   r   strr!   r   r&   r&   r'   r   -  s     zAdspotsInAvailAdmin.adspot_infozAd SpotZ
adspot__idN)r2   r3   r4   r   r   r   r   r!   r   r   r   r   r   r   r   r&   r&   r&   r'   r     s2     

r   c                       s  e Zd ZeZdZeedddddfZdZ	dZ
dZed	d
difedd
difedd
difedd
difeddddffZdZdddgZdd Zede_de_dd Zede_de_d d! Zed"e_d#e_d$d% Zed&e_d'd( Zed)e_d*d+ Zed,e_d0 fd.d/	Z  ZS )1VerifsAdmin)
rv   networknamezonenamer>   air_timer   r   verification_badgerevisionr   r   r   airStatuscoder   r>   )rv   ru   r   r   r   )r   z	-air_timez	-revisionZIdentificationrd   )rv   ru   zNetwork Information)r   r   zBroadcast Details)r>   r   
air_lengthzStatus & Verification)r   vercompleter   r   r   r   r   mark_completecreate_revisionsexport_broadcast_summaryc                 C   s<   |j r8|j  }t|d }t|d }| d|dS dS )Nr   :02dr}   )r   r   r   r   r&   r&   r'   r   e  s    
zVerifsAdmin.duration_displayr   r   c                 C   s2   |j rd}td}nd}|jp$td}td||S )Nr   ZSuccessredUnknownr   )is_successful_broadcastr!   r   r   r   r&   r&   r'   r   o  s    
 zVerifsAdmin.status_badgezBroadcast Statusc                 C   s6   |j rd}d}td}nd}d}td}td|||S )Nr   u   ✓rF   r   u   ○rH   z8<span style="color: {}; font-weight: bold;">{} {}</span>)is_verification_completer!   r   )r#   r   r   iconr   r&   r&   r'   r   ~  s    
  zVerifsAdmin.verification_badgeZVerificationr   c                 C   sD   d}|D ] }|j s|j|jd |d7 }q| |td| d S )Nr   r   r   z1Successfully marked {} verifications as complete.)r   r   r   r   r!   r   )r#   r$   r0   r   verificationr&   r&   r'   r     s    
zVerifsAdmin.mark_completez'Mark selected verifications as completec                 C   s8   d}|D ]}|   |d7 }q| |td| d S )Nr   r   z&Successfully created {} new revisions.)create_revisionr   r!   r   )r#   r$   r0   Zrevisions_createdr  r&   r&   r'   r     s    
zVerifsAdmin.create_revisionsz/Create new revisions for selected verificationsc                 C   sH   ddl m} g }|D ]}||  q|d|iddid}d|d< |S )	z)Custom action to export broadcast summaryr   )JsonResponseZverificationsindent   )json_dumps_paramsz-attachment; filename="broadcast_summary.json"zContent-Disposition)django.httpr  appendget_broadcast_summary)r#   r$   r0   r  Z	summariesr  responser&   r&   r'   r     s    z$VerifsAdmin.export_broadcast_summaryzExport broadcast summaryNc                    s   |pi }|  |}| }d}d}|D ] }|jr8|d7 }|jr&|d7 }q&||||dkrb|| d nd|dkrx|| d ndd|d< t j||dS )z)Add summary statistics to changelist viewr   r   d   )totalrE   rI   completion_ratesuccess_rateZsummary_stats)extra_context)get_querysetr   r   r   ri   changelist_view)r#   r$   r  r0   total_verificationsZcomplete_verificationsZsuccessful_broadcastsr  rm   r&   r'   r    s"    


zVerifsAdmin.changelist_view)N)r2   r3   r4   rt   r   r   rD   rU   r   r   r   r   r!   r   r   r   r   r   r   r   r   r   r   r   r  rp   r&   r&   rm   r'   r   <  sh            







r   c                       s6   e Zd ZedZedZedZd fdd	Z  ZS )BroadcastAdminSitezBroadcast Management SystemzBroadcast AdminzBroadcast AdministrationNc                    sN   t  ||}dddddg |D ](}|d dkr |d j fd	d
d q |S )zp
        Return a sorted list of all the installed apps that have been
        registered in this site.
        r   r   r   r   r   	app_label	playlistsmodelsc                    s   | d  kr  | d S dS )Nobject_namei  )index)xZbroadcast_orderr&   r'   <lambda>  s    
z1BroadcastAdminSite.get_app_list.<locals>.<lambda>)key)ri   get_app_listsort)r#   r$   r  app_listapprm   r  r'   r    s    zBroadcastAdminSite.get_app_list)N)	r2   r3   r4   r!   site_header
site_titleindex_titler  rp   r&   r&   rm   r'   r    s   r  )9Zdjango.contribr   django.utils.htmlr   django.utils.translationr   r!   django.urlsr   django.utils.safestringr   django.db.modelsr   r   r	   django.contrib.adminr
   Zdjango.formsr   r   django.utilsr   Zdjango.core.validatorsr   r   r   r   loggingr  r   r   r   r   r   	getLoggerr2   loggerr   r7   rD   rU   ra   rq   rt   TabularInlinery   r   r   register
ModelAdminr   r   r   r   r   	AdminSiter  r&   r&   r&   r'   <module>   sF   
!.tCG< 