o
    2c                     @   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   L/var/www/html/gps/gps/lib/python3.10/site-packages/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 ur4|jdkr4|d tj	|jd t
|j}|jrI|j|d< tjdi |S || jv rW| j| |||S t| d| d }|d uri||||S d S )N)labeldescriptionr   filtersdefaultr   r   )maxchoiceszconv_%sr   )verbose_name	help_textr   updateblankappendr   Optional
max_lengthLengthtype__name__r   fSelectFieldr   getattr)r   modelfield
field_argskwargs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g dejddgejg dejdgejdgej	dgej
g d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 )ModelConverter)	AutoFieldIntegerFieldSmallIntegerFieldPositiveIntegerFieldPositiveSmallIntegerFieldDecimalField
FloatField)	FileFieldFilePathField
ImageFieldDateTimeField	DateFieldBooleanField)	CharFieldPhoneNumberField	SlugField	TextFieldXMLFieldNc                    sb   i }|d u r	| j }t|D ]\}}| |}|D ]}|||< qq|r'|| tt| | d S r
   )DEFAULT_SIMPLE_CONVERSIONSr   make_simple_converterr   superr,   r   )r   extra_converterssimple_conversionsr   
field_typedjango_fieldsr(   name	__class__r   r   r   <   s   


zModelConverter.__init__c                    s    fdd}|S )Nc                    s    di |S )Nr   r   )r#   r$   r&   rD   r   r   
_converterJ   s   z8ModelConverter.make_simple_converter.<locals>._converterr   )r   rD   rJ   r   rI   r   r@   I   s   z$ModelConverter.make_simple_converterc                 C   s   t dd|jji|S )Nr#   r   )r   reltor   r#   r$   r&   r   r   r   conv_ForeignKeyN   s   zModelConverter.conv_ForeignKeyc                 C   s*   dd }|d  | tjdddi|S )Nc                 S   s"   z|   W S  ty   |  Y S w r
   )timeAttributeError)objr   r   r   	time_onlyR   s
   
z0ModelConverter.conv_TimeField.<locals>.time_onlyr   formatz%H:%M:%Sr   )r   r    r7   )r   r#   r$   r&   rR   r   r   r   conv_TimeFieldQ   s   zModelConverter.conv_TimeFieldc                 C   "   |d  t  tjdi |S Nr   r   )r   r   emailr    r=   rM   r   r   r   conv_EmailFieldZ      zModelConverter.conv_EmailFieldc                 C   rU   rV   )r   r   
ip_addressr    r=   rM   r   r   r   conv_IPAddressField^   rY   z"ModelConverter.conv_IPAddressFieldc                 C   rU   rV   )r   r   urlr    r=   rM   r   r   r   conv_URLFieldb   rY   zModelConverter.conv_URLFieldc                    s2   ddl m   fdd}d}tjd||d|S )Nr   NOT_PROVIDEDc                    s8   d d ddd}t |  rd S | |v r||  S tt| S )NTF)NoneNTrueFalse)
isinstanceboolint)valuedr^   r   r   coerce_nullbooli   s   
z=ModelConverter.conv_NullBooleanField.<locals>.coerce_nullbool))NUnknown)TYes)FNo)r   coercer   )django.db.models.fieldsr_   r    r!   )r   r#   r$   r&   rh   r   r   r^   r   conv_NullBooleanFieldf   s   	z$ModelConverter.conv_NullBooleanField)NN)r   r*   r+   r    r.   r2   r4   r7   r8   r9   r=   TextAreaFieldr?   r   r@   rN   rT   rX   r[   r]   rn   __classcell__r   r   rG   r   r,   0   s$    




	r,   Nc           
         s   |pt  }|pi }dd | jjD }rfdd|D }n r) fdd|D }i }|D ]\}}|| |||}	|	durC|	||< q-|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
   )attname).0r    r   r   r   	<genexpr>   s    zmodel_fields.<locals>.<genexpr>c                 3   s     | ]}|d   v r|V  qdS r   Nr   rr   x)onlyr   r   rs          c                 3   s     | ]}|d   vr|V  qdS rt   r   ru   )excluder   r   rs      rx   N)r,   _metar   r)   get)
r#   rw   ry   r%   r(   r   
field_dictrF   model_fieldr$   r   )ry   rw   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   rz   object_name)r#   
base_classrw   ry   r%   r(   r|   r   r   r   r      s   r   )NNNN)__doc__wtformsr   r    r   r   wtforms.compatr   wtforms.ext.django.fieldsr   __all__objectr	   r,   r   r   r   r   r   r   <module>   s     
F