a
    Dg:                     @   s  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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 d dlmZ d dlm Z m!Z!m"Z"m#Z# d dl$m%Z% e	 Z&h dZ'e(edre)ej*Z+ede% ne) Z+G dd dej,Z-G dd de-Z.G dd de.Z/G dd de.Z0G dd dej,Z1G dd dej2Z3G d d! d!eej4Z5ej6e3e5d d"d#Z7d$S )%    )groupby)warn)forms)settings)get_user_model)Group
Permission)"password_validators_help_text_htmlvalidate_password)transactionrender_to_string)	mark_safe)gettext_lazy)hooks)BaseFormSetMixin)AdminPageChooser)PAGE_PERMISSION_CODENAMESPAGE_PERMISSION_TYPESGroupPagePermissionPage)RemovedInWagtail70Warning>   
first_nameemailis_superuser	last_namegroupsWAGTAIL_USER_CUSTOM_FIELDSzThe `WAGTAIL_USER_CUSTOM_FIELDS` setting is deprecated. Use a custom `UserViewSet` subclass and override `get_form_class()` instead.c                       s4   e Zd ZdZ fddZedd Zdd Z  ZS )UsernameFormz
    Intelligently sets up the username field if it is in fact a username. If the
    User model has been swapped out, and the username field is an email or
    something else, don't touch it.
    c                    sZ   t  j|i | tjdkrV| jd }d|_td|_|j	 |_|j
dtdi d S )Nusernamez^[\w.@+-]+$z-Required. Letters, digits and @/./+/-/_ only.invalidzFThis value may contain only letters, numbers and @/./+/-/_ characters.)super__init__UserUSERNAME_FIELDfieldsregex_	help_texterror_messagescopyupdate)selfargskwargsfield	__class__ R/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/wagtail/users/forms.pyr"   3   s    


zUsernameForm.__init__c                 C   s
   | t j S N)r#   r$   r,   r2   r2   r3   username_fieldC   s    zUsernameForm.username_fieldc                 C   s
   t jtvS r4   )r#   r$   standard_fieldsr5   r2   r2   r3   separate_username_fieldG   s    z$UsernameForm.separate_username_field)	__name__
__module____qualname____doc__r"   propertyr6   r8   __classcell__r2   r2   r0   r3   r   ,   s
   
r   c                       s&  e Zd ZdZedd Zedd ZededdZe	j
d	ed
dZe	jd	eddZe	jd	eddZe	jedde	jddidedddZe	jedde	jddidedddZe	jeddeddZ fddZdd Zdd Zd d! Z fd"d#Z fd$d%Zd( fd&d'	Z  ZS ))UserFormrequiredc                 C   s   t tddS )NZWAGTAILUSERS_PASSWORD_REQUIREDTgetattrr   r5   r2   r2   r3   password_requiredN   s    zUserForm.password_requiredc                 C   s   t tddS )NZWAGTAILUSERS_PASSWORD_ENABLEDTrA   r5   r2   r2   r3   password_enabledR   s    zUserForm.password_enabledz)A user with that username already exists.z%The two password fields didn't match.)duplicate_usernamepassword_mismatchTZEmail)r@   labelz
First Namez	Last NameZPasswordFautocompleteznew-password)attrszLeave blank if not changing.)rG   r@   widgetr(   stripzPassword confirmationz3Enter the same password as above, for verification.Administrator@Administrators have full access to manage any object or setting.rG   r@   r(   c                    s^   t  j|i | | jrJ| jrZtt | jd _d| jd _d| jd _n| jd= | jd= d S )N	password1T	password2)	r!   r"   rD   rC   r   r	   r%   r(   r@   )r,   r-   r.   r0   r2   r3   r"   v   s    zUserForm.__init__c                 C   s~   t j}|| jvrd S | j| }t j }| jjd urD|j| jjd}|jf i ||i	 rz| 
t jtj| jd dd |S )NpkrE   code)r#   r$   cleaned_data_default_managerallinstancerR   excludefilterexists	add_errorr   ValidationErrorr)   )r,   r6   r   Zusersr2   r2   r3   _clean_username   s     


zUserForm._clean_usernamec                 C   s@   | j d}| j d}||kr<| dtj| jd dd |S )NrO   rP   rF   rS   )rU   getr\   r   r]   r)   r,   rO   rP   r2   r2   r3   clean_password2   s    zUserForm.clean_password2c                 C   s:   | j d}| j d}|r6|r6||kr6t|| jd dS )a
  
        Run the Django password validators against the new password. This must
        be called after the user instance in self.instance is populated with
        the new data from the form, as some validators rely on attributes on
        the user model.
        rO   rP   )userN)rU   r_   r
   rX   r`   r2   r2   r3   r
      s    zUserForm.validate_passwordc              
      sN   t    z|   W n2 tjyH } z| d| W Y d }~n
d }~0 0 d S )NrP   )r!   _post_cleanr
   r   r]   r\   )r,   er0   r2   r3   rc      s
    
zUserForm._post_cleanc                    s   t    |   d S r4   )r!   _clean_fieldsr^   r5   r0   r2   r3   re      s    
zUserForm._clean_fieldsc                    sD   t  jdd}| jr,| jd }|r,|| |r@|  |   |S )NFcommitrO   )r!   saverD   rU   set_passwordZsave_m2m)r,   rg   rb   passwordr0   r2   r3   rh      s    

zUserForm.save)T)r9   r:   r;   required_css_classr=   rC   rD   r'   r)   r   Z
EmailFieldr   Z	CharFieldr   r   ZPasswordInputrO   rP   BooleanFieldr   r"   r^   ra   r
   rc   re   rh   r>   r2   r2   r0   r3   r?   K   sN   

r?   c                   @   s   e Zd ZG dd dZdS )UserCreationFormc                   @   s*   e Zd ZeZejheB eB Zde	j
iZdS )zUserCreationForm.Metar   Nr9   r:   r;   r#   modelr$   r7   custom_fieldsr%   r   CheckboxSelectMultiplewidgetsr2   r2   r2   r3   Meta   s   rs   N)r9   r:   r;   rs   r2   r2   r2   r3   rm      s   rm   c                       s.   e Zd ZdZ fddZG dd dZ  ZS )UserEditFormFc                    s6   | dd}t j|i | |r2| jd= | jd= d S )Nediting_selfF	is_activer   )popr!   r"   r%   )r,   r-   r.   ru   r0   r2   r3   r"      s
    zUserEditForm.__init__c                   @   s,   e Zd ZeZejdheB eB Zde	j
iZdS )zUserEditForm.Metarv   r   Nrn   r2   r2   r2   r3   rs      s   rs   )r9   r:   r;   rC   r"   rs   r>   r2   r2   r0   r3   rt      s   rt   c                       sh   e Zd Z fddZdZdediZejeddedd	Z	G d
d dZ
dd Zd fdd	Z  ZS )	GroupFormc                    sT   t  j|i | tj | _tdD ]}| j| B | _q(| jd| j	d _
d S )NZregister_permissionscontent_typepermissions)r!   r"   r   objectsnoneregistered_permissionsr   Z	get_hooksselect_relatedr%   queryset)r,   r-   r.   fnr0   r2   r3   r"      s    
zGroupForm.__init__r@   duplicate_namez&A group with that name already exists.rL   FrM   rN   c                   @   s    e Zd ZeZdZde iZdS )zGroupForm.Meta)namerz   rz   N)	r9   r:   r;   r   ro   r%   r   rq   rr   r2   r2   r2   r3   rs      s   rs   c                 C   sV   | j d }ztjj| jjdj|d W n tjy@   | Y S 0 t	| j
d d S )Nr   rQ   )r   r   )rU   r   rV   rY   rX   rR   r_   ZDoesNotExistr   r]   r)   )r,   r   r2   r2   r3   
clean_name  s    

zGroupForm.clean_nameTc                    sT   z| j jj| jd}t| W n ty4   g }Y n0 t j|d}|jj|  |S )NZpk__inrf   )	rX   rz   rY   r}   bool
ValueErrorr!   rh   add)r,   rg   Zuntouchable_permissionsgroupr0   r2   r3   rh     s    
zGroupForm.save)T)r9   r:   r;   r"   rk   r'   r)   r   rl   r   rs   r   rh   r>   r2   r2   r0   r3   rx      s   	

rx   c                   @   sZ   e Zd ZdZejej e	ddddZ
ejejjddedd	d
d
dejdZdS )PagePermissionsFormz
    Note 'Permissions' (plural). A single instance of this form defines the permissions
    that are assigned to an entity (i.e. group or user) for a specific page.
    FT)Zshow_edit_linkZcan_choose_root)r   rJ   Zwagtailcorepage)Zcontent_type__app_labelZcontent_type__modelZcodename__inry   codename)r   Zto_field_namer@   rJ   N)r9   r:   r;   r<   r   ZModelChoiceFieldr   r{   rW   r   r   ZModelMultipleChoiceFieldr   rZ   r   r~   order_byrq   rz   r2   r2   r2   r3   r   %  s&   
r   c                       s@   e Zd ZeZd fdd	Zdd Zejdd Z	d	d
 Z
  ZS )BaseGroupPagePermissionFormSetNpage_permissionsc           	         s   |d u rt  }|jd u rg }n|jddd}|| _g }t|dd D ]"\}}||dd |D d qJt j	||||d d S )	Nr   
permissionc                 S   s   | j S r4   r   )ppr2   r2   r3   <lambda>X      z9BaseGroupPagePermissionFormSet.__init__.<locals>.<lambda>c                 S   s   g | ]
}|j qS r2   )r   ).0r   r2   r2   r3   
<listcomp>]  r   z;BaseGroupPagePermissionFormSet.__init__.<locals>.<listcomp>)r   rz   )initialprefix)
r   rR   r   r~   r   rX   r   appendr!   r"   )	r,   datafilesrX   r   Zfull_page_permissionsZinitial_datar   r   r0   r2   r3   r"   G  s*    
z'BaseGroupPagePermissionFormSet.__init__c                    sH   t  jrdS  fdd jD }tt|t|krDttddS )z6Checks that no two forms refer to the same page objectNc                    s*   g | ]"}| j vrd |jv r|jd  qS r   Zdeleted_formsrU   r   formr5   r2   r3   r   i  s   z8BaseGroupPagePermissionFormSet.clean.<locals>.<listcomp>z>You cannot have multiple permission records for the same page.)anyerrorsr   lensetr]   r'   )r,   Zpagesr2   r5   r3   cleanc  s    

z$BaseGroupPagePermissionFormSet.cleanc           	         s    j jd u rtd fdd jD }t }|D ](}|jd D ]}||jd |f q@q2g }t } j j D ]4}|j	|j
f|v r||j	|j
f qr||j qr j jj|d  || }tj fdd|D  d S )NzFCannot save a GroupPagePermissionFormSet for an unsaved group instancec                    s$   g | ]}| j vrd |jv r|qS r   r   r   r5   r2   r3   r   ~  s   z7BaseGroupPagePermissionFormSet.save.<locals>.<listcomp>rz   r   r   c                    s    g | ]\}}t  j||d qS ))r   r   r   )r   rX   )r   r   r   r5   r2   r3   r     s   )rX   rR   	Exceptionr   r   rU   r   r   rW   r   r   r   rZ   deleter   r{   Zbulk_create)	r,   Zforms_to_saveZfinal_permission_recordsr   r   Zpermission_ids_to_deleteZpermission_records_to_keepr   Zpermissions_to_addr2   r5   r3   rh   v  s0    

z#BaseGroupPagePermissionFormSet.savec                 C   s   t dd| iS )Nz:wagtailusers/groups/includes/page_permissions_formset.htmlformsetr   r5   r2   r2   r3   as_admin_panel  s    z-BaseGroupPagePermissionFormSet.as_admin_panel)NNNr   )r9   r:   r;   r   Zpermission_typesr"   r   r   Zatomicrh   r   r>   r2   r2   r0   r3   r   C  s   
+r   T)r   extraZ
can_deleteN)8	itertoolsr   warningsr   Zdjangor   Zdjango.confr   Zdjango.contrib.authr   Zdjango.contrib.auth.modelsr   r   Z'django.contrib.auth.password_validationr	   r
   Z	django.dbr   Zdjango.template.loaderr   Zdjango.utils.htmlr   Zdjango.utils.translationr   r'   Zwagtailr   Zwagtail.admin.forms.formsetsr   Zwagtail.admin.widgetsr   Zwagtail.modelsr   r   r   r   Zwagtail.utils.deprecationr   r#   r7   hasattrr   r   rp   Z	ModelFormr   r?   rm   rt   rx   ZFormr   ZBaseFormSetr   Zformset_factoryZGroupPagePermissionFormSetr2   r2   r2   r3   <module>   sL   
 >f