
    Ii                         S SK Jr  S SKrS SKJr  S SKJrJrJ	r	  S SK
JrJr  S SKJr  S SKJr  SS	KJr  SS
KJr  SSKJr   " S S\R.                  5      r " S S\5      rS rg)    )IterableN)hybrid_property)
attributesclass_mapperColumnProperty)MapperPropertyPropComparator)_state_session)set_creation_order   )ImproperlyConfigured)identity)_get_class_registryc                   x   ^  \ rS rSrU 4S jr\R                  4S jrS rS r	\R                  SS4S jr
S	rU =r$ )
GenericAttributeImpl   c                    > [        [        [        [        R                  R                  S5      5      5      nUS:  a  / USS QSPUSS Q7n[        TU ]  " U0 UD6  g)a  
The constructor of attributes.AttributeImpl changed in SQLAlchemy 2.0.22,
adding a 'default_function' required positional argument before 'dispatch'.
This adjustment ensures compatibility across versions by inserting None for
'default_function' in versions >= 2.0.22.

Arguments received: (class, key, dispatch)
Required by AttributeImpl: (class, key, default_function, dispatch)
Setting None as default_function here.
.)   r      Nr   )tuplemapintsa__version__splitsuper__init__)selfargskwargssqlalchemy_version	__class__s       >/venv/lib/python3.13/site-packages/sqlalchemy_utils/generic.pyr   GenericAttributeImpl.__init__   s`     #3sBNN,@,@,E#FG+/T"1X/t/d12h/D$)&)    c                 z   U R                   U;   a  X R                      $ [        U5      nUc  g U R                  U5      n[        UR                  5      R                  U5      nUc  g U R                  U5      n UR                  Xg5      nU$ ! [         a$    UR                  U5      R                  U5      n U$ f = fN)	keyr
   get_state_discriminatorr   class_getget_state_idAttributeErrorquery)	r   statedict_passivesessiondiscriminatortarget_classidtargets	            r$   r,   GenericAttributeImpl.get"   s    88u?" !'? 44U;*5<<8<<]Ku%	9[[2F   	9]]<044R8F 	9s   9B *B:9B:c                     U R                   R                  n[        U[        5      (       a$  [	        UR                  5       UR                  5      $ UR                  UR                     R                  $ r(   )
parent_tokenr4   
isinstancer   getattrobj__name__attrsr)   value)r   r0   r4   s      r$   r*   ,GenericAttributeImpl.get_state_discriminatorA   sT    ))77m_55599;(>(>??;;}001777r&   c                 V   ^ [        U4S jU R                  R                   5       5      $ )Nc              3   j   >#    U  H(  nTR                   UR                     R                  v   M*     g 7fr(   )r?   r)   r@   ).0r6   r0   s     r$   	<genexpr>4GenericAttributeImpl.get_state_id.<locals>.<genexpr>J   s&     N9M2U[[(..9Ms   03)r   r:   r6   )r   r0   s    `r$   r-   !GenericAttributeImpl.get_state_idH   s     N9J9J9M9MNNNr&   NFc                    X2U R                   '   UcN  U R                  R                   H  nS X'R                   '   M     S X R                  R                  R                   '   g [	        U5      n[        U5      n	U	R                  U5      S   n
UR                  n[        U R                  R                  5       H  u  pX   X'R                   '   M     XU R                  R                  R                   '   g )Nr   )	r)   r:   r6   r4   typer   identity_key_from_instancer>   	enumerate)r   r0   r1   	initiatorr2   	check_oldpopr6   r+   mapperpkr4   indexs                r$   setGenericAttributeImpl.setL   s     $dhh''** $ff +9=E##11556 )_F!&)F229=a@B #OOM&t'8'8';';<	 "	ff =9F$##11556r&    )r>   
__module____qualname____firstlineno__r   r   PASSIVE_OFFr,   r*   r-   rR   __static_attributes____classcell__r#   s   @r$   r   r      s@    *$ )3(>(> >8O
 **G Gr&   r   c                   X   ^  \ rS rSrSrS
U 4S jjrS rS r " S S\5      r	S r
S	rU =r$ )GenericRelationshipPropertyi   a6  A generic form of the relationship property.

Creates a 1 to many relationship between the parent model
and any other models using a descriminator (the table name).

:param discriminator
    Field to discriminate which model we are referring to.
:param id:
    Field to point to the model we are referring to.
c                 x   > [         TU ]  5         Xl        X l        S U l        S U l        X0l        [        U 5        g r(   )r   r   _discriminator_col_id_cols_id_discriminatordocr   )r   r4   r6   rd   r#   s       r$   r   $GenericRelationshipProperty.__init__u   s5    "/"4 r&   c                    [        U[        5      (       aC  UR                  nU R                  R                  R                  5        H  u  p4X2:X  d  M  Us  $    g U R                  R                  R                  5        HE  n[        U[        5      (       d  M  UR                  S   R                  UR                  :X  d  MC  Us  $    g )Nr   )r;   r   r>   parentall_orm_descriptorsitemsr?   valuesr   columnsname)r   columnattr_keyr)   attrs        r$   _column_to_property/GenericRelationshipProperty._column_to_property   s    fo..H![[<<BBD	?K E ))002dN33||A++v{{:# 3r&   c                   ^  U 4S jnU" T R                   5      T l         U" T R                  5      T l        [        T R                  [        5      (       a%  [	        [        UT R                  5      5      T l        OT R                  /T l        T R                  T R                   5      T l        T R                  c  [        S5      e[	        [        T R                  T R                  5      5      T l	        g )Nc                 d   > [        U [        5      (       a  TR                  R                  U    $ U $ r(   )r;   strrg   rk   )rm   r   s    r$   convert_strings9GenericRelationshipProperty.init.<locals>.convert_strings   s*    &#&&{{**622Mr&   z(Could not find discriminator descriptor.)
r`   ra   r;   r   listr   rp   r4   r   r6   )r   ru   s   ` r$   init GenericRelationshipProperty.init   s    	
 #2$2I2I"J'6dmmX.. _dmm!DEDM!]]ODM!55d6M6MN%&:  s433T]]CDr&   c                   ,    \ rS rSrS rS rS rS rSrg)&GenericRelationshipProperty.Comparator   c                     Xl         X l        g r(   )property_parententity)r   propparentmappers      r$   r   /GenericRelationshipProperty.Comparator.__init__   s     M!-r&   c                     [        U5      R                  nU R                  R                  U:H  n[	        U5      n[        U R                  R                  5       H  u  pVX6XE   :H  -  nM     U$ r(   )rI   r>   r~   r`   r   rK   ra   )r   otherr4   qother_idrQ   r6   s          r$   __eq__-GenericRelationshipProperty.Comparator.__eq__   s]     K00M00MAAH&t}}'='=>	8?** ?Hr&   c                     X:H  ) $ r(   rT   )r   r   s     r$   __ne__-GenericRelationshipProperty.Comparator.__ne__   s    ]##r&   c                    [         R                  " U5      nUR                  /nUR                  UR                   Vs/ s H  nUR
                  R                  PM     sn5        U R                  R                  R                  U5      $ s  snf r(   )	r   inspectr>   extend_inheriting_mappersr+   r~   r`   in_)r   r   rO   class_names	submappers        r$   is_type.GenericRelationshipProperty.Comparator.is_type   s{    ZZ&F !>>*K!'!;!; !;I   ))!;  
 ==3377DD s    B	)r   r~   N)	r>   rU   rV   rW   r   r   r   r   rY   rT   r&   r$   
Comparatorr{      s    	.		$
	Er&   r   c           
          [         R                  " UR                  U R                  U R	                  X5      UU R
                  [        U S9  g )N)
comparatorparententityrd   
impl_classr:   )r   register_attributer+   r)   r   rd   r   )r   rO   s     r$   instrument_class,GenericRelationshipProperty.instrument_class   s:    %%MMHHt4+	
r&   )rc   r`   rb   ra   r4   rd   r6   r(   )r>   rU   rV   rW   __doc__r   rp   rx   r	   r   r   rY   rZ   r[   s   @r$   r]   r]   i   s0    	!
$E.E^ E8	
 	
r&   r]   c                      [        U 0 UD6$ r(   )r]   )r    r!   s     r$   generic_relationshipr      s    &777r&   )collections.abcr   
sqlalchemyr   sqlalchemy.ext.hybridr   sqlalchemy.ormr   r   r   sqlalchemy.orm.interfacesr   r	   sqlalchemy.orm.sessionr
   sqlalchemy.utilr   
exceptionsr   	functionsr   functions.ormr   ScalarAttributeImplr   r]   r   rT   r&   r$   <module>r      sQ    $  1 C C D 1 . ,  .WG:99 WGt^
. ^
B8r&   