
    htfkG                        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 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 d dlmZmZm Z m!Z!m"Z"  G d de      Z# G d de      Z$ G d d      Z% G d de%ejL                        Z' G d dejP                        Z) G d dejP                        Z*y)    )OrderedDict)forms)settings)adminmessages)FilteredSelectMultiple)get_user_model)get_object_or_404redirectrender)reversepath)gettext_lazy)gettext)GroupObjectPermissionsFormUserObjectPermissionsForm)Group)get_group_permsget_groups_with_permsget_perms_for_modelget_user_permsget_users_with_permsc                       e Zd ZdZd Zy)AdminUserObjectPermissionsFormz
    Extends :form:`UserObjectPermissionsForm`. It only overrides
    ``get_obj_perms_field_widget`` method so it return
    ``django.contrib.admin.widgets.FilteredSelectMultiple`` widget.
    c                 ,    t        t        d      d      S NPermissionsFr   _selfs    X/var/www/html/software/conda/envs/higlass/lib/python3.12/site-packages/guardian/admin.pyget_obj_perms_field_widgetz9AdminUserObjectPermissionsForm.get_obj_perms_field_widget       %a&6>>    N__name__
__module____qualname____doc__r#    r%   r"   r   r          ?r%   r   c                       e Zd ZdZd Zy)AdminGroupObjectPermissionsFormz
    Extends :form:`GroupObjectPermissionsForm`. It only overrides
    ``get_obj_perms_field_widget`` method so it return
    ``django.contrib.admin.widgets.FilteredSelectMultiple`` widget.
    c                 ,    t        t        d      d      S r   r   r    s    r"   r#   z:AdminGroupObjectPermissionsForm.get_obj_perms_field_widget$   r$   r%   Nr&   r+   r%   r"   r.   r.      r,   r%   r.   c                        e Zd ZdZdZdZdZdZdZdZ	dZ
dZd	Z fd
Z fdZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )GuardedModelAdminMixinzI
    Serves as a helper for custom subclassing ``admin.ModelAdmin``.
    z%admin/guardian/model/change_form.htmlz*admin/guardian/model/obj_perms_manage.htmlz/admin/guardian/model/obj_perms_manage_user.htmlz0admin/guardian/model/obj_perms_manage_group.htmlFusergroupTc                    t         |   |      }|j                  j                  r|S | j                  r*| j
                  |j                  i} |j                  di |}| j                  rjt               }|j                  j                  j                         }dj                  | j                  |      }||j                  i} |j                  di |}|S )Nz{}__{}r+   )superget_querysetr2   is_superuser"user_can_access_owned_objects_onlyuser_owned_objects_fieldfilter+user_can_access_owned_by_group_objects_onlyr	   groupsfieldrelated_query_nameformatgroup_owned_objects_field)r!   requestqsfiltersUseruser_rel_nameqs_key	__class__s          r"   r6   z#GuardedModelAdminMixin.get_queryset:   s    W!'*<<$$I2244gllCG%W%B;;!#D KK--@@BM__T%C%C]SFw||,G%W%B	r%   c                    t         |          }| j                  r| j                  j                  j
                  | j                  j                  j                  f}t        d| j                  j                  | j                        d|z        t        d| j                  j                  | j                        d|z        t        d| j                  j                  | j                        d|z        g}||z   }|S )a0  
        Extends standard admin model urls with the following:

        - ``.../permissions/`` under ``app_mdodel_permissions`` url name (params: object_pk)
        - ``.../permissions/user-manage/<user_id>/`` under ``app_model_permissions_manage_user`` url name (params: object_pk, user_pk)
        - ``.../permissions/group-manage/<group_id>/`` under ``app_model_permissions_manage_group`` url name (params: object_pk, group_pk)

        .. note::
           ``...`` above are standard, instance detail url (i.e.
           ``/admin/flatpages/1/``)

        z<object_pk>/permissions/z%s_%s_permissions)viewnamez.<object_pk>/permissions/user-manage/<user_id>/z%s_%s_permissions_manage_userz0<object_pk>/permissions/group-manage/<group_id>/z%s_%s_permissions_manage_group)r5   get_urlsinclude_object_permissions_urlsmodel_meta	app_label
model_namer   
admin_site
admin_viewobj_perms_manage_viewobj_perms_manage_user_viewobj_perms_manage_group_view)r!   urlsinfomyurlsrG   s       r"   rK   zGuardedModelAdminMixin.get_urlsK   s     w!//::##--tzz/?/?/J/JJD///44335-46 E//4488:9D@B G//4499;:TACF D=Dr%   c                 D   | j                   j                  |      }|j                  d| i| j                  || j                  j
                  j                  | j                  j
                  t        |      | j                  ||      t        |      t        d      d	       |S )z
        Returns context dictionary with common admin and object permissions
        related content. It uses AdminSite.each_context,
        making sure all required template vars are in the context.
        model_adminzObject permissions)		adminformmediaobjectrO   optsoriginalhas_change_permissionmodel_permstitle)rQ   each_contextupdater\   rM   rN   rO   strr`   r   r   )r!   rA   objcontexts       r"   get_obj_perms_base_contextz1GuardedModelAdminMixin.get_obj_perms_base_contextl   s     //..w7'.ZZ))33JJ$$C%)%?%?%M.s3+,

 
	 r%   c           	         | j                  |d      s,t        d| j                  j                        }t	        |      S ddlm} t        | j                  |       ||            }t        t        t        |dd	      j                         d
             }t        t        t        |d      j                         d             }|j                  dk(  rd|j                  v r | j!                  |      |j                        } | j#                  |      |j                        }	| j                  j                  | j$                  j&                  j(                  | j$                  j&                  j*                  f}
|j-                         rp|j.                  d   j0                  }t        d|
z  |j0                  |g      }t	        |      S |j                  dk(  rd|j                  v r | j!                  |      |j                        } | j#                  |      |j                        }	| j                  j                  | j$                  j&                  j(                  | j$                  j&                  j*                  f}
|	j-                         rl|	j.                  d   j2                  }t        d|
z  |j0                  |g      }t	        |      S  | j!                  |             } | j#                  |             }	| j5                  ||      }||d<   ||d<   ||d<   |	|d<   | j                  j                  |_        t9        || j;                         |      S )af  
        Main object permissions view. Presents all users and groups with any
        object permissions for the current model *instance*. Users or groups
        without object permissions for related *instance* would **not** be
        shown. In order to add or manage user or group one should use links or
        forms presented within the page.
        Nadmin:indexcurrent_appr   )unquotepkTF)attach_permswith_group_usersc                 D    t        | d   t               j                        S Nr   )getattrr	   USERNAME_FIELD)r2   s    r"   <lambda>z>GuardedModelAdminMixin.obj_perms_manage_view.<locals>.<lambda>   s    G^-<<"> r%   )key)rp   c                      | d   j                   S rs   rJ   )r3   s    r"   rv   z>GuardedModelAdminMixin.obj_perms_manage_view.<locals>.<lambda>   s    %(-- r%   POSTsubmit_manage_userr2    %s:%s_%s_permissions_manage_userargssubmit_manage_groupr3   !%s:%s_%s_permissions_manage_groupusers_permsgroups_perms	user_form
group_form)r`   r   rQ   rJ   r   django.contrib.admin.utilsrm   r
   r6   r   sortedr   itemsr   methodrz   get_obj_perms_user_select_formget_obj_perms_group_select_formrM   rN   rO   rP   is_validcleaned_dataro   idrh   rl   r   get_obj_perms_manage_template)r!   rA   	object_pkpost_urlrm   rf   r   r   r   r   rW   user_idurlgroup_idrg   s                  r"   rS   z,GuardedModelAdminMixin.obj_perms_manage_view   s    ))'48}$//:N:NOHH%%6 1 1! +-!$St6;==BUW>
 #%c=CCE/
 >>V#(<(L;; 'I== 'J $$

  **

  ++D
 !!##008;;6=&&'*  }$^^v%*?7<<*O;; 'I== 'J $$

  **

  ++D
 ""$%227;>>7$>&&(+  }$D;;GDFIF==gFHJ11'3?!,".( * #oo22gtAACWMMr%   c                 @    dt         j                  v ry| j                  S )a&  
        Returns main object permissions admin template.  May be overridden if
        need to change it dynamically.

        .. note::
           If ``INSTALLED_APPS`` contains ``grappelli`` this function would
           return ``"admin/guardian/grappelli/obj_perms_manage.html"``.

        	grappelliz6admin/guardian/contrib/grappelli/obj_perms_manage.html)r   INSTALLED_APPSobj_perms_manage_templater    s    r"   r   z4GuardedModelAdminMixin.get_obj_perms_manage_template   s!     (111K---r%   c                    | j                  |d      s,t        d| j                  j                        }t	        |      S t        t               |      }t        | j                  |      |      }| j                  |      } ||||j                  xs d      }|j                  dk(  r|j                         r|j                          t        d      }	t        j                  ||	       | j                  j                  | j                   j"                  j$                  | j                   j"                  j&                  f}
t        d|
z  |j(                  |j(                  g      }t	        |      S | j+                  ||      }||d	<   t-        ||      |d
<   ||d<   | j                  j                  |_        t1        || j3                         |      S )zI
        Manages selected users' permissions for current object.
        Nrj   rk   rn   rz   Permissions saved.r|   r}   user_obj
user_permsform)r`   r   rQ   rJ   r   r
   r	   r6   get_obj_perms_manage_user_formrz   r   r   save_obj_permsr   r   successrM   rN   rO   rP   ro   rh   r   rl   r   "get_obj_perms_manage_user_template)r!   rA   r   r   r   r2   rf   
form_classr   msgrW   r   rg   s                r"   rT   z1GuardedModelAdminMixin.obj_perms_manage_user_view   s    ))'48}$//:N:NOHH%% !1g> 1 1' :yI88A
$W\\%9T:>>V#!./CWc*$$

  **

  ++D
 2T9ffdgg&C C= 11'3?"
 .tS 9"oo22gtFFH'RRr%   c                 @    dt         j                  v ry| j                  S )a/  
        Returns object permissions for user admin template.  May be overridden
        if need to change it dynamically.

        .. note::
           If ``INSTALLED_APPS`` contains ``grappelli`` this function would
           return ``"admin/guardian/grappelli/obj_perms_manage_user.html"``.

        r   z;admin/guardian/contrib/grappelli/obj_perms_manage_user.html)r   r   obj_perms_manage_user_templater    s    r"   r   z9GuardedModelAdminMixin.get_obj_perms_manage_user_template  s!     (111P222r%   c                     t         S )z
        Returns form class for selecting a user for permissions management.  By
        default :form:`UserManage` is returned.
        )
UserManager!   rA   s     r"   r   z5GuardedModelAdminMixin.get_obj_perms_user_select_form  s
    
 r%   c                     t         S )z
        Returns form class for selecting a group for permissions management.  By
        default :form:`GroupManage` is returned.
        )GroupManager   s     r"   r   z6GuardedModelAdminMixin.get_obj_perms_group_select_form  s
    
 r%   c                     t         S )z
        Returns form class for user object permissions management.  By default
        :form:`AdminUserObjectPermissionsForm` is returned.
        )r   r   s     r"   r   z5GuardedModelAdminMixin.get_obj_perms_manage_user_form  s
    
 .-r%   c                    | j                  |d      s,t        d| j                  j                        }t	        |      S t        t        |      }t        | j                  |      |      }| j                  |      } ||||j                  xs d      }|j                  dk(  r|j                         r|j                          t        d      }	t        j                  ||	       | j                  j                  | j                   j"                  j$                  | j                   j"                  j&                  f}
t        d|
z  |j(                  |j*                  g	      }t	        |      S | j-                  ||      }||d
<   t/        ||      |d<   ||d<   | j                  j                  |_        t3        || j5                         |      S )zJ
        Manages selected groups' permissions for current object.
        Nrj   rk   )r   rn   rz   r   r   r}   	group_objgroup_permsr   )r`   r   rQ   rJ   r   r
   r   r6   get_obj_perms_manage_group_formrz   r   r   r   r   r   r   rM   rN   rO   rP   ro   r   rh   r   rl   r   #get_obj_perms_manage_group_template)r!   rA   r   r   r   r3   rf   r   r   r   rW   r   rg   s                r"   rU   z2GuardedModelAdminMixin.obj_perms_manage_group_view&  s    ))'48}$//:N:NOHH%%!%H5 1 1' :yI99'B
%gll&:d;>>V#!./CWc*$$

  **

  ++D
 3d:ffehh'C C= 11'3?$!0!<"oo22gtGGI7SSr%   c                 @    dt         j                  v ry| j                  S )a1  
        Returns object permissions for group admin template.  May be overridden
        if need to change it dynamically.

        .. note::
           If ``INSTALLED_APPS`` contains ``grappelli`` this function would
           return ``"admin/guardian/grappelli/obj_perms_manage_group.html"``.

        r   z<admin/guardian/contrib/grappelli/obj_perms_manage_group.html)r   r   obj_perms_manage_group_templater    s    r"   r   z:GuardedModelAdminMixin.get_obj_perms_manage_group_templateK  s!     (111Q333r%   c                     t         S )z
        Returns form class for group object permissions management.  By default
        :form:`AdminGroupObjectPermissionsForm` is returned.
        )r.   r   s     r"   r   z6GuardedModelAdminMixin.get_obj_perms_manage_group_formY  s
    
 /.r%   )r'   r(   r)   r*   change_form_templater   r   r   r8   r9   r;   r@   rL   r6   rK   rh   rS   r   rT   r   r   r   r   rU   r   r   __classcell__)rG   s   @r"   r1   r1   (   s     	0  	5  	: # 	; $).&%27/ '&*#"B(NN`.#SJ3.#TJ4/r%   r1   c                       e Zd ZdZy)GuardedModelAdmina	  
    Extends ``django.contrib.admin.ModelAdmin`` class. Provides some extra
    views for object permissions management at admin panel. It also changes
    default ``change_form_template`` option to
    ``'admin/guardian/model/change_form.html'`` which is required for proper
    url (object permissions related) being shown at the model pages.

    **Extra options**

    ``GuardedModelAdmin.obj_perms_manage_template``

        *Default*: ``admin/guardian/model/obj_perms_manage.html``

    ``GuardedModelAdmin.obj_perms_manage_user_template``

        *Default*: ``admin/guardian/model/obj_perms_manage_user.html``

    ``GuardedModelAdmin.obj_perms_manage_group_template``

        *Default*: ``admin/guardian/model/obj_perms_manage_group.html``

    ``GuardedModelAdmin.user_can_access_owned_objects_only``

        *Default*: ``False``

        If this would be set to ``True``, ``request.user`` would be used to
        filter out objects he or she doesn't own (checking ``user`` field
        of used model - field name may be overridden by
        ``user_owned_objects_field`` option).

        .. note::
           Please remember that this will **NOT** affect superusers!
           Admins would still see all items.

    ``GuardedModelAdmin.user_can_access_owned_by_group_objects_only``

        *Default*: ``False``

        If this would be set to ``True``, ``request.user`` would be used to
        filter out objects her or his group doesn't own (checking if any group
        user belongs to is set as ``group`` field of the object; name of the
        field can be changed by overriding ``group_owned_objects_field``).

        .. note::
           Please remember that this will **NOT** affect superusers!
           Admins would still see all items.

    ``GuardedModelAdmin.group_owned_objects_field``

        *Default*: ``group``

    ``GuardedModelAdmin.include_object_permissions_urls``

        *Default*: ``True``

        .. versionadded:: 1.2

        Might be set to ``False`` in order **NOT** to include guardian-specific
        urls.

    **Usage example**

    Just use :admin:`GuardedModelAdmin` instead of
    ``django.contrib.admin.ModelAdmin``.

    .. code-block:: python

        from django.contrib import admin
        from guardian.admin import GuardedModelAdmin
        from myapp.models import Author

        class AuthorAdmin(GuardedModelAdmin):
            pass

        admin.site.register(Author, AuthorAdmin)

    N)r'   r(   r)   r*   r+   r%   r"   r   r   a  s    Lr%   r   c                   f    e Zd Z ej                   ed      dd ed      i ed            Zd Zy)	r   zUser identification   does_not_existzThis user does not existz1Enter a value compatible with User.USERNAME_FIELD)label
max_lengtherror_messages	help_textc                 6   | j                   d   }t               }	 |j                  }	  |j                  j
                  di ||i}|S # t        $ r d}Y .w xY w# |j                  $ r0 t        j                  | j                  d   j                  d         w xY w)zN
        Returns ``User`` instance based on the given identification.
        r2   usernamer   r+   )r   r	   ru   AttributeErrorobjectsgetDoesNotExistr   ValidationErrorfieldsr   )r!   identification
user_modelusername_fieldr2   s        r"   
clean_userzUserManage.clean_user  s     **62#%
	('66N	F):%%))M^^,LMDK	  	('N	(
 && 	F''F#223CDF F	Fs   A A AA?BN)r'   r(   r)   r   	CharFieldr   r2   r   r+   r%   r"   r   r     sA    5??#8!9&)+;Q9>; +<%&R&T	DFr%   r   c                   J    e Zd Z ej                  dd ed      i      Zd Zy)r   P   r   zThis group does not exist)r   r   c                     | j                   d   }	 t        j                  j                  |      }|S # t        j                  $ r0 t        j                  | j                  d   j                  d         w xY w)zK
        Returns ``Group`` instance based on the given group name.
        r3   ry   r   )	r   r   r   r   r   r   r   r   r   )r!   rJ   r3   s      r"   clean_groupzGroupManage.clean_group  sz       )	GMM%%4%0EL!! 	G''G$334DEG G	Gs
   !3 AA6N)r'   r(   r)   r   r   r   r3   r   r+   r%   r"   r   r     s-    EOOr;K;<=X;Y;[ \E
Gr%   r   N)+collectionsr   djangor   django.confr   django.contribr   r   django.contrib.admin.widgetsr   django.contrib.authr	   django.shortcutsr
   r   r   django.urlsr   r   django.utils.translationr   r   r   guardian.formsr   r   django.contrib.auth.modelsr   guardian.shortcutsr   r   r   r   r   r   r.   r1   
ModelAdminr   Formr   r   r+   r%   r"   <module>r      s    #    * ? . @ @ % 6 , P ,6 6?%> ??&@ ?v/ v/r	M.0@0@ M`F F6G%** Gr%   