U
    mh.                     @   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 d dlmZmZ d dlmZmZmZ d d	lmZmZ G d
d dejZG dd deZG dd dej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 G dd dejZ!G dd dejZ"d S )!    )Decimal)models)ValidationError)MinValueValidator)User)	BaseModel)ChannelAdbreak)BrandAgency
Advertiser)get_encoded_file_upload_pathget_original_file_upload_pathc                   @   s@   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdS )CampaignStatusDraftzPending ApprovalApproved	Scheduled	PrebookedBookedCanceledzIn progress
TerminatedActivePaused	Completed	CancelledN)__name__
__module____qualname__r   ZPending_Approvalr   r   r   r   r   ZIn_progressr   r   r   r   r    r   r   0/var/www/html/Focus/src/apps/campaigns/models.pyr      s   r   c                   @   s  e Zd ZejddZejeejddddZ	eje
ejdddddZejeejdd	Zejd
ejddddZejdejejdZejdddZe Ze ZejdddZejddeedgdZejdddZejdddZ ej!dddZ"e Z#ejdddZ$ejdddZ%ejdddZ&ejdddZ'ejdddZ(ejdddZ)ejdddZ*ejddZ+ejddddZ,ejddddZ-ejddddZ.eje/ejddddZ0dd Z1G dd  d Z2e3d!d" Z4e3d#d$ Z5d%S )&	Campaigns   
max_lengthagencyT	db_columnblanknullbrand	campaigns)	on_deleter&   r(   r'   related_name)r+   r,   AdspotsZ	id_adpost)r(   r'   r&      )r#   choicesdefaultr'   r(   2   UTC)r#   r0         z0.01)
max_digitsdecimal_places
validators)r#   r(   F)r0   )r#   r'   r(   Zmanaged_campaigns)r+   r(   r'   r,   c                 C   s   | j S )N)nameselfr   r   r   __str__{   s    zCampaigns.__str__c                   @   s   e Zd ZdZdZdZdgZdS )zCampaigns.MetaCampaignr    -created_atN)r   r   r   verbose_nameverbose_name_pluraldb_tableorderingr   r   r   r   Meta~   s   rC   c                 C   s,   | j r(| j  t   }td|jS dS )z%Calculate days remaining in campaign.r   )end_datedatetimezonenowmaxdays)r;   deltar   r   r   days_remaining   s    zCampaigns.days_remainingc                 C   s   | j tjkS )z&Check if campaign is currently active.)statusr   r   r:   r   r   r   	is_active   s    zCampaigns.is_activeN)6r   r   r   r   	CharFieldr9   
ForeignKeyr   SET_NULLr$   r
   r)   r   CASCADEZ
advertiserZadpostr   r/   r   rL   BooleanFieldZpacingDateTimeField
start_daterD   rF   DecimalFieldr   r   ZbudgetIntegerFieldvolumeZdelivery
FloatFieldZcpmZgeneral_rotationproductcategorycountryZbroadcasts_day
media_typeZis_vastZ	vast_dataZexclusivityZprogram_categoryZshows_preferenceZposition_preferencer   Zcampaign_managerr<   rC   propertyrK   rM   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	dZ
d	S )
AdspotsStatusChoices)draftr   )Z
processing
Processing)readyZReady)activer   )pausedr   )	completedr   )failedZFailed)archivedArchivedN)r   r   r   DRAFT
PROCESSINGZREADYACTIVEZPAUSEDZ	COMPLETEDFAILEDARCHIVEDr   r   r   r   r^      s   r^   c                       s,  e Zd ZdZejdddddZejeej	dddddZ
ejeej	dddd	dZejeej	dddd
dZejeddddZejeddddZejddedgddZejdejejddZejddddZejddddZejdddddZej dddZ!G dd dZ"dd Z# fdd Z$d#d!d"Z%  Z&S )$r-   zN
    Model representing advertising spots/creative content for campaigns.
    r!   TzName/title of the ad spot)r#   r'   r(   	help_textZadspotszAssociated campaign)r+   r,   r'   r(   rm   zDistribution channelzAssociated brandzOriginal uploaded ad file)	upload_tor'   r(   rm   zProcessed/encoded ad file   zDuration in seconds)r'   r(   r8   rm   r.   zCurrent status of the ad spot)r#   r/   r0   rm   zVAST tag URL for the adr'   r(   rm   zFile size in bytesd   zMIME type of the ad filezWhether this ad spot is active)r0   rm   c                   @   sr   e Zd ZdZdZdZdgZejdgdejddgdejddgdejd	dgdejd
gdejddgdgZ	dS )zAdspots.Metar-   zAd SpotzAd Spotsr>   rL   )fieldscampaignr)   channel
created_atrM   N)
r   r   r   rA   r?   r@   rB   r   Indexindexesr   r   r   r   rC      s   rC   c                 C   s4   | j r| j  d|   dS d| j d|   dS )z%String representation of the ad spot.z ()zAd Spot )r9   get_status_displayidr:   r   r   r   r<     s    zAdspots.__str__c                    s.   | j rt| j dr| j j| _t j|| dS )z"Override save to add custom logic.sizeN)original_filehasattrr{   	file_sizesupersave)r;   argskwargs	__class__r   r   r     s    
zAdspots.savec                 C   s$   |r| j r| j n| j}|r |jS dS )zGet the appropriate file URL.N)encoded_filer|   url)r;   encodedZ
file_fieldr   r   r   get_file_url  s    zAdspots.get_file_url)T)'r   r   r   __doc__r   rN   r9   rO   r    rP   rs   r   rt   r
   r)   	FileFieldr   r|   r   r   PositiveIntegerFieldr   durationr^   r/   rh   rL   URLFieldZurl_from_vastPositiveBigIntegerFieldr~   Z	mime_typerR   rM   rC   r<   r   r   __classcell__r   r   r   r   r-      s   		
r-   c                   @   sL   e Zd ZejeejddddZejdddZ	ejdddZ
G d	d
 d
ZdS )CampaignTimeIntervalsr=   T)r+   r?   r(   r'   z#Start time for ad spot availabilityz
Start Time)rm   r?   z!End time for ad spot availabilityzEnd Timec                   @   s   e Zd ZdZdS )zCampaignTimeIntervals.Metar   Nr   r   r   rA   r   r   r   r   rC   *  s   rC   N)r   r   r   r   rO   r    rQ   rs   	TimeField
start_timeend_timerC   r   r   r   r   r   %  s   r   c                   @   s   e Zd ZejeejdddZejeejdddZ	eje
ejdddZejdddZejdddZejdddZG dd dZdS )CampaignairtimelogTr1   c                   @   s   e Zd ZdZdS )zCampaignairtimelog.MetaZCampaignAirtimeLogNr   r   r   r   r   rC   7  s   rC   N)r   r   r   r   rO   r    rP   rs   r-   Zspotr	   Zad_breakrS   Zairtime_startZairtime_endrR   Zinsertion_statusrC   r   r   r   r   r   .  s   r   c                   @   sj   e Zd ZejdddZejeejddddZ	ej
ddddZejddd	Zejdd
dZG dd dZdS )CampaignPriorityScoresrz   T)r&   primary_keyz4The foreign key referencing the associated Campaign.)r+   rm   r'   r(   zAThe priority score calculated for the campaign on the given date.rp   z=The date and time when the priority score record was created.)auto_now_addrm   zBThe date and time when the priority score record was last updated.)auto_nowrm   c                   @   s   e Zd ZdZdS )zCampaignPriorityScores.Metar   Nr   r   r   r   r   rC   V  s   rC   N)r   r   r   r   	AutoFieldrz   rO   r    
DO_NOTHINGrs   rX   Zpriority_scorerS   ru   
updated_atrC   r   r   r   r   r   ;  s,   r   c                   @   sN   e Zd ZejedejdddZejedejdddZdd Z	G dd dZ
d	S )
AdSpotExclusionZexclusions_1T)r,   r+   r(   r'   Zexclusions_2c                 C   s   | j | jkrtdd S )Nz#Ad spots cannot exclude themselves.)	ad_spot_1	ad_spot_2r   r:   r   r   r   clean^  s    zAdSpotExclusion.cleanc                   @   s$   e Zd ZdZejddgddgZdS )zAdSpotExclusion.Metar   r   r   Zunique_ad_spot_exclusion)rr   r9   N)r   r   r   rA   r   UniqueConstraintconstraintsr   r   r   r   rC   b  s   rC   N)r   r   r   r   rO   r-   rQ   r   r   r   rC   r   r   r   r   r   Z  s   r   c                   @   sJ   e Zd ZejddZejddZejddZejddZ	G dd dZ
dS )PendingTr   r!   r"   c                   @   s   e Zd ZdZdS )zPending.Metar   Nr   r   r   r   r   rC   o  s   rC   N)r   r   r   r   r   Z
id_pendingrN   Zcreative_idr   r   rC   r   r   r   r   r   i  s
   r   c                   @   sJ   e Zd ZejddZejddZejddZejddZ	G dd dZ
dS )DayTimeTr   r!   r"   c                   @   s   e Zd ZdZdS )zDayTime.MetaZDay_timeNr   r   r   r   r   rC   y  s   rC   N)r   r   r   r   r   id_timerN   r9   startendrC   r   r   r   r   r   s  s
   r   c                   @   sh   e Zd ZejddZejeejddddZ	eje
ejddddZejeejddddZG dd dZd	S )
	PlacementTr   r   r%   id_campaign
id_channelc                   @   s   e Zd ZdZdS )zPlacement.Metar   Nr   r   r   r   r   rC     s   rC   N)r   r   r   r   r   Zid_placementrO   r   r   r   r    r   r   r   rC   r   r   r   r   r   }  s
   r   N)#decimalr   	django.dbr   django.core.exceptionsr   Zdjango.core.validatorsr   apps.accounts.modelsr   apps.common.modelsr   Zapps.channels.modelsr   r	   Zapps.agencies.modelsr
   r   r   Zapps.campaigns.utilsr   r   TextChoicesr   r    r^   r-   r   r   Modelr   r   r   r   r   r   r   r   r   <module>   s(   s 	

