o
    j                     @   s  d dl mZmZ d dlZeeZd dlZzd dlZ	W n e
y(   d dl	Z	Y nw d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ zd dlm Z  e j!Z!W n e
e"fy   d dlm#Z! Y nw d dl$m%Z% d dl&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z6 d dl4m	Z7 d dl4m8Z9 d dl4m:Z; d dl4m<Z= d dl>m?Z? d dl4m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZh d dlimjZj G dd  d ZkG d!d" d"Zli ejWeXejeXejmeYejneYejoe^ejpe^ejZe]ejqe]ejre\ejse\ejteLejPePejuePejJeJejveJejwjxjyjveJejzeJejwjxjyj{eKejHeHej|eHejIeIej}eIeeOe%eheefiZ~eed#eed$dZedureLe~e< d`d%d&Zd'd( Z		dad)d*Z		dad+d,Zd-d. ZG d/d0 d0eZd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIdJ ZdKdL ZdMdN ZdOdP ZdQdR ZdSdT ZdUdV ZdbdXdYZdZd[ Zd\d] Zd^d_ ZdS )c    )absolute_importprint_functionN)isabs)isclass)event)Column)Index)Table)
ForeignKey)FLOAT)DOUBLE_PRECISION)PGUuidPGInet)relationship)mapper)association_proxy)	mapperlib)_mapper_registry)PGLTree)PGXmlPGObjectXmlPGObjectJson
PGFileJsonPGJsonBPGHtmlPGJson)
PGGeometry)EnumBase)XmlModifier)xml)json)jsonb)table)msgpack)HybridFileStore))SimpleModelEnumArrayComplexModelBaseAnyAnyDictAnyXmlAnyHtmlDateTimeDateTimeDuration	ByteArrayStringUnicodeUuidBooleanPointLinePolygon
MultiPoint	MultiLineMultiPolygonFloatDoubleDecimalIntegerInteger8	Integer16	Integer32	Integer64UnsignedIntegerUnsignedInteger8UnsignedInteger16UnsignedInteger32UnsignedInteger64Ipv6AddressIpv4Address	IpAddressFileLtree)sanitize_argsc                   @      e Zd ZdS )_SINGLEN__name__
__module____qualname__ rU   rU   \/var/www/html/LicenciasMiG/venv/lib/python3.10/site-packages/spyne/store/relational/_base.pyrP   \       rP   c                   @   rO   )_JOINEDNrQ   rU   rU   rU   rV   rX   _   rW   rX   BinaryBINARYc                 C   sd   |j jdkr| jd u r|d u rd|d< nd|_|j jd ur0|d u r)|j j|d< d S |j j|_d S d S )NFnullabledefault)
Attributesr[   __extends__
db_defaultr\   )clssubcls
col_kwargscolrU   rU   rV   _sp_attrs_to_sqla_constraints   s   
rd   c                 C   sf  | j j}|d ur
|S t| trtS t| tttfrtS t| t	r%t
ddS t| tr2td| j jdS t| tr?td| j jdS t| trLtd| j jdS t| trYtd| j jdS t| trftd| j jdS t| trstd	| j jdS t| tr| j jtj jkrtjS t| j jS t| tr| j jtj jkrtjS t| j jS t| trtj| jd
| jiS t| trtS t| trt S t| t!t"fr| j j#}|d u rd S t$|t%rt&S t$|t'rt(S t)t*| |dt| t+rtj,S t| t-t.frtj/S t| t0t1frtj2S t| t3t4frtj5S t| t6t7frtj5S t| t8r t9S t| t:r(t;S t| t2t<fr3tj=S t| t>r<tj=S t| t?r^| j j#t@u rLtj?S | j j#tAu rVtj5S tBd| j j# t| tCrgtjCS t| tDr| j jEd u r| j jFd u rtjDddS tjDddS tjD| j jEdS t| tGrtjGS t| tHrtjIjJjKjLS t| tMrtN| jO}|S d S )NT)as_uuidPOINT)	dimension
LINESTRINGPOLYGON
MULTIPOINTMULTILINESTRINGMULTIPOLYGONname)r`   store_asz%Boolean.store_as has invalid value %r)timezoneF)Pr]   db_type
issubclassrM   r   rK   rJ   rI   r   r4   r   r6   r   dimr7   r8   r9   r:   r;   r2   max_len
sqlalchemyTextr3   UnicodeTextr   r&   
__values____type_name__r+   r   r,   r   r)   r*   rn   
isinstancec_jsonr   c_jsonbr   NotImplementedErrordictr1   LargeBinaryrC   rH   
BigIntegerrB   rG   r?   rA   rF   SmallIntegerr@   rE   r<   r   r=   r   rD   DECIMALr>   r5   boolint
ValueErrorr-   r/   ro   as_timezoner.   r0   dialects
postgresqlbaseINTERVALr   _get_sqlalchemy_typetype)r`   rp   saretvalrU   rU   rV   r      s   

















r   c              	   C   s   |j jdusJ d| t|j j\}}	t| ||	 t|\}
|
\}}t|}d|	v r1|	d}n|}|du r=|d | }||ksEJ dtd|j j|f dd|j j|f ||||d	}t	|||fi |	S )
zbGets key and child type and returns a column that points to the primary
    key of the child.
    N%r has no table name.rm   _zaThe column name for the foreign key must be different from the column name for the object itself.%s.%sTz
%s_%s_fkey)	use_alterrm   
deferrable	initiallyondeleteonupdate)
r]   
table_namerN   sqla_column_argsrd   get_pk_columnsr   popr
   r   )parentsubnamera   fk_col_namer   r   r   r   col_argsrb   	pk_columnpk_keypk_spyne_typepk_sqla_typecolnamefkrU   rU   rV   _get_col_o2o'  s0   

r   c                 c   s    | j jdusJ d|  t| j j\}}t| \}|\}	}
t|
}|du r/d| j j|	g}||fgV  td| j j|	f ||||d}t|||fi |}|V  dS )zaGets the parent class and returns a column that points to the primary key
    of the parent.
    Nr   r   r   )r   r   r   r   )	r]   r   rN   r   r   r   joinr
   r   )r`   r   r   r   r   r   r   rb   r   r   r   r   r   rc   rU   rU   rV   _get_col_o2mQ  s   

r   c              
   C   sD   t | ||	|
||d\}}t| |||||||d}d |_|_||fS )zGets the parent and child classes and returns foreign keys to both
    tables. These columns can be used to create a relation table.r   r   r   r   T)r   r   primary_key)r`   kchildfk_left_col_namefk_right_col_namefk_left_deferrablefk_left_initiallyfk_right_deferrablefk_right_initiallyfk_left_ondeletefk_left_onupdatefk_right_ondeletefk_right_onupdatecol_infoleft_col	right_colrU   rU   rV   _get_cols_m2mq  s   

r   c                   @   s   e Zd Zdd Zdd ZdS )
_FakeTablec                 C   s   || _ i | _g | _g | _d S N)rm   ccolumnsindexes)selfrm   rU   rU   rV   __init__  s   
z_FakeTable.__init__c                 C   s   | j | || j|j< d S r   )r   appendr   rm   )r   rc   rU   rU   rV   append_column  s   z_FakeTable.append_columnN)rR   rS   rT   r   r   rU   rU   rU   rV   r     s    r   c              	   C   s:  |j j}|j j}|r|sd}z|\}}W n ttfy-   d| j||r%dndf }|}Y nw |dv r4dS |du rB||ft|df}n
||ft||df}t| trY| j	
| dS td	d
 |jj	D }	|	|d}
|
du r{t|d i |d  dS |
j|ksJ d|
j||
jd}||ksJ d||dS )z
    :param table: sqla table
    :param col: sqla col
    :param k: field name (not necessarily == k)
    :param v: spyne type
    Tz%s_%s%s_unique )FNN)unique)r   postgresql_usingc                 S   s   g | ]}|j |fqS rU   )rm   ).0idxrU   rU   rV   
<listcomp>  s    z#_gen_index_info.<locals>.<listcomp>r      zUUniqueness flag differ between existing and current values. Existing: {!r}, New: {!r}r   z`Indexing methods differ between existing and current index directives. Existing: {!r}, New: {!r})r]   r   index	TypeErrorr   rm   r}   ry   r   r   r   r"   getr   formatkwargs)r"   rc   r   vr   r   
index_nameindex_method
index_argsr   existing_idxexisting_valrU   rU   rV   _gen_index_info  sD   



r   c           
      C   s   | j j}g }d }t| dd }|d u r$|D ]}t|dd d ur#|jr#|}q|d ur=|j j}|d ur=||kr7t}nt}tdd }|d urG|j j}|d u rf|D ]}t	|d }	|	d ure|d u saJ d|	}t}qM||||fS )Nr^   
_type_infoz0Joined table inheritance is not yet implemented.z"There can be only one base mapper.)
r]   r   getattr	__mixin__rP   rX   r|   sqla_mapper_mapper_registriesr   )
r`   	cls_basesr   incinheritance
base_classbbase_table_namebase_mapperbmrU   rU   rV   _check_inheritance  s8   r   c                 C   s8   | j j}| j j}d }||jv r|j| }|S t|}|S r   )r]   r   sqla_metadatatablesr   )r`   r   metadatar"   rU   rU   rV   _check_table  s   

r   c                 C   s   t |jj\}}t| || t|jdd }d|v r|d}	n|}	|jjsT|	|jv r0|j|	 }
nt|	|g|R i |}
|	|
 t
||
|| |jjsR|
||< d S d S |d ur^|||< d S d S )Nmapper_propertyrm   )rN   r]   r   rd   r   r   exc_dbr   r   r   r   
exc_mapper)r`   propsr"   r   ra   	sqla_typer   rb   mpr   rc   rU   rU   rV   _add_simple_type  s$   

r   c                 C   s  | j j}t| |||j|j|j|j|j|j|j	|j
|j|j\}}|j|_|j|_|jdu r7d| j j|g}n|j}||jv r}|j| }	|	j|jd}
|
dusRJ |
dur`|jj|
jjks`J |	j|jd}|du rr|	| n|jj|jjks|J nt||g||fR  }	| j j}t|j|j|j|j|jd}|jr|durt t!| dksJ t!| \\}}|j| }|"t|	||	j|j k||	j|j kd |j#dur|j#|d< t$|fi |||< dS |"t|	d |j#dur|j#|d< t$|fi |||< dS )	at  Generates a relational many-to-many array.

    :param cls: The class that owns the field
    :param props: SQLAlchemy Mapper properties
    :param subname: Field name
    :param arrser: Array serializer, ie the __orig__ of the class inside the
                   Array object
    :param storage: The storage configuration object passed to the store_as
    attribute.
    Tr   N)lazybackrefcascadeorder_byback_populatesr   )	secondaryprimaryjoinsecondaryjoinsingle_parent)r   )%r]   r   r   leftrightr   r   r   r   r   r   r   r   keymultir   r   r   r   r   r   	__class__r   r	   
sqla_tabler}   r   r   r   r   r   explicit_joinlenr   updater   r   )r`   r   r   arrserstorager   col_own	col_childrel_table_namerel_tcol_own_existingcol_child_existingown_t
rel_kwargs
col_pk_keyr   col_pkrU   rU   rV   _gen_array_m2m  sd   







r  c                    s  | j j}| j j}t| |j|j|j|j|jd}t	|}|d \|_}	|j}
t
|}|j  du r2| |j j}|du rAd||g}||jv r|j| }|j|j  jju seJ d|  |j|j  jjf |
|jv r|	|j|
 jju sJ d|	|j|
 jjf n=t	|}t| ||d || n,t |}t| ||d t	|}t| ||d t||tdtjd	d
||}t|| | ddd |dD } fdd}td| tfd|i}t|| t||d| < t| |td|   dS )aa  Generate an array of simple objects.

    :param cls: The class that owns this field
    :param props: SQLAlchemy Mapper properties
    :param subname: Field name
    :param arrser_cust: Array serializer, ie the class itself inside the Array
                        object
    :param storage: The storage configuration object passed to the store_as
    r   r   Nr   z%s.%s: %r != %rz%r != %rrc   idT)r   r   c                 s   s    | ]	}|  p	d V  qdS )r   N)
capitalize)r   xrU   rU   rV   	<genexpr>  s    z$_gen_array_simple.<locals>.<genexpr>c                    s   t |  |d  d S )Nr   )setattr)r   argschild_right_col_namerU   rV   _i  s   z_gen_array_simple.<locals>._ir   )r]   r   r   r   r   r   r   r   r   nextr   r   r   r   r   r   r   rd   r   r   r	   rt   r?   r   splitobjectr   r   r  r   )r`   r   r   arrser_custr  r   r   _gen_colr   child_left_col_typechild_left_col_namechild_right_col_typechild_table_namechild_tchild_left_colchild_right_colcls_namer  cls_rU   r  rV   _gen_array_simplep  s~   





r&  c                 C   s  t | |j|j|j|j|jd}t|}|d \|_}|jd u s#J d|j}	|j|	j	v rM|	j	|j j
j}
||	j	|j j
ju sFJ d||
f |	j	|j }nt|}t| ||d |	| |j|j| t|j|j|j|j|g|jd}|jd ur|j|d< t|fi |||< d S )Nr   r   z'left' is ignored in one-to-many relationships with complex types (because they already have a table). You probably meant to use 'right'.z9Existing column type %r disagrees with new column type %rr  )r   r   r   r   foreign_keysr   r   )r   r   r   r   r   r   r  r   	__table__r   r   r   rd   r   
__mapper__add_propertyrm   r}   r   r   r   r   r   r   r   )r`   r   r   r  r  r  r  r   col_typer!  new_col_typerc   r
  rU   rU   rV   _gen_array_o2m  sD   


	
r-  c                 C   s   | j jdkp
t| tS )Nr   )r]   
max_occursrq   r'   )r   rU   rU   rV   	_is_array   s   r/  c                 C   s   |}t |tr|j \}|}|jd ur|j}|jdkr&t| |||| d S t |tr5t| |||| d S t	| ||||| d S )NF)
rq   r'   r   values__orig__r   r  r%   r&  r-  )r`   r   r   ra   r  r  r  rU   rU   rV   _add_array_to_complex  s   



r2  c              
   C   s2  |j d u r|}n|j }t|ddrJ d|jd u sJ dt| |||j|j|j|j|jd}|j	|_|j	|j
v rJ|j
|j	 }|ddu rId|_n|| t|j|j|j|jd}	|jd ure|j|	d< || j pj| u r{t| \\}
}|j
|
 g|	d	< t|fd|gd
|	}t|||| |||< |||j	< d S )Nr   FzBStoring a single element-type using a relation table is pointless.z/'right' is ignored in a one-to-one relationshipr   r[   )r   r   r   r   r   remote_side)uselistr'  )r1  r   r   r   r   r   r   r   r   rm   r   r   r[   r   r}   r   r   r   r   r   r   r   r   )r`   r   r"   r   ra   r  rb   real_vrc   r
  pk_col_namepk_col_typerelrU   rU   rV   _add_simple_type_to_complex  sL   



r9  c                 C   s4   t |rt| |||| d S t| |||||| d S r   )r/  r2  r9  r`   r   r"   r   ra   r  r   rb   rU   rU   rV   _add_complex_type_as_tableK  s
   r;  c                 C   sx   d|v r
| d}n|}||jv r|j| }	nt||j|j|j}
t||
fi |}	|	||< ||jvr:||	 d S d S )Nrm   )r   r   r   root_tagno_nspretty_printr   r   )r`   r   r"   r   ra   r  r   rb   r   rc   trU   rU   rV   _add_complex_type_as_xmlW  s   

r@  c	                 C   sx   d|v r
| d}	n|}	|	|jv r|j|	 }
nt||j|j|d}t|	|fi |}
|
||< ||jvr:||
 d S d S )Nrm   )ignore_wrappers
complex_asdbt)r   r   r   rA  rB  r   r   )r`   r   r"   r   ra   r  r   rb   rC  r   rc   r?  rU   rU   rV   _add_complex_type_as_jsonj  s   

rD  c              
   C   s   t |trt| ||||S t|jdd }t|jj\}}t| || t|t	r2t
| |||||||S t|trBt| |||||||S t|trSt| |||||||d	S t|trdt| |||||||d	S t|trmtt|d u rsd S t|)Nrn   r    r!   )rq   rL   _add_file_typer   r]   rN   r   rd   ry   c_tabler;  c_xmlr@  rz   rD  r{   	c_msgpackr|   r   r:  rU   rU   rV   _add_complex_type~  s4   





rI  c           	      C   sh   | j j}| j j}|}t| j j\}}t||gt|j| R i |}|jD ]\}}t	|i | q&|S r   )
r]   r   r   rN   sqla_table_argsr	   tupler   r   r   )	r`   r"   r   r   _table
table_argstable_kwargsr   index_kwargsrU   rU   rV   _convert_fake_table  s   rP  c                    s   t  |\}}}}t jj\}}	|	dd}
|
du r ||	d< n	||
 ||	d< |	dd}|durJt|ts@|j| |	d< n
t	
d|  |	d= |durR||	d< |tur[|f| }t g|R i |	} fdd}t d| |S )	a  Generate SQLAlchemy mapper from Spyne definition data.

    :param cls: La Class.
    :param props: Dict of properties for SQLAlchemt'y Mapper call.
    :param table: A Table instance. Not a `_FakeTable` or anything.
    :param cls_bases: Sequence of class bases.
    
propertiesNpolymorphic_onz1Deleted invalid 'polymorphic_on' value %r for %r.inheritsc                    sF   | j }   D ]\}}||vr t|rt|trq
d ||< q
d S r   )__dict__get_flat_type_infoitemsr   rq   r(   )targetcontextdr   r   r`   rU   rV   on_load  s   z_gen_mapper.<locals>.on_loadload)r   rN   r]   sqla_mapper_argsr   r   ry   r   r   loggerwarningrP   r   r   listen)r`   r   r"   r   r   r   r   r   mapper_argsmapper_kwargs_propspo
cls_mapperr[  rU   rZ  rV   _gen_mapper  s.   	




rf  c           
      C   s   t |jdd }t|jj\}}t| || t|trh||jv r%|j| }n1t|j	s,J |j
dkr9t|j	|j}	n|j
dkrHt|j	|jdd}	nt|j
t||	fi |}|||< ||jvrf|| d S d S t|)Nrn   r    r!   )rC  )r   r]   rN   r   rd   ry   r$   r   r   store	db_formatr   r   r|   r   r   )
r`   r   r"   r   ra   r  r   rb   rc   r?  rU   rU   rV   rE    s$   





rE  c                 C   sr   | j }i }t|}|du rt| |||| n	t| ||||| | jj}| D ]\}}||s6||| q'dS )zAdd field to the given Spyne object also mapped as a SQLAlchemy object
    to a SQLAlchemy table

    :param cls: The class to add the column to.
    :param subname: The column name
    :param subcls: The column type, a ModelBase subclass.
    N)	r(  r   rI  r   r]   r   rV  has_propertyr*  )r`   r   ra   r"   mapper_propsr   r   rU   rU   rV   
add_column  s   	
rk  c                 C   sX   t |dkr| j|d u rdS |D ]}t|dsq|jj}|d ur)||r) dS qdS )Nr   Fr]   T)r   r1  hasattrr]   r   ri  )r`   r   r   r   r   rU   rU   rV   _parent_mapper_has_property  s   
rm  rU   c              	   C   sl  t | }i }|  }t|dkr3|d jj}|du r"| |  }n*|jr-| |  }n| j }nt	| j t	| |  ksEJ | |  }|D ]A\}}t
| ||rYqNt|}	|	du rt|jdd}
|
du r}td|  |  |||
f  qNt| |||| qNt| |||||	 qNt|trt| |}t| |||}| jj| _| | j_| _| | j_| _|S )z~Return SQLAlchemy table object corresponding to the passed Spyne object.
    Also maps given class to the returned table.
    r   Nrn   z#Skipping %s.%s.%s: %r, store_as: %r)r   	ancestorsr   r]   r   rU  rV  concreter   setrm  r   r   r^  debugget_namespaceget_type_namerI  r   ry   r   rP  rf  r   __tablename__r)  r   r(  )r`   r   r"   rj  rn  
anc_mapperfieldsr   r   r?  pre  rU   rU   rV   gen_sqla_info(  sD   



rx  c                 C   s  i }| j r	d|d< | jsd|d< d|d< t| jtjr9| jjr*tdd| jji|S | jj	|d< t| jji |S t| jtj
tjfrJtdi |S t| jtjtjtjfr`t| jjfi |S t| jtjrtt| jj| jjfi |S t| jtrt|d	krtdi |S tS t| jtrt|d	krtdi |S tS t| jtv rtt| j }t|d	kr|jdi |S |S t| jttfr| jj}t|d	kr|jdi |S |S t| jtr| j}t|d	kr| jjdi |S |S td
|  )z$Map sqlalchemy types to spyne types.Tr   Fr[   r   
min_occursr0  	type_namer   zHSpyne type was not found. Probably _sq2sp_type_map needs a new entry. %rNrU   ) r   r[   ry   r   rt   r&   convert_unicoder3   enumsrm   rv   ru   r2   VARCHARlengthNumericr>   	precisionscaler   r   r+   r   r,   _sq2sp_type_map	customizer   r   r`   r   FileData	Exception)r   custr   rU   rU   rV   _get_spyne_typed  sZ   r  c                 C   s   | j j}| j}t| j j\}}t|dkr#|jD ]	}t|||j< qn|	 |d< t
| |g|R i |}|j | j _| _| | j _| _d S )Nr   include_properties)r]   r   r   rN   r]  r   r   r  rm   keysr   r   rt  r   r)  )r`   r"   r   ra  rb  r   re  rU   rU   rV   gen_spyne_info  s   
r  c                 C   sb   g }|  |  D ]\}}|jjdur$|jjd ddr$|||f q	t|dkr/t|S dS )z,Return primary key fields of a Spyne object.Nr   Fr   )rU  rV  r]   r   r   r   r   rK  )r`   r   r   r   rU   rU   rV   r     s   r   )NN)NNNN)rU   )
__future__r   r   logging	getLoggerrR   r^  rt   
simplejsonr    ImportErroros.pathr   inspectr   r   sqlalchemy.schemar   r   r	   r
   sqlalchemy.dialects.postgresqlr   r   #sqlalchemy.dialects.postgresql.baser   r   sqlalchemy.ormr   r   sqlalchemy.ext.associationproxyr   r   r   AttributeErrorr   spyne.store.relational.simpler   spyne.store.relational.documentr   r   r   r   r   r   r   spyne.store.relational.spatialr   spyne.model.enumr   spyne.model.complexr   spyne.modelr   rG  rz   r!   r{   r"   rF  r#   rH  spyne.model.binaryr$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   
spyne.utilrN   rP   rX   r  NUMERICr   BIGINTINTEGERr   SMALLINTr~   BOOLEAN	TIMESTAMPr   r   r   DATETIMEr   DATETIMEr  r   sqlalchemy_BINARYrd   r   r   r   r   r  r   r   r   r   r   r  r&  r-  r/  r2  r9  r;  r@  rD  rI  rP  rf  rE  rk  rm  rx  r  r  r   rU   rU   rU   rV   <module>   s   

$	
*

 
*
 2&]Y743
<A