o
    bL                     @   sh  d dl Z d dlmZ d dlmZmZ d dlmZmZ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 dgZG dd deeZdHd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G dd deZG dd deZG dd dejZ e!e e!e e!e e!e e!e e!e  G dd deZ"G d d! d!e"Z#G d"d# d#Z$G d$d% d%Z%G d&d' d'ej&Z'G d(d) d)ej(Z)G d*d+ d+e Z*G d,d- d-e%e$ej+Z,G d.d/ d/e%e$ej-Z.G d0d1 d1e$ej/Z0G d2d3 d3e%e$ej1Z2G d4d5 d5e$ej3Z4G d6d7 d7e%e$ej5Z6G d8d9 d9e$ej7Z8G d:d; d;e%e$ej9Z:G d<d= d=Z;G d>d? d?e;ej<Z=G d@dA dAe;ej>Z?G dBdC dCe;ej@ZAG dDdE dEe;ejBZCe"!e) e"!e* e"!e, e"!e' e"!e. e"!e0 e"!e2 e"!e4 e"!e6 e"!e8 e"!e: e"!e= e"!e? e"!eA e"!eC G dFdG dGZDdS )I    N)forms)checks
exceptions)NotSupportedErrorconnectionsrouter)lookups)PostgresOperatorLookup	Transform)gettext_lazy   )Field)CheckFieldDefaultMixin	JSONFieldc                       s   e Zd ZdZedZdediZdZ	d fdd	Z fd	d
Z	dd Z
 fddZdd Zdd Zdd Z fddZ fddZdd Z fddZ  ZS )r   FzA JSON objectinvalidzValue must be valid JSON.)dictz{}Nc                    sN   |r
t |s
td|rt |std|| _|| _t j||fi | d S )Nz0The encoder parameter must be a callable object.z0The decoder parameter must be a callable object.)callable
ValueErrorencoderdecodersuper__init__)selfZverbose_namenamer   r   kwargs	__class__ [/var/www/secure340b-portal/env/lib/python3.10/site-packages/django/db/models/fields/json.pyr      s   zJSONField.__init__c                    s4   t  jdi |}|dpg }|| | |S )N	databasesr   )r   checkgetextend_check_supported)r   r   errorsr   r   r   r   r    $   s   zJSONField.checkc                 C   sz   g }|D ]6}t || jsqt| }| jjjr | jjj|jkr qd| jjjv s:|jj	s:|
tjd|j | jdd q|S )Nsupports_json_fieldz%s does not support JSONFields.zfields.E180)objid)r   Zallow_migrate_modelmodelr   _metaZrequired_db_vendorvendorZrequired_db_featuresfeaturesr%   appendr   ErrorZdisplay_name)r   r   r$   db
connectionr   r   r   r#   *   s2   zJSONField._check_supportedc                    sF   t   \}}}}| jd ur| j|d< | jd ur| j|d< ||||fS )Nr   r   )r   deconstructr   r   )r   r   pathargsr   r   r   r   r0   C   s   



zJSONField.deconstructc                 C   sP   |d u r|S t |trt |ts|S z	tj|| jdW S  tjy'   | Y S w Ncls)
isinstanceKeyTransformstrjsonloadsr   JSONDecodeError)r   valueZ
expressionr/   r   r   r   from_db_valueK   s   zJSONField.from_db_valuec                 C   s   dS )Nr   r   r   r   r   r   get_internal_typeW   s   zJSONField.get_internal_typec                 C   s   |d u r|S t j|| jdS r3   )r9   dumpsr   )r   r<   r   r   r   get_prep_valueZ   s   zJSONField.get_prep_valuec                    s   t  |}|r
|S t|S N)r   get_transformKeyTransformFactory)r   r   Z	transformr   r   r   rC   _   s   zJSONField.get_transformc                    sN   t  || ztj|| jd W d S  ty&   tj| jd dd|idw )Nr4   r   r<   )codeparams)	r   validater9   r@   r   	TypeErrorr   ZValidationErrorZerror_messages)r   r<   Zmodel_instancer   r   r   rG   e   s   zJSONField.validatec                 C   s
   |  |S rB   )Zvalue_from_object)r   r&   r   r   r   value_to_stringp      
zJSONField.value_to_stringc                    s$   t  jdi tj| j| jd|S )N)Z
form_classr   r   r   )r   	formfieldr   r   r   r   )r   r   r   r   r   rK   s   s   
zJSONField.formfield)NNNN)__name__
__module____qualname__Zempty_strings_allowed_descriptionZdefault_error_messagesZ_default_hintr   r    r#   r0   r=   r?   rA   rC   rG   rI   rK   __classcell__r   r   r   r   r      s$    Tc              	   C   sj   |rdgng }| D ]&}zt |}W n ty'   |d |t| Y q	w |d|  q	d|S )N$.z[%s] )intr   r,   r9   r@   join)key_transformsinclude_rootr1   key_transformnumr   r   r   compile_json_path|   s   

r[   c                   @      e Zd ZdZdZdd ZdS )DataContainscontainsz@>c                 C   sP   |j jstd| ||\}}| ||\}}t|t| }d||f |fS )Nz:contains lookup is not supported on this database backend.JSON_CONTAINS(%s, %s)r+   Zsupports_json_field_containsr   process_lhsprocess_rhstupler   compilerr/   lhs
lhs_paramsrhs
rhs_paramsrF   r   r   r   as_sql      zDataContains.as_sqlNrL   rM   rN   lookup_namepostgres_operatorrj   r   r   r   r   r]          r]   c                   @   r\   )ContainedByZcontained_byz<@c                 C   sP   |j jstd| ||\}}| ||\}}t|t| }d||f |fS )Nz>contained_by lookup is not supported on this database backend.r_   r`   rd   r   r   r   rj      rk   zContainedBy.as_sqlNrl   r   r   r   r   rp      ro   rp   c                       sB   e Zd ZdZdddZdd Zdd Z fdd	Zd
d Z  Z	S )HasKeyLookupNc              	   C   s   t | jtr| j||\}}}t|}n
| ||\}}d}|| }| j}	g }
t |	ttfs2|	g}	|	D ]!}t |trE|||^ }}n|g}|
	d|t|ddf  q4| j
rfd| j
|gt|
  }|t|t|
 fS )NrR   z%s%sF)rX   z(%s))r6   rf   r7   preprocess_lhsr[   ra   rh   listrc   r,   logical_operatorrV   len)r   re   r/   templaterf   rg   Zlhs_key_transformsZlhs_json_pathsqlrh   ri   keyrO   rhs_key_transformsr   r   r   rj      s*   



zHasKeyLookup.as_sqlc                 C      | j ||ddS )Nz"JSON_CONTAINS_PATH(%s, 'one', %%s)rv   rj   r   re   r/   r   r   r   as_mysql      zHasKeyLookup.as_mysqlc                 C   s$   | j ||dd\}}|t| g fS )NzJSON_EXISTS(%s, '%%s')r{   )rj   rc   )r   re   r/   rw   rF   r   r   r   	as_oracle   s   zHasKeyLookup.as_oraclec                    sX   t | jtr%| j||^ }}|d d D ]	}t|| j| _q|d | _t ||S )N)r6   rh   r7   rr   rf   r   as_postgresql)r   re   r/   rO   ry   rx   r   r   r   r      s   
zHasKeyLookup.as_postgresqlc                 C   rz   )NJSON_TYPE(%s, %%s) IS NOT NULLr{   r|   r}   r   r   r   	as_sqlite   r   zHasKeyLookup.as_sqliterB   )
rL   rM   rN   rt   rj   r~   r   r   r   rQ   r   r   r   r   rq      s    
rq   c                   @      e Zd ZdZdZdZdS )HasKeyZhas_key?FN)rL   rM   rN   rm   rn   Zprepare_rhsr   r   r   r   r          r   c                   @   s    e Zd ZdZdZdZdd ZdS )HasKeysZhas_keysz?&z AND c                 C   s   dd | j D S )Nc                 S   s   g | ]}t |qS r   )r8   ).0itemr   r   r   
<listcomp>   s    z+HasKeys.get_prep_lookup.<locals>.<listcomp>)rh   r>   r   r   r   get_prep_lookup   r   zHasKeys.get_prep_lookupN)rL   rM   rN   rm   rn   rt   r   r   r   r   r   r      s
    r   c                   @   r   )
HasAnyKeysZhas_any_keysz?|z OR N)rL   rM   rN   rm   rn   rt   r   r   r   r   r      r   r   c                       ,   e Zd ZdZ fddZ fddZ  ZS )	JSONExactTc                    sP   t  ||\}}|jdkr$t  ||\}}|dkr$|d gkr$d| }||fS )Nsqlite%szJSON_TYPE(%s, '$'))r   ra   r*   rb   )r   re   r/   rf   rg   rh   ri   r   r   r   ra      s   
zJSONExact.process_lhsc                    sV   t  ||\}}|dkr|d gkrdg}|jdkr'dgt| }|t| }||fS )Nr   nullmysqlJSON_EXTRACT(%s, '$'))r   rb   r*   ru   rc   )r   re   r/   rh   ri   funcr   r   r   rb      s   
zJSONExact.process_rhs)rL   rM   rN   Zcan_use_none_as_rhsra   rb   rQ   r   r   r   r   r      s    	r   c                       sL   e Zd ZdZdZ fddZdd Zdd Zd	d
 Zdd Z	dd Z
  ZS )r7   z->z#>c                    s    t  j|i | t|| _d S rB   )r   r   r8   key_name)r   r   r2   r   r   r   r   r     s   zKeyTransform.__init__c                 C   sf   | j g}| j}t|tr|d|j  |j}t|ts||\}}|jdkr.dd |D }|||fS )Nr   oraclec                 S   s   g | ]}| d dqS )%z%%)replace)r   rx   r   r   r   r      s    z/KeyTransform.preprocess_lhs.<locals>.<listcomp>)r   rf   r6   r7   insertcompiler*   )r   re   r/   rW   previousrf   rF   r   r   r   rr     s   



zKeyTransform.preprocess_lhsc                 C   0   |  ||\}}}t|}d| t||f fS NzJSON_EXTRACT(%s, %%s)rr   r[   rc   r   re   r/   rf   rF   rW   Z	json_pathr   r   r   r~   #     zKeyTransform.as_mysqlc                 C   s6   |  ||\}}}t|}d||fd  t|d fS )Nz4COALESCE(JSON_QUERY(%s, '%s'), JSON_VALUE(%s, '%s'))   r   r   r   r   r   r   (  s   

zKeyTransform.as_oraclec                 C   s   |  ||\}}}t|dkrd|| jf }|t||f fS zt| j}W n ty2   | j}Y nw d|| jf t||f fS )Nr   z(%s %s %%s))rr   ru   postgres_nested_operatorrc   rU   r   r   rn   )r   re   r/   rf   rF   rW   rw   lookupr   r   r   r   0  s   
zKeyTransform.as_postgresqlc                 C   r   r   r   r   r   r   r   r   ;  r   zKeyTransform.as_sqlite)rL   rM   rN   rn   r   r   rr   r~   r   r   r   rQ   r   r   r   r   r7     s    r7   c                   @   s   e Zd ZdZdZdS )KeyTextTransformz->>z#>>N)rL   rM   rN   rn   r   r   r   r   r   r   A  s    r   c                       s    e Zd ZdZ fddZ  ZS )KeyTransformTextLookupMixinz
    Mixin for combining with a lookup expecting a text lhs from a JSONField
    key lookup. On PostgreSQL, make use of the ->> operator instead of casting
    key values to text and performing the lookup on the resulting
    representation.
    c                    sL   t |ts	tdt|jg|jR i |j}t j|g|R i | d S )NzLTransform should be an instance of KeyTransform in order to use this lookup.)	r6   r7   rH   r   r   Zsource_expressionsextrar   r   )r   rY   r2   r   Zkey_text_transformr   r   r   r   M  s   
z$KeyTransformTextLookupMixin.__init__)rL   rM   rN   __doc__r   rQ   r   r   r   r   r   F  s    r   c                       r   )CaseInsensitiveMixinz
    Mixin to allow case-insensitive comparison of JSON values on MySQL.
    MySQL handles strings used in JSON context using the utf8mb4_bin collation.
    Because utf8mb4_bin is a binary collation, comparison of JSON values is
    case-sensitive.
    c                    0   t  ||\}}|jdkrd| |fS ||fS Nr   z	LOWER(%s))r   ra   r*   )r   re   r/   rf   rg   r   r   r   ra   a     
z CaseInsensitiveMixin.process_lhsc                    r   r   )r   rb   r*   r   re   r/   rh   ri   r   r   r   rb   g  r   z CaseInsensitiveMixin.process_rhs)rL   rM   rN   r   ra   rb   rQ   r   r   r   r   r   Z  s    r   c                   @      e Zd Zdd Zdd ZdS )KeyTransformIsNullc                 C   s\   t | jj| jj||\}}| js||fS | j||\}}}d||f t|t| fS )Nz(NOT %s OR %s IS NULL))r   rf   r   r   rh   rr   rc   )r   re   r/   rw   rF   rf   rg   rO   r   r   r   r   p  s   zKeyTransformIsNull.as_oraclec                 C   s,   d}| j sd}t| jj| jjj|||dS )NzJSON_TYPE(%s, %%s) IS NULLr   r{   )rh   r   rf   r   rj   )r   re   r/   rv   r   r   r   r   {  s   zKeyTransformIsNull.as_sqliteN)rL   rM   rN   r   r   r   r   r   r   r   n  s    r   c                          e Zd Z fddZ  ZS )KeyTransformInc                    s   t  ||||\}}t|ds8|jjs8|jdkr1t|}d}t|t	t
fr,|d }n|d }n|jdv r8d}|jdkrD|jrDd	| }||fS )
Nrj   r   9%s(JSON_OBJECT('value' VALUE %%s FORMAT JSON), '$.value')
JSON_QUERY
JSON_VALUE>   r   r   r   r   zJSON_UNQUOTE(%s))r   resolve_expression_parameterhasattrr+   has_native_json_fieldr*   r9   r:   r6   rs   r   Zmysql_is_mariadb)r   re   r/   rw   paramrF   r<   r   r   r   r     s$   




z+KeyTransformIn.resolve_expression_parameter)rL   rM   rN   r   rQ   r   r   r   r   r         r   c                       s4   e Zd Z fddZ fddZ fddZ  ZS )KeyTransformExactc                    sb   t  ||\}}|jdkr-t  ||\}}|dkr-|dgkr-| j||^}}d| }||fS )Nr   r   r   zJSON_TYPE(%s, %%s))r   ra   r*   rb   rf   rr   )r   re   r/   rf   rg   rh   ri   rO   r   r   r   ra     s   
zKeyTransformExact.process_lhsc                    s   t | jtrttj| ||S t ||\}}|jdkrLg }d}|D ]}t	|}t |t
tfr:||d  q$||d  q$|t| }||fS |jdkr^dd |D }|t| }||fS )Nr   r   r   r   r   c                 S   s   g | ]
}|d kr
dndqS )r   r   r   r   r   r<   r   r   r   r     s    z1KeyTransformExact.process_rhs.<locals>.<listcomp>)r6   rh   r7   r   r   Exactrb   r*   r9   r:   rs   r   r,   rc   )r   re   r/   rh   ri   r   rw   r<   r   r   r   rb     s"   


zKeyTransformExact.process_rhsc                    s   t  ||\}}|dgkr?t| jj| jj}|||\}}| jd| jd}|||\}	}
d||	f t|t|
 fS t  ||S )Nr   ZisnullTz	%s AND %s)	r   rb   r   rf   r   r   Z
get_lookuprj   rc   )r   re   r/   rh   ri   Zhas_key_exprZhas_key_sqlZhas_key_paramsZis_null_exprZis_null_sqlZis_null_paramsr   r   r   r     s   

zKeyTransformExact.as_oracle)rL   rM   rN   ra   rb   r   rQ   r   r   r   r   r     s    	r   c                   @      e Zd ZdS )KeyTransformIExactNrL   rM   rN   r   r   r   r   r         r   c                   @   r   )KeyTransformIContainsNr   r   r   r   r   r     r   r   c                   @   r   )KeyTransformStartsWithNr   r   r   r   r   r     r   r   c                   @   r   )KeyTransformIStartsWithNr   r   r   r   r   r     r   r   c                   @   r   )KeyTransformEndsWithNr   r   r   r   r   r     r   r   c                   @   r   )KeyTransformIEndsWithNr   r   r   r   r   r     r   r   c                   @   r   )KeyTransformRegexNr   r   r   r   r   r     r   r   c                   @   r   )KeyTransformIRegexNr   r   r   r   r   r     r   r   c                       r   )KeyTransformNumericLookupMixinc                    s0   t  ||\}}|jjsdd |D }||fS )Nc                 S   s   g | ]}t |qS r   )r9   r:   r   r   r   r   r     s    z>KeyTransformNumericLookupMixin.process_rhs.<locals>.<listcomp>)r   rb   r+   r   r   r   r   r   rb     s   z*KeyTransformNumericLookupMixin.process_rhs)rL   rM   rN   rb   rQ   r   r   r   r   r     r   r   c                   @   r   )KeyTransformLtNr   r   r   r   r   r     r   r   c                   @   r   )KeyTransformLteNr   r   r   r   r   r     r   r   c                   @   r   )KeyTransformGtNr   r   r   r   r   r     r   r   c                   @   r   )KeyTransformGteNr   r   r   r   r   r     r   r   c                   @   r   )rD   c                 C   s
   || _ d S rB   )r   )r   r   r   r   r   r     rJ   zKeyTransformFactory.__init__c                 O   s   t | jg|R i |S rB   )r7   r   )r   r2   r   r   r   r   __call__  s   zKeyTransformFactory.__call__N)rL   rM   rN   r   r   r   r   r   r   rD     s    rD   )T)Er9   djangor   Zdjango.corer   r   Z	django.dbr   r   r   Zdjango.db.modelsr   Zdjango.db.models.lookupsr	   r
   Zdjango.utils.translationr   rO   rT   r   mixinsr   __all__r   r[   r]   rp   rq   r   r   r   r   r   Zregister_lookupr7   r   r   r   ZIsNullr   Inr   r   ZIExactr   Z	IContainsr   Z
StartsWithr   ZIStartsWithr   ZEndsWithr   Z	IEndsWithr   Regexr   ZIRegexr   r   ZLessThanr   ZLessThanOrEqualr   ZGreaterThanr   ZGreaterThanOrEqualr   rD   r   r   r   r   <module>   sz    
l4	





2,














