U
    fg                     @   st   d dl 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	G d
d de	Z
G dd de	ZdS )    N)widgets)Field)ValidationError)SelectFieldSelectMultipleField
RadioFieldc                       sV   e Zd Ze Zd fdd	Zdd Zdd Zdd	 Z	d
d Z
G dd deZ  ZS )SelectFieldBaseNc                    s$   t  j||f| |d k	r || _d S N)super__init__option_widget)selflabel
validatorsr   kwargs	__class__ :/tmp/pip-unpacked-wheel-p06mjha7/wtforms/fields/choices.pyr      s    zSelectFieldBase.__init__c                 C   s
   t  dS )z
        Provides data for choice widget rendering. Must return a sequence or
        iterable of (value, label, selected, render_kw) tuples.
        NNotImplementedErrorr   r   r   r   iter_choices   s    zSelectFieldBase.iter_choicesc                 C   s   dS )NFr   r   r   r   r   
has_groups%   s    zSelectFieldBase.has_groupsc                 C   s
   t  d S r	   r   r   r   r   r   iter_groups(   s    zSelectFieldBase.iter_groupsc           	      c   s   t | j| j| j| jd | jd}t|  D ]j\}}t|dkrL|\}}}}n|\}}}i }| j	f |d| j
|f d||}|d | ||_|V  q*d S )N)widgetr   name	render_kwZ_formZ_meta   z%s-%d)r   id)dictr   r   r   r   meta	enumerater   len_Optionr   processchecked)	r   optsichoicevaluer   r&   r   optr   r   r   __iter__+   s.    
  zSelectFieldBase.__iter__c                   @   s   e Zd ZdZdd ZdS )zSelectFieldBase._OptionFc                 C   s
   t | jS r	   )strdatar   r   r   r   _valueE   s    zSelectFieldBase._Option._valueN)__name__
__module____qualname__r&   r/   r   r   r   r   r$   B   s   r$   )NNN)r0   r1   r2   r   Optionr   r   r   r   r   r,   r   r$   __classcell__r   r   r   r   r      s   	r   c                       sh   e Zd Ze Zddeddf 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 )r   NTc                    sX   t  j||f| || _t|r&| }|d k	rHt|tr<|nt|| _nd | _|| _d S r	   )	r
   r   coercecallable
isinstancer    listchoicesvalidate_choice)r   r   r   r5   r9   r:   r   r   r   r   r   L   s    	zSelectField.__init__c                 C   s@   | j sg }n*t| j tr0ttj| j  }n| j }| |S r	   )	r9   r7   r    r8   	itertoolschainfrom_iterablevalues_choices_generator)r   r9   r   r   r   r   _   s    zSelectField.iter_choicesc                 C   s   t | jtS r	   )r7   r9   r    r   r   r   r   r   i   s    zSelectField.has_groupsc                 c   s4   t | jtr0| j D ]\}}|| |fV  qd S r	   )r7   r9   r    itemsr?   )r   r   r9   r   r   r   r   l   s    zSelectField.iter_groupsc                 c   sr   |s
g }n"t |d ttfr"|}n
t||}|D ]<^}}}| || jk}t|rZ|d ni }||||fV  q0d S Nr   )r7   r8   tuplezipr5   r.   r#   r   r9   Z_choicesr*   r   Z
other_argsselectedr   r   r   r   r?   q   s    
zSelectField._choices_generatorc              	   C   s@   z|d k	r|  |nd | _W n ttfk
r:   d | _Y nX d S r	   )r5   r.   
ValueError	TypeErrorr   r*   r   r   r   process_data   s    zSelectField.process_datac              
   C   sT   |sd S z|  |d | _W n2 tk
rN } zt| d|W 5 d }~X Y nX d S )Nr   z!Invalid Choice: could not coerce.)r5   r.   rF   gettextr   Z	valuelistexcr   r   r   process_formdata   s    zSelectField.process_formdatac                 C   sR   | j s
d S | jd kr"t| d|  D ]^}}}}|r* qNq*t| dd S )NChoices cannot be None.zNot a valid choice.)r:   r9   rG   rJ   r   r   )r   form_matchr   r   r   pre_validate   s    
zSelectField.pre_validate)r0   r1   r2   r   Selectr   r-   r   r   r   r   r?   rI   rM   rR   r4   r   r   r   r   r   I   s   
	r   c                   @   s<   e Zd ZdZejddZdd Zdd Zdd	 Z	d
d Z
dS )r   z
    No different from a normal select field, except this one can take (and
    validate) multiple choices.  You'll need to specify the HTML `size`
    attribute to the select field when rendering.
    T)multiplec                 c   s|   |s
g }n"t |d ttfr"|}n
t||}|D ]F^}}}| jd k	oR| || jk}t|rd|d ni }||||fV  q0d S rA   )r7   r8   rB   rC   r.   r5   r#   rD   r   r   r   r?      s    
z&SelectMultipleField._choices_generatorc              	      s@   zt  fdd|D  _W n ttfk
r:   d  _Y nX d S )Nc                 3   s   | ]}  |V  qd S r	   r5   ).0vr   r   r   	<genexpr>   s     z3SelectMultipleField.process_data.<locals>.<genexpr>)r8   r.   rF   rG   rH   r   r   r   rI      s    z SelectMultipleField.process_datac              
      sT   zt  fdd|D  _W n2 tk
rN } zt d|W 5 d }~X Y nX d S )Nc                 3   s   | ]}  |V  qd S r	   rU   )rV   xr   r   r   rX      s     z7SelectMultipleField.process_formdata.<locals>.<genexpr>z@Invalid choice(s): one or more data inputs could not be coerced.)r8   r.   rF   rJ   rK   r   r   r   rM      s    z$SelectMultipleField.process_formdatac                    s   j rjsd S jd kr(tdfdd D  t fddjD r fddtjD }t	ddt
|td	|d
 d S )NrN   c                    s   g | ]}  |d  qS )r   rU   )rV   r)   r   r   r   
<listcomp>   s     z4SelectMultipleField.pre_validate.<locals>.<listcomp>c                 3   s   | ]}| kV  qd S r	   r   rV   r.   
acceptabler   r   rX      s     z3SelectMultipleField.pre_validate.<locals>.<genexpr>c                    s   g | ]}| krt |qS r   )r-   r[   r\   r   r   rZ      s     z1'%(value)s' is not a valid choice for this field.z1'%(value)s' are not valid choices for this field.z', ')r*   )r:   r.   r9   rG   rJ   r   anysetr   ngettextr#   r    join)r   rO   Zunacceptabler   )r]   r   r   rR      s$    

z SelectMultipleField.pre_validateN)r0   r1   r2   __doc__r   rS   r   r?   rI   rM   rR   r   r   r   r   r      s   
r   c                   @   s$   e Zd ZdZejddZe ZdS )r   z
    Like a SelectField, except displays a list of radio buttons.

    Iterating the field will produce subfields (each containing a label as
    well) in order to allow custom rendering of the individual radio fields.
    F)Zprefix_labelN)	r0   r1   r2   rb   r   Z
ListWidgetr   Z
RadioInputr   r   r   r   r   r      s   r   )r;   Zwtformsr   Zwtforms.fields.corer   Zwtforms.validatorsr   __all__r   r   r   r   r   r   r   r   <module>   s   ;U>