o
    ehM7                     @   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mZmZ ddlmZ dd	lmZmZ dd
l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G dd dejZdS )z
Campaigns Forms Module

This module contains all form classes for the campaigns app.
Includes model forms for creating and updating campaigns and related models.
    )forms)gettext_lazy)ValidationError)timezone   )CampaignCampaignChannelScheduleCampaignPerformance)Brand)	TVChannelGeographicZone)Creativec                       sB   e Zd ZdZG dd dZ fddZ fddZdd	 Z  ZS )
CampaignFormz3
    Form for creating and updating campaigns.
    c                   @   s   e Zd ZeZg dZejdedddej	ddedddej
d	didej
d	didejdd
ddejdd
ddejdddddejdddddejdddddejdddddej	ddedddejd	didejd	diddZdS )zCampaignForm.Meta)namedescriptioncampaign_type
advertiser
start_dateend_datetotal_budgetdaily_budgetcost_per_spotprioritytarget_audiencegeographic_zoneschannelsform-controlzEnter campaign nameclassplaceholderattrs   zEnter campaign description)r   rowsr   r   zdatetime-localr   type0.010r   stepmin110)r   r*   max   z%Describe target audience demographicszform-check-inputN)__name__
__module____qualname__r   modelfieldsr   	TextInput_TextareaSelectDateTimeInputNumberInputCheckboxSelectMultiplewidgets r<   r<   HC:\Users\vibe-look\OneDrive\Desktop\Adtlas_V\src\apps\campaigns\forms.pyMeta   st    
r>   c                    s   t  j|i | tjjddd| jd _tjjddd| jd _t	jjddd| jd _d| jd _
d| jd _
d| jd _
d| jd _
d| jd	 _
td
| jd _td| jd _td| jd _d S )NT	is_activer   r   r   r   r   r   r   z.Priority level from 1 (lowest) to 10 (highest)r   z-Leave empty to distribute total budget evenlyr   zCost per advertising spotr   )super__init__r
   objectsfilterorder_byr3   querysetr   r   requiredr5   	help_text)selfargskwargs	__class__r<   r=   rB   Z   s0   


zCampaignForm.__init__c                    s   t   }|d}|d}|d}|d}|r3|r3||kr'ttd|t k r3ttd|rR|rR|rR|rR| |  jd }|| |krRttd|S )	Nr   r   r   r   z"End date must be after start date.z!Start date cannot be in the past.r   u9   Daily budget × campaign days cannot exceed total budget.)	rA   cleangetr   r5   r   nowdatedays)rI   cleaned_datar   r   r   r   Zcampaign_daysrL   r<   r=   rN   v   s$   




zCampaignForm.cleanc                 C   sN   | j d}|r%tjj|d}| jjr|j| jjd}| r%t	t
d|S )Nr   )Zname__iexactpkz)A campaign with this name already exists.)rS   rO   r   rC   rD   instancerU   excludeexistsr   r5   )rI   r   rF   r<   r<   r=   
clean_name   s   zCampaignForm.clean_name)	r/   r0   r1   __doc__r>   rB   rN   rY   __classcell__r<   r<   rL   r=   r      s    Ar   c                       sB   e Zd ZdZG dd dZ fddZdd Z fdd	Z  ZS )
CampaignChannelScheduleFormzD
    Form for creating and updating campaign channel schedules.
    c                   @   s   e Zd ZeZg dZejddidejddidejddddejddddej	de
dddejdd	d
dejddddddZdS )z CampaignChannelScheduleForm.Meta)campaignchannel
start_timeend_timedays_of_weekspots_per_daychannel_budgetr   r   r    timer$   ze.g., 1,2,3,4,5 for weekdaysr   r+   r   r*   r&   r'   r(   N)r/   r0   r1   r   r2   r3   r   r7   	TimeInputr4   r5   r9   r;   r<   r<   r<   r=   r>      s>    
r>   c                    s   | dd }t j|i | |r.|| jd _t | jd _|jj	dd
d| jd _ntjj	dd
d| jd _td| jd _td| jd	 _d S )
Nr]   Tr?   r   r^   z5Comma-separated list of weekdays (1=Monday, 7=Sunday)ra   zNumber of spots to air per dayrb   )poprA   rB   r3   initialr   HiddenInputwidgetr   rD   rE   rF   r   rC   r5   rH   rI   rJ   rK   r]   rL   r<   r=   rB      s&   
z$CampaignChannelScheduleForm.__init__c              	   C   s   | j d}|r?z'dd |dD }|D ]}|dk s|dkr"t qdtttt|W S  tt	fy>   t
tdw |S )Nra   c                 S      g | ]}t | qS r<   intstrip).0dayr<   r<   r=   
<listcomp>       zBCampaignChannelScheduleForm.clean_days_of_week.<locals>.<listcomp>,r      z=Please enter valid weekday numbers (1-7) separated by commas.)rS   rO   split
ValueErrorjoinmapstrsortedsetAttributeErrorr   r5   )rI   ra   rR   rq   r<   r<   r=   clean_days_of_week   s   z.CampaignChannelScheduleForm.clean_days_of_weekc                    s>   t   }|d}|d}|r|r||krttd|S )Nr_   r`   z"End time must be after start time.)rA   rN   rO   r   r5   )rI   rS   r_   r`   rL   r<   r=   rN      s   


z!CampaignChannelScheduleForm.clean)	r/   r0   r1   rZ   r>   rB   r~   rN   r[   r<   r<   rL   r=   r\      s    $r\   c                       s6   e Zd ZdZG dd dZ fddZdd Z  ZS )CampaignPerformanceFormz?
    Form for manually entering campaign performance data.
    c                   @   s   e Zd ZeZg dZejddidejddddej	ddddej	ddddej	dd	dd
dej	ddddej	dd	dd
ddZ
dS )zCampaignPerformanceForm.Meta)r]   rQ   impressionsspots_airedspendreach	frequencyr   r   r    rQ   r$   r'   re   r&   r(   N)r/   r0   r1   r	   r2   r3   r   r7   	DateInputr9   r;   r<   r<   r<   r=   r>      sB    
r>   c                    sb   | dd }t j|i | |r|| jd _t | jd _| jj	s/t
  | jd _d S d S )Nr]   rQ   )rg   rA   rB   r3   rh   r   ri   rj   rV   rU   r   rP   rQ   rk   rL   r<   r=   rB   $  s   z CampaignPerformanceForm.__init__c                 C   s   | j d}| j d}|rK|rKtjj||d}| jjr$|j| jjd}| r.t	t
d||j k r;t	t
d|jrK||j krKt	t
d|S )NrQ   r]   )r]   rQ   rT   z.Performance data for this date already exists.z*Date cannot be before campaign start date.z'Date cannot be after campaign end date.)rS   rO   r	   rC   rD   rV   rU   rW   rX   r   r5   r   rQ   r   )rI   rQ   r]   rF   r<   r<   r=   
clean_date0  s,   z"CampaignPerformanceForm.clean_date)r/   r0   r1   rZ   r>   rB   r   r[   r<   r<   rL   r=   r      s
    &r   c                   @   s   e Zd ZdZdedfgej Zdedfgej Z	e
jde
jdeddd	d
Ze
jede
jddid	dZe
je	de
jddid	dZe
jejjddddede
jddid	dZe
jde
jdddd	d
Ze
jde
jdddd	d
ZdS )CampaignFilterFormz4
    Form for filtering campaigns in list view.
     zAll Statusesz	All TypesFr   zSearch campaigns...r   r    )rG   rj   r   )choicesrG   rj   Tr?   r   zAll Advertisers)rF   rG   empty_labelrj   rQ   r$   N)r/   r0   r1   rZ   r5   r   CAMPAIGN_STATUSSTATUS_CHOICESCAMPAIGN_TYPESZTYPE_CHOICESr   	CharFieldr4   searchChoiceFieldr7   statusr   ModelChoiceFieldr
   rC   rD   rE   r   	DateFieldr   Zstart_date_fromZstart_date_tor<   r<   r<   r=   r   P  s^    	
r   c                   @   sn   e Zd ZdZdedfdedfdedfded	fgZejeejd
diddZ	ej
e dZdd ZdS )BulkCampaignActionFormz-
    Form for bulk actions on campaigns.
    activateZActivatepauseZPausecompletezMark as CompleteddeleteDeleter   r   r    )r   rj   )rj   c              	   C   sN   | j d}|r%zdd |dD }|W S  ttfy$   ttdw g S )Ncampaign_idsc                 S   rl   r<   rm   )rp   idr<   r<   r=   rr     rs   z=BulkCampaignActionForm.clean_campaign_ids.<locals>.<listcomp>rt   zInvalid campaign IDs.)rS   rO   rv   rw   r}   r   r5   )rI   r   idsr<   r<   r=   clean_campaign_ids  s   z)BulkCampaignActionForm.clean_campaign_idsN)r/   r0   r1   rZ   r5   ACTION_CHOICESr   r   r7   actionr   ri   r   r   r<   r<   r<   r=   r     s"    



r   N)rZ   djangor   django.utils.translationr   r5   django.core.exceptionsr   django.utilsr   modelsr   r   r	   Zapps.advertisers.modelsr
   Zapps.channels.modelsr   r   Zapps.creatives.modelsr   	ModelFormr   r\   r   Formr   r   r<   r<   r<   r=   <module>   s    [W: