o
    Df                     @   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                       sX   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i | |d ur|| _d S d S N)super__init__option_widget)selflabel
validatorsr   kwargs	__class__ O/home/ubuntu/webapp/venv/lib/python3.10/site-packages/wtforms/fields/choices.pyr      s   
zSelectFieldBase.__init__c                 C      t  )z
        Provides data for choice widget rendering. Must return a sequence or
        iterable of (value, label, selected, render_kw) tuples.
        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   r   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 ]6\}}t|dkr'|\}}}}n|\}}}i }| j	d|d| j
|f d||}|d | ||_|V  qd S )N)widgetr   name	render_kw_form_meta   z%s-%d)r   idr   )dictr   r   r   r   meta	enumerater   len_Optionr"   processchecked)	r   optsichoicevaluer   r)   r   optr   r   r   __iter__+   s2   
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)   r2   r   r   r   r   r'   B   s    r'   )NNN)r3   r4   r5   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                    s\   t  j||fi | || _t|r| }|d ur&t|tr |nt|| _nd | _|| _d S r	   )	r
   r   coercecallable
isinstancer#   listchoicesvalidate_choice)r   r   r   r8   r<   r=   r   r   r   r   r   L   s   	
zSelectField.__init__c                 C   s@   | j sg }nt| j trttj| j  }n| j }| |S r	   )	r<   r:   r#   r;   	itertoolschainfrom_iterablevalues_choices_generator)r   r<   r   r   r   r   _   s   
zSelectField.iter_choicesc                 C   s   t | jtS r	   )r:   r<   r#   r   r   r   r   r   i   s   zSelectField.has_groupsc                 c   s:    t | jtr| j D ]\}}|| |fV  qd S d S r	   )r:   r<   r#   itemsrB   )r   r   r<   r   r   r   r   l   s   zSelectField.iter_groupsc                 c   st    |sg }nt |d ttfr|}nt||}|D ]^}}}| || jk}t|r.|d ni }||||fV  qd S Nr   )r:   r;   tuplezipr8   r1   r&   r   r<   _choicesr-   r   
other_argsselectedr   r   r   r   rB   q   s   
zSelectField._choices_generatorc              	   C   s>   z|d ur
|  |nd | _W d S  ttfy   d | _Y d S w r	   )r8   r1   
ValueError	TypeErrorr   r-   r   r   r   process_data   s
   zSelectField.process_datac              
   C   sH   |sd S z|  |d | _W d S  ty# } zt| d|d }~ww )Nr   z!Invalid Choice: could not coerce.)r8   r1   rK   gettextr   	valuelistexcr   r   r   process_formdata   s   zSelectField.process_formdatac                 C   sP   | j sd S | jd u rt| d|  D ]^}}}}|r  d S qt| d)NChoices cannot be None.zNot a valid choice.)r=   r<   rL   rO   r   r   )r   form_matchr   r   r   pre_validate   s   
zSelectField.pre_validate)r3   r4   r5   r   Selectr   r0   r   r   r   r   rB   rN   rS   rX   r7   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 ]#^}}}| jd uo*| || jv }t|r3|d ni }||||fV  qd S rD   )r:   r;   rE   rF   r1   r8   r&   rG   r   r   r   rB      s   
z&SelectMultipleField._choices_generatorc              	      s>   zt  fdd|D  _W d S  ttfy   d  _Y d S w )Nc                 3       | ]}  |V  qd S r	   r8   ).0vr   r   r   	<genexpr>       z3SelectMultipleField.process_data.<locals>.<genexpr>)r;   r1   rK   rL   rM   r   r   r   rN      s
   z SelectMultipleField.process_datac              
      sH   zt  fdd|D  _W d S  ty# } zt d|d }~ww )Nc                 3   r[   r	   r\   )r]   xr   r   r   r_      r`   z7SelectMultipleField.process_formdata.<locals>.<genexpr>z@Invalid choice(s): one or more data inputs could not be coerced.)r;   r1   rK   rO   rP   r   r   r   rS      s   z$SelectMultipleField.process_formdatac                    s   j rjsd S jd u rtdfdd D  t fddjD rJ fddtjD }t	ddt
|td	|d
 d S )NrT   c                    s   g | ]	}  |d  qS )r   r\   )r]   r,   r   r   r   
<listcomp>   s    z4SelectMultipleField.pre_validate.<locals>.<listcomp>c                 3   s    | ]}| vV  qd S r	   r   r]   r1   
acceptabler   r   r_      s    z3SelectMultipleField.pre_validate.<locals>.<genexpr>c                    s   g | ]
}| vrt |qS r   )r0   rc   rd   r   r   rb      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=   r1   r<   rL   rO   r   anysetr   ngettextr&   r#   join)r   rU   unacceptabler   )re   r   r   rX      s&   

z SelectMultipleField.pre_validateN)r3   r4   r5   __doc__r   rY   r   rB   rN   rS   rX   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)prefix_labelN)	r3   r4   r5   rk   r   
ListWidgetr   
RadioInputr   r   r   r   r   r      s    r   )r>   wtformsr   wtforms.fields.corer   wtforms.validatorsr   __all__r   r   r   r   r   r   r   r   <module>   s    ;U>