o
    <ehk                     @   s  d Z ddlZddlZddlmZ ddlmZ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 dd
lmZ ddlmZ ddlmZmZmZ ddlmZ e
 Zdd Zdd Z dd Z!dd Z"dd Z#G dd deeeZ$G dd deeZ%G dd deeeZ&G dd deeeZ'G d d! d!eeZ(G d"d# d#eeZ)G d$d% d%eZ*G d&d' d'eZ+G d(d) d)eeZ,G d*d+ d+eeeZ-dS ),a  Creative Management Models

Django models for managing creative assets, processing, and optimization.
Handles creative files, versions, formats, templates, and performance tracking.

Models:
- Creative: Main creative entity
- CreativeVersion: Version control
- CreativeFormat: Format specifications
- CreativeTemplate: Reusable templates
- CreativeAsset: Individual asset files
- CreativeApproval: Approval workflow
- CreativePerformance: Performance metrics
- CreativeTag: Tagging system
- CreativeCompliance: Brand safety
- CreativeVariant: A/B testing

Features:
- File upload and processing
- Multi-format transcoding
- Version control
- Approval workflows
- Performance tracking
- Template management
- Compliance checking
    N)Decimal)datetime	timedelta)models)get_user_model)MinValueValidatorMaxValueValidatorFileExtensionValidator)ValidationError)gettext_lazy)timezone)reverse)	BaseModel
AuditModelStatusModel)Campaignc                 C   s4   | dd }t j d| }d| j d| S )zGenerate upload path for creative files.
    
    Args:
        instance: Creative instance
        filename: Original filename
        
    Returns:
        str: Upload path
    .z
creatives//N)splituuiduuid4hexidinstancefilenameext r   IC:\Users\vibe-look\OneDrive\Desktop\Adtlas_V\src\apps\creatives\models.pycreative_upload_path1   s   
r    c                 C   s>   | dd }t j d| }d| jj d| j d| S )zGenerate upload path for asset files.
    
    Args:
        instance: CreativeAsset instance
        filename: Original filename
        
    Returns:
        str: Upload path
    r   r   zassets/r   N)r   r   r   r   creativer   
asset_typer   r   r   r   asset_upload_path@   s   
r#   c                 C   N   | j dkr	tdg d}| jdd  }||vr%tdd| dS )	zValidate video file format and size.
    
    Args:
        value: File field value
        
    Raises:
        ValidationError: If file is invalid
    i  @z$Video file size cannot exceed 500MB.)Zmp4ZaviZmovZwmvZflvZwebmZmkvr   r   zInvalid video format. Allowed: , Nsizer
   namer   lowerjoinvalueZvalid_extensionsr   r   r   r   validate_video_fileO      
	r-   c                 C   r$   )	zValidate audio file format and size.
    
    Args:
        value: File field value
        
    Raises:
        ValidationError: If file is invalid
    i   z#Audio file size cannot exceed 50MB.)Zmp3ZwavZaacZoggZflacZm4ar   r   zInvalid audio format. Allowed: r%   Nr&   r+   r   r   r   validate_audio_filea   r.   r/   c                 C   r$   )	zValidate image file format and size.
    
    Args:
        value: File field value
        
    Raises:
        ValidationError: If file is invalid
    i   z#Image file size cannot exceed 10MB.)jpgjpegpnggifbmpZwebpsvgr   r   zInvalid image format. Allowed: r%   Nr&   r+   r   r   r   validate_image_files   r.   r6   c                
   @   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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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gZej	d*ed+ed,d-Z
ejd.ed/ed0d1Zej	d2eed3ed4d5Zej	d2eded6ed7d8Zejed.d.ed9ed:d;Zejed.d.eged<ed=d>Zejd.d.ed?ged@edAdBZejd.d.edCedDdEZej	d2d.edFedGdHZej	dId.edJedKdHZejeejdLedMedNdOZejed"edPedQdRZ ej!d.d.edSedTdEZ"ejdUedVedWdXZ#ejdUedYedZdXZ$ejdUed[ed\dXZ%ej&d]ed^ed_dXZ'ejd.d.ed`e(dagedbedcdBZ)G ddde deZ*dfdg Z+dhdi Z,e-djdk Z.e-dldm Z/e-dndo Z0dpdq Z1drds Z2dtdu Z3dvS )wCreativezMain creative entity model.
    
    Represents a creative asset with metadata, files, and processing status.
    Supports multiple formats, versions, and approval workflows.
    videoVideoaudioAudioimageImagebannerBanner
rich_mediaz
Rich MediainteractiveInteractivenativeZNativetextTextdraftDraftZpending_reviewzPending ReviewapprovedApprovedrejectedRejected
processing
ProcessingreadyZReadyarchivedArchived   Low   Normal   High   ZUrgent   Critical   zCreative Namez!Descriptive name for the creative
max_lengthverbose_name	help_textTDescriptionz$Detailed description of the creativeblankr]   r^      zCreative TypezType of creative contentr\   choicesr]   r^   zCreative StatuszCurrent status of the creativer\   rd   defaultr]   r^   zPrimary FilezMain creative file)	upload_tora   nullr]   r^   Z	ThumbnailzPreview thumbnail imagerg   ra   rh   
validatorsr]   r^   皙?zDuration (seconds)z Duration for video/audio contentra   rh   rj   r]   r^   File Size (bytes)zSize of the primary filera   rh   r]   r^   Z
Dimensionsz!Width x Height for visual contentr\   ra   r]   r^   
   zAspect RatiozAspect ratio (e.g., 16:9)	creativesr   zAssociated campaign	on_deleterelated_namer]   r^   PriorityzProcessing priority level)rd   rf   r]   r^   ZDeadlinez Deadline for creative completionr   ImpressionszTotal impressions servedrf   r]   r^   ClickszTotal clicks receivedConversionszTotal conversions attributedFZ	CompliantzPasses brand safety checks              Y@zCompliance Scorez%Brand safety compliance score (0-100)c                   @   sd   e Zd ZedZedZdZd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Creative.Metar7   	CreativesZcreatives_creative-created_atr(   campaigncreative_status)fieldscreative_typestatusprioritydeadlineis_compliantcompliance_scoreN)__name__
__module____qualname___r]   verbose_name_pluraldb_tableorderingr   Indexindexesr   r   r   r   Meta/  s    r   c                 C      | j  d|   dS Nz ())r(   Zget_creative_type_displayselfr   r   r   __str__;     zCreative.__str__c                 C   s   t dd| jidS )z%Get absolute URL for creative detail.zcreatives:creative_detailpk)kwargsN)r   r   r   r   r   r   get_absolute_url>  s   zCreative.get_absolute_urlc                 C      | j dkr| j| j  d S dS zCalculate click-through rate.r   d   rz   Nimpressionsclicksr   r   r   r   ctrB     
zCreative.ctrc                 C   r   zCalculate conversion rate.r   r   rz   Nr   conversionsr   r   r   r   conversion_rateI  r   zCreative.conversion_ratec                 C   s"   | j rt | j ko| jdkS dS )zCheck if creative is overdue.rN   FN)r   r   nowr   r   r   r   r   
is_overdueP  s   zCreative.is_overduec                 C   s"   | j rtj| j jd  S dS )zGet primary file extension.rQ    N)primary_fileospathsplitextr(   r)   r   r   r   r   get_file_extensionW  s   zCreative.get_file_extensionc                 C   sP   | j sdS dD ]}| j dk r| j dd|   S |  j d  _ q| j ddS )zGet human-readable file size.Unknown)BKBMBGBg      @z.1f z TBN)	file_size)r   unitr   r   r   get_file_size_display]  s   
zCreative.get_file_size_displayc                 C   sH   | j sdS t| j d }t| j d }|dkr| d|dS | dS )zGet human-readable duration.zN/A<   r   :02dsN)durationint)r   minutessecondsr   r   r   get_duration_displayh  s   
zCreative.get_duration_displayN)4r   r   r   __doc__r   ZCREATIVE_TYPESZCREATIVE_STATUSPRIORITY_LEVELSr   	CharFieldr(   	TextFielddescriptionr   r   	FileFieldr    r   
ImageFieldr6   Z	thumbnail
FloatFieldr   r   PositiveIntegerFieldr   Z
dimensionsZaspect_ratio
ForeignKeyr   CASCADEr~   r   DateTimeFieldr   r   r   r   BooleanFieldr   r   r   r   r   r   propertyr   r   r   r   r   r   r   r   r   r   r7      s$   



















		
	


r7   c                   @   s   e Zd ZdZejeejdededdZ	ej
ededdZejd	d
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dZG dd dZdd ZdS )CreativeVersionzjCreative version control model.
    
    Tracks different versions of a creative with change history.
    versionsr7   Associated creativerr   zVersion NumberzSequential version numberr]   r^   r   TzVersion NamezDescriptive version namero   zChanges Descriptionz&Description of changes in this versionzVersion FilezFile for this versionrg   r]   r^   FzCurrent Versionz"Is this the current active versionrw   c                   @   s.   e Zd ZedZedZdZdgZddgZdS )zCreativeVersion.MetazCreative VersionzCreative VersionsZcreatives_versionz-version_numberr!   version_numberN	r   r   r   r   r]   r   r   r   unique_togetherr   r   r   r   r         r   c                 C      | j j d| j S )Nz v)r!   r(   r   r   r   r   r   r        zCreativeVersion.__str__N)r   r   r   r   r   r   r7   r   r   r!   r   r   r   Zversion_namer   Zchanges_descriptionr   r    filer   
is_currentr   r   r   r   r   r   r   u  sF    r   c                   @   s$  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d
ededdZejdeededdZ	ej
ddededdZej
ddededdZejddedgededdZej
ddededdZejeededd Zejeed!ed"d ZG d#d$ d$Zd%d& Zd'S )(CreativeFormatzmCreative format specifications model.
    
    Defines different format requirements and specifications.
    r8   r9   r:   r;   r<   r=   r>   r?   r   zFormat Namez Name of the format specificationr[   rb   zFormat TypezType of formatrc   TzWidth (pixels)zRequired width in pixelsrn   zHeight (pixels)zRequired height in pixelsrk   zMax Duration (seconds)zMaximum allowed durationrl   zMax File Size (bytes)zMaximum allowed file sizezAllowed FormatszList of allowed file formatsrw   zRequired SpecificationszAdditional format requirementsc                   @   (   e Zd ZedZedZdZddgZdS )zCreativeFormat.MetazCreative FormatzCreative FormatsZcreatives_formatformat_typer(   Nr   r   r   r   r]   r   r   r   r   r   r   r   r     
    r   c                 C   r   r   )r(   Zget_format_type_displayr   r   r   r   r     r   zCreativeFormat.__str__N)r   r   r   r   r   ZFORMAT_TYPESr   r   r(   r   r   widthheightr   r   Zmax_durationZmax_file_size	JSONFieldlistZallowed_formatsdictZrequired_specsr   r   r   r   r   r   r     sn    



r   c                   @   s  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d
ededdZej	dededdZ
ejdeededdZejdededdZejdddegededdZejeededd Zejd!ed"ed#d ZG d$d% d%Zd&d' Zd(S ))CreativeTemplatezUCreative template model.
    
    Reusable templates for creating new creatives.
    r8   zVideo Templater>   zBanner Templater@   zRich Media TemplaterC   zNative Templater   zTemplate NamezName of the templater[   Tr_   zTemplate descriptionr`   rb   zTemplate TypezType of templaterc   z
templates/zTemplate FilezTemplate file or packager   ztemplates/previews/zPreview ImagezTemplate preview imageri   zTemplate VariableszConfigurable template variablesrw   r   zUsage Countz!Number of times template was usedc                   @   r   )zCreativeTemplate.MetazCreative TemplatezCreative TemplatesZcreatives_templatez-usage_countr(   Nr   r   r   r   r   r   3  r   r   c                 C   r   r   )r(   Zget_template_type_displayr   r   r   r   r   9  r   zCreativeTemplate.__str__N)r   r   r   r   r   ZTEMPLATE_TYPESr   r   r(   r   r   Ztemplate_typer   template_filer   r6   Zpreview_imager   r   	variablesr   Zusage_countr   r   r   r   r   r   r     s`    



	r   c                	   @   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ejeej	dededdZ
ejdeededdZejdededdZejeededdZejdded ed!d"Zejeed#ed$d%Zejd&ed'ed(d%ZG d)d* d*Zd+d, Zd-S ).CreativeAssetzfIndividual creative asset model.
    
    Represents individual files associated with a creative.
    r8   r9   r:   r;   r<   r=   subtitleZSubtitleZoverlayZOverlaylogoZLogo
backgroundZ
BackgroundZassetsr7   r   rr   rb   z
Asset TypezType of assetrc   r   z
Asset NamezName of the assetr[   z
Asset Filez
Asset filer   Trm   zSize of the asset filern   MetadatazAsset metadata and propertiesrw   rQ   zDisplay OrderzOrder for displaying assetsc                   @   s(   e Zd ZedZedZdZg dZdS )zCreativeAsset.MetazCreative AssetzCreative AssetsZcreatives_asset)r!   orderr(   Nr   r   r   r   r   r   {  r   r   c                 C   s   | j j d| j S Nz - )r!   r(   r   r   r   r   r     r   zCreativeAsset.__str__N)r   r   r   r   r   ZASSET_TYPESr   r   r7   r   r!   r   r"   r(   r   r#   r   r   r   r   r   metadatar   r   r   r   r   r   r   r   =  sf    







r   c                   @   s   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
ededdZ
ejeej	dededdZejdedededdZejdededdZejddededdZG dd dZdd Zd S )!CreativeApprovalzVCreative approval workflow model.
    
    Tracks approval process and decisions.
    pendingPendingrH   rI   rJ   rK   Zchanges_requestedzChanges RequestedZ	approvalsr7   zCreative being reviewedrr   Zcreative_reviewsZReviewerzUser reviewing the creativerb   zApproval StatuszCurrent approval statusre   TZCommentszReviewer comments and feedbackr`   zReviewed AtzWhen the review was completedrn   c                   @   &   e Zd ZedZedZdZdgZdS )zCreativeApproval.MetazCreative ApprovalzCreative ApprovalsZcreatives_approvalr}   Nr   r   r   r   r   r     
    
r   c                 C      | j j d|   S r   )r!   r(   Zget_approval_status_displayr   r   r   r   r     r   zCreativeApproval.__str__N)r   r   r   r   r   ZAPPROVAL_STATUSr   r   r7   r   r!   UserZreviewerr   Zapproval_statusr   commentsr   Zreviewed_atr   r   r   r   r   r   r     sR    



r   c                   @   s  e Zd ZdZejeejde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	ededdZejdde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edd  Zed!d" Zd#S )$CreativePerformancez\Creative performance tracking model.
    
    Stores performance metrics for creatives.
    performance_datar7   zCreative being trackedrr   DatezPerformance dater   r   rv   zNumber of impressionsrw   rx   zNumber of clicksry   zNumber of conversionsrp   rS   z0.00ZSpendzAmount spent)
max_digitsdecimal_placesrf   r]   r^   ZRevenuezRevenue generatedc                   @   s.   e Zd ZedZedZdZdgZddgZdS )zCreativePerformance.MetazCreative PerformanceZcreatives_performancez-dater!   dateNr   r   r   r   r   r     r   r   c                 C   r   r   )r!   r(   r   r   r   r   r   r     r   zCreativePerformance.__str__c                 C   r   r   r   r   r   r   r   r      r   zCreativePerformance.ctrc                 C   r   r   r   r   r   r   r   r     r   z#CreativePerformance.conversion_ratec                 C   s   | j dkrt| j| j  S dS )zCalculate return on ad spend.r   rz   N)spendfloatrevenuer   r   r   r   roas  r   zCreativePerformance.roasN)r   r   r   r   r   r   r7   r   r   r!   	DateFieldr   r   r   r   r   DecimalFieldr   r   r  r   r   r   r   r   r  r   r   r   r   r     sd    

r   c                   @   s   e Zd ZdZejddededdZejdededd	Z	ejd
dededdZ
ejeddededdZG dd dZdd ZdS )CreativeTagzXCreative tagging model.
    
    Provides tagging and categorization for creatives.
    2   TzTag NamezName of the tag)r\   uniquer]   r^   r_   zTag descriptionr`      z#007bffZColorzTag color (hex code))r\   rf   r]   r^   tagsr|   zTagged creatives)rt   ra   r]   r^   c                   @   r   )zCreativeTag.MetazCreative TagzCreative TagsZcreatives_tagr(   Nr   r   r   r   r   r   8  r   r   c                 C   s   | j S )N)r(   r   r   r   r   r   >  s   zCreativeTag.__str__N)r   r   r   r   r   r   r   r(   r   r   colorManyToManyFieldr7   rq   r   r   r   r   r   r   r    s8    r  c                   @   s  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
ededdZ
ejdedededdZejddededgededdZejddededdZejeededdZejeeded dZejded!ed"d#ZG d$d% d%Zd&d' Zd(S ))CreativeCompliancez\Creative compliance tracking model.
    
    Tracks brand safety and compliance checks.
    r   r   ZpassedZPassedfailedFailedwarningWarningZ
compliancer7   zCreative being checkedrr   rb   zCompliance StatuszOverall compliance statusre   Trz   r{   zBrand Safety ScorezBrand safety score (0-100)rl   rp   zContent Ratingz Content rating (G, PG, PG-13, R)ro   zDetected Issuesz"List of detected compliance issuesrw   zScan ResultszDetailed scan resultszLast Scannedz When compliance was last checked)auto_nowr]   r^   c                   @   s&   e Zd ZedZedZdZdgZdS )zCreativeCompliance.MetazCreative ComplianceZcreatives_compliancez-last_scannedNr   r   r   r   r   r     r   r   c                 C   r   r   )r!   r(   Zget_compliance_status_displayr   r   r   r   r     r   zCreativeCompliance.__str__N)r   r   r   r   r   ZCOMPLIANCE_STATUSr   OneToOneFieldr7   r   r!   r   Zcompliance_statusr   r   r   Zbrand_safety_scoreZcontent_ratingr   r   Zdetected_issuesr   Zscan_resultsr   Zlast_scannedr   r   r   r   r   r   r  B  sf    



r  c                   @   s  e Zd ZdZejeejd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eededdZejededgd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ededdZG dd  d Zd!d" Zed#d$ Zed%d& Zd'S )(CreativeVariantz]Creative A/B testing variant model.
    
    Manages different variants for A/B testing.
    Zvariantsr7   zBase creativerr   r   zVariant NamezName of the variantr[   Tr_   zVariant descriptionr`   zVariant FilezVariant creative filer   rz   r{   g      I@zTraffic Allocation (%)z&Percentage of traffic for this variant)rj   rf   r]   r^   r   rv   zVariant impressionsrw   rx   zVariant clicksry   zVariant conversionsc                   @   s0   e Zd ZedZedZdZddgZddgZdS )zCreativeVariant.MetazCreative VariantzCreative VariantsZcreatives_variantr!   variant_nameNr   r   r   r   r   r     s    r   c                 C   r   r   )r!   r(   r  r   r   r   r   r     r   zCreativeVariant.__str__c                 C   r   r   r   r   r   r   r   r     r   zCreativeVariant.ctrc                 C   r   r   r   r   r   r   r   r     r   zCreativeVariant.conversion_rateN)r   r   r   r   r   r   r7   r   r   r!   r   r  r   r   r   r    Zvariant_filer   r   r   Ztraffic_allocationr   r   r   r   r   r   r   r   r   r   r   r   r   r    sf    
r  ).r   r   r   decimalr   r   r   	django.dbr   django.contrib.authr   django.core.validatorsr   r   r	   django.core.exceptionsr
   django.utils.translationr   r   django.utilsr   django.urlsr   Zapps.common.modelsr   r   r   apps.campaigns.modelsr   r   r    r#   r-   r/   r6   r7   r   r   r   r   r   r   r  r  r  r   r   r   r   <module>   s>     q6MEH<U,H