U
    h-                     @   s   d 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 ddlmZ dd	lmZ d
dlmZmZmZ eeG dd dejZeeG dd dejZeeG dd dejZG dd dejZdS )ab  
Django Admin Configuration for Activities App

This module provides comprehensive Django admin interface configuration for
the Activities app models, including Activity, ActivityCategory, and ActivitySummary.

Features:
    - Activity management with advanced filtering and search
    - Category administration with hierarchical display
    - Activity summary and analytics
    - Bulk actions for activity management
    - Custom admin actions for monitoring
    - Export functionality for reporting
    - Real-time activity monitoring

Author: Adtlas Development Team
Version: 2.0.0
Last Updated: 2025-07-15
    )admin)format_html)gettext_lazy)reverse)	mark_safe)CountQ)timezone)	timedelta   )ActivityCategoryActivityActivitySummaryc                   @   s   e Zd ZdZdZdZdZdZdddifeddd	ifed
ddifeddddfeddddffZ	dd Z
de
_dd Zde_dd Zde_ddgZdd Zde_dd  Zd!e_dS )"ActivityCategoryAdminz%ActivityCategory admin configuration.)namecodeget_color_displayget_icon_display	is_active	is_systemget_activities_count
created_at)r   r   r   )r   r   descriptionr   
updated_atNfieldsZ
Appearance)coloriconZConfiguration)r   r   retention_daysZ	Hierarchy)parentcollapser   classes
Timestampsc                 C   s   t d|j|jS )zDisplay color with preview.zb<span style="background-color: {}; padding: 2px 10px; border-radius: 3px; color: white;">{}</span>)r   r   selfobj r(   0/var/www/html/Focus/src/apps/activities/admin.pyr   C   s
     z'ActivityCategoryAdmin.get_color_displayZColorc                 C   s   t d|j|jS )zDisplay icon with preview.z<i class="{}"></i> {})r   r   r%   r(   r(   r)   r   K   s
     z&ActivityCategoryAdmin.get_icon_displayZIconc                 C   s
   |j  S )z)Get count of activities in this category.)
activitiescountr%   r(   r(   r)   r   S   s    z*ActivityCategoryAdmin.get_activities_countzActivities Countactivate_categoriesdeactivate_categoriesc                 C   s"   |j dd}| || d dS )z#Bulk action to activate categories.Tr   z# categories activated successfully.Nupdatemessage_userr&   requestquerysetupdatedr(   r(   r)   r,   Z   s    z)ActivityCategoryAdmin.activate_categorieszActivate selected categoriesc                 C   s"   |j dd}| || d dS )z%Bulk action to deactivate categories.Fr.   z% categories deactivated successfully.Nr/   r2   r(   r(   r)   r-   `   s    z+ActivityCategoryAdmin.deactivate_categorieszDeactivate selected categories)__name__
__module____qualname____doc__list_displaylist_filtersearch_fieldsreadonly_fields_	fieldsetsr   short_descriptionr   r   actionsr,   r-   r(   r(   r(   r)   r   "   sD   
  r   c                	       s   e Zd ZdZdZdZdZdZdZddd	ife	d
dddfe	ddddfe	dddife	ddddfe	ddddffZ
dd Zde_ fddZdddgZdd Zd e_d!d" Zd#e_d$d% Zd&e_  ZS )'ActivityAdminzActivity admin configuration.)useractioncategoryget_description_shortis_successfulr   duration_ms)rD   rE   rG   r   request_methodZuser__is_staff)user__emailuser__usernamer   
ip_addressrequest_path)idr   r   content_type	object_idr   Nr   )rC   rD   rE   r   zRequest Info)rL   
user_agentsession_keyrM   rI   r    r"   zContent Object)rO   rP   Status)rG   error_messagerH   Metadata)metadatar$   r   c                 C   s0   |j r,t|j dkr&|j dd d S |j S dS )zDisplay shortened description.2   Nz...zNo description)r   lenr%   r(   r(   r)   rF      s    &z#ActivityAdmin.get_description_shortDescriptionc                    s   t  |dddS )&Optimize queryset with select_related.rC   rE   rO   superget_querysetselect_relatedr&   r3   	__class__r(   r)   r]      s    zActivityAdmin.get_querysetmark_as_successfulmark_as_failedexport_activitiesc                 C   s"   |j dd}| || d dS )z-Bulk action to mark activities as successful.TrG   z! activities marked as successful.Nr/   r2   r(   r(   r)   rb      s    z ActivityAdmin.mark_as_successfulz&Mark selected activities as successfulc                 C   s"   |j dd}| || d dS )z)Bulk action to mark activities as failed.Fre   z activities marked as failed.Nr/   r2   r(   r(   r)   rc      s    zActivityAdmin.mark_as_failedz"Mark selected activities as failedc                 C   s   ddl }ddlm} |dd}d|d< ||}|dd	d
dddddg |D ]F}||jrd|jjnd|j|jrx|jj	nd|j
|j|j|j|jg qN|S )zExport activities to CSV.r   N)HttpResponseztext/csv)rO   z%attachment; filename="activities.csv"zContent-DispositionUserActionZCategoryrY   z
IP AddresszIs Successfulz
Created AtzDuration (ms)SystemNone)csvdjango.httprf   writerwriterowrC   emailrD   rE   r   r   rL   rG   r   rH   )r&   r3   r4   rk   rf   responserm   activityr(   r(   r)   rd      s6    

      zActivityAdmin.export_activitiesz!Export selected activities to CSV)r6   r7   r8   r9   r:   r;   r<   r=   date_hierarchyr>   r?   rF   r@   r]   rA   rb   rc   rd   __classcell__r(   r(   r`   r)   rB   g   sR     
rB   c                       s   e Zd ZdZdZdZdZdZdZddd	ife	d
ddife	ddddfe	ddddfe	ddddffZ
dd Zde_dd Zde_dd Zde_dd Zde_ fdd Zd!gZd"d# Zd$e_  ZS )%ActivitySummaryAdminz$ActivitySummary admin configuration.)daterE   get_total_activitiesget_successful_activitiesget_failed_activitiesget_success_rater   )ru   rE   r   )Zcategory__nameru   r   ru   Nr   )ru   rE   Z
Statistics)total_activitiessuccessful_activitiesfailed_activitiesZunique_usersZ
unique_ipsZPerformance)Zavg_duration_msZmax_duration_msZmin_duration_msr    r"   ZDetails)Ztop_actionsZ	top_usersZsummary_datar$   c                 C   s   t d|jS )z)Display total activities with formatting.z<strong>{}</strong>)r   rz   r%   r(   r(   r)   rv      s    z)ActivitySummaryAdmin.get_total_activitiesZTotalc                 C   s   t d|jS )z/Display successful activities with green color.z%<span style="color: green;">{}</span>)r   r{   r%   r(   r(   r)   rw     s    z.ActivitySummaryAdmin.get_successful_activitiesZ
Successfulc                 C   s   t d|jS )z)Display failed activities with red color.z#<span style="color: red;">{}</span>)r   r|   r%   r(   r(   r)   rx   
  s    z*ActivitySummaryAdmin.get_failed_activitiesZFailedc                 C   sF   |j dkrB|j|j  d }|dkr&dn|dkr2dnd}td||S d	S )
z#Calculate and display success rate.r   d   Z   greenF   Zorangeredz'<span style="color: {};">{:.1f}%</span>zN/A)rz   r{   r   )r&   r'   rater   r(   r(   r)   ry     s    
 z%ActivitySummaryAdmin.get_success_ratezSuccess Ratec                    s   t  |dS )rZ   rE   r[   r_   r`   r(   r)   r]     s    z!ActivitySummaryAdmin.get_querysetregenerate_summariesc                 C   s    |  }| |d| d dS )zRegenerate activity summaries.zRegeneration queued for z summaries.N)r+   r1   )r&   r3   r4   r+   r(   r(   r)   r   $  s    z)ActivitySummaryAdmin.regenerate_summarieszRegenerate selected summaries)r6   r7   r8   r9   r:   r;   r<   r=   rr   r>   r?   rv   r@   rw   rx   ry   r]   rA   r   rs   r(   r(   r`   r)   rt      sH   
 
rt   c                       s"   e Zd ZdZd fdd	Z  ZS )ActivityDashboardViewz%Custom dashboard view for activities.Nc                    s   |pi }t  }|jddddd}|tdd }|tjj|d tjj|d tjj|dd tjj|d	dj
td	d
ddd d t j||dS )z,Add dashboard statistics to changelist view.r   )hourminutesecondmicrosecond   )days)created_at__gteF)r   rG   rJ   rN   )r+   z-countN   )Zactivities_todayZactivities_weekZfailed_activities_todayZtop_users_today)extra_context)r	   nowreplacer
   r0   r   objectsfilterr+   valuesannotater   order_byr\   changelist_view)r&   r3   r   r   Ztoday_start
week_startr`   r(   r)   r   0  s0     z%ActivityDashboardView.changelist_view)N)r6   r7   r8   r9   r   rs   r(   r(   r`   r)   r   -  s   r   N)r9   Zdjango.contribr   django.utils.htmlr   django.utils.translationr   r>   django.urlsr   django.utils.safestringr   django.db.modelsr   r   django.utilsr	   datetimer
   modelsr   r   r   register
ModelAdminr   rB   rt   r   r(   r(   r(   r)   <module>   s    DkY