o
    ݻehI0                     @   s   d 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mZ ddlmZ dd	lmZ G d
d deZG dd deZG dd deZdS )z
Campaigns Models Module

This module contains all campaign-related models including:
- Campaign model for advertising campaigns
- CampaignSchedule for scheduling campaigns
- CampaignBudget for budget management
- CampaignPerformance for tracking metrics
    N)Decimal)models)reverse)timezone)MinValueValidatorMaxValueValidator)gettext_lazy)	BaseModelc                	   @   s  e Zd ZdZdedfdedfdedfded	fd
edfdedfdedfgZdedfdedfdedfdedfdedfdedfgZdedfdedfd ed!fd"ed#fgZej	d$e
jd%ed&d'Zejd(ed)ed*d+Zejd$ed,ed-d.Zejd/eded0ed1d2Zejd3ejd4ed5ed6d7Zejd8d9d4ed:ed;d<Zejd=d$d4ed>ed?d@ZejedAedBdCZejedDedEdCZejdFdeedGgedHedIdJZejdKdd$d$eedGgedLedMdNZejdOdd$d$eedGgedPedQdNZ ejd/ededRedSd2Z!ej"ededTedUdVZ#ej$e%d$edWedXdYZ&ej'dZed[ed\d]Z(ejdFded^ed_ed`daZ)ejd$edbedcd.Z*G ddde deZ+dfdg Z,dhdi Z-e.djdk Z/e.dldm Z0e.dndo Z1dpdq Z2drds Z3dtS )uCampaignz
    Main campaign model for TV advertising campaigns.
    
    Represents an advertising campaign with all its properties including
    budget, schedule, targeting, and performance tracking.
    ZdraftZDraftpendingzPending ApprovalapprovedZApprovedactiveActivepausedZPaused	completedZ	Completed	cancelledZ	CancelledZbrand_awarenesszBrand AwarenessZproduct_launchzProduct LaunchZpromotionalZPromotionalZseasonalZSeasonalZevent_basedzEvent BasedZdirect_responsezDirect Response   ZLow   ZNormal   ZHigh   CriticalTFzCampaign ID)primary_keydefaulteditableverbose_name   zCampaign Namez-Descriptive name for the advertising campaign)
max_lengthr   	help_textDescriptionz<Detailed description of the campaign objectives and strategy)blankr   r      zCampaign TypezType of advertising campaign)r   choicesr   r   r   zadvertisers.Brand	campaignsZ
Advertiserz$The advertiser running this campaign)	on_deleterelated_namer   r   channels.TVChannelCampaignChannelSchedulezTarget Channelsz(TV channels where this campaign will run)throughr$   r   r   zchannels.GeographicZonezGeographic Zonesz,Geographic areas to target for this campaign)r   r$   r   r   z
Start Datez&When the campaign should start runningr   r   zEnd Datez%When the campaign should stop running   0.01zTotal Budgetz(Total budget allocated for this campaign)
max_digitsdecimal_places
validatorsr   r   
   zDaily Budgetz%Maximum daily spend for this campaignr+   r,   nullr   r-   r   r      zCost Per Spotz#Cost per advertising spot/insertionStatuszCurrent status of the campaignPriorityz0Campaign priority level for scheduling conflicts)r!   r   r   r   zTarget Demographicsz6JSON data containing demographic targeting information)r   r   r   r   r   zTotal Impressionsz(Total number of ad impressions deliveredr   r   r   0.00zTotal Spendz#Total amount spent on this campaignr+   r,   r   r   r   ZNotesz.Internal notes and comments about the campaignc                   @   s^   e Zd ZedZedZdgZejddgdejddgdejddgdejd	dgdgZ	d
S )zCampaign.Metar
   	Campaignsz-created_atstatus
start_datefields
advertiserend_datepriorityN)
__name__
__module____qualname___r   verbose_name_pluralorderingr   Indexindexes rG   rG   IC:\Users\vibe-look\OneDrive\Desktop\Adtlas_V\src\apps\campaigns\models.pyMeta   s    rI   c                 C   s   | j  d| jj  dS )Nz ())namer<   selfrG   rG   rH   __str__      zCampaign.__str__c                 C   s   t dd| jidS )Nzcampaigns:detailpk)kwargs)r   rP   rL   rG   rG   rH   get_absolute_url   s   zCampaign.get_absolute_urlc                 C   s.   t  }| jdko| j|  ko| jkS   S )z&Check if campaign is currently active.r   N)r   nowr8   r9   r=   )rM   rS   rG   rG   rH   	is_active   s   
zCampaign.is_activec                 C   s,   | j r| j  t   }td|jS dS )z%Calculate days remaining in campaign.r   N)r=   dater   rS   maxdays)rM   deltarG   rG   rH   days_remaining   s   zCampaign.days_remainingc                 C   s   | j dkr| j| j  d S dS )z(Calculate budget utilization percentage.r   d   Ntotal_budgettotal_spendrL   rG   rG   rH   budget_utilization   s   
zCampaign.budget_utilizationc                 C   s   | j | j S )zGet remaining budget amount.Nr[   rL   rG   rG   rH   get_remaining_budget   s   zCampaign.get_remaining_budgetc                 C   s6   | j dv o| jt   ko| jkn  o|  dkS )z#Check if campaign can be activated.)r   r   r   N)r8   r9   r   rS   r=   r_   rL   rG   rG   rH   can_be_activated   s
   

zCampaign.can_be_activatedN)4r?   r@   rA   __doc__rB   ZCAMPAIGN_STATUSZCAMPAIGN_TYPESZPRIORITY_LEVELSr   	UUIDFielduuiduuid4id	CharFieldrK   	TextFielddescriptionZcampaign_type
ForeignKeyCASCADEr<   ManyToManyFieldchannelsZgeographic_zonesDateTimeFieldr9   r=   DecimalFieldr   r   r\   Zdaily_budgetZcost_per_spotr8   IntegerFieldr>   	JSONFielddictZtarget_demographicsPositiveBigIntegerFieldZtotal_impressionsr]   ZnotesrI   rN   rR   propertyrT   rY   r^   r_   r`   rG   rG   rG   rH   r
      s$   

















				


r
   c                	   @   s.  e Zd ZdZejeejdeddZ	ejdejdeddZ
ejeded	d
Zejededd
ZejeededdZejdededgededdZejddddeedgededdZejdededdZejddeded ed!d"ZG d#d$ d$Zd%d& Zed'd( Zd)S )*r&   z
    Schedule model for campaign-channel relationships.
    
    Defines when and how a campaign runs on specific channels,
    including time slots, frequency, and channel-specific budgets.
    Zchannel_schedulesr
   r#   r$   r   r%   Zcampaign_schedulesChannelz
Start Timez(Daily start time for ads on this channelr(   zEnd Timez&Daily end time for ads on this channelzDays of Weekz5List of days when ads should run (0=Monday, 6=Sunday)r4   r   rZ   zSpots Per Dayz*Number of ad spots per day on this channel)r   r-   r   r   r.   r   Tr*   zChannel Budgetz!Budget allocated for this channelr/   r   zImpressions Deliveredz+Total impressions delivered on this channelr5   zAmount SpentzAmount spent on this channelr6   c                   @   s*   e Zd ZedZedZddgZdgZdS )zCampaignChannelSchedule.MetazCampaign Channel SchedulezCampaign Channel SchedulescampaignchannelZchannel__nameN)r?   r@   rA   rB   r   rC   unique_togetherrD   rG   rG   rG   rH   rI   3  s
    
rI   c                 C   s   | j j d| jj S Nz - )rv   rK   rw   rL   rG   rG   rH   rN   9  rO   zCampaignChannelSchedule.__str__c                 C   s   | j  dS )z)Get daily frequency as a readable string.z
 spots/dayN)spots_per_dayrL   rG   rG   rH   daily_frequency<  s   z'CampaignChannelSchedule.daily_frequencyN)r?   r@   rA   ra   r   ri   r
   rj   rB   rv   rw   	TimeField
start_timeend_timerp   listZdays_of_weekPositiveIntegerFieldr   r   rz   rn   r   Zchannel_budgetrr   Zimpressions_deliveredZamount_spentrI   rN   rs   r{   rG   rG   rG   rH   r&      st    r&   c                       s
  e Zd ZdZejeejdeddZ	ej
ededdZejded	ed
dZejdededdZejddedededdZejddddededdZejddededdZejddddededdZG dd  d Zd!d" Z fd#d$Z  ZS )%CampaignPerformancez
    Daily performance tracking for campaigns.
    
    Stores daily metrics and performance data for campaigns,
    enabling detailed analytics and reporting.
    Zperformance_recordsr
   rt   Datez Date for this performance recordr(   r   ZImpressionsz%Number of ad impressions on this dater4   zSpots Airedz*Number of ad spots that aired on this dater.   r   r5   zDaily SpendzAmount spent on this dater6   r1   TZCPMzCost per thousand impressions)r+   r,   r0   r   r   r   ZReachz Estimated unique viewers reached)r0   r   r   r   r   Z	FrequencyzAverage frequency per viewerc                   @   sH   e Zd ZedZedZddgZdgZej	ddgdej	dgdgZ
dS )zCampaignPerformance.MetazCampaign PerformancezCampaign Performance Recordsrv   rU   z-dater:   N)r?   r@   rA   rB   r   rC   rx   rD   r   rE   rF   rG   rG   rG   rH   rI     s    rI   c                 C   s   | j j d| j S ry   )rv   rK   rU   rL   rG   rG   rH   rN     s   zCampaignPerformance.__str__c                    s<   | j dkr| jdkr| j | j d | _t j|i | dS )zCalculate CPM when saving.r   i  N)spendimpressionscpmsupersave)rM   argsrQ   	__class__rG   rH   r     s   zCampaignPerformance.save)r?   r@   rA   ra   r   ri   r
   rj   rB   rv   	DateFieldrU   rr   r   r   Zspots_airedrn   r   r   r   Zreach	frequencyrI   rN   r   __classcell__rG   rG   r   rH   r   B  sl    		
r   )ra   rc   decimalr   	django.dbr   django.urlsr   django.utilsr   django.core.validatorsr   r   django.utils.translationr   rB   Zapps.common.modelsr	   r
   r&   r   rG   rG   rG   rH   <module>   s   
 ZR