
    wdf)              	           d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddlm
Z
mZ d	Zd
 Z G d de          Z G d de          Z G d de          Z	 	 	 ddZde	dddddddf	dZdS )z8
Tools for generating forms based on SQLAlchemy models.
    )unicode_literalsN)fields)
validators)Form   )QuerySelectFieldQuerySelectMultipleField)model_fields
model_formc                        fd}|S )Nc                 0    t                    | _        | S N)	frozenset_converter_for)funcargss    _/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/wtforms/ext/sqlalchemy/orm.py_innerzconverts.<locals>._inner   s    'oo     )r   r   s   ` r   convertsr      s#         Mr   c                       e Zd Zd ZdS )ModelConversionErrorc                 <    t                               | |           d S r   )	Exception__init__)selfmessages     r   r   zModelConversionError.__init__   s    4)))))r   N)__name__
__module____qualname__r   r   r   r   r   r      s#        * * * * *r   r   c                       e Zd ZddZddZdS )ModelConverterBaseTc                     || _         |si }t          |           D ]1}t          | |          }t          |d          r|j        D ]}|||<   2|| _        d S )Nr   )use_mrodirgetattrhasattrr   
converters)r   r)   r%   nameobj	classnames         r   r   zModelConverterBase.__init__   sx     	JII 	0 	0D$%%Cs,-- 0!$!3 0 0I,/Jy))$r   Nc                 @   t          |d          st          |d          sd S t          |d          s't          |j                  dk    rt          d          g g d d}d }d }d }	t          |d          s|j        d         }t	          |dd           }
|
/t	          |
dd           }|t          |          r |d           n|}
|
|d<   |j        r-|d	                             t          j	                               n,|d	                             t          j
                               | j        r't          j        t          |j                            }	nt          |j                  g}	|	D ]J}|j        d
|j        }|                    d          r
|dd          }|| j        v r| j        |         } nIK|	D ]$}|j        | j        v r| j        |j                 } n"%t'          d|j        d|	d         d          nsst'          d|j        z            |j        j        d}|j        D ]}|d         j        sd}|                    |fdd           | j        |j        j                 }|r|                    |            ||||||          S )Ncolumns	directionr   z?Do not know how to convert multiple-column properties currently)r   filtersdefaultr   r1   argr   .
sqlalchemy   z#Could not find field converter for z (z).z)Cannot convert field %s, need DB session.TFc                  R                                                                    S r   )queryall)
db_sessionforeign_models   r   <lambda>z,ModelConverterBase.convert.<locals>.<lambda>y   s!    )9)9-)H)H)L)L)N)N r   )allow_blankquery_factory)modelmapperpropcolumn
field_args)r(   lenr.   	TypeErrorr'   callablenullableappendr   OptionalRequiredr%   inspectgetmrotyper    r   
startswithr)   r   keyr?   class_local_remote_pairsupdater/   r*   )r   r>   r?   r@   rB   r9   kwargs	converterrA   typesr1   callable_defaultcol_typetype_stringrF   pairr:   s        `          @r   convertzModelConverterBase.convert-   sT   tY'' 	k0J0J 	F{++ 	DL0A0AQ0F0FQ  
 
 
 	t[)) =	=\!_F
 fi66G" $+7E4#@#@ #/8@AQ8R8Rh..t444XhG 'F9 C|$++J,?,A,ABBBB|$++J,?,A,ABBB| ,tFK'8'899fk**+! u u)1)<)<)<h>O>OP)),77 3"-bcc"2K$/11 $ <IE 2 !& u uH(DO;;$(OH4E$F	 < /.`d`h`h`hjopqjrjrjr/sttt  c*+VY]Ya+abbb K.MH/ % %Aw' %$HMM'!N!N!N!N!N    
 (;<I 	&MM*%%%y
 
 
 	
r   )Tr   )r   r    r!   r   rY   r   r   r   r#   r#      sB        % % % %Z
 Z
 Z
 Z
 Z
 Z
r   r#   c                   z    e Zd Zd+ fd	Zed             Z edd          d             Z edd	d
dd          d             Z ed          d             Z	 ed          d             Z
 ed          d             Z ed          d             Z edd          d             Z edd          d             Z edd          d             Z edd           d!             Z ed"          d#             Z ed$          d%             Z ed&          d'             Z ed(d)          d*             Z xZS ),ModelConverterNTc                 \    t          t          |                               ||           d S )N)r%   )superr[   r   )r   extra_convertersr%   	__class__s      r   r   zModelConverter.__init__   s-    nd##,,-=w,OOOOOr   c                     |j         j        r:|d                             t          j        |j         j                             d S d S )Nr   )max)rL   lengthrG   r   Length)clsrA   rB   extras       r   _string_commonzModelConverter._string_common   sN    ; 	W|$++J,=&+BT,U,U,UVVVVV	W 	Wr   StringUnicodec                 B     | j         dd|i| t          j        di |S NrB   r   )rf   f	TextFieldr   rB   re   s      r   conv_StringzModelConverter.conv_String   s6    ;;z;U;;;{((Z(((r   z
types.TextUnicodeTextztypes.LargeBinaryztypes.Binaryzsql.sqltypes.Textc                 B     | j         dd|i| t          j        di |S rj   )rf   rk   TextAreaFieldrm   s      r   	conv_TextzModelConverter.conv_Text   s6    ;;z;U;;;,,,,,r   Booleanc                 $    t          j        di |S Nr   )rk   BooleanFieldrm   s      r   conv_BooleanzModelConverter.conv_Boolean   s    ~++
+++r   Datec                 $    t          j        di |S ru   )rk   	DateFieldrm   s      r   	conv_DatezModelConverter.conv_Date   s    {((Z(((r   DateTimec                 $    t          j        di |S ru   )rk   DateTimeFieldrm   s      r   conv_DateTimezModelConverter.conv_DateTime   s    ,,,,,r   Enumc                 ^    d|vrd |j         j        D             |d<   t          j        di |S )Nchoicesc                     g | ]}||fS r   r   ).0es     r   
<listcomp>z,ModelConverter.conv_Enum.<locals>.<listcomp>   s    $G$G$GaV$G$G$Gr   r   )rL   enumsrk   SelectField)r   rA   rB   re   s       r   	conv_EnumzModelConverter.conv_Enum   s@    J&&$G$GV[5F$G$G$GJy!}**z***r   IntegerSmallIntegerc                     t          |j        dd          }|r.|d                             t          j        d                     t          j        di |S )NunsignedFr   r   )minr   )r'   rL   rG   r   NumberRangerk   IntegerField)r   rA   rB   re   r   s        r   handle_integer_typesz#ModelConverter.handle_integer_types   s[    6;
E:: 	K|$++J,Bq,I,I,IJJJ~++
+++r   NumericFloatc                 ^    t          |j        dd          }|||d<   t          j        di |S )Nscale   placesr   )r'   rL   rk   DecimalField)r   rA   rB   re   r   s        r   handle_decimal_typesz#ModelConverter.handle_decimal_types   s;    gq11#)Jx ~++
+++r   zdatabases.mysql.MSYearzdialects.mysql.base.YEARc                     |d                              t          j        dd                     t          j        di |S )Nr   im  ik  )r   ra   r   )rG   r   r   rk   rl   rm   s      r   conv_MSYearzModelConverter.conv_MSYear   sA    < ''
(>4T(R(R(RSSS{((Z(((r   zdatabases.postgres.PGInetzdialects.postgresql.base.INETc                     |                     dd           |d                             t          j                               t	          j        di |S )Nlabelz
IP Addressr   r   )
setdefaultrG   r   	IPAddressrk   rl   rm   s      r   conv_PGInetzModelConverter.conv_PGInet   sP    g|444< ''
(<(>(>???{((Z(((r   z dialects.postgresql.base.MACADDRc                     |                     dd           |d                             t          j                               t	          j        di |S )Nr   zMAC Addressr   r   )r   rG   r   
MacAddressrk   rl   rm   s      r   conv_PGMacaddrzModelConverter.conv_PGMacaddr   sP    g}555< ''
(=(?(?@@@{((Z(((r   zdialects.postgresql.base.UUIDc                     |                     dd           |d                             t          j                               t	          j        di |S )Nr   UUIDr   r   )r   rG   r   r   rk   rl   rm   s      r   conv_PGUuidzModelConverter.conv_PGUuid   sO    gv...< ''
(9(9:::{((Z(((r   	MANYTOONEc                     t          di |S ru   )r   rm   s      r   conv_ManyToOnezModelConverter.conv_ManyToOne   s    --*---r   
MANYTOMANY	ONETOMANYc                     t          di |S ru   )r	   rm   s      r   conv_ManyToManyzModelConverter.conv_ManyToMany   s    '55*555r   )NT)r   r    r!   r   classmethodrf   r   rn   rr   rw   r{   r   r   r   r   r   r   r   r   r   r   __classcell__)r_   s   @r   r[   r[      s       P P P P P P W W [W Xh	"") ) #") XlM+>Pcdd- - ed- Xi, , , Xf) ) ) Xj- - - Xf+ + +
 Xi((, , )(, Xi!!, , "!, X&(BCC) ) DC) X)+JKK) ) LK)
 X011) ) 21)
 X-..) ) /.)
 Xk. . . XlK((6 6 )(6 6 6 6 6r   r[   Fc           	         | j         j        }|pt                      }|pi }g }	|j        D ]Y}
t	          |
dd          r*|r|
j        d         j        r(|r|
j        d         j        r=|	                    |
j	        |
f           Zrfd|	D             }	nrfd|	D             }	i }|	D ]8\  }}
|
                    | ||
|                    |          |          }||||<   9|S )z
    Generate a dictionary of fields for a given SQLAlchemy model.

    See `model_form` docstring for description of parameters.
    r.   Nr   c              3   0   K   | ]}|d          v |V  dS r   Nr   )r   xonlys     r   	<genexpr>zmodel_fields.<locals>.<genexpr>   s+      <<Aqtt||a||||<<r   c              3   0   K   | ]}|d          v|V  dS r   r   )r   r   excludes     r   r   zmodel_fields.<locals>.<genexpr>   s1      CCAqt7/B/Ba/B/B/B/BCCr   )_sa_class_managerr?   r[   iterate_propertiesr'   r.   foreign_keysprimary_keyrG   rN   rY   get)r>   r9   r   r   rB   rS   
exclude_pk
exclude_fkr?   
propertiesr@   
field_dictr*   fields     ``          r   r
   r
      sP    $+F-^--I!rJJ) , ,4D)) 	 dl1o:  Q ; 48T*++++  D<<<<<<<

	 DCCCCCCC
J  % %
d!!64NN4  *
 
 $Jtr   Tc
           
          t          | d          st          d          |	pt          | j        dz             }	t	          | |||||||          }
t          |	|f|
          S )a  
    Create a wtforms Form for a given SQLAlchemy model class::

        from wtforms.ext.sqlalchemy.orm import model_form
        from myapp.models import User
        UserForm = model_form(User)

    :param model:
        A SQLAlchemy mapped model class.
    :param db_session:
        An optional SQLAlchemy Session.
    :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.
    :param exclude_pk:
        An optional boolean to force primary key exclusion.
    :param exclude_fk:
        An optional boolean to force foreign keys exclusion.
    :param type_name:
        An optional string to set returned type name.
    r   z'model must be a sqlalchemy mapped modelr   )r   r   )r(   rD   strr   r
   rL   )r>   r9   
base_classr   r   rB   rS   r   r   	type_namer   s              r   r   r     s}    F 5-.. CABBB9S&!899Iz4*i*  J 	J>:666r   )NNNNNFF)__doc__
__future__r   rJ   wtformsr   rk   r   wtforms.formr   r   r	   __all__r   r   r   objectr#   r[   r
   r   r   r   r   <module>r      sw    ( ' ' ' ' '                    > > > > > > > >
  * * * * *9 * * *
i
 i
 i
 i
 i
 i
 i
 i
XP6 P6 P6 P6 P6' P6 P6 P6f =A=B!% % % %P "&$T$+7 +7 +7 +7 +7 +7r   