B
    `Q                 @   s  d dl mZ d dlZd dlZd dlZd dlZyd dlZW n ek
rP   dZY nX yd dlZW n ek
rv   dZY nX d dl	m
Z
mZ dZG dd deZG dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZ G d'd( d(eZ!eZ"eZ#eZ$eZ%eZ&eZ'eZ(eZ)eZ*eZ+eZ,eZ-eZ.e Z/dS ))    )unicode_literalsN)string_types	text_type)DataRequireddata_requiredEmailemailEqualToequal_to	IPAddress
ip_addressInputRequiredinput_requiredLengthlengthNumberRangenumber_rangeOptionaloptionalRequiredrequiredRegexpregexpURLurlAnyOfany_ofNoneOfnone_of
MacAddressmac_addressUUIDValidationErrorStopValidationc               @   s   e Zd ZdZdddZdS )r"   z>
    Raised when a validator fails to validate its input.
     c             O   s   t j| |f|| d S )N)
ValueError__init__)selfmessageargskwargs r+   Z/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/wtforms/validators.pyr&   !   s    zValidationError.__init__N)r$   )__name__
__module____qualname____doc__r&   r+   r+   r+   r,   r"      s   r"   c               @   s   e Zd ZdZdddZdS )r#   z
    Causes the validation chain to stop.

    If StopValidation is raised, no more validators in the validation chain are
    called. If raised with a message, the message will be added to the errors
    list.
    r$   c             O   s   t j| |f|| d S )N)	Exceptionr&   )r'   r(   r)   r*   r+   r+   r,   r&   -   s    zStopValidation.__init__N)r$   )r-   r.   r/   r0   r&   r+   r+   r+   r,   r#   %   s   r#   c               @   s"   e Zd ZdZdddZdd ZdS )r	   a9  
    Compares the values of two fields.

    :param fieldname:
        The name of the other field to compare to.
    :param message:
        Error message to raise in case of a validation error. Can be
        interpolated with `%(other_label)s` and `%(other_name)s` to provide a
        more helpful error.
    Nc             C   s   || _ || _d S )N)	fieldnamer(   )r'   r2   r(   r+   r+   r,   r&   <   s    zEqualTo.__init__c             C   s   y|| j  }W n( tk
r6   t|d| j  Y nX |j|jkrt|drV|jjpZ| j | j d}| j}|d kr||d}t|| d S )NzInvalid field name '%s'.label)Zother_labelZ
other_namez&Field must be equal to %(other_name)s.)	r2   KeyErrorr"   gettextdatahasattrr3   textr(   )r'   formfieldotherdr(   r+   r+   r,   __call__@   s    

zEqualTo.__call__)N)r-   r.   r/   r0   r&   r=   r+   r+   r+   r,   r	   1   s   

r	   c               @   s"   e Zd ZdZdddZdd ZdS )	r   a  
    Validates the length of a string.

    :param min:
        The minimum required length of the string. If not provided, minimum
        length will not be checked.
    :param max:
        The maximum length of the string. If not provided, maximum length
        will not be checked.
    :param message:
        Error message to raise in case of a validation error. Can be
        interpolated using `%(min)d` and `%(max)d` if desired. Useful defaults
        are provided depending on the existence of min and max.
    Nc             C   sF   |dks|dkst d|dks0||ks0t d|| _|| _|| _d S )Nr>   z1At least one of `min` or `max` must be specified.z `min` cannot be more than `max`.)AssertionErrorminmaxr(   )r'   r@   rA   r(   r+   r+   r,   r&   `   s
    zLength.__init__c             C   s   |j rt|j pd}|| jk s2| jdkr|| jkr| j}|d kr| jdkr\|dd| j}nD| jdkrx|dd| j}n(| j| jkr|dd| j}n
|d	}t|t| j| j|d
 d S )Nr   r>   z.Field must be at least %(min)d character long.z/Field must be at least %(min)d characters long.z.Field cannot be longer than %(max)d character.z/Field cannot be longer than %(max)d characters.z-Field must be exactly %(max)d character long.z.Field must be exactly %(max)d characters long.z:Field must be between %(min)d and %(max)d characters long.)r@   rA   r   )	r6   lenr@   rA   r(   ngettextr5   r"   dict)r'   r9   r:   lr(   r+   r+   r,   r=   g   s    


zLength.__call__)r>   r>   N)r-   r.   r/   r0   r&   r=   r+   r+   r+   r,   r   Q   s   
r   c               @   s"   e Zd ZdZdddZdd ZdS )r   a  
    Validates that a number is of a minimum and/or maximum value, inclusive.
    This will work with any comparable number type, such as floats and
    decimals, not just integers.

    :param min:
        The minimum required value of the number. If not provided, minimum
        value will not be checked.
    :param max:
        The maximum value of the number. If not provided, maximum value
        will not be checked.
    :param message:
        Error message to raise in case of a validation error. Can be
        interpolated using `%(min)s` and `%(max)s` if desired. Useful defaults
        are provided depending on the existence of min and max.
    Nc             C   s   || _ || _|| _d S )N)r@   rA   r(   )r'   r@   rA   r(   r+   r+   r,   r&      s    zNumberRange.__init__c             C   s   |j }|d ks@t|s@| jd k	r,|| jk s@| jd k	r|| jkr| j}|d kr| jd krd|d}n | jd krz|d}n
|d}t|t| j| jd d S )Nz Number must be at least %(min)s.zNumber must be at most %(max)s.z+Number must be between %(min)s and %(max)s.)r@   rA   )	r6   mathisnanr@   rA   r(   r5   r"   rD   )r'   r9   r:   r6   r(   r+   r+   r,   r=      s    &


zNumberRange.__call__)NNN)r-   r.   r/   r0   r&   r=   r+   r+   r+   r,   r   {   s   
r   c               @   s&   e Zd ZdZdZd	ddZdd ZdS )
r   a=  
    Allows empty input and stops the validation chain from continuing.

    If input is empty, also removes prior errors (such as processing errors)
    from the field.

    :param strip_whitespace:
        If True (the default) also stop the validation chain on input which
        consists of only whitespace.
    )r   Tc             C   s   |rdd | _ n
dd | _ d S )Nc             S   s   |   S )N)strip)sr+   r+   r,   <lambda>       z#Optional.__init__.<locals>.<lambda>c             S   s   | S )Nr+   )rI   r+   r+   r,   rJ      rK   )string_check)r'   strip_whitespacer+   r+   r,   r&      s    zOptional.__init__c             C   s>   |j r&t|j d tr:| |j d s:g |jd d < t d S )Nr   )raw_data
isinstancer   rL   errorsr#   )r'   r9   r:   r+   r+   r,   r=      s    &zOptional.__call__N)T)r-   r.   r/   r0   field_flagsr&   r=   r+   r+   r+   r,   r      s   

r   c               @   s&   e Zd ZdZdZdddZdd ZdS )	r   a  
    Checks the field's data is 'truthy' otherwise stops the validation chain.

    This validator checks that the ``data`` attribute on the field is a 'true'
    value (effectively, it does ``if field.data``.) Furthermore, if the data
    is a string type, a string containing only whitespace characters is
    considered false.

    If the data is empty, also removes prior errors (such as processing errors)
    from the field.

    **NOTE** this validator used to be called `Required` but the way it behaved
    (requiring coerced data, not input data) meant it functioned in a way
    which was not symmetric to the `Optional` validator and furthermore caused
    confusion with certain fields which coerced data to 'falsey' values like
    ``0``, ``Decimal(0)``, ``time(0)`` etc. Unless a very specific reason
    exists, we recommend using the :class:`InputRequired` instead.

    :param message:
        Error message to raise in case of a validation error.
    )r   Nc             C   s
   || _ d S )N)r(   )r'   r(   r+   r+   r,   r&      s    zDataRequired.__init__c             C   sR   |j rt|j trN|j  sN| jd kr2|d}n| j}g |jd d < t|d S )NzThis field is required.)r6   rO   r   rH   r(   r5   rP   r#   )r'   r9   r:   r(   r+   r+   r,   r=      s    
zDataRequired.__call__)N)r-   r.   r/   r0   rQ   r&   r=   r+   r+   r+   r,   r      s   
r   c                   s    e Zd ZdZ fddZ  ZS )r   z
    Legacy alias for DataRequired.

    This is needed over simple aliasing for those who require that the
    class-name of required be 'Required.'

    c                s&   t t| j|| tjdtdd d S )Nz7Required is going away in WTForms 3.0, use DataRequired   )
stacklevel)superr   r&   warningswarnDeprecationWarning)r'   r)   r*   )	__class__r+   r,   r&      s    zRequired.__init__)r-   r.   r/   r0   r&   __classcell__r+   r+   )rX   r,   r      s   r   c               @   s&   e Zd ZdZdZdddZdd ZdS )	r   z
    Validates that input was provided for this field.

    Note there is a distinction between this and DataRequired in that
    InputRequired looks that form-input data was provided, and DataRequired
    looks at the post-coercion data.
    )r   Nc             C   s
   || _ d S )N)r(   )r'   r(   r+   r+   r,   r&      s    zInputRequired.__init__c             C   sF   |j r|j d sB| jd kr&|d}n| j}g |jd d < t|d S )Nr   zThis field is required.)rN   r(   r5   rP   r#   )r'   r9   r:   r(   r+   r+   r,   r=      s    
zInputRequired.__call__)N)r-   r.   r/   r0   rQ   r&   r=   r+   r+   r+   r,   r      s   
r   c               @   s$   e Zd ZdZdddZd	ddZdS )
r   a  
    Validates the field against a user provided regexp.

    :param regex:
        The regular expression string to use. Can also be a compiled regular
        expression pattern.
    :param flags:
        The regexp flags to use, for example re.IGNORECASE. Ignored if
        `regex` is not a string.
    :param message:
        Error message to raise in case of a validation error.
    r   Nc             C   s&   t |trt||}|| _|| _d S )N)rO   r   recompileregexr(   )r'   r\   flagsr(   r+   r+   r,   r&     s    
zRegexp.__init__c             C   sF   | j |jpd}|sB|d kr:| jd kr4|d}n| j}t||S )Nr$   zInvalid input.)r\   matchr6   r(   r5   r"   )r'   r9   r:   r(   r^   r+   r+   r,   r=     s    
zRegexp.__call__)r   N)N)r-   r.   r/   r0   r&   r=   r+   r+   r+   r,   r   
  s   
r   c               @   s0   e Zd ZdZedejZd
ddZdd	 Z	dS )r   a  
    Validates an email address. Requires email_validator package to be
    installed. For ex: pip install wtforms[email].

    :param message:
        Error message to raise in case of a validation error.
    :param granular_messsage:
        Use validation failed message from email_validator library
        (Default False).
    :param check_deliverability:
        Perform domain name resolution check (Default False).
    :param allow_smtputf8:
        Fail validation for addresses that would require SMTPUTF8
        (Default True).
    :param allow_empty_local:
        Allow an empty local part (i.e. @example.com), e.g. for validating
        Postfix aliases (Default False).
    z(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*\Z|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"\Z)NFTc             C   s2   t d krtd|| _|| _|| _|| _|| _d S )Nz7Install 'email_validator' for email validation support.)email_validatorr1   r(   granular_messagecheck_deliverabilityallow_smtputf8allow_empty_local)r'   r(   r`   ra   rb   rc   r+   r+   r,   r&   C  s    zEmail.__init__c          
   C   s   y0|j d krt tj|j | j| j| jd W nV tjk
r } z6| j}|d krn| jrd|	|}n
|	d}t
|W d d }~X Y nX d S )N)ra   rb   rc   zInvalid email address.)r6   r_   ZEmailNotValidErrorZvalidate_emailra   rb   rc   r(   r`   r5   r"   )r'   r9   r:   er(   r+   r+   r,   r=   S  s    

zEmail.__call__)NFFTF)
r-   r.   r/   r0   rZ   r[   
IGNORECASEZ
user_regexr&   r=   r+   r+   r+   r,   r   *  s       

r   c               @   s:   e Zd ZdZdddZdd Zed	d
 Zedd ZdS )r   aV  
    Validates an IP address. Requires ipaddress package to be instaled for Python 2 support.

    :param ipv4:
        If True, accept IPv4 addresses as valid (default True)
    :param ipv6:
        If True, accept IPv6 addresses as valid (default False)
    :param message:
        Error message to raise in case of a validation error.
    TFNc             C   s6   t d krtd|s |s td|| _|| _|| _d S )Nz)Install 'ipaddress' for Python 2 support.zDIP Address Validator must have at least one of ipv4 or ipv6 enabled.)	ipaddressr1   r%   ipv4ipv6r(   )r'   rg   rh   r(   r+   r+   r,   r&   r  s    zIPAddress.__init__c             C   sV   |j }d}|r.| jr| |p,| jo,| |}|sR| j}|d krJ|d}t|d S )NFzInvalid IP address.)r6   rg   
check_ipv4rh   
check_ipv6r(   r5   r"   )r'   r9   r:   valueZvalidr(   r+   r+   r,   r=   {  s     
zIPAddress.__call__c             C   s8   yt |}W n tk
r"   dS X t|t js4dS dS )NFT)rf   r   r%   rO   IPv4Address)clsrk   addressr+   r+   r,   ri     s    zIPAddress.check_ipv4c             C   s8   yt |}W n tk
r"   dS X t|t js4dS dS )NFT)rf   r   r%   rO   IPv6Address)rm   rk   rn   r+   r+   r,   rj     s    zIPAddress.check_ipv6)TFN)	r-   r.   r/   r0   r&   r=   classmethodri   rj   r+   r+   r+   r,   r   g  s
   

	r   c                   s.   e Zd ZdZd fdd	Z fddZ  ZS )r   zu
    Validates a MAC address.

    :param message:
        Error message to raise in case of a validation error.
    Nc                s   d}t t| j||d d S )Nz&^(?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$)r(   )rT   r   r&   )r'   r(   pattern)rX   r+   r,   r&     s    zMacAddress.__init__c                s0   | j }|d kr|d}tt| ||| d S )NzInvalid Mac address.)r(   r5   rT   r   r=   )r'   r9   r:   r(   )rX   r+   r,   r=     s    
zMacAddress.__call__)N)r-   r.   r/   r0   r&   r=   rY   r+   r+   )rX   r,   r     s   r   c                   s.   e Zd ZdZd fdd	Z fddZ  ZS )	r   a  
    Simple regexp based url validation. Much like the email validator, you
    probably want to validate the url later by other means if the url must
    resolve.

    :param require_tld:
        If true, then the domain-name portion of the URL must contain a .tld
        suffix.  Set this to false if you want to allow domains like
        `localhost`.
    :param message:
        Error message to raise in case of a validation error.
    TNc                s,   d}t t| |tj| t|dd| _d S )NzP^[a-z]+://(?P<host>[^\/\?:]+)(?P<port>:[0-9]+)?(?P<path>\/.*?)?(?P<query>\?.*)?$T)require_tldallow_ip)rT   r   r&   rZ   re   HostnameValidationvalidate_hostname)r'   rr   r(   r\   )rX   r+   r,   r&     s
    zURL.__init__c                sH   | j }|d kr|d}tt| |||}| |dsDt|d S )NzInvalid URL.host)r(   r5   rT   r   r=   ru   groupr"   )r'   r9   r:   r(   r^   )rX   r+   r,   r=     s    
zURL.__call__)TN)r-   r.   r/   r0   r&   r=   rY   r+   r+   )rX   r,   r     s   r   c               @   s"   e Zd ZdZdddZdd ZdS )r!   zn
    Validates a UUID.

    :param message:
        Error message to raise in case of a validation error.
    Nc             C   s
   || _ d S )N)r(   )r'   r(   r+   r+   r,   r&     s    zUUID.__init__c             C   sJ   | j }|d kr|d}yt|j W n tk
rD   t|Y nX d S )NzInvalid UUID.)r(   r5   uuidr!   r6   r%   r"   )r'   r9   r:   r(   r+   r+   r,   r=     s    
zUUID.__call__)N)r-   r.   r/   r0   r&   r=   r+   r+   r+   r,   r!     s   
r!   c               @   s.   e Zd ZdZd	ddZdd Zedd ZdS )
r   ae  
    Compares the incoming data to a sequence of valid inputs.

    :param values:
        A sequence of valid inputs.
    :param message:
        Error message to raise in case of a validation error. `%(values)s`
        contains the list of values.
    :param values_formatter:
        Function used to format the list of values in the error message.
    Nc             C   s$   || _ || _|d kr| j}|| _d S )N)valuesr(   default_values_formattervalues_formatter)r'   ry   r(   r{   r+   r+   r,   r&     s
    zAnyOf.__init__c             C   sB   |j | jkr>| j}|d kr$|d}t|t| | jd d S )Nz*Invalid value, must be one of: %(values)s.)ry   )r6   ry   r(   r5   r"   rD   r{   )r'   r9   r:   r(   r+   r+   r,   r=     s
    
zAnyOf.__call__c             C   s   d dd | D S )Nz, c             s   s   | ]}t |V  qd S )N)r   ).0xr+   r+   r,   	<genexpr>	  s    z1AnyOf.default_values_formatter.<locals>.<genexpr>)join)ry   r+   r+   r,   rz     s    zAnyOf.default_values_formatter)NN)r-   r.   r/   r0   r&   r=   staticmethodrz   r+   r+   r+   r,   r     s   
r   c               @   s.   e Zd ZdZd	ddZdd Zedd ZdS )
r   ai  
    Compares the incoming data to a sequence of invalid inputs.

    :param values:
        A sequence of invalid inputs.
    :param message:
        Error message to raise in case of a validation error. `%(values)s`
        contains the list of values.
    :param values_formatter:
        Function used to format the list of values in the error message.
    Nc             C   s$   || _ || _|d kr| j}|| _d S )N)ry   r(   rz   r{   )r'   ry   r(   r{   r+   r+   r,   r&     s
    zNoneOf.__init__c             C   sB   |j | jkr>| j}|d kr$|d}t|t| | jd d S )Nz+Invalid value, can't be any of: %(values)s.)ry   )r6   ry   r(   r5   r"   rD   r{   )r'   r9   r:   r(   r+   r+   r,   r=     s
    
zNoneOf.__call__c             C   s   d dd | D S )Nz, c             s   s   | ]}t |V  qd S )N)r   )r|   r}   r+   r+   r,   r~   )  s    z2NoneOf.default_values_formatter.<locals>.<genexpr>)r   )vr+   r+   r,   rz   '  s    zNoneOf.default_values_formatter)NN)r-   r.   r/   r0   r&   r=   r   rz   r+   r+   r+   r,   r     s   
r   c               @   s>   e Zd ZdZedejZedejZdddZ	dd	 Z
d
S )rt   z
    Helper class for checking hostnames for validation.

    This is not a validator in and of itself, and as such is not exported.
    z ^(xn-|[a-z0-9_]+)(-[a-z0-9_]+)*$z*^([a-z]{2,20}|xn--([a-z0-9]+-)*[a-z0-9]+)$TFc             C   s   || _ || _d S )N)rr   rs   )r'   rr   rs   r+   r+   r,   r&   5  s    zHostnameValidation.__init__c             C   s   | j rt|st|rdS y|d}W n tk
r@   Y nX t|tsV|d}t	|dkrfdS |
d}x0|D ](}|rt	|dkrdS | j|svdS qvW | jrt	|dk s| j|d	 sdS dS )
NTidnaascii   F.?   rR   r>   )rs   r   ri   rj   encodeUnicodeErrorrO   r   decoderB   splithostname_partr^   rr   tld_part)r'   hostnamepartspartr+   r+   r,   r=   9  s*    



zHostnameValidation.__call__N)TF)r-   r.   r/   r0   rZ   r[   re   r   r   r&   r=   r+   r+   r+   r,   rt   ,  s
   
rt   )0
__future__r   rF   rZ   rx   rU   r_   ImportErrorrf   Zwtforms.compatr   r   __all__r%   r"   r1   r#   objectr	   r   r   r   r   r   r   r   r   r   r   r   r!   r   r   rt   r   r
   r   r    r   r   r   r   r   r   r   r   r   r   r+   r+   r+   r,   <module>   s\   

	 *(& =9%  .