U
    Gh)H                     @   s  d 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 dd	lmZmZmZmZmZmZmZmZmZmZmZmZmZ G d
d dejZ G dd dejZ!G dd dejZ"G dd dejZ#e$eG dd dej%Z&e$eG dd dej%Z'e$eG dd dej%Z(e$eG dd dej%Z)e$eG dd dej%Z*e$eG dd dej%Z+e$eG dd dej%Z,e$eG d d! d!ej%Z-ed"ej._/ed#ej._0ed$ej._1d%S )&aJ  Django Admin Configuration for Channels App

This module configures the Django admin interface for all channel-related models.
Provides comprehensive admin interfaces with advanced filtering, search capabilities,
inline editing, and custom actions for efficient channel management.

Author: Senior Django Developer
Version: 1.0.0
    )admin)format_html)gettext_lazy)reverse)	mark_safe)timezone)CountQ)ChannelChannelZoneChannelCodecChannelZoneRelationJingleJingleDetectionAdbreak
EPGProgramChannelScheduleStandaloneVPNConfigurationStandaloneFTPConfigurationZoneVPNConfigurationZoneFTPConfigurationc                       s0   e Zd ZdZeZdZdZdZ fddZ	  Z
S )ChannelZoneRelationInlinez,Inline admin for Channel-Zone relationships.   )zonecodec
stream_urlbackup_stream_urlstandalone_vpn_configstandalone_ftp_config	is_activepriority)
created_at
updated_atc                    s   t  |ddddS )Nr   r   r   r   superget_querysetselect_relatedselfrequest	__class__ ./var/www/html/Focus/src/apps/channels/admin.pyr%   &   s       z&ChannelZoneRelationInline.get_queryset)__name__
__module____qualname____doc__r   modelextrafieldsreadonly_fieldsr%   __classcell__r,   r,   r*   r-   r      s   r   c                   @   s$   e Zd ZdZeZdZdZdZdZ	dS )JingleInlinez!Inline admin for Channel Jingles.r   )namejingle_typeplacement_typedurationr   r    )r;   
play_countlast_playedTN)
r.   r/   r0   r1   r   r2   r3   r4   r5   show_change_linkr,   r,   r,   r-   r7   ,   s   r7   c                       s4   e Zd ZdZeZdZdZdZdZ	 fddZ
  ZS )EPGProgramInlinezInline admin for EPG Programs.r   )titleprogram_type
start_timeend_timer;   )r;   Tc                    s*   t  |jt tjdd ddS )N   daysstart_time__gterB   r$   r%   filterr   now	timedeltaorder_byr'   r*   r,   r-   r%   =   s
    zEPGProgramInline.get_queryset)r.   r/   r0   r1   r   r2   r3   r4   r5   r>   r%   r6   r,   r,   r*   r-   r?   5   s   r?   c                       s0   e Zd ZdZeZdZdZdZ fddZ	  Z
S )ChannelScheduleInlinez#Inline admin for Channel Schedules.r   )r@   schedule_typerB   rC   r   Tc                    s*   t  |jt tjdd ddS )Nr   rE   rG   rB   rI   r'   r*   r,   r-   r%   J   s
    z"ChannelScheduleInline.get_queryset)r.   r/   r0   r1   r   r2   r3   r4   r>   r%   r6   r,   r,   r*   r-   rN   C   s   rN   c                       s|   e Zd Zd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d Ze	de_de_ fddZ  ZS )ChannelZoneAdminz"Admin interface for Channel Zones.)r8   coder   channel_countr   r!   )r   r   r!   )r8   rQ   descriptionr8   idr!   r"   Basic Informationr4   Configuration)r   r   Metadatacollapser4   classesc                 C   s6   |j  }|dkr2tdd|j  }td||S dS )z(Display number of channels in this zone.r   z!admin:channels_channel_changelistz?zones__id__exact=z<a href="{}">{} channels</a>z
0 channels)channelscountr   rV   r   )r(   objr_   urlr,   r,   r-   rR   f   s
    
zChannelZoneAdmin.channel_countChannelsZchannels__countc                    s   t  |jtddS )Nr^   )Zchannels_count)r$   r%   annotater   r'   r*   r,   r-   r%   p   s    zChannelZoneAdmin.get_queryset)r.   r/   r0   r1   list_displaylist_filtersearch_fieldsorderingr5   _	fieldsetsrR   short_descriptionadmin_order_fieldr%   r6   r,   r,   r*   r-   rP   P   s.     
rP   c                   @   s   e Zd Zd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ife	ddddfe	ddddffZ
dd Ze	de_dS )ChannelCodecAdminz#Admin interface for Channel Codecs.)r8   video_codecaudio_codec
resolutionbitrate
frame_rateusage_count)rm   rn   ro   )r8   rm   rn   rT   rU   rW   r4   zVideo Settings)rm   ro   rq   zAudio Settings)rn   rp   zAdvanced Options)ffmpeg_optionsrZ   r\   rY   c                 C   s   |j  |j  }| dS )z)Display how many channels use this codec.z	 usage(s))r^   r_   zone_relationsr(   r`   r_   r,   r,   r-   rr      s    zChannelCodecAdmin.usage_countZUsageN)r.   r/   r0   r1   rd   re   rf   rg   r5   rh   ri   rr   rj   r,   r,   r,   r-   rl   v   s:      rl   c                	       s8  e Zd ZdZd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ife
ddddfe
ddddfe
ddddffZeeeegZd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/d0 Ze
d1e_ fd2d3Z  ZS )4ChannelAdminzDAdmin interface for Channels with comprehensive management features.)display_namer8   channel_numberchannel_typestatus_badgeonline_status
zone_countlast_health_check)ry   status	is_onlinesupports_dailanguagecategoryr!   )r8   rw   rx   rS   )rx   r8   )rV   r!   r"   r}   r,   zChannel Identityr4   )r8   rw   rx   logoClassification)ry   r~   r   r   target_audiencezContent & Branding)rS   websitezAdvertising Configuration)r   rZ   r\   zHealth Monitoring)r   r}   rY   rU   activate_channelsdeactivate_channelsmark_onlinemark_offlinec                 C   s,   ddddd}| |jd}td|| S )z&Display status with color-coded badge.greenredorangeblue)activeinactivemaintenancetestinggrayz5<span style="color: {}; font-weight: bold;">{}</span>)getr~   r   get_status_display)r(   r`   colorscolorr,   r,   r-   rz      s     zChannelAdmin.status_badgeStatusr~   c                 C   s   |j rtdS tdS )z Display online status with icon.u-   <span style="color: green;">● Online</span>u,   <span style="color: red;">● Offline</span>)r   r   r(   r`   r,   r,   r-   r{      s    zChannelAdmin.online_statusZOnliner   c                 C   s    |j  }|dkr| dS dS )z3Display number of zones this channel broadcasts to.r   z zone(s)zNo zones)zonesr_   ru   r,   r,   r-   r|      s    

zChannelAdmin.zone_countZZonesc                 C   s"   |j dd}| || d dS )z*Bulk action to activate selected channels.r   r~   z! channels activated successfully.Nupdatemessage_userr(   r)   querysetupdatedr,   r,   r-   r      s    zChannelAdmin.activate_channelszActivate selected channelsc                 C   s"   |j dd}| || d dS )z,Bulk action to deactivate selected channels.r   r   z# channels deactivated successfully.Nr   r   r,   r,   r-   r      s    z ChannelAdmin.deactivate_channelszDeactivate selected channelsc                 C   s"   |j dd}| || d dS )z'Bulk action to mark channels as online.Tr   z channels marked as online.Nr   r   r,   r,   r-   r      s    zChannelAdmin.mark_onlinez Mark selected channels as onlinec                 C   s"   |j dd}| || d dS )z(Bulk action to mark channels as offline.Fr   z channels marked as offline.Nr   r   r,   r,   r-   r      s    zChannelAdmin.mark_offlinez!Mark selected channels as offlinec                    s   t  | dS )Nr   )r$   r%   r&   prefetch_relatedr'   r*   r,   r-   r%      s    zChannelAdmin.get_queryset)r.   r/   r0   r1   rd   re   rf   rg   r5   filter_horizontalrh   ri   r   r7   r?   rN   inlinesactionsrz   rj   rk   r{   r|   r   r   r   r   r%   r6   r,   r,   r*   r-   rv      sf      






rv   c                       s   e Zd Zd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e	ddddfe	ddddffZ
dd Ze	de_ fddZ  ZS )ChannelZoneRelationAdminz/Admin interface for Channel-Zone relationships.)channelr   r   r   r    stream_url_short)r   r   r   vpn_type)channel__name
zone__namer   )r   r   	-priorityrU   Relationshipr4   )r   r   r   rX   )r   r   r    zVPN Configuration)r   vpn_server_addressvpn_usernamevpn_passwordrZ   r\   zFTP Configuration)ftp_platform_nameZftp_server_addressftp_usernameftp_passwordrY   c                 C   s0   |j r,t|j dkr&|j dd d S |j S dS )zDisplay shortened stream URL.2   Nz...-)r   lenr   r,   r,   r-   r      s    &z)ChannelZoneRelationAdmin.stream_url_shortz
Stream URLc                    s   t  |dddS )Nr   r   r   r#   r'   r*   r,   r-   r%   '  s    z%ChannelZoneRelationAdmin.get_queryset)r.   r/   r0   r1   rd   re   rf   rg   r5   rh   ri   r   rj   r%   r6   r,   r,   r*   r-   r     s<     
r   c                
       s   e Zd Zd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ife	ddddfe	ddddfe	ddddfe	ddddffZ
dd Ze	de_de_ fddZ  ZS )JingleAdminz$Admin interface for Channel Jingles.)	r8   r   r9   r:   duration_displayr   r    r<   r=   )r9   r:   r   r   r!   )r8   r   rS   )r   r9   r   )rV   r;   r<   r=   r!   r"   rW   r4   )r   r8   r   )r9   r:   r    Media)filer;   
Scheduling)r   
start_dateend_date
time_slotsrZ   r\   ZFingerprinting)audio_fingerprintframes_fingerprint
Statistics)r<   r=   rY   rU   c                 C   s,   |j r(t|j d\}}|dd|dS dS *Display duration in human-readable format.<   02d:r   r;   divmod)r(   r`   minutessecondsr,   r,   r-   r   S  s    zJingleAdmin.duration_displayDurationr;   c                    s   t  |dS Nr   r#   r'   r*   r,   r-   r%   \  s    zJingleAdmin.get_queryset)r.   r/   r0   r1   rd   re   rf   rg   r5   rh   ri   r   rj   rk   r%   r6   r,   r,   r*   r-   r   +  sN      
r   c                       s   e Zd ZdZd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ife
dd	dife
ddddffZdd Ze
de_de_ fddZ  ZS )AdbreakAdminzAdmin interface for Ad Breaks.)	r   datestart_atend_atr   adbreak_typeadbreak_categoryshow_before
show_after)r   r   r   r   )r   r   r   )z-datez	-start_atrU   r   rW   r4   )r   r   Timing)r   r   r;   r   )r   r   Context)r   r   rY   rZ   r\   c                 C   s8   |j r4t|j  }t|d\}}|dd|dS dS r   )r;   inttotal_secondsr   )r(   r`   r   r   r   r,   r,   r-   r     s
    zAdbreakAdmin.duration_displayr   r;   c                    s   t  |dS r   r#   r'   r*   r,   r-   r%     s    zAdbreakAdmin.get_queryset)r.   r/   r0   r1   rd   re   rf   rg   r5   date_hierarchyrh   ri   r   rj   rk   r%   r6   r,   r,   r*   r-   r   `  s@       
r   c                
       s   e Zd ZdZd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ife
ddddfe
ddddfe
ddddfe
ddddffZdd Ze
de_de_dd Ze
de_ fd d!Z  ZS )"EPGProgramAdminz!Admin interface for EPG Programs.)r@   r   rA   rB   rC   r   season_episodecontent_rating)rA   r   r   r   rB   r@   rS   r   z-start_time)rV   r;   r!   r"   rB   rW   r4   r   r@   rS   r   )rA   r   r   r   )rB   rC   r;   zSeries Information)season_numberepisode_numberoriginal_air_daterZ   r\   ZAccessibility)subtitles_availableAdvertising)has_ad_breaksad_break_positionsrY   rU   c                 C   s<   |j r8t|j d\}}|dkr.| d| dS | dS dS )r   r   r   zh mr   r   )r(   r`   hours	remainderr,   r,   r-   r     s    "z EPGProgramAdmin.duration_displayr   r;   c                 C   s:   |j r$|jr$d|j dd|jdS |j r6d|j  S dS )z'Display season and episode information.Sr   EzSeason r   )r   r   r   r,   r,   r-   r     s
    zEPGProgramAdmin.season_episodezS/Ec                    s   t  |dS r   r#   r'   r*   r,   r-   r%     s    zEPGProgramAdmin.get_queryset)r.   r/   r0   r1   rd   re   rf   rg   r5   r   rh   ri   r   rj   rk   r   r%   r6   r,   r,   r*   r-   r     sT      

r   c                       s   e Zd ZdZd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ife
ddddfe
ddddffZ fddZ  ZS )ChannelScheduleAdminz&Admin interface for Channel Schedules.)r@   r   rO   rB   rC   r   	allow_ads)rO   r   r   r   rB   r   r   rU   rB   rW   r4   r   r   )rO   rB   rC   r   ZContent)content_urlbackup_content_urlr   )r   ad_break_durationrZ   r\   rY   c                    s   t  |dS r   r#   r'   r*   r,   r-   r%     s    z!ChannelScheduleAdmin.get_queryset)r.   r/   r0   r1   rd   re   rf   rg   r5   r   rh   ri   r%   r6   r,   r,   r*   r-   r     s:      r   zAdtlas Channels AdministrationzAdtlas Channels Adminz)Welcome to Adtlas Channels AdministrationN)2r1   Zdjango.contribr   django.utils.htmlr   django.utils.translationr   rh   django.urlsr   django.utils.safestringr   django.utilsr   django.db.modelsr   r	   apps.channels.modelsr
   r   r   r   r   r   r   r   r   r   r   r   r   TabularInliner   r7   r?   rN   register
ModelAdminrP   rl   rv   r   r   r   r   r   sitesite_header
site_titleindex_titler,   r,   r,   r-   <module>   s>   
<	%#g(4->%