a
    LcòfQ  ã                   @   sD  d dl Z d dlZd dl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 d dlmZ d dlmZ d d	lmZ d d
lmZ ddg di fZeG dd„ dƒƒZeG dd„ deƒƒZeedƒedƒdd�Zdd„ ZeG dd„ dƒƒZeƒ ZedƒZeeedƒdƒZedƒZeeedƒdƒZ dd„ Z!dd „ Z"d!d"„ Z#e#ged#ƒfe!ged$ƒfe"ged%ƒfd&œZ$d'd(„ Z%dEd+d,„Z&e&ed-ƒd.�Z'eG d/d0„ d0ƒƒZ(eG d1d2„ d2e(ƒƒZ)eG d3d4„ d4e(ƒƒZ*eG d5d6„ d6e(ƒƒZ+eG d7d8„ d8e(ƒƒZ,eG d9d:„ d:e(ƒƒZ-eG d;d<„ d<ƒƒZ.eG d=d>„ d>ƒƒZ/d?d@„ Z0dAdB„ Z1eG dCdD„ dDƒƒZ2dS )Fé    N)ÚPath)ÚurlsplitÚ
urlunsplit)ÚValidationError)Údeconstructible)Úpunycode)Úis_valid_ipv6_address)Ú_lazy_re_compile)Úgettext_lazy)Úngettext_lazyÚ © c                   @   s>   e Zd ZdZedƒZdZdZdZddd„Z	d	d
„ Z
dd„ ZdS )ÚRegexValidatorr   zEnter a valid value.ÚinvalidFr   Nc                 C   st   |d ur|| _ |d ur|| _|d ur*|| _|d ur8|| _|d urF|| _| jr`t| j tƒs`tdƒ‚t| j | jƒ| _ d S )Nz@If the flags are set, regex must be a regular expression string.)	ÚregexÚmessageÚcodeÚinverse_matchÚflagsÚ
isinstanceÚstrÚ	TypeErrorr	   )Úselfr   r   r   r   r   r   r   úS/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/core/validators.pyÚ__init__   s    ÿzRegexValidator.__init__c                 C   s>   | j  t|ƒ¡}| jr|n| }|r:t| j| jd|id�‚dS )z�
        Validate that the input contains (or does *not* contain, if
        inverse_match is True) a match for the regular expression.
        Úvalue©r   ÚparamsN)r   Úsearchr   r   r   r   r   )r   r   Zregex_matchesZinvalid_inputr   r   r   Ú__call__/   s    zRegexValidator.__call__c                 C   sN   t |tƒoL| jj|jjkoL| jj|jjkoL| j|jkoL| j|jkoL| j|jkS ©N)r   r   r   Úpatternr   r   r   r   ©r   Úotherr   r   r   Ú__eq__9   s    
ÿþ
ý
ü
úzRegexValidator.__eq__)NNNNN)Ú__name__Ú
__module__Ú__qualname__r   Ú_r   r   r   r   r   r   r$   r   r   r   r   r      s    ÿ

r   c                       s¾   e Zd ZdZdZdZde d e d e d Zde d	 Zd
e d Zde e e d Z	e
de d e d e	 d ejƒZedƒZg d¢ZedƒZdZd‡ fdd„	Z‡ fdd„Z‡  ZS )ÚURLValidatoru   Â¡-ï¿¿zo(?:0|25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?)(?:\.(?:0|25[0-5]|2[0-4][0-9]|1[0-9]?[0-9]?|[1-9][0-9]?)){3}z\[[0-9a-f:.]+\]z[a-zz0-9](?:[a-zz0-9-]{0,61}[a-zz0-9])?z(?:\.(?!-)[a-zz0-9-]{1,63}(?<!-))*z\.(?!-)(?:[a-zz%-]{2,63}|xn--[a-z0-9]{1,59})(?<!-)\.?ú(z|localhost)z5^(?:[a-z0-9.+-]*)://(?:[^\s:@/]+(?::[^\s:@/]*)?@)?(?:ú|z#)(?::[0-9]{1,5})?(?:[/?#][^\s]*)?\ZzEnter a valid URL.)ÚhttpÚhttpsÚftpZftpsz	
i   Nc                    s$   t ƒ jf i |¤Ž |d ur || _d S r    )Úsuperr   Úschemes)r   r0   Úkwargs©Ú	__class__r   r   r   m   s    zURLValidator.__init__c                    sÖ  t |tƒrt|ƒ| jkr.t| j| jd|id�‚| j |¡rPt| j| jd|id�‚| 	d¡d  
¡ }|| jvr‚t| j| jd|id�‚zt|ƒ}W n( ty¶   t| j| jd|id�‚Y n0 ztƒ  |¡ W n‚ t�yJ } zh|�r4|\}}}}}zt|ƒ}W n t�y   |‚Y n0 t|||||fƒ}	tƒ  |	¡ n‚ W Y d }~n^d }~0 0 t d|j¡}
|
�r |
d }zt|ƒ W n* t�yž   t| j| jd|id�‚Y n0 |jd u �s¼t|jƒdk�rÒt| j| jd|id�‚d S )Nr   r   z://r   z^\[(.+)\](?::[0-9]{1,5})?$é   éý   )r   r   ÚlenÚ
max_lengthr   r   r   Úunsafe_charsÚintersectionÚsplitÚlowerr0   r   Ú
ValueErrorr/   r   r   ÚUnicodeErrorr   Úrer   ÚnetlocÚvalidate_ipv6_addressÚhostname)r   r   ÚschemeZsplitted_urlÚer?   ÚpathÚqueryÚfragmentÚurlZ
host_matchZpotential_ipr2   r   r   r   r   sD    

ÿzURLValidator.__call__)N)r%   r&   r'   ÚulZipv4_reZipv6_reZhostname_reÚ	domain_reZtld_reZhost_rer	   r>   Ú
IGNORECASEr   r(   r   r0   Ú	frozensetr8   r7   r   r   Ú__classcell__r   r   r2   r   r)   D   sH   ÿÿþþÿþþþþþþù	r)   z^-?\d+\ZzEnter a valid integer.r   ©r   r   c                 C   s   t | ƒS r    )Úinteger_validator©r   r   r   r   Úvalidate_integerª   s    rP   c                   @   sd   e Zd ZedƒZdZedejƒZ	edejƒZ
edejƒZdgZddd	„Zd
d„ Zdd„ Zdd„ ZdS )ÚEmailValidatorzEnter a valid email address.r   z’(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*\Z|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"\Z)zH((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+)(?:[A-Z0-9-]{2,63}(?<!-))\Zz\[([A-F0-9:.]+)\]\ZÚ	localhostNc                 C   s.   |d ur|| _ |d ur|| _|d ur*|| _d S r    )r   r   Údomain_allowlist)r   r   r   Z	allowlistr   r   r   r   Æ   s    zEmailValidator.__init__c                 C   s¼   |rd|vst |ƒdkr.t| j| jd|id�‚| dd¡\}}| j |¡s`t| j| jd|id�‚|| jvr¸|  |¡s¸zt	|ƒ}W n t
y’   Y n0 |  |¡r¢d S t| j| jd|id�‚d S )Nú@i@  r   r   r4   )r6   r   r   r   ÚrsplitÚ
user_regexÚmatchrS   Úvalidate_domain_partr   r=   )r   r   Z	user_partÚdomain_partr   r   r   r   Î   s    ÿ
zEmailValidator.__call__c                 C   sN   | j  |¡rdS | j |¡}|rJ|d }zt|ƒ W dS  tyH   Y n0 dS )NTr4   F)Údomain_regexrW   Úliteral_regexÚvalidate_ipv46_addressr   )r   rY   Zliteral_matchÚ
ip_addressr   r   r   rX   æ   s    z#EmailValidator.validate_domain_partc                 C   s.   t |tƒo,| j|jko,| j|jko,| j|jkS r    )r   rQ   rS   r   r   r"   r   r   r   r$   ô   s    

ÿ
þ
üzEmailValidator.__eq__)NNN)r%   r&   r'   r(   r   r   r	   r>   rJ   rV   rZ   r[   rS   r   r   rX   r$   r   r   r   r   rQ   ®   s&   úýý
rQ   z^[-a-zA-Z0-9_]+\ZuP   Enter a valid â€œslugâ€� consisting of letters, numbers, underscores or hyphens.z	^[-\w]+\ZuY   Enter a valid â€œslugâ€� consisting of Unicode letters, numbers, underscores, or hyphens.c                 C   sj   zt  | ¡ W n( ty6   ttdƒdd| id�‚Y n00 tdd„ |  d¡D ƒƒrfttdƒdd| id�‚d S )NúEnter a valid IPv4 address.r   r   r   c                 s   s"   | ]}|d ko|d d kV  qdS )Ú0r   Nr   )Ú.0Úoctetr   r   r   Ú	<genexpr>  ó    z(validate_ipv4_address.<locals>.<genexpr>Ú.)Ú	ipaddressÚIPv4Addressr<   r   r(   Úanyr:   rO   r   r   r   Úvalidate_ipv4_address  s    ÿýrh   c                 C   s"   t | ƒsttdƒdd| id�‚d S )NúEnter a valid IPv6 address.r   r   r   )r   r   r(   rO   r   r   r   r@   %  s    ÿr@   c                 C   sZ   zt | ƒ W nH tyT   zt| ƒ W n( tyN   ttdƒdd| id�‚Y n0 Y n0 d S )Nú#Enter a valid IPv4 or IPv6 address.r   r   r   )rh   r   r@   r(   rO   r   r   r   r\   ,  s    ýr\   rj   r^   ri   )ÚbothZipv4Zipv6c                 C   sN   | dkr|rt dƒ‚zt|  ¡  W S  tyH   t d| ttƒf ƒ‚Y n0 dS )zq
    Depending on the given parameters, return the appropriate validators for
    the GenericIPAddressField.
    rk   z=You can only use `unpack_ipv4` if `protocol` is set to 'both'z+The protocol '%s' is unknown. Supported: %sN)r<   Úip_address_validator_mapr;   ÚKeyErrorÚlist)ÚprotocolZunpack_ipv4r   r   r   Úip_address_validatorsA  s    ÿ
ÿÿrp   ú,Fc                 C   s.   t d|rdndt | ¡dœ ƒ}t|||d�S )Nz#^%(neg)s\d+(?:%(sep)s%(neg)s\d+)*\Zz(-)?r   )ÚnegÚseprM   )r	   r>   Úescaper   )rs   r   r   Zallow_negativeÚregexpr   r   r   Úint_list_validatorS  s    
þÿÿrv   z&Enter only digits separated by commas.)r   c                   @   sB   e Zd ZedƒZdZddd„Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dS )ÚBaseValidatorz<Ensure this value is %(limit_value)s (it is %(show_value)s).Úlimit_valueNc                 C   s   || _ |r|| _d S r    )rx   r   )r   rx   r   r   r   r   r   h  s    zBaseValidator.__init__c                 C   sP   |   |¡}t| jƒr|  ¡ n| j}|||dœ}|  ||¡rLt| j| j|d�‚d S )N)rx   Z
show_valuer   r   )ÚcleanÚcallablerx   Úcomparer   r   r   )r   r   Úcleanedrx   r   r   r   r   r   m  s    
ÿzBaseValidator.__call__c                 C   s4   t || jƒstS | j|jko2| j|jko2| j|jkS r    )r   r3   ÚNotImplementedrx   r   r   r"   r   r   r   r$   v  s    
ÿ
ýzBaseValidator.__eq__c                 C   s   ||uS r    r   ©r   ÚaÚbr   r   r   r{     s    zBaseValidator.comparec                 C   s   |S r    r   ©r   Úxr   r   r   ry   ‚  s    zBaseValidator.clean)N)r%   r&   r'   r(   r   r   r   r   r$   r{   ry   r   r   r   r   rw   c  s   
		rw   c                   @   s    e Zd ZedƒZdZdd„ ZdS )ÚMaxValueValidatorz;Ensure this value is less than or equal to %(limit_value)s.Z	max_valuec                 C   s   ||kS r    r   r~   r   r   r   r{   ‹  s    zMaxValueValidator.compareN©r%   r&   r'   r(   r   r   r{   r   r   r   r   rƒ   †  s   rƒ   c                   @   s    e Zd ZedƒZdZdd„ ZdS )ÚMinValueValidatorz>Ensure this value is greater than or equal to %(limit_value)s.Z	min_valuec                 C   s   ||k S r    r   r~   r   r   r   r{   ”  s    zMinValueValidator.compareNr„   r   r   r   r   r…   �  s   r…   c                   @   s    e Zd ZedƒZdZdd„ ZdS )ÚStepValueValidatorz=Ensure this value is a multiple of step size %(limit_value)s.Z	step_sizec                 C   s   t jt  ||¡ddd� S )Nr   g•Ö&è.>)Zabs_tol)ÚmathÚiscloseÚ	remainderr~   r   r   r   r{   �  s    zStepValueValidator.compareNr„   r   r   r   r   r†   ˜  s   r†   c                   @   s,   e Zd ZedddƒZdZdd„ Zdd„ Zd	S )
ÚMinLengthValidatorzQEnsure this value has at least %(limit_value)d character (it has %(show_value)d).zREnsure this value has at least %(limit_value)d characters (it has %(show_value)d).rx   Z
min_lengthc                 C   s   ||k S r    r   r~   r   r   r   r{   ¬  s    zMinLengthValidator.comparec                 C   s   t |ƒS r    ©r6   r�   r   r   r   ry   ¯  s    zMinLengthValidator.cleanN©r%   r&   r'   r   r   r   r{   ry   r   r   r   r   rŠ   ¡  s   ûrŠ   c                   @   s,   e Zd ZedddƒZdZdd„ Zdd„ Zd	S )
ÚMaxLengthValidatorzPEnsure this value has at most %(limit_value)d character (it has %(show_value)d).zQEnsure this value has at most %(limit_value)d characters (it has %(show_value)d).rx   r7   c                 C   s   ||kS r    r   r~   r   r   r   r{   ¾  s    zMaxLengthValidator.comparec                 C   s   t |ƒS r    r‹   r�   r   r   r   ry   Á  s    zMaxLengthValidator.cleanNrŒ   r   r   r   r   r�   ³  s   ûr�   c                   @   sR   e Zd ZdZedƒedddƒedddƒedd	dƒd
œZdd„ Zdd„ Zdd„ Z	dS )ÚDecimalValidatorz}
    Validate that the input does not exceed the maximum number of digits
    expected, otherwise raise ValidationError.
    zEnter a number.z:Ensure that there are no more than %(max)s digit in total.z;Ensure that there are no more than %(max)s digits in total.Úmaxz9Ensure that there are no more than %(max)s decimal place.z:Ensure that there are no more than %(max)s decimal places.zJEnsure that there are no more than %(max)s digit before the decimal point.zKEnsure that there are no more than %(max)s digits before the decimal point.)r   Ú
max_digitsÚmax_decimal_placesÚmax_whole_digitsc                 C   s   || _ || _d S r    )r�   Údecimal_places)r   r�   r“   r   r   r   r   á  s    zDecimalValidator.__init__c                 C   s@  |  ¡ dd … \}}|dv r4t| jd dd|id�‚|dkrZt|ƒ}|dkrT||7 }d}n.t|ƒt|ƒkrxt|ƒ }}nt|ƒ}t|ƒ}|| }| jd urÀ|| jkrÀt| jd d| j|d	œd�‚| jd urð|| jkrðt| jd
 d
| j|d	œd�‚| jd u�r<| jd u�r<|| j| j k�r<t| jd d| j| j |d	œd�‚d S )Nr4   >   ÚFÚNÚnr   r   r   r   )r   r�   )r�   r   r‘   r’   )Úas_tupler   Úmessagesr6   Úabsr�   r“   )r   r   Zdigit_tupleÚexponentÚdigitsZdecimalsZwhole_digitsr   r   r   r   å  sL    ÿ
ý
ýÿþýýzDecimalValidator.__call__c                 C   s$   t || jƒo"| j|jko"| j|jkS r    )r   r3   r�   r“   r"   r   r   r   r$     s
    
ÿ
ýzDecimalValidator.__eq__N)
r%   r&   r'   Ú__doc__r(   r   r˜   r   r   r$   r   r   r   r   rŽ   Å  s*   ýýûô0rŽ   c                   @   s2   e Zd ZedƒZdZd
dd„Zdd„ Zdd	„ ZdS )ÚFileExtensionValidatorub   File extension â€œ%(extension)sâ€� is not allowed. Allowed extensions are: %(allowed_extensions)s.Zinvalid_extensionNc                 C   s<   |d urdd„ |D ƒ}|| _ |d ur*|| _|d ur8|| _d S )Nc                 S   s   g | ]}|  ¡ ‘qS r   ©r;   )r`   Zallowed_extensionr   r   r   Ú
<listcomp>'  s   z3FileExtensionValidator.__init__.<locals>.<listcomp>)Úallowed_extensionsr   r   )r   r    r   r   r   r   r   r   %  s    ÿzFileExtensionValidator.__init__c                 C   sR   t |jƒjdd …  ¡ }| jd urN|| jvrNt| j| j|d | j¡|dœd�‚d S )Nr4   z, )Ú	extensionr    r   r   )	r   ÚnameÚsuffixr;   r    r   r   r   Újoin)r   r   r¡   r   r   r   r   0  s    ÿþ
ýýzFileExtensionValidator.__call__c                 C   s0   t || jƒo.| j|jko.| j|jko.| j|jkS r    )r   r3   r    r   r   r"   r   r   r   r$   @  s    
ÿ
þ
üzFileExtensionValidator.__eq__)NNN)	r%   r&   r'   r(   r   r   r   r   r$   r   r   r   r   r�     s   ÿ
r�   c                  C   sD   zddl m}  W n ty&   g  Y S 0 |  ¡  dd„ | jD ƒS d S )Nr   ©ÚImagec                 S   s   g | ]}|  ¡ d d… ‘qS )r4   Nrž   )r`   Úextr   r   r   rŸ   P  rc   z2get_available_image_extensions.<locals>.<listcomp>)ZPILr¦   ÚImportErrorÚinitZ	EXTENSIONr¥   r   r   r   Úget_available_image_extensionsI  s    
rª   c                 C   s   t tƒ d�| ƒS )N)r    )r�   rª   rO   r   r   r   Úvalidate_image_file_extensionS  s    
ÿr«   c                   @   s6   e Zd ZdZedƒZdZddd„Zdd„ Zd	d
„ Z	dS )ÚProhibitNullCharactersValidatorz<Validate that the string doesn't contain the null character.z Null characters are not allowed.Znull_characters_not_allowedNc                 C   s    |d ur|| _ |d ur|| _d S r    rM   )r   r   r   r   r   r   r   `  s    z(ProhibitNullCharactersValidator.__init__c                 C   s&   dt |ƒv r"t| j| jd|id�‚d S )Nú r   r   )r   r   r   r   )r   r   r   r   r   r   f  s    z(ProhibitNullCharactersValidator.__call__c                 C   s$   t || jƒo"| j|jko"| j|jkS r    )r   r3   r   r   r"   r   r   r   r$   j  s
    
ÿ
ýz&ProhibitNullCharactersValidator.__eq__)NN)
r%   r&   r'   rœ   r(   r   r   r   r   r$   r   r   r   r   r¬   Y  s   
r¬   )rq   Nr   F)3re   r‡   r>   Úpathlibr   Úurllib.parser   r   Zdjango.core.exceptionsr   Zdjango.utils.deconstructr   Zdjango.utils.encodingr   Zdjango.utils.ipv6r   Zdjango.utils.regex_helperr	   Zdjango.utils.translationr
   r(   r   ZEMPTY_VALUESr   r)   rN   rP   rQ   Zvalidate_emailZslug_reZvalidate_slugZslug_unicode_reZvalidate_unicode_slugrh   r@   r\   rl   rp   rv   Z%validate_comma_separated_integer_listrw   rƒ   r…   r†   rŠ   r�   rŽ   r�   rª   r«   r¬   r   r   r   r   Ú<module>   sŽ   0^ýNüÿú
ý
ÿ"W+
