U
    hN                     @   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m	Z	 ddl
mZ ddlmZ dd	lmZ d
dlmZmZ e 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 )a  
Adtlas Activities Filters

This module contains Django Filter classes for the activities app,
providing comprehensive filtering capabilities for activity tracking,
analytics, and reporting functionality.

Features:
    - Advanced activity filtering
    - Date range filtering
    - User and category filtering
    - Performance-based filtering
    - Custom filter methods
    - Search functionality

Author: Adtlas Development Team
Version: 1.0.0
Last Updated: 2025-01-27
    N)forms)Q)timezone)datetime	timedelta)get_user_model)ContentType)gettext_lazy   )ActivityActivityCategoryc                
   @   sd  e Zd ZdZejej e	j
eddZejddeddZejejjdd	ed
eddZejdejjdd	e	j
eddZejejededdZejdeje	j
eddZeje	jdedfdedfdedfgded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ejed.ed/ed0d1Zejd2d3e	j d4d5id6ed7d8Z!ejd2d9e	j d4d5id6ed:d8Z"ej#d2d;e	j$d4d<id6ed=d8Z%ej#d2d>e	j$d4d<id6ed?d8Z&d@edAfdBedCfdDedEfdFedGfgZ'eje'dHedIedJd1Z(ej)dKdLedMdZ*ej)dKdNedOdZ+ejdedPdQZ,eje-j edRedSdZ.ejdTe	jdedfdedUfdedVfgdedWdXZ/ejdYedZe	j0d[ed\id6d]Z1ejd^e	jdedfded_fded`fgdedadXZ2ejdedbdQZ3G dcdd ddZ4dedf Z5dgdh Z6didj Z7dkdl Z8dmdn Z9doS )pActivityFiltera  
    Comprehensive filter set for Activity model.
    
    This filter provides advanced filtering capabilities for activities
    including date ranges, user filtering, category filtering, success status,
    performance metrics, and search functionality.
    
    Filters:
        - user: Filter by specific user or multiple users
        - category: Filter by activity category
        - action: Filter by activity action
        - is_successful: Filter by success status
        - date_range: Predefined date range filters
        - date_from/date_to: Custom date range
        - duration_range: Filter by duration ranges
        - ip_address: Filter by IP address
        - content_type: Filter by related object type
        - search: Full-text search across multiple fields
    Users)querysetwidgetlabeluser__email	icontainsz
User Email)
field_namelookup_exprr   T	is_activeAll CategoriesCategoryr   empty_labelr   category
Categoriesr   r   r   r   All ActionsActionchoicesr   r   actionActionsr   r"   r   r    All
SuccessfulFFailedr"   Statusr   r   todayToday	yesterday	Yesterdaylast_7_dayszLast 7 dayslast_30_dayszLast 30 days	this_weekz	This week
this_monthz
This month
last_monthz
Last month	this_yearz	This yearfilter_date_rangeAll Time
Date Ranger"   methodr   r   
created_at	date__gtetypedateattrs	From Dater   r   r   r   	date__lteTo Date	time__gtetimez	From TimeZ	time__ltezTo TimefastzFast (< 1s)normalzNormal (1-5s)slowzSlow (5-30s)	very_slowzVery Slow (> 30s)filter_duration_rangezAll DurationszDuration Rangeduration_msgtezMin Duration (ms)ltezMax Duration (ms)z
IP Addressr   r   zAll Object TypeszObject Typefilter_has_errorWith ErrorsWithout Errorsz	Has Error)r;   r   r   filter_searchSearchplaceholderz-Search in description, user, error message...r;   r   r   filter_has_metadatazWith MetadatazWithout MetadatazHas MetadatazSession Keyc                   @   s   e Zd ZeZdgdgdZdS )ActivityFilter.Metaexactr   )	object_id
user_agentN__name__
__module____qualname__r   modelfields rc   rc   2/var/www/html/Focus/src/apps/activities/filters.pyMeta   s   re   c                 C   s  |s|S t  }| }|dkr,|j|dS |dkrN|tdd }|j|dS |dkrp|tdd }|j|dS |d	kr|td
d }|j|dS |dkr| }	|t|	d }
|j|
dS |dkr|jdd}|j|dS |dkrX|jdkr |j|jd ddd}|jddtdd }n*|j|jd dd}|jddtdd }|j||dS |dkr||jddd}|j|dS |S )  
        Filter activities by predefined date ranges.
        
        Args:
            queryset: Base queryset
            name: Filter field name
            value: Selected date range
        
        Returns:
            QuerySet: Filtered queryset
        r-   )created_at__dater/   r
   )daysr1      )created_at__date__gter2      r3   r4   )dayr5      )yearmonthrl   )ro   rl   )rj   created_at__date__lter6   )	r   nowr?   filterr   weekdayreplacero   rn   )selfr   namevaluerq   r-   r/   week_ago	month_agodays_since_monday
week_startmonth_startZlast_month_startZlast_month_end
year_startrc   rc   rd   r7      sH    

 ActivityFilter.filter_date_rangec                 C   sl   |s|S |j dd}|dkr(|jddS |dkr>|jdddS |d	krT|jdd
dS |dkrh|jd
dS |S )a  
        Filter activities by duration ranges.
        
        Args:
            queryset: Base queryset
            name: Filter field name
            value: Selected duration range
        
        Returns:
            QuerySet: Filtered queryset
        T)duration_ms__isnullrH     duration_ms__ltrI     )duration_ms__gter   rJ   i0u  rK   )r   )excluderr   ru   r   rv   rw   rc   rc   rd   rL   .  s    z$ActivityFilter.filter_duration_rangec                 C   sB   |dkr|S |r$|j ddj ddS |tddtddB S dS )a  
        Filter activities by error presence.
        
        Args:
            queryset: Base queryset
            name: Filter field name
            value: Boolean indicating error presence
        
        Returns:
            QuerySet: Filtered queryset
        Nr&   Zerror_message__exactTZerror_message__isnullr   rr   r   r   rc   rc   rd   rQ   N  s
    zActivityFilter.filter_has_errorc                 C   sB   |dkr|S |r$|j ddj i dS |tddti dB S dS )a  
        Filter activities by metadata presence.
        
        Args:
            queryset: Base queryset
            name: Filter field name
            value: Boolean indicating metadata presence
        
        Returns:
            QuerySet: Filtered queryset
        NT)Zmetadata__isnull)Zmetadata__exactr   r   rc   rc   rd   rX   b  s
    z"ActivityFilter.filter_has_metadatac                 C   s   |s|S |  }t }|D ]f}t|dt|dB t|dB t|dB t|dB t|dB t|dB t|dB }|r|||M }q|}q||S )	a  
        Perform full-text search across multiple fields.
        
        Args:
            queryset: Base queryset
            name: Filter field name
            value: Search query
        
        Returns:
            QuerySet: Filtered queryset
        description__icontains)user__email__icontains)user__first_name__icontains)user__last_name__icontains)Zerror_message__icontains)Zcategory__name__icontains)Zip_address__icontains)Zuser_agent__icontains)splitr   rr   )ru   r   rv   rw   search_termsZsearch_querytermZ
term_queryrc   rc   rd   rT   v  s2    
zActivityFilter.filter_searchN):r^   r_   r`   __doc__django_filtersModelMultipleChoiceFilterUserobjectsallr   CheckboxSelectMultiple_user
CharFilter
user_emailModelChoiceFilterr   rr   r   category_multipleChoiceFilterr   ACTION_CHOICESr#   MultipleChoiceFilteraction_multipleBooleanFilterSelectis_successfulDATE_RANGE_CHOICES
date_range
DateFilter	DateInput	date_fromdate_to
TimeFilter	TimeInputZ	time_fromZtime_toZDURATION_CHOICESZduration_rangeNumberFilterZduration_minZduration_max
ip_addressr   content_type	has_error	TextInputsearchZhas_metadatasession_keyre   r7   rL   rQ   rX   rT   rc   rc   rc   rd   r   $   s$  










	






 	



? r   c                   @   s   e Zd ZdZejdeddZejdeddZej	e
jdedfded	fd
edfgdeddZejdede
jdediddZG dd dZdd ZdS )ActivityCategoryFiltera  
    Filter set for ActivityCategory model.
    
    This filter provides filtering capabilities for activity categories
    including name search, status filtering, and ordering options.
    
    Filters:
        - name: Filter by category name
        - code: Filter by category code
        - is_active: Filter by active status
        - search: Full-text search across name and description
    r   NamerP   ZCoder&   r'   TZActiveFZInactiver*   r+   r,   rT   rU   rV   z$Search in name, code, description...r@   rW   c                   @   s   e Zd ZeZdddgZdS )zActivityCategoryFilter.Metarv   coder   N)r^   r_   r`   r   ra   rb   rc   rc   rc   rd   re     s   re   c                 C   s,   |s|S | t|dt|dB t|dB S )a  
        Perform full-text search across category fields.
        
        Args:
            queryset: Base queryset
            name: Filter field name
            value: Search query
        
        Returns:
            QuerySet: Filtered queryset
        )Zname__icontains)Zcode__icontainsr   )rr   r   r   rc   rc   rd   rT     s    z$ActivityCategoryFilter.filter_searchN)r^   r_   r`   r   r   r   r   rv   r   r   r   r   r   r   r   re   rT   rc   rc   rc   rd   r     s6   


	 r   c                   @   s   e Zd ZdZejejjdde	de	ddZ
ejeje	de	dd	Zejejd
e	dfde	dfde	dfgde	ddZejejde	de	ddZejdde	dejde	diddZG dd dZdd  Zd!S )"r   a  
    Specialized filter for user-specific activity views.
    
    This filter provides filtering capabilities specifically designed
    for user activity dashboards and personal activity tracking.
    
    Filters:
        - category: Filter by activity category
        - action: Filter by activity action
        - is_successful: Filter by success status
        - date_range: Predefined date range filters
        - search: Search in activity descriptions
    Tr   r   r   r   r   r    r!   r&   r'   r(   Fr)   r*   r+   r,   r7   r8   r9   r:   descriptionr   rU   rV   zSearch in descriptions...r@   )r   r   r   r   c                   @   s   e Zd ZeZdddgZdS )rY   r   r#   r   Nr]   rc   rc   rc   rd   re     s   re   c                 C   s   t  }||||S )rf   )r   r7   )ru   r   rv   rw   Zactivity_filterrc   rc   rd   r7     s    r~   N)r^   r_   r`   r   r   r   r   r   rr   r   r   r   r   r   r#   r   r   r   r   r   r   r   r   r   r   re   r7   rc   rc   rc   rd   r     sH   


	 	c                   @   s  e Zd ZdZejddejddideddZ	ejdd	ejddided
dZ
ejdejjddejeddZejdejjddejeddZejdejejedd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eded ed!d"ZG d#d$ d$Zd%d& Zd'S )(ActivityAnalyticsFiltera  
    Specialized filter for activity analytics and reporting.
    
    This filter provides advanced filtering capabilities specifically
    designed for analytics dashboards and reporting functionality.
    
    Filters:
        - date_from/date_to: Custom date range for analytics
        - category_multiple: Multiple category selection
        - user_multiple: Multiple user selection
        - action_multiple: Multiple action selection
        - performance_filter: Filter by performance metrics
    r<   r=   r>   r?   r@   rB   rC   rD   rE   r   Tr   r   r   r   r   r#   r$   r%   high_performancezHigh Performance (< 1s)medium_performancezMedium Performance (1-5s)low_performancezLow Performance (> 5s)with_errorsrR   without_errorsrS   filter_performancezAll PerformancezPerformance Filterr:   c                   @   s   e Zd ZeZg ZdS )zActivityAnalyticsFilter.MetaNr]   rc   rc   rc   rd   re   m  s   re   c                 C   s   |s|S |dkr|j ddS |dkr2|j dddS |dkrF|j ddS |d	krb|jd
djddS |dkr| td
dtddB S |S )a  
        Filter activities by performance criteria.
        
        Args:
            queryset: Base queryset
            name: Filter field name
            value: Selected performance filter
        
        Returns:
            QuerySet: Filtered queryset
        r   r   r   r   r   )r   Zduration_ms__lter   )Zduration_ms__gtr   r&   r   Tr   r   )rr   r   r   r   rc   rc   rd   r   q  s    z*ActivityAnalyticsFilter.filter_performanceN)r^   r_   r`   r   r   r   r   r   r   r   r   r   r   r   rr   r   r   r   Zuser_multipler   r   r   r   ZPERFORMANCE_CHOICESr   Zperformance_filterre   r   rc   rc   rc   rd   r   ,  sZ   




r   )r   r   djangor   django.db.modelsr   django.utilsr   r   r   django.contrib.authr   "django.contrib.contenttypes.modelsr   django.utils.translationr	   r   modelsr   r   r   	FilterSetr   r   r   rc   rc   rc   rd   <module>   s      ~CI