o
    Oeh-                     @   sj  d Z ddlmZmZ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mZmZmZ dd	lmZmZmZ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&m'Z' G dd deeZ(G dd deeZ)G dd deeZ*G dd deeZ+G dd deeZ,edd Z-edd Z.edd Z/ed d! Z0ed"d# Z1d$S )%z
Campaigns Views Module

This module contains all view classes and functions for the campaigns app.
Includes list views, detail views, create/update forms, and API endpoints.
    )renderget_object_or_404redirect)login_required)LoginRequiredMixin)messages)reverse_lazy)gettext_lazy)ListView
DetailView
CreateView
UpdateView
DeleteView)QSumAvgCount)timezone)JsonResponse)	Paginator   )CampaignCampaignChannelScheduleCampaignPerformance)CampaignFormCampaignChannelScheduleFormc                       s8   e Zd ZdZeZdZdZdZdd Z	 fddZ
  ZS )	CampaignListViewz<
    List view for campaigns with filtering and search.
    zcampaigns/campaign_list.html	campaigns   c                 C   s   t jddd}| jjd}|r|j|d}| jjd}|r(|j|d}| jjd}|r7|j|d}| jjd	}|rR|t|d
t|dB t|dB }|	dS )N
advertisergeographic_zoneschannelsstatusr"   type)campaign_type)advertiser_idsearch)Zname__icontains)Zdescription__icontains)Zadvertiser__name__icontains-created_at)
r   objectsselect_relatedprefetch_relatedrequestGETgetfilterr   order_by)selfquerysetr"   r%   r   r'    r3   HC:\Users\vibe-look\OneDrive\Desktop\Adtlas_V\src\apps\campaigns\views.pyget_queryset$   s,   
zCampaignListView.get_querysetc                    s   t  jdi |}tj|d< tj|d< | jjdd|d< | jjdd|d< | jjdd|d	< tj	 |d
< tjj
dd	 |d< tjjtddd pOd|d< |S )NZstatus_choicesZtype_choicesr"    current_statusr$   current_typer'   Zcurrent_searchtotal_campaignsactiver#   active_campaignstotal_budget)totalr=   r   r3   )superget_context_datar   CAMPAIGN_STATUSCAMPAIGN_TYPESr,   r-   r.   r)   countr/   	aggregater   r1   kwargscontext	__class__r3   r4   r?   C   s    

z!CampaignListView.get_context_data)__name__
__module____qualname____doc__r   modeltemplate_namecontext_object_namepaginate_byr5   r?   __classcell__r3   r3   rG   r4   r      s    r   c                       s4   e Zd ZdZeZdZdZdd Z fddZ	  Z
S )CampaignDetailViewz/
    Detail view for individual campaigns.
    zcampaigns/campaign_detail.htmlcampaignc                 C   s   t jdddddS )Nr   r    r!   Zchannel_schedules__channelperformance_records)r   r)   r*   r+   r1   r3   r3   r4   r5   ]   s   zCampaignDetailView.get_querysetc                    s   t  jdi |}| j}|jd |d< |jdd d |d< |jjt	dt	dt
dt	d	d
}||d< t  |j  jd }|dkrd|d pOd| |d pVd| |d p]d| d|d< |S )Nchannelchannel_schedulesz-date   Zrecent_performanceimpressionsspendcpmspots_aired)total_impressionstotal_spendZavg_cpmtotal_spotsZperformance_summaryr   r   r]   r^   r_   )rY   rZ   spotsZdaily_averagesr3   )r>   r?   objectrW   r*   allrT   r0   rC   r   r   r   nowdate
start_datedays)r1   rE   rF   rS   performance_dataZdays_runningrG   r3   r4   r?   c   s4   
z#CampaignDetailView.get_context_data)rI   rJ   rK   rL   r   rM   rN   rO   r5   r?   rQ   r3   r3   rG   r4   rR   U   s    rR   c                       s@   e Zd ZdZeZeZdZe	dZ
 fddZ fddZ  ZS )CampaignCreateViewz(
    Create view for new campaigns.
    campaigns/campaign_form.htmlcampaigns:listc                    (   t | jtd|jj t |S )Nz,Campaign "{}" has been created successfully.	r   successr,   _formatinstancenamer>   
form_validr1   formrG   r3   r4   rr         zCampaignCreateView.form_validc                    s.   t  jdi |}td|d< td|d< |S )NzCreate New CampaigntitlezCreate Campaignsubmit_textr3   )r>   r?   rn   rD   rG   r3   r4   r?      s   z#CampaignCreateView.get_context_data)rI   rJ   rK   rL   r   rM   r   
form_classrN   r   success_urlrr   r?   rQ   r3   r3   rG   r4   rh      s    	rh   c                       s@   e Zd ZdZeZeZdZdd Z	 fddZ
 fddZ  ZS )	CampaignUpdateViewz-
    Update view for existing campaigns.
    ri   c                 C   s   t dd| jjidS )Ncampaigns:detailpk)rE   )r   ra   r|   rU   r3   r3   r4   get_success_url   s   z"CampaignUpdateView.get_success_urlc                    rk   )Nz,Campaign "{}" has been updated successfully.rl   rs   rG   r3   r4   rr      ru   zCampaignUpdateView.form_validc                    s8   t  jdi |}td| jj|d< td|d< |S )NzEdit Campaign: {}rv   zUpdate Campaignrw   r3   )r>   r?   rn   ro   ra   rq   rD   rG   r3   r4   r?      s   z#CampaignUpdateView.get_context_data)rI   rJ   rK   rL   r   rM   r   rx   rN   r}   rr   r?   rQ   r3   r3   rG   r4   rz      s    	rz   c                       s0   e Zd ZdZeZdZedZ fddZ	  Z
S )CampaignDeleteViewz$
    Delete view for campaigns.
    z&campaigns/campaign_confirm_delete.htmlrj   c                    s:   |   }t|td|j t j|g|R i |S )Nz,Campaign "{}" has been deleted successfully.)
get_objectr   rm   rn   ro   rq   r>   delete)r1   r,   argsrE   rS   rG   r3   r4   r      s   zCampaignDeleteView.delete)rI   rJ   rK   rL   r   rM   rN   r   ry   r   rQ   r3   r3   rG   r4   r~      s    r~   c           
   	   C   s   t j }t jjdd }t jjdd }t jjdd }t jjtdtdd}t jdd	d
d }t jjdt	 tj
dd ddd
d }t jjddgddd
d }||||||||d}	t| d|	S )zB
    Dashboard view showing campaign overview and statistics.
    r:   r#   pending	completedr<   r^   )r<   r^   r   r(   N
      rf   )r"   Zend_date__lteend_date   )
status__inz-total_impressions)r9   r;   pending_campaignscompleted_campaignsbudget_statsrecent_campaignsending_soontop_performerszcampaigns/dashboard.html)r   r)   rB   r/   rC   r   r*   r0   r   rc   	timedeltar   )
r,   r9   r;   r   r   r   r   r   r   rF   r3   r3   r4   campaign_dashboard   sD   
r   c                 C   s`   t t|d}| rd|_|  t| td|j	 nt
| td|j	 td|dS )z
    Activate a campaign.
    r|   r:   z!Campaign "{}" has been activated.zACampaign "{}" cannot be activated. Please check the requirements.r{   N)r   r   can_be_activatedr"   saver   rm   rn   ro   rq   errorr   r,   r|   rS   r3   r3   r4   campaign_activate   s   r   c                 C   sZ   t t|d}|jdkrd|_|  t| td|j nt	| td t
d|dS )z
    Pause a campaign.
    r   r:   pausedzCampaign "{}" has been paused.z$Only active campaigns can be paused.r{   N)r   r   r"   r   r   rm   rn   ro   rq   r   r   r   r3   r3   r4   campaign_pause  s   
r   c                 C   s~   t t|d}|jjt  tjdd dd}dd |D dd |D d	d |D d
d |D dd |D d}t	|S )z<
    AJAX endpoint for campaign performance chart data.
    r   rX   r   )Z	date__gterd   c                 S   s   g | ]}|j d qS )z%Y-%m-%d)rd   strftime.0pr3   r3   r4   
<listcomp>9  s    z-campaign_performance_data.<locals>.<listcomp>c                 S      g | ]}|j qS r3   )rY   r   r3   r3   r4   r   :      c                 S   s   g | ]}t |jqS r3   )floatrZ   r   r3   r3   r4   r   ;  s    c                 S   r   r3   )r\   r   r3   r3   r4   r   <  r   c                 S   s    g | ]}|j rt|j nd qS )r   )r[   r   r   r3   r3   r4   r   =  s     )datesrY   rZ   r`   r[   N)
r   r   rT   r/   r   rc   rd   r   r0   r   )r,   r|   rS   rg   datar3   r3   r4   campaign_performance_data,  s   r   c              
   C   s   t t|d}tjj|d}d|_|j d|_d|_d|_d|_|	  |j
|j
  |j D ]}tjj||j|j|j|j|j|jd q2t| td|j td|jdS )	z%
    Clone an existing campaign.
    r   Nz (Copy)draftr   )rS   rV   
start_timeend_timedays_of_weekspots_per_daychannel_budgetz+Campaign "{}" has been cloned successfully.r{   )r   r   r)   r.   r|   rq   r"   r]   r^   r   r    setrb   rW   r   createrV   r   r   r   r   r   r   rm   rn   ro   r   )r,   r|   Zoriginal_campaignZcloned_campaignscheduler3   r3   r4   campaign_cloneC  s4   
r   N)2rL   django.shortcutsr   r   r   django.contrib.auth.decoratorsr   django.contrib.auth.mixinsr   django.contribr   django.urlsr   django.utils.translationr	   rn   django.views.genericr
   r   r   r   r   django.db.modelsr   r   r   r   django.utilsr   django.httpr   django.core.paginatorr   modelsr   r   r   formsr   r   r   rR   rh   rz   r~   r   r   r   r   r   r3   r3   r3   r4   <module>   s:   :1
.


