U
    Ghb                     @   sv  d Z ddlZddlmZ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 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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- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9 ddl:m;Z;m<Z<m=Z=m>Z> ddl?m@Z@ ddlAmBZBmCZC G dd de3ZDG dd de
eZEG dd  d e
eZFG d!d" d"e
eZGG d#d$ d$e(jHZIG d%d& d&e(jJZKG d'd( d(e(jHZLG d)d* d*e(jMZNe,d+ge-e1eBgd,d- ZOe,d.ge-e1gd/d0 ZPeed+gd1d2 ZQe,d+ge-e1eBgd5d3d4ZRdS )6a  
Adtlas Activities Views

This module contains the views for the activities app, providing comprehensive
activity tracking, monitoring, and reporting functionality through both
web interfaces and REST API endpoints.

Features:
    - Activity listing and filtering
    - Real-time activity feeds
    - Activity analytics and reporting
    - User activity dashboards
    - Activity search and export
    - Category management

Author: Adtlas Development Team
Version: 1.0.0
Last Updated: 2025-01-27
    N)datetime	timedelta)renderget_object_or_404)login_required)LoginRequiredMixin)JsonResponseHttpResponse)ListView
DetailViewTemplateView)require_http_methods)csrf_exempt)method_decorator)timezone)CountQAvgMaxMin)	Paginator)gettext_lazy)ContentType)genericsstatusfilters)api_viewpermission_classes)Response)IsAuthenticated)PageNumberPagination)DjangoFilterBackend)ActivityActivityCategoryActivitySummary)ActivitySerializerActivityCategorySerializerActivitySummarySerializerActivityCreateSerializer)ActivityFilter)CanViewActivitiesCanManageActivitiesc                   @   s$   e Zd ZdZdZdZdZdd ZdS )ActivityPaginationz
    Custom pagination class for activity listings.
    
    This pagination class provides configurable page sizes
    and includes additional metadata in the response.
       	page_sized   c                 C   s6   t |  |  d| jjj| j| jjj| jj|dS )z
        Return a paginated response with additional metadata.
        
        Args:
            data: Serialized data for the current page
        
        Returns:
            Response: Paginated response with metadata
        )nextprevious)linkscountr.   total_pagescurrent_pageresults)	r   Zget_next_linkZget_previous_linkpage	paginatorr3   r.   	num_pagesnumber)selfdata r=   0/var/www/html/Focus/src/apps/activities/views.pyget_paginated_responseA   s    
z)ActivityPagination.get_paginated_responseN)__name__
__module____qualname____doc__r.   Zpage_size_query_paramZmax_page_sizer?   r=   r=   r=   r>   r,   6   s
   r,   c                       s8   e Zd ZdZeZdZdZdZdd Z	 fddZ
  ZS )	ActivityListViewa  
    Web view for listing activities with filtering and pagination.
    
    This view provides a web interface for browsing activities
    with advanced filtering, search, and export capabilities.
    
    Attributes:
        model: Activity model
        template_name: Template for rendering the view
        context_object_name: Name for the activities in template context
        paginate_by: Number of activities per page
    zactivities/activity_list.html
activitiesr-   c           	      C   st  t jdddd}| jjd}|r4|j|d}| jjd}|rR|j|d}| jjd}|rp|j|d}| jjd	}|d
k	r|j| dkd}| jjd}| jjd}|rz t	
|d }|j|d}W n tk
r   Y nX |r.z t	
|d }|j|d}W n tk
r,   Y nX | jjd}|rp|t|dt|dB t|dB t|dB }|S )z
        Get filtered and optimized queryset for activities.
        
        Returns:
            QuerySet: Filtered activities queryset
        usercategorycontent_type-created_atuser_id)category_idaction)rM   is_successfulNtruerN   	date_fromdate_to%Y-%m-%dZcreated_at__date__gte)Zcreated_at__date__ltesearch)Zdescription__icontains)Zuser__email__icontains)Zuser__first_name__icontains)Zuser__last_name__icontains)r"   objectsselect_relatedorder_byrequestGETgetfilterlowerr   strptimedate
ValueErrorr   )	r;   querysetrK   rL   rM   rN   rQ   rR   rU   r=   r=   r>   get_querysetk   sZ      zActivityListView.get_querysetc              
      s   t  jf |}tjjdd|d< tj|d< | jj	dd| jj	dd| jj	dd| jj	d	d| jj	d
d| jj	dd| jj	ddd|d< | 
 }| |d< |jdd |d< |jdd |d< |S )z
        Add additional context data for the template.
        
        Args:
            **kwargs: Additional keyword arguments
        
        Returns:
            dict: Template context data
        T	is_active
categoriesactionsrF    rG   rM   rN   rQ   rR   rU   )rF   rG   rM   rN   rQ   rR   rU   Zcurrent_filterstotal_countrP   success_countFZfailure_count)superget_context_datar#   rV   r\   r"   ACTION_CHOICESrY   rZ   r[   rb   r3   )r;   kwargscontextra   	__class__r=   r>   rk      s     


z!ActivityListView.get_context_data)r@   rA   rB   rC   r"   modeltemplate_namecontext_object_namepaginate_byrb   rk   __classcell__r=   r=   ro   r>   rD   X   s   :rD   c                   @   s$   e Zd ZdZeZdZdZdd ZdS )ActivityDetailViewa|  
    Web view for displaying detailed activity information.
    
    This view shows comprehensive details about a specific activity
    including metadata, related objects, and context information.
    
    Attributes:
        model: Activity model
        template_name: Template for rendering the view
        context_object_name: Name for the activity in template context
    zactivities/activity_detail.htmlactivityc                 C   s   t jdddS )z
        Get optimized queryset for activity detail.
        
        Returns:
            QuerySet: Optimized activities queryset
        rF   rG   rH   )r"   rV   rW   r;   r=   r=   r>   rb      s
      zActivityDetailView.get_querysetN)	r@   rA   rB   rC   r"   rq   rr   rs   rb   r=   r=   r=   r>   rv      s
   rv   c                       s4   e Zd ZdZdZ fddZdd Zdd Z  ZS )	ActivityDashboardViewa  
    Web view for activity analytics dashboard.
    
    This view provides a comprehensive dashboard with activity
    statistics, charts, and analytics for monitoring system usage.
    
    Attributes:
        template_name: Template for rendering the dashboard
    zactivities/dashboard.htmlc              	      sR  t  jf |}t }| }|tdd }|tdd }|tdd }tj tjj	|d tjj	|d tjj	|d tjj	|d | 
 tjj	|dd  d|d	< tjj	|dd
djtddddd |d< tjj	|ddjtddddd |d< tjddddd |d< | d|d< |S )z
        Add dashboard data to the template context.
        
        Args:
            **kwargs: Additional keyword arguments
        
        Returns:
            dict: Template context data with dashboard statistics
           days      created_at__daterT   rF   )total_activitiesZtoday_activitiesZyesterday_activitiesZweek_activitiesZmonth_activitiessuccess_rateZactive_users_todaystatscategory__namecategory__coloridr3   -countN
   Ztop_categoriesrM   top_actionsrG   rI      Zrecent_activitiesZactivity_trends)rj   rk   r   nowr_   r   r"   rV   r3   r\   _calculate_success_ratevaluesdistinctannotater   rX   rW   _get_activity_trends)r;   rm   rn   r   today	yesterdayZweek_agoZ	month_agoro   r=   r>   rk      sf    


 
	
 
z&ActivityDashboardView.get_context_datac                 C   s4   t j }|dkrdS t jjdd }|| d S )z
        Calculate overall success rate for activities.
        
        Returns:
            float: Success rate as a percentage
        r   g        TrP   r/   )r"   rV   r3   r\   )r;   total
successfulr=   r=   r>   r   -  s
    
z-ActivityDashboardView._calculate_success_ratec                 C   s   t   }|t|d }tjj|djddiddj	t
ddd}dd	 |D }g }|}||kr||d
||dd |tdd7 }qb|S )z
        Get activity trends for the specified number of days.
        
        Args:
            days (int): Number of days to analyze
        
        Returns:
            list: List of daily activity counts
        r{   rT   dayzdate(created_at)selectr   r   c                 S   s   i | ]}|d  |d qS )r   r3   r=   ).0itemr=   r=   r>   
<dictcomp>R  s      z>ActivityDashboardView._get_activity_trends.<locals>.<dictcomp>rS   r   r_   r3   rz   )r   r   r_   r   r"   rV   r\   extrar   r   r   rX   appendstrftimer[   )r;   r|   end_date
start_dateZdaily_countsZcounts_dicttrendscurrent_dater=   r=   r>   r   ;  s.    
	
z*ActivityDashboardView._get_activity_trends)	r@   rA   rB   rC   rr   rk   r   r   ru   r=   r=   ro   r>   ry      s
   
:ry   c                   @   s   e Zd ZdZejdddZeZ	e
egZeZeejejgZeZddddgZd	d
ddgZdgZdd Zdd Zdd Zdd ZdS )ActivityListAPIViewan  
    REST API view for listing and creating activities.
    
    This view provides REST API endpoints for retrieving activities
    with filtering, pagination, and search capabilities, as well as
    creating new activity records.
    
    Permissions:
        - List: IsAuthenticated + CanViewActivities
        - Create: IsAuthenticated + CanManageActivities
    rF   rG   rH   descriptionuser__emailZuser__first_nameZuser__last_name
created_atrM   rN   duration_msrI   c                 C   s   | j jdkrtS tS )z
        Return appropriate serializer class based on action.
        
        Returns:
            Serializer class for the current action
        POST)rY   methodr(   r%   rx   r=   r=   r>   get_serializer_classy  s    z(ActivityListAPIView.get_serializer_classc                 C   s$   | j jdkrt t gS t t gS 
        Return appropriate permissions based on action.
        
        Returns:
            list: Permission instances for the current action
        r   rY   r   r   r+   r*   rx   r=   r=   r>   get_permissions  s    z#ActivityListAPIView.get_permissionsc                 C   sd   |j ds|  |j d< |j ds<| jjdd|j d< |j dsX| jjj|j d< |  dS )z
        Perform activity creation with additional context.
        
        Args:
            serializer: Activity serializer instance
        
ip_address
user_agentHTTP_USER_AGENTrg   session_keyN)validated_datar[   _get_client_iprY   METAsessionr   save)r;   
serializerr=   r=   r>   perform_create  s    z"ActivityListAPIView.perform_createc                 C   s4   | j jd}|r"|dd }n| j jd}|S )zr
        Get client IP address from request.
        
        Returns:
            str: Client IP address
        HTTP_X_FORWARDED_FOR,r   REMOTE_ADDR)rY   r   r[   split)r;   x_forwarded_foripr=   r=   r>   r     s
    z"ActivityListAPIView._get_client_ipN)r@   rA   rB   rC   r"   rV   rW   ra   r%   serializer_classr   r*   r   r,   pagination_classr!   r   SearchFilterOrderingFilterfilter_backendsr)   filterset_classsearch_fieldsordering_fieldsorderingr   r   r   r   r=   r=   r=   r>   r   b  s   r   c                   @   s4   e Zd ZdZejdddZeZ	e
egZdd ZdS )ActivityDetailAPIViewaW  
    REST API view for retrieving, updating, and deleting activities.
    
    This view provides REST API endpoints for detailed activity
    operations including retrieval, updates, and deletion.
    
    Permissions:
        - Retrieve: IsAuthenticated + CanViewActivities
        - Update/Delete: IsAuthenticated + CanManageActivities
    rF   rG   rH   c                 C   s$   | j jdkrt t gS t t gS )r   )PUTPATCHDELETEr   rx   r=   r=   r>   r     s    z%ActivityDetailAPIView.get_permissionsN)r@   rA   rB   rC   r"   rV   rW   ra   r%   r   r   r*   r   r   r=   r=   r=   r>   r     s
   r   c                   @   sT   e Zd ZdZejjddZeZ	e
gZejejgZdddgZddgZdgZdd	 Zd
S )ActivityCategoryListAPIViewa/  
    REST API view for listing and creating activity categories.
    
    This view provides REST API endpoints for managing activity
    categories with filtering and search capabilities.
    
    Permissions:
        - List: IsAuthenticated
        - Create: IsAuthenticated + CanManageActivities
    Trc   namecoder   r   c                 C   s    | j jdkrt t gS t gS r   )rY   r   r   r+   rx   r=   r=   r>   r     s    z+ActivityCategoryListAPIView.get_permissionsN)r@   rA   rB   rC   r#   rV   r\   ra   r&   r   r   r   r   r   r   r   r   r   r   r   r=   r=   r=   r>   r     s   
r   c                   @   sL   e Zd ZdZejddZeZ	e
egZeejgZdddgZddgZdgZdS )ActivitySummaryListAPIViewa  
    REST API view for listing activity summaries.
    
    This view provides REST API endpoints for retrieving activity
    summaries with filtering and aggregation capabilities.
    
    Permissions:
        - List: IsAuthenticated + CanViewActivities
    rF   rG   r_   r   z-dateN)r@   rA   rB   rC   r$   rV   rW   ra   r'   r   r   r*   r   r!   r   r   r   filterset_fieldsr   r   r=   r=   r=   r>   r     s   


r   rZ   c              	   C   s  t | jdd}t  }|t|d }tjj	|d}|
 }|j	dd
 }|j	dd
 }|d 
 }|d	 
 }	|j	dd
jtdtdtdd}
|ddjtddd}|djtddd}g }|}||kr,|j	|d
 }||d|d |tdd7 }q|j	|tdd djddiddjtddd}t|d|d|d||||dkr|| d nd||	d|
d |
d  |
d! d"t|t|t|d#d$|id%S )&a.  
    REST API endpoint for activity statistics.
    
    This endpoint provides comprehensive activity statistics
    including counts, trends, and performance metrics.
    
    Args:
        request: Django request object
    
    Returns:
        Response: JSON response with activity statistics
    r|   r~   r{   rT   TrP   FrF   r   )duration_ms__isnullr   )avg_durationmin_durationmax_durationr   r   r   r   r   rM   r   rS   r   rz   r}   hourzextract(hour from created_at)r   )r   r   r|   r   r/   )r   successful_activitiesfailed_activitiesr   unique_users
unique_ipsr   r   r   )avg_duration_msmin_duration_msmax_duration_ms)by_category	by_actionZby_hourdaily)periodtotalsZperformanceZ
breakdownsr   )intrZ   r[   r   r   r_   r   r"   rV   r\   r3   r   r   	aggregater   r   r   r   r   rX   r   r   r   r   list)rY   r|   r   r   Zbase_querysetr   r   r   r   r   Zduration_statsZcategory_statsZaction_statsZdaily_trendsr   Z	day_countZhourly_statsr=   r=   r>   activity_statistics_api  s    	 

	 r   r   c                 C   s   z| j  }d|kr | jj|d< d|kr0d|d< tj| j|d|d|d| |dd|dd|d	i d
}t|}t|j t	j
dW S  tk
r } ztdt|it	jd W Y S d}~X Y nX dS )a0  
    REST API endpoint for logging activities.
    
    This is a convenience endpoint for quickly logging activities
    with minimal required data.
    
    Args:
        request: Django request object with activity data
    
    Returns:
        Response: JSON response with created activity data
    rF   rN   TrM   r   rG   error_messagerg   metadata)rF   rM   r   rG   rY   rN   r   r   )r   errorN)r<   copyrF   r   r"   log_activityr[   r%   r   r   HTTP_201_CREATED	ExceptionstrHTTP_400_BAD_REQUEST)rY   r<   rw   r   er=   r=   r>   log_activity_apih  s.    




r   c                 C   s   ddl }t }| |_| }tdd}d|d< ||}|ddd	d
dddddddg |dddD ]r}|t|j	|j
rt|j
nd| |jr|jjnd|j| |jpd|jrdnd|jpd|jd|jg qf|S )a  
    Export activities as CSV file.
    
    This view exports filtered activities as a CSV file
    for external analysis and reporting.
    
    Args:
        request: Django request object with filter parameters
    
    Returns:
        HttpResponse: CSV file response
    r   Nztext/csv)rH   z%attachment; filename="activities.csv"zContent-DispositionIDUserActionCategoryDescriptionzRelated Objectz
IP AddressSuccesszDuration (ms)z
Created AtzError MessagerF   rG   rH   	Anonymousrg   YesNoz%Y-%m-%d %H:%M:%S)csvrD   rY   rb   r	   writerwriterowrW   r   r   rF   get_action_displayrG   r   r   get_object_displayr   rN   r   r   r   r   )rY   r   viewra   responser   rw   r=   r=   r>   export_activities_csv  sF    

        
r  c                 C   sj   |r
|}n| j j}t| jdd}tjj|ddd	dd| }t
|dd	}t|t||jd
S )ac  
    REST API endpoint for user activity feed.
    
    This endpoint provides a real-time activity feed for a specific
    user or the current user if no user_id is provided.
    
    Args:
        request: Django request object
        user_id: Optional user ID for the feed
    
    Returns:
        Response: JSON response with user activity feed
    limitr   rJ   rG   rH   rI   NT)many)rK   r3   rE   )rF   r   r   rZ   r[   r"   rV   r\   rW   rX   r%   r   lenr<   )rY   rK   Ztarget_user_idr  rE   r   r=   r=   r>   user_activity_feed_api  s(     r  )N)SrC   jsonr   r   django.shortcutsr   r   django.contrib.auth.decoratorsr   django.contrib.auth.mixinsr   django.httpr   r	   django.views.genericr
   r   r   Zdjango.views.decorators.httpr   django.views.decorators.csrfr   django.utils.decoratorsr   django.utilsr   django.db.modelsr   r   r   r   r   django.core.paginatorr   django.utils.translationr   _"django.contrib.contenttypes.modelsr   rest_frameworkr   r   r   Zrest_framework.decoratorsr   r   rest_framework.responser   Zrest_framework.permissionsr   Zrest_framework.paginationr    Zdjango_filters.rest_frameworkr!   apps.activities.modelsr"   r#   r$   Z"apps.activities.api.v1.serializersr%   r&   r'   r(   Zapps.activities.filtersr)   Zapps.activities.permissionsr*   r+   r,   rD   rv   ry   ZListCreateAPIViewr   ZRetrieveUpdateDestroyAPIViewr   r   ZListAPIViewr   r   r   r  r  r=   r=   r=   r>   <module>   sZ   "q|O 
e04
