o
    h                     @   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__ I/var/www/html/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_kwZ_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(   r1   r   r   r   r   r&   B   s    r&   )NNN)r2   r3   r4   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   r7   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;   r9   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	   )r9   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	   )r9   r;   r"   itemsrA   )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   )r9   r:   tuplezipr7   r0   r%   r   r;   Z_choicesr,   r   Z
other_argsselectedr   r   r   r   rA   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	   )r7   r0   
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.)r7   r0   rH   gettextr   Z	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;   rI   rL   r   r   )r   form_matchr   r   r   pre_validate   s   
zSelectField.pre_validate)r2   r3   r4   r   Selectr   r/   r   r   r   r   rA   rK   rO   rT   r6   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)Z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 rC   )r9   r:   rD   rE   r0   r7   r%   rF   r   r   r   rA      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	   r7   ).0vr   r   r   	<genexpr>       z3SelectMultipleField.process_data.<locals>.<genexpr>)r:   r0   rH   rI   rJ   r   r   r   rK      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   rV   r	   rW   )rX   xr   r   r   rZ      r[   z7SelectMultipleField.process_formdata.<locals>.<genexpr>z@Invalid choice(s): one or more data inputs could not be coerced.)r:   r0   rH   rL   rM   r   r   r   rO      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 )NrP   c                    s   g | ]	}  |d  qS )r   rW   )rX   r+   r   r   r   
<listcomp>   s    z4SelectMultipleField.pre_validate.<locals>.<listcomp>c                 3   s    | ]}| vV  qd S r	   r   rX   r0   
acceptabler   r   rZ      s    z3SelectMultipleField.pre_validate.<locals>.<genexpr>c                    s   g | ]
}| vrt |qS r   )r/   r^   r_   r   r   r]      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<   r0   r;   rI   rL   r   anysetr   ngettextr%   r"   join)r   rQ   Zunacceptabler   )r`   r   r   rT      s&   

z SelectMultipleField.pre_validateN)r2   r3   r4   __doc__r   rU   r   rA   rK   rO   rT   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)	r2   r3   r4   re   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>