o
    k`d%6                     @   s   d dl 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	 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 G dd deZG dd de	ZG dd deZG dd dejZG dd deZG dd deZdS )    N)Site)modelsQ)MP_NodeManager)ROOT_USER_LEVEL)NoPermissionsException)PageNodeQuerySetPageQuerySet)PublisherManager)get_fallback_languagesc                   @   s@   e Zd ZdZdd ZdddZdddZdd	d
ZdddZdS )PageManagerzTUse draft() and public() methods for accessing the corresponding
    instances.
    c                 C   s
   t | jS )z3Change standard model queryset to our own.
        )r
   modelself r   R/var/www/mitschrieb_seite/venv/lib/python3.10/site-packages/cms/models/managers.pyget_queryset   s   
zPageManager.get_querysetNc                 C      |   |S N)r   on_siter   siter   r   r   r   !      zPageManager.on_sitec                 C   r   r   )r   	publishedr   r   r   r   r   $   r   zPageManager.publishedc                 C   s   |    |S r   )r   draftsget_homer   r   r   r   r   '      zPageManager.get_homeTc              
   C   s   ddl m} |  }| }|rtj }||}t|d}t }|j	}	|	D ]4}
|
j
}t|dr6t|ds7q'|jj}| }|r[|ds[|jD ]}|tdi d|||iO }qIq'|rl|t|dM }|t|d	M }|||B }| S )zqSimple search function

        Plugins can define a 'search_fields' tuple similar to ModelAdmin classes
        r   )plugin_pool)title_set__title__icontainssearch_fieldscmsplugin_ptr+z*placeholders__cmsplugin__{}__{}__icontains)title_set__language)cmsplugin__languageNr   )cms.plugin_poolr   r   publicr   objectsget_currentr   r   registered_pluginsr   hasattrr!   fieldrelated_query_name
startswithr    formatfilterdistinct)r   qlanguagecurrent_site_onlyr   qsr   qtqppluginsplugin	cmspluginr+   r,   r   r   r   search*   sB   



zPageManager.searchr   )NT)	__name__
__module____qualname____doc__r   r   r   r   r:   r   r   r   r   r      s    


r   c                   @   s   e Zd Zdd Zdd ZdS )PageNodeManagerc                 C   s   t | jdS )z(Sets the custom queryset as the default.path)r	   r   order_byr   r   r   r   r   W   s   zPageNodeManager.get_querysetc                 C   s   | j |dS )N)r   )r/   r   r   r   r   get_for_site[   s   zPageNodeManager.get_for_siteN)r;   r<   r=   r   rB   r   r   r   r   r?   U   s    r?   c                       s.   e Zd ZdddZ fddZdd Z  ZS )	TitleManagerFc                 C   s   z
| j ||d}|W S  | jjyJ   |rIz&| j|d}t|}|D ]}|D ]}||jkr6|    W  Y S q&q"W Y dS  | jjyH   Y Y dS w  w )z
        Gets the latest content for a particular page and language. Falls back
        to another language if wanted.
        )r2   pagerD   N)getr   DoesNotExistr/   r   r2   )r   rD   r2   language_fallbacktitletitles	fallbackslangr   r   r   	get_title`   s*   
zTitleManager.get_titlec                    s   t   jddS )NT)r   )superr&   r/   r   	__class__r   r   r&   x   r   zTitleManager.publicc                 C   sn  g d}dg}|j }|j}z	| j||d}	W nV | jjyl   i }
|D ]}||v r/|| |
|< q#||
d< ||
d< ||rb|dd}|rNd|
d	< ||
d
< nd|
d	< |D ]}||p\d}||
|< qT| jdi |
 Y S w |D ]}||jv r||d}t|	|| qo||rd|v r|dd}t	||	_
||	_|D ]}||jv r||pd}t|	|| q|	  |	S )zJ
        set or create a title for a particular page and language
        )slugrI   meta_description
page_title
menu_titleredirect)rD   r2   rD   r2   overwrite_urlNThas_url_overwriter@   Fr   )cleaned_datauserrF   r   rG    has_advanced_settings_permissioncreatebase_fieldssetattrboolrW   r@   save)r   requestrD   formr2   r\   advanced_fieldsrX   rY   objdatanamerV   r+   valuer   r   r   set_or_create{   sV   






zTitleManager.set_or_create)F)r;   r<   r=   rM   r&   rg   __classcell__r   r   rO   r   rC   _   s    
rC   c                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )BasicPagePermissionManagerzGlobal page permission manager accessible under objects.

    !IMPORTANT: take care, PagePermissionManager and GlobalPagePermissionManager
    both inherit from this manager
    c                 C   s   |  t|dt|dB S )zZGet all objects for given user, also takes look if user is in some
        group.
        rY   group__user)r/   r   )r   rY   r   r   r   	with_user   s   z$BasicPagePermissionManager.with_userc                 C   s   t r   )NotImplementedError)r   rY   site_idpermr   r   r   get_with_permission   s   z.BasicPagePermissionManager.get_with_permissionc                 C      |  ||dS )Ncan_addrq   r   rY   ro   r   r   r   get_with_add_pages_permission   r   z8BasicPagePermissionManager.get_with_add_pages_permissionc                 C   rr   )N
can_changert   ru   r   r   r    get_with_change_pages_permission   r   z;BasicPagePermissionManager.get_with_change_pages_permissionc                 C   rr   )Ncan_change_permissionsrt   ru   r   r   r   get_with_change_permissions   r   z6BasicPagePermissionManager.get_with_change_permissionsc                 C   rr   )Ncan_viewrt   ru   r   r   r   get_with_view_permissions   r   z4BasicPagePermissionManager.get_with_view_permissionsN)
r;   r<   r=   r>   rm   rq   rv   rx   rz   r|   r   r   r   r   ri      s    ri   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )GlobalPagePermissionManagerc                 C   s*   t |gd}t dd}| |||B S )N	sites__inTsites__isnullr   rm   r/   )r   rY   ro   	this_site	all_sitesr   r   r   get_with_site   s   
z)GlobalPagePermissionManager.get_with_sitec                 C   sB   t di |dd|gi}t di |dddi}| |||B S )r
        Provide a single point of entry for deciding whether any given global
        permission exists.
        Tr   r   Nr   r   )r   rY   ro   rp   r   r   r   r   r   rq      s   z/GlobalPagePermissionManager.get_with_permissionc                 C   sP   t |gd}t dd}| |||B }dd |D }|ttj| S )Nr~   Tr   c                 S      g | ]}t di |d iqS Tr   r   .0rp   r   r   r   
<listcomp>       zDGlobalPagePermissionManager.user_has_permissions.<locals>.<listcomp>)r   rm   r/   	functoolsreduceoperatoror_exists)r   rY   ro   permsr   r   querysetqueriesr   r   r   user_has_permissions   s
   
z0GlobalPagePermissionManager.user_has_permissionsN)r;   r<   r=   r   rq   r   r   r   r   r   r}      s    r}   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )PagePermissionManagerz6Page permission manager accessible under objects.
    c                 C   s"   |dd|i}|  |jdi |S )r   Tpage__node__siteNr   rm   r/   )r   rY   ro   rp   queryr   r   r   rq      s   z)PagePermissionManager.get_with_permissionc                 C   s   |  |j|dS )Nr   r   ru   r   r   r   r      r   z#PagePermissionManager.get_with_sitec                 C   s8   |  |j|d}dd |D }|ttj| S )Nr   c                 S   r   r   r   r   r   r   r   r     r   z>PagePermissionManager.user_has_permissions.<locals>.<listcomp>)rm   r/   r   r   r   r   r   )r   rY   ro   r   r   r   r   r   r   r      s   z*PagePermissionManager.user_has_permissionsc                 C   s   ddl m} ddlm} z|||}W n ty    |   Y S w |tkr)|  S |||dd}| j||d}|j	|dj	|d}|S )	a  Get all page permission objects on which user/group is lover in
        hierarchy then given user and given user can change permissions on them.

        !IMPORTANT, but exclude objects with given user, or any group containing
        this user - he can't be able to change his own permissions, because if
        he does, and removes some permissions from himself, he will not be able
        to add them anymore.

        Example:
                                       A
                                    /                                      user    B,E
                                /                                   C,X     D,Y

            Gives permission nodes C,X,D,Y under user, so he can edit
            permissions if he haves can_change_permission.

        Example:
                                      A,Y
                                    /                                      user    B,E,X
                                /                                   C,X     D,Y

            Gives permission nodes C,D under user, so he can edit, but not
            anymore to X,Y, because this users are on the same level or higher
            in page hierarchy. (but only if user have can_change_permission)

        Example:
                                        A
                                    /                                        user     B,E
                                /     |                                    C,X     D,Y    user
                                            /                                               I      J,A

            User permissions can be assigned to multiple page nodes, so merge of
            all of them is required. In this case user can see permissions for
            users C,X,D,Y,I,J but not A, because A user in higher in hierarchy.

        If permission object holds group, this permission object can be visible
        to user only if all of the group members are lover in hierarchy. If any
        of members is higher then given user, this entry must stay invisible.

        If user is superuser, or haves global can_change_permission permissions,
        show him everything.

        Result of this is used in admin for page permissions inline.
        r   )get_change_permissions_id_list)get_user_permission_levelF)check_global)page__id__inpage__node__depth__gterj   rk   )
cms.utils.page_permissionsr   cms.utils.permissionsr   r   noner   allr/   exclude)r   rY   r   r   r   
user_levelpage_id_allow_listr4   r   r   r   subordinate_to_user  s    5z)PagePermissionManager.subordinate_to_userc           	      C   s   ddl m}m}m}m}m} | }|j }t	|dt	|dt	|dB @ }|j
r;|t	|j
dt	|dt	|dB @ O }|t	|dt	|dt	|dB t	|dB @ O }| |dS )aO  Returns queryset containing all instances somehow connected to given
        page. This includes permissions to page itself and permissions inherited
        from higher pages.

        NOTE: this returns just PagePermission instances, to get complete access
        list merge return of this function with Global permissions.
        r   )ACCESS_CHILDRENACCESS_DESCENDANTSACCESS_PAGEACCESS_PAGE_AND_CHILDRENACCESS_PAGE_AND_DESCENDANTS)page__node__path__in)grant_onrE   page__node__depth)
cms.modelsr   r   r   r   r   get_draft_objectnodeget_ancestor_pathsr   parent_pager/   rA   )	r   rD   r   r   r   r   r   pathsr   r   r   r   for_pageP  s"   



zPagePermissionManager.for_pageN)	r;   r<   r=   r>   rq   r   r   r   r   r   r   r   r   r      s    Lr   )r   r   django.contrib.sites.modelsr   	django.dbr   django.db.modelsr   treebeard.mp_treer   cms.constantsr   cms.exceptionsr   cms.models.queryr	   r
   cms.publisherr   cms.utils.i18nr   r   r?   rC   Managerri   r}   r   r   r   r   r   <module>   s"    E
V