U
    PN^                     @   s   d 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Z
G dd	 d	eZG d
d deZdddZeddddfddZdS )z4
Tools for generating forms based on Django models.
    )fields)Form)
validators)	iteritems)ModelSelectField)model_fields
model_formc                   @   s   e Zd Zdd Zdd ZdS )ModelConverterBasec                 C   s
   || _ d S N)
converters)selfr    r   ;/tmp/pip-install-o1yuzyg2/WTForms/wtforms/ext/django/orm.py__init__   s    zModelConverterBase.__init__c                 C   s   |j |jg g |jd}|r$|| |jr<|d t  |jd k	rh|jdkrh|d tj	|jd t
|j}|jr|j|d< tjf |S || jkr| j| |||S t| d| d }|d k	r||||S d S )N)labeldescriptionr   filtersdefaultr   r   )maxchoiceszconv_%s)Zverbose_name	help_textr   updateZblankappendr   Optional
max_lengthZLengthtype__name__r   fSelectFieldr   getattr)r   modelfield
field_argskwargsZftype	converterr   r   r   convert   s*    



zModelConverterBase.convertN)r   
__module____qualname__r   r%   r   r   r   r   r	      s   r	   c                       s   e Zd Zejdddddgejddgejdd	d
gejdgejdgej	dgej
dddgejddgiZd$ fdd	Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Z  ZS )%ModelConverterZ	AutoFieldIntegerFieldZSmallIntegerFieldZPositiveIntegerFieldZPositiveSmallIntegerFieldDecimalFieldZ
FloatField	FileFieldZFilePathFieldZ
ImageFieldDateTimeField	DateFieldBooleanFieldZ	CharFieldZPhoneNumberFieldZ	SlugField	TextFieldZXMLFieldNc                    sb   i }|d kr| j }t|D ]$\}}| |}|D ]}|||< q0q|rN|| tt| | d S r
   )DEFAULT_SIMPLE_CONVERSIONSr   make_simple_converterr   superr(   r   )r   Zextra_convertersZsimple_conversionsr   
field_typeZdjango_fieldsr$   name	__class__r   r   r   <   s    

zModelConverter.__init__c                    s    fdd}|S )Nc                    s
    f |S r
   r   )r    r!   r#   r3   r   r   
_converterJ   s    z8ModelConverter.make_simple_converter.<locals>._converterr   )r   r3   r8   r   r7   r   r1   I   s    z$ModelConverter.make_simple_converterc                 C   s   t f d|jji|S )Nr    )r   reltor   r    r!   r#   r   r   r   conv_ForeignKeyN   s    zModelConverter.conv_ForeignKeyc                 C   s*   dd }|d  | tjf ddi|S )Nc                 S   s(   z
|   W S  tk
r"   |  Y S X d S r
   )timeAttributeError)objr   r   r   	time_onlyR   s    
z0ModelConverter.conv_TimeField.<locals>.time_onlyr   formatz%H:%M:%S)r   r   r,   )r   r    r!   r#   r@   r   r   r   conv_TimeFieldQ   s    zModelConverter.conv_TimeFieldc                 C   s   |d  t  tjf |S Nr   )r   r   emailr   r/   r;   r   r   r   conv_EmailFieldZ   s    zModelConverter.conv_EmailFieldc                 C   s   |d  t  tjf |S rC   )r   r   
ip_addressr   r/   r;   r   r   r   conv_IPAddressField^   s    z"ModelConverter.conv_IPAddressFieldc                 C   s   |d  t  tjf |S rC   )r   r   urlr   r/   r;   r   r   r   conv_URLFieldb   s    zModelConverter.conv_URLFieldc                    s2   ddl m   fdd}d}tjf ||d|S )Nr   NOT_PROVIDEDc                    s<   d d ddd}t |  rd S | |kr,||  S tt| S d S )NTF)NoneNTrueFalse)
isinstanceboolint)valuedrJ   r   r   coerce_nullbooli   s    
z=ModelConverter.conv_NullBooleanField.<locals>.coerce_nullbool))NUnknown)TZYes)FZNo)r   Zcoerce)Zdjango.db.models.fieldsrK   r   r   )r   r    r!   r#   rT   r   r   rJ   r   conv_NullBooleanFieldf   s    	z$ModelConverter.conv_NullBooleanField)NN)r   r&   r'   r   r)   r*   r+   r,   r-   r.   r/   ZTextAreaFieldr0   r   r1   r<   rB   rE   rG   rI   rV   __classcell__r   r   r5   r   r(   0   s2           	r(   Nc           
         s   |pt  }|pi }dd | jjD }r<fdd|D }n rR fdd|D }i }|D ],\}}|| |||}	|	dk	rZ|	||< qZ|S )z
    Generate a dictionary of fields for a given Django model.

    See `model_form` docstring for description of parameters.
    c                 s   s   | ]}|j |fV  qd S r
   )Zattname).0r   r   r   r   	<genexpr>   s     zmodel_fields.<locals>.<genexpr>c                 3   s   | ]}|d   kr|V  qdS r   Nr   rX   x)onlyr   r   rY      s      c                 3   s   | ]}|d   kr|V  qdS rZ   r   r[   )excluder   r   rY      s      N)r(   _metar   r%   get)
r    r]   r^   r"   r$   r   
field_dictr4   Zmodel_fieldr!   r   )r^   r]   r   r   v   s    

r   c                 C   s&   t | ||||}t| jjd |f|S )a  
    Create a wtforms Form for a given Django model class::

        from wtforms.ext.django.orm import model_form
        from myproject.myapp.models import User
        UserForm = model_form(User)

    :param model:
        A Django ORM model class
    :param base_class:
        Base form class to extend from. Must be a ``wtforms.Form`` subclass.
    :param only:
        An optional iterable with the property names that should be included in
        the form. Only these properties will have fields.
    :param exclude:
        An optional iterable with the property names that should be excluded
        from the form. All other properties will have fields.
    :param field_args:
        An optional dictionary of field names mapping to keyword arguments used
        to construct each field object.
    :param converter:
        A converter to generate the fields based on the model properties. If
        not set, ``ModelConverter`` is used.
    r   )r   r   r_   Zobject_name)r    Z
base_classr]   r^   r"   r$   ra   r   r   r   r      s    r   )NNNN)__doc__Zwtformsr   r   r   r   Zwtforms.compatr   Zwtforms.ext.django.fieldsr   __all__objectr	   r(   r   r   r   r   r   r   <module>   s    F
