o
    Šågâ  ã                   @   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__© úR/var/www/html/flaskapp/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>