o
    Ӎdhk<                     @   s:  d Z ddl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 eeZe	 Zeeeddd Zeeeddd Zeeeddd Zeeeddd Zeeeddd Zeeeddd Zeeeddd Zeeeddd Z dd Z!d ddZ"dS )!a2  Advertisers Signals

This module contains Django signal handlers for the advertisers app.
Handles automated tasks and model lifecycle events.

Signals:
    - Agency creation/update signals
    - Brand creation/update signals
    - User-advertiser relationship signals
    - Cleanup and maintenance signals
    N)	post_savepost_delete
pre_delete)receiver)get_user_model)	send_mail)settings)timezone   )AgencyBrandBrandCategoryUserAdvertiser)senderc              
   K   sn  |rt d|j d|j d |jri|jjriz1td|j dd|j p(|jj d|j dt	j
|jjgd	d
 t d|jj d|j  W n  tyh } zt d|j dt|  W Y d}~nd}~ww tj sddddddddddddddddddddddd dg}|D ]}tjjd#i | qt d! dS dS t d"|j d|j d dS )$zHandle agency creation and updates.
    
    Actions performed:
    - Log agency creation/update
    - Send notification emails
    - Create default brand categories if needed
    zNew agency created:  (ID: )zWelcome to Adtlas - Agency 'z	' Created
                    Dear z8,
                    
                    Your agency 'a  ' has been successfully created in Adtlas.
                    
                    You can now start adding brands and managing your advertising campaigns.
                    
                    Best regards,
                    The Adtlas Team
                    Tsubjectmessage
from_emailrecipient_listfail_silentlyzWelcome email sent to  for agency z(Failed to send welcome email for agency : NZ
Automotivez)Car manufacturers and automotive services)namedescriptionzFood & Beveragez#Food, drinks, and restaurant chainsZ
Technologyz$Tech companies and software serviceszFashion & Beautyz)Clothing, cosmetics, and lifestyle brandsZ
Healthcarez-Medical services and pharmaceutical companiesZFinancez(Banks, insurance, and financial servicesZEntertainmentz*Media, gaming, and entertainment companiesZRetailz&Retail stores and e-commerce platformsz Default brand categories createdzAgency updated:  )loggerinfor   idowneremailr   get_full_nameusernamer   DEFAULT_FROM_EMAIL	Exceptionerrorstrr   objectsexistsget_or_create)r   instancecreatedkwargseZdefault_categoriesZcategory_datar   r   LC:\Users\vibe-look\OneDrive\Desktop\Adtlas_V\src\apps\advertisers\signals.pyagency_post_save    sF   	
 (
 r1   c                 K   sD   t d|j d|j d |jjdd tjj|djdd d	S )
zHandle agency deletion.
    
    Actions performed:
    - Log agency deletion
    - Archive related data instead of hard delete
    zAgency being deleted: r   r   inactivestatus)brand__agencyF	is_activeN)	r   warningr   r    brandsupdater   r)   filter)r   r,   r.   r   r   r0   agency_pre_deleteY   s   r<   c                 K   s0  |rt d|j d|jj d|j d |jjr|jjjrzHtd|j d|jj p0|jjj	 d|j d|jj d	|j d
|j
pCd d|jrL|jjnd dtj|jjjgdd t d|j  W dS  ty } zt dt|  W Y d}~dS d}~ww dS dS t d|j d|j d dS )zHandle brand creation and updates.
    
    Actions performed:
    - Log brand creation/update
    - Update agency statistics
    - Send notifications
    zNew brand created: r   r   r   zNew Brand Added - r   z8,
                    
                    A new brand 'z!' has been added to your agency 'zW'.
                    
                    Brand Details:
                    - Name: z!
                    - Industry: zNot specifiedz!
                    - Category: z
                    
                    You can now start creating campaigns for this brand.
                    
                    Best regards,
                    The Adtlas Team
                    Tr   z%Brand creation notification sent for z,Failed to send brand creation notification: NzBrand updated: )r   r   r   agencyr    r!   r"   r   r#   r$   industrycategoryr   r%   r&   r'   r(   r   r,   r-   r.   r/   r   r   r0   brand_post_saven   s<   	&

" rA   c              
   K   s   t d|j d|j d |jjdd z|jjdd t d|j d	 W dS  tyJ } zt d
|j dt	|  W Y d}~dS d}~ww )zpHandle brand deletion.
    
    Actions performed:
    - Log brand deletion
    - Archive related campaigns
    zBrand being deleted: r   r   Fr6   r2   r3   zCampaigns for brand z marked as inactivez%Could not update campaigns for brand r   N)
r   r8   r   r    user_relationshipsr:   	campaignsr   r&   r(   r   r,   r.   r/   r   r   r0   brand_pre_delete   s   *rE   c                 K   s  |rt d|jj d|jj d|j d |jjroz8td|jj d|j	 p+|jj d|j d|jj d	|jj
j d
	tj|jjgdd t d|jj  W n tyn } zt dt|  W Y d}~nd}~ww |jj
jr|jj
jjrzLtd|jj d|jj
j	 p|jj
jj d|j	 p|jj d|j d|jj d|j	 p|jj d|jj d|j dtj|jj
jjgdd W dS  ty } zt dt|  W Y d}~dS d}~ww dS dS t d|jj d|jj d|j d|j d	 dS )zHandle user-advertiser relationship creation and updates.
    
    Actions performed:
    - Log relationship changes
    - Send access notifications
    - Update user permissions
    z"New user-advertiser relationship:  -> z (r   zBrand Access Granted - r   zA,
                    
                    You have been granted z access to the brand 'z%' 
                    under agency 'z'.
                    
                    You can now access this brand's campaigns and data according to your role permissions.
                    
                    Best regards,
                    The Adtlas Team
                    Tr   zAccess notification sent to z$Failed to send access notification: NzUser Access Granted - z1,
                    
                    User 'z(' has been granted 
                    z access to brand 'zV'.
                    
                    User Details:
                    - Name: z
                    - Email: z
                    - Role: zp
                    
                    Best regards,
                    The Adtlas Team
                    z#Failed to send owner notification: z&User-advertiser relationship updated: z
, active: )r   r   userr$   brandr   roler"   r   r#   r=   r   r%   r&   r'   r(   r!   r7   r@   r   r   r0   user_advertiser_post_save   s   	 	"rJ   c              
   K   s   t d|jj d|jj  |jjrfz5td|jj d|j p$|jj d|jj d|jj	j dt
j|jjgdd	 t d
|jj  W dS  tye } zt dt|  W Y d}~dS d}~ww dS )zHandle user-advertiser relationship deletion.
    
    Actions performed:
    - Log relationship removal
    - Send access revocation notifications
    z&User-advertiser relationship deleted: rF   zBrand Access Revoked - z
                Dear z9,
                
                Your access to brand 'z' under agency 'z' 
                has been revoked.
                
                If you believe this is an error, please contact your administrator.
                
                Best regards,
                The Adtlas Team
                Tr   z'Access revocation notification sent to z/Failed to send access revocation notification: N)r   r   rG   r$   rH   r   r"   r   r#   r=   r   r%   r&   r'   r(   rD   r   r   r0   user_advertiser_post_delete   s4   "rK   c                 K   s   |rt d|j d|j d nt d|j d|j d |jrH|j}|jh}|rJ|j|v r;t d|j  dS ||j |j}|s+dS dS dS )zHandle brand category creation and updates.
    
    Actions performed:
    - Log category changes
    - Validate hierarchy
    zNew brand category created: r   r   zBrand category updated: z6Circular reference detected in category hierarchy for N)r   r   r   r    parentr'   add)r   r,   r-   r.   currentvisitedr   r   r0   brand_category_post_save%  s   
rP   c                 K   sz   t d|j d|j d tjj|d}| r;t d|	  d|j  |j
ddd	 t d
|	  d dS dS )zHandle user deletion cleanup.
    
    Actions performed:
    - Clean up orphaned agencies
    - Deactivate user-advertiser relationships
    zUser deleted: r   r   )r!   zFound z$ orphaned agencies for deleted user r2   N)r4   r!   zMarked z+ agencies as inactive due to owner deletion)r   r   r$   r    r   r)   r;   r*   r8   countr:   )r   r,   r.   Zorphaned_agenciesr   r   r0   user_post_deleteD  s   rR   c                 C   sr   d}|D ]2}zt | |tj|gdd |d7 }W q ty6 } ztd| dt|  W Y d}~qd}~ww |S )a	  Send bulk email notifications with error handling.
    
    Args:
        subject (str): Email subject
        message (str): Email message
        recipient_list (list): List of email addresses
    
    Returns:
        int: Number of successfully sent emails
    r   Fr   r
   zFailed to send email to r   N)r   r   r%   r&   r   r'   r(   )r   r   r   Z
sent_countr"   r/   r   r   r0   send_bulk_notificationa  s    &rS   c                 C   s\   | j j}t| dd}|rd|j nd}t| d| d|  d| d| d	t   d
S )zLog model changes for audit purposes.
    
    Args:
        instance: Model instance
        action (str): Action performed (created, updated, deleted)
        user: User who performed the action (optional)
    r    unknownz by   r   r   r   z at N)	__class____name__getattrr$   r   r   r	   now)r,   actionrG   
model_nameZinstance_idZ	user_infor   r   r0   log_model_change~  s   (r]   )N)#__doc__loggingZdjango.db.models.signalsr   r   r   django.dispatchr   django.contrib.authr   django.core.mailr   django.confr   django.utilsr	   modelsr   r   r   r   	getLoggerrX   r   Userr1   r<   rA   rE   rJ   rK   rP   rR   rS   r]   r   r   r   r0   <module>   s:    



8



+



G

)


