U
    h`S                     @   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m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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d Zdd ZdS )a  
Adtlas Activities Permissions

This module contains custom permission classes for the activities app,
providing fine-grained access control for activity tracking, monitoring,
and management functionality.

Features:
    - Role-based access control
    - Object-level permissions
    - Activity viewing permissions
    - Activity management permissions
    - User-specific activity access
    - Admin and superuser overrides

Author: Adtlas Development Team
Version: 1.0.0
Last Updated: 2025-01-27
    )permissions
PermissionContentType)gettext_lazy   )ActivityActivityCategoryc                   @   s(   e Zd ZdZedZdd Zdd ZdS )CanViewActivitiesa  
    Permission class for viewing activities.
    
    This permission allows users to view activities based on their role
    and specific permissions. Users can view their own activities by default,
    while viewing others' activities requires specific permissions.
    
    Rules:
        - Superusers: Can view all activities
        - Staff with 'view_activity' permission: Can view all activities
        - Regular users: Can only view their own activities
        - Anonymous users: No access
    z.You do not have permission to view activities.c                 C   sJ   |j r|j jsdS |j jrdS |j dr.dS |j jrF|j drFdS dS )a  
        Check if user has permission to view activities.
        
        Args:
            request: Django request object
            view: Django view object
        
        Returns:
            bool: True if user has permission, False otherwise
        FTactivities.view_activity)useris_authenticatedis_superuserhas_permis_staffselfrequestview r   6/var/www/html/Focus/src/apps/activities/permissions.pyhas_permission/   s    z CanViewActivities.has_permissionc                 C   sj   |j jrdS |j drdS |j |j kr,dS t|j drf|j j }|j rft|j drf|j j|krfdS dS )a,  
        Check if user has permission to view a specific activity.
        
        Args:
            request: Django request object
            view: Django view object
            obj: Activity object
        
        Returns:
            bool: True if user has permission, False otherwise
        Tr   managed_departments
departmentF)r   r   r   hasattrr   allr   )r   r   r   objZuser_departmentsr   r   r   has_object_permissionM   s    z'CanViewActivities.has_object_permissionN__name__
__module____qualname____doc___messager   r   r   r   r   r   r      s   r   c                   @   s(   e Zd ZdZedZdd Zdd ZdS )CanManageActivitiesa  
    Permission class for managing activities.
    
    This permission allows users to create, update, and delete activities
    based on their role and specific permissions.
    
    Rules:
        - Superusers: Can manage all activities
        - Staff with 'add_activity', 'change_activity', 'delete_activity': Can manage activities
        - Regular users: Can create activities and manage their own
        - Anonymous users: No access
    z0You do not have permission to manage activities.c                 C   st   |j r|j jsdS |j jrdS |jdkr<|j dp:|j jS |jdkrR|j dS |jdkrh|j dS |j dS )	a  
        Check if user has permission to manage activities.
        
        Args:
            request: Django request object
            view: Django view object
        
        Returns:
            bool: True if user has permission, False otherwise
        FTcreatezactivities.add_activityupdatepartial_updateactivities.change_activitydestroyactivities.delete_activityr   r   r   actionr   r   r   r   r   r      s    


z"CanManageActivities.has_permissionc                 C   sh   |j jrdS |jdkr.|j dp,|j |j kS |jdkr\|j dpZ|j |j koZ|j dS |j dS )a.  
        Check if user has permission to manage a specific activity.
        
        Args:
            request: Django request object
            view: Django view object
            obj: Activity object
        
        Returns:
            bool: True if user has permission, False otherwise
        Tr(   r+   r,   r-   )r   r   r/   r   r   r   r   r   r   r   r   r      s    


z)CanManageActivities.has_object_permissionNr   r   r   r   r   r&   o   s   #r&   c                   @   s(   e Zd ZdZedZdd Zdd ZdS )CanViewActivityCategoriesap  
    Permission class for viewing activity categories.
    
    This permission allows users to view activity categories based on
    their authentication status and role.
    
    Rules:
        - All authenticated users: Can view active categories
        - Staff with permissions: Can view all categories including inactive
        - Anonymous users: No access
    z7You do not have permission to view activity categories.c                 C   s   |j r|j jsdS dS )a  
        Check if user has permission to view activity categories.
        
        Args:
            request: Django request object
            view: Django view object
        
        Returns:
            bool: True if user has permission, False otherwise
        FT)r   r   r   r   r   r   r      s    z(CanViewActivityCategories.has_permissionc                 C   s   |j js|j jrdS |jS )a4  
        Check if user has permission to view a specific category.
        
        Args:
            request: Django request object
            view: Django view object
            obj: ActivityCategory object
        
        Returns:
            bool: True if user has permission, False otherwise
        T)r   r   r   	is_activer0   r   r   r   r      s    z/CanViewActivityCategories.has_object_permissionNr   r   r   r   r   r1      s   r1   c                   @   s    e Zd ZdZedZdd ZdS )CanManageActivityCategoriesa  
    Permission class for managing activity categories.
    
    This permission allows users to create, update, and delete activity
    categories based on their role and specific permissions.
    
    Rules:
        - Superusers: Can manage all categories
        - Staff with category permissions: Can manage categories
        - Regular users: No access
        - Anonymous users: No access
    z9You do not have permission to manage activity categories.c                 C   sl   |j r|j jsdS |j jrdS |jdkr4|j dS |jdkrJ|j dS |jdkr`|j dS |j dS )	a  
        Check if user has permission to manage activity categories.
        
        Args:
            request: Django request object
            view: Django view object
        
        Returns:
            bool: True if user has permission, False otherwise
        FTr'   zactivities.add_activitycategoryr(   z"activities.change_activitycategoryr,   z"activities.delete_activitycategoryr.   r   r   r   r   r   
  s    


z*CanManageActivityCategories.has_permissionNr    r!   r"   r#   r$   r%   r   r   r   r   r   r3      s   r3   c                   @   s    e Zd ZdZedZdd ZdS )CanViewActivityAnalyticsa  
    Permission class for viewing activity analytics.
    
    This permission allows users to access activity analytics and
    reporting functionality based on their role and permissions.
    
    Rules:
        - Superusers: Can view all analytics
        - Staff with analytics permissions: Can view analytics
        - Managers: Can view their team's analytics
        - Regular users: Can view their own analytics
        - Anonymous users: No access
    z6You do not have permission to view activity analytics.c                 C   sf   |j r|j jsdS |j jrdS |j dr.dS |j jrF|j drFdS t|j drb|j j rbdS dS )a
  
        Check if user has permission to view activity analytics.
        
        Args:
            request: Django request object
            view: Django view object
        
        Returns:
            bool: True if user has permission, False otherwise
        FTz"activities.view_activity_analyticsr   r   r   r   r   r   r   r   r   existsr   r   r   r   r   <  s    z'CanViewActivityAnalytics.has_permissionNr4   r   r   r   r   r5   +  s   r5   c                   @   s    e Zd ZdZedZdd ZdS )CanExportActivitiesa  
    Permission class for exporting activities.
    
    This permission allows users to export activity data based on
    their role and specific permissions.
    
    Rules:
        - Superusers: Can export all activities
        - Staff with export permissions: Can export activities
        - Managers: Can export their team's activities
        - Regular users: Can export their own activities
        - Anonymous users: No access
    z0You do not have permission to export activities.c                 C   sf   |j r|j jsdS |j jrdS |j dr.dS |j jrF|j drFdS t|j drb|j j rbdS dS )a  
        Check if user has permission to export activities.
        
        Args:
            request: Django request object
            view: Django view object
        
        Returns:
            bool: True if user has permission, False otherwise
        FTzactivities.export_activityr   r   r6   r   r   r   r   r   p  s    z"CanExportActivities.has_permissionNr4   r   r   r   r   r8   _  s   r8   c                   @   s(   e Zd ZdZedZdd Zdd ZdS )IsActivityOwnerOrReadOnlyaz  
    Permission class for activity ownership.
    
    This permission allows read access to all authenticated users
    but write access only to the activity owner or users with
    appropriate permissions.
    
    Rules:
        - Read access: All authenticated users (subject to other permissions)
        - Write access: Activity owner or users with change permissions
    z(You can only modify your own activities.c                 C   s*   |j r|j jsdS |jtjkr"dS |j jS )a  
        Check if user has permission for the requested action.
        
        Args:
            request: Django request object
            view: Django view object
        
        Returns:
            bool: True if user has permission, False otherwise
        FT)r   r   methodr   SAFE_METHODSr   r   r   r   r     s
    z(IsActivityOwnerOrReadOnly.has_permissionc                 C   s8   |j tjkrdS |jjrdS |jdr,dS |j|jkS )a(  
        Check if user has permission for the specific object.
        
        Args:
            request: Django request object
            view: Django view object
            obj: Activity object
        
        Returns:
            bool: True if user has permission, False otherwise
        Tr+   )r:   r   r;   r   r   r   r0   r   r   r   r     s    z/IsActivityOwnerOrReadOnly.has_object_permissionNr   r   r   r   r   r9     s   r9   c                   @   s    e Zd ZdZedZdd ZdS )CanAccessActivityDashboarda  
    Permission class for accessing activity dashboard.
    
    This permission controls access to the activity dashboard
    and monitoring interfaces.
    
    Rules:
        - Superusers: Full dashboard access
        - Staff with dashboard permissions: Dashboard access
        - Managers: Limited dashboard access for their teams
        - Regular users: Personal dashboard access
        - Anonymous users: No access
    z<You do not have permission to access the activity dashboard.c                 C   sZ   |j r|j jsdS |j jrdS |j dr.dS |j jr:dS t|j drV|j j rVdS dS )a  
        Check if user has permission to access the dashboard.
        
        Args:
            request: Django request object
            view: Django view object
        
        Returns:
            bool: True if user has permission, False otherwise
        FTz"activities.view_activity_dashboardr   r6   r   r   r   r   r     s    z)CanAccessActivityDashboard.has_permissionNr4   r   r   r   r   r<     s   r<   c            	   	   C   s   ddl m}  ddlm} |jt}|jt}dd|ddd|dd	d
|ddd|ddd|ddd|dg}g }|D ]8}| jj|d |d d|d id\}}|rx|	| qx|S )a  
    Create custom permissions for the activities app.
    
    This function creates additional permissions beyond the default
    Django model permissions for fine-grained access control.
    
    Returns:
        list: List of created permission objects
    r   r   r   view_activity_analyticszCan view activity analytics)codenamenamecontent_typeexport_activityzCan export activitiesview_activity_dashboardzCan view activity dashboardZmanage_activity_retentionz&Can manage activity retention policiesZview_all_user_activitieszCan view all user activitiesZmanage_activity_categorieszCan manage activity categoriesr>   r@   r?   )r>   r@   defaults)
django.contrib.auth.modelsr   "django.contrib.contenttypes.modelsr   objectsget_for_modelr	   r
   get_or_createappend)	r   r   Zactivity_ctZcategory_ctZcustom_permissionsZcreated_permissionsZ	perm_data
permissioncreatedr   r   r   create_activity_permissions  sN    
$

rL   c               
   C   s  ddl m} m} | jjdd\}}| jjdd\}}| jjdd\}}|jjdd}g g g d	}|D ] }|j| |d
 |j	 qd|jdddddddddg	d}	|	D ] }|j| |d |j	 q|jdddgd}
|
D ] }|j| |d |j	 q|S )z
    Assign default permissions to user groups.
    
    This function assigns appropriate permissions to default
    user groups for the activities app.
    
    Returns:
        dict: Summary of assigned permissions
    r   )Groupr   zActivity Administrators)r?   zActivity ManagerszActivity Viewers
activities)content_type__app_label)admin_groupmanager_groupviewer_grouprP   Zview_activityZadd_activityZchange_activityZview_activitycategoryZadd_activitycategoryZchange_activitycategoryr=   rA   rB   )Zcodename__inrQ   rR   )
rD   rM   r   rF   rH   filterr   addrI   r>   )rM   r   rP   r$   rQ   rR   Zactivity_permissionsZassignment_summarypermZmanager_permsZviewer_permsr   r   r   assign_default_permissionsM  sN    
        rV   N)r#   rest_frameworkr   rD   r   rE   r   django.utils.translationr   r$   modelsr	   r
   BasePermissionr   r&   r1   r3   r5   r8   r9   r<   rL   rV   r   r   r   r   <module>   s   QV5144A4E