U
    PN^T                     @   s   d dl 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 d dlmZ d d	lmZ d
dlmZmZmZ d
dlmZ zd
dlmZ W n ek
r   dZY nX edZe ZG dd deZdd Z G dd deZdS )    N)current_apprequest)session)Markup)CombinedMultiDictImmutableMultiDict)cached_property)Form)DefaultMeta)HiddenInput   )FlaskWTFDeprecationWarningstring_types	text_type)_FlaskFormCSRF)translations)POSTPUTPATCHDELETEc                       sL   e Zd ZdZG dd deZef fdd	Zdd Zdd	 Z	d
d Z
  ZS )	FlaskFormzFlask-specific subclass of WTForms :class:`~wtforms.form.Form`.

    If ``formdata`` is not specified, this will use :attr:`flask.request.form`
    and :attr:`flask.request.files`.  Explicitly pass ``formdata=None`` to
    prevent this.
    c                   @   sT   e Zd ZeZeZedd Zedd Z	edd Z
edd Zd	d
 Zdd ZdS )zFlaskForm.Metac                 C   s   t jddS )NZWTF_CSRF_ENABLEDTr   configgetself r   5/tmp/pip-install-o1yuzyg2/flask-wtf/flask_wtf/form.pycsrf%   s    zFlaskForm.Meta.csrfc                 C   s   t jdt jS )NZWTF_CSRF_SECRET_KEY)r   r   r   Z
secret_keyr   r   r   r   csrf_secret)   s     zFlaskForm.Meta.csrf_secretc                 C   s   t jddS )NZWTF_CSRF_FIELD_NAMEZ
csrf_tokenr   r   r   r   r   csrf_field_name/   s    zFlaskForm.Meta.csrf_field_namec                 C   s   t jddS )NZWTF_CSRF_TIME_LIMITi  r   r   r   r   r   csrf_time_limit3   s    zFlaskForm.Meta.csrf_time_limitc                 C   sL   |t krHt rDtjr$ttjtjfS tjr0tjS t rDtt S d S |S N)_Auto_is_submittedr   filesr   formZget_jsonr   )r   r&   formdatar   r   r   wrap_formdata7   s     zFlaskForm.Meta.wrap_formdatac                 C   s   t jddsd S tS )NZWTF_I18N_ENABLEDT)r   r   r   r   )r   r&   r   r   r   get_translationsG   s    zFlaskForm.Meta.get_translationsN)__name__
__module____qualname__r   Z
csrf_classr   Zcsrf_contextr   r   r   r    r!   r(   r)   r   r   r   r   Meta!   s   



r-   c                    sf   | dd }|d k	rHtjtddd |dp2i |d< |d d| tt| jf d|i| d S )Ncsrf_enabledzQ"csrf_enabled" is deprecated and will be removed in 1.0. Set "meta.csrf" instead.   
stacklevelmetar   r'   )	popwarningswarnr   r   
setdefaultsuperr   __init__)r   r'   kwargsr.   	__class__r   r   r8   M   s    zFlaskForm.__init__c                 C   s   t  S )zConsider the form submitted if there is an active request and
        the method is ``POST``, ``PUT``, ``PATCH``, or ``DELETE``.
        )r$   r   r   r   r   is_submittedZ   s    zFlaskForm.is_submittedc                 C   s   |   o|  S )zCall :meth:`validate` only if the form is submitted.
        This is a shortcut for ``form.is_submitted() and form.validate()``.
        )r<   validater   r   r   r   validate_on_submita   s    zFlaskForm.validate_on_submitc                    s,    fdd}t ddd ||p  D S )a?  Render the form's hidden fields in one call.

        A field is considered hidden if it uses the
        :class:`~wtforms.widgets.HiddenInput` widget.

        If ``fields`` are given, only render the given fields that
        are hidden.  If a string is passed, render the field with that
        name if it exists.

        .. versionchanged:: 0.13

           No longer wraps inputs in hidden div.
           This is valid HTML 5.

        .. versionchanged:: 0.13

           Skip passed fields that aren't hidden.
           Skip passed names that don't exist.
        c                 3   s@   | D ]6}t |trt |d }|d kst |jts4q|V  qd S r"   )
isinstancer   getattrZwidgetr   )fieldsfr   r   r   hidden_fields|   s    
z+FlaskForm.hidden_tag.<locals>.hidden_fields
c                 s   s   | ]}t |V  qd S r"   )r   ).0rB   r   r   r   	<genexpr>   s     z'FlaskForm.hidden_tag.<locals>.<genexpr>)r   join)r   rA   rC   r   r   r   
hidden_tagg   s    
zFlaskForm.hidden_tag)r*   r+   r,   __doc__r
   r-   r#   r8   r<   r>   rH   __classcell__r   r   r:   r   r      s   ,r   c                   C   s   t totjtkS )zConsider the form submitted if there is an active request and
    the method is ``POST``, ``PUT``, ``PATCH``, or ``DELETE``.
    )boolr   methodSUBMIT_METHODSr   r   r   r   r$      s    r$   c                       s    e Zd ZdZ fddZ  ZS )r	   zP
    .. deprecated:: 0.13
        Renamed to :class:`~flask_wtf.FlaskForm`.
    c                    s(   t jtddd tt| j|| d S )NzL"flask_wtf.Form" has been renamed to "FlaskForm" and will be removed in 1.0.r/   r0   )r4   r5   r   r7   r	   r8   )r   argsr9   r:   r   r   r8      s    zForm.__init__)r*   r+   r,   rI   r8   rJ   r   r   r:   r   r	      s   r	   )!r4   Zflaskr   r   r   Zjinja2r   Zwerkzeug.datastructuresr   r   Zwerkzeug.utilsr   Zwtformsr	   Zwtforms.metar
   Zwtforms.widgetsr   _compatr   r   r   r   r   Zi18nr   ImportErrorsetrM   objectr#   r   r$   r   r   r   r   <module>   s&   
r