o
    ¥gW                     @   s  d dl Z 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mZ d dlmZ d dlmZ d dlmZmZmZ d d	l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 dOddZ!G dd deeZ"G dd de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"Z)G d#d$ d$ej*Z+G d%d& d&e)ej,Z-e .e" e .e# e .e% e .e& e .e' e .e+ e .e- G d'd( d(eZ/G d)d* d*e/Z0e0j1Z2G d+d, d,Z3G d-d. d.ej4Z5G d/d0 d0ej6Z7G d1d2 d2e+Z8G d3d4 d4e)e3ej9Z:G d5d6 d6e)e3ej,Z;G d7d8 d8e3ej<Z=G d9d: d:e)e3ej>Z?G d;d< d<e3ej@ZAG d=d> d>e)e3ejBZCG d?d@ d@e3ejDZEG dAdB dBe)e3ejFZGG dCdD dDZHG dEdF dFeHejIZJG dGdH dHeHejKZLG dIdJ dJeHejMZNG dKdL dLeHejOZPe/.e7 e/.e8 e/.e: e/.e5 e/.e; e/.e= e/.e? e/.eA e/.eC e/.eE e/.eG e/.eJ e/.eL e/.eN e/.eP G dMdN dNZQdS )P    N)forms)checks
exceptions)NotSupportedErrorconnectionsrouter)expressionslookups)
LOOKUP_SEP)	TextField)FieldGetDbPrepValueMixinPostgresOperatorLookup	Transform)RemovedInDjango51Warning)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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__)selfverbose_namenamer   r   kwargs	__class__ Y/var/www/rescue_company/venv/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&   0   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   allow_migrate_modelmodelr   _metarequired_db_vendorvendorrequired_db_featuresfeaturesr+   appendr   Errordisplay_name)r   r%   r*   db
connectionr#   r#   r$   r)   6   s*   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$   r:   N   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   value
expressionr9   r#   r#   r$   from_db_valueV   s   zJSONField.from_db_valuec                 C   s   dS )Nr   r#   r   r#   r#   r$   get_internal_typeb   s   zJSONField.get_internal_typec                 C   s   t |tjrCt |jtr7t |jts7ztj|j| j	d}W n tj
y*   |j}Y n w tjd|dtd nt |jtrA|j}n	|S t|drJ|S |j|| jS )Nr=   zFProviding an encoded JSON string via Value() is deprecated. Use Value(z$, output_field=JSONField()) instead.)categoryas_sql)r?   r   ValuerE   rA   output_fieldr   rB   rC   r   rD   warningswarnr   hasattropsadapt_json_valuer   )r   rE   r9   preparedr#   r#   r$   get_db_prep_valuee   s*   

zJSONField.get_db_prep_valuec                 C   s   |d u r|S |  ||S N)rT   )r   rE   r9   r#   r#   r$   get_db_prep_save   s   zJSONField.get_db_prep_savec                    s   t  |}|r
|S t|S rU   )r   get_transformKeyTransformFactory)r   r   	transformr!   r#   r$   rW      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 )Nr=   r   rE   )codeparams)	r   validaterB   dumpsr   	TypeErrorr   ValidationErrorerror_messages)r   rE   model_instancer!   r#   r$   r\      s   zJSONField.validatec                 C   s
   |  |S rU   )value_from_object)r   r,   r#   r#   r$   value_to_string      
zJSONField.value_to_stringc                    s$   t  jdi tj| j| jd|S )N)
form_classr   r   r#   )r   	formfieldr   r   r   r   )r   r    r!   r#   r$   rf      s   
zJSONField.formfield)NNNN)F)__name__
__module____qualname__empty_strings_allowed_descriptiondefault_error_messages_default_hintr   r&   r)   r:   rG   rI   rT   rV   rW   r\   rc   rf   __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   r5   rB   r]   join)key_transformsinclude_rootr;   key_transformnumr#   r#   r$   compile_json_path   s   

ry   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)r4   supports_json_field_containsr   process_lhsprocess_rhstupler   compilerr9   lhs
lhs_paramsrhs
rhs_paramsr[   r#   r#   r$   rK         zDataContains.as_sqlNrg   rh   ri   lookup_namepostgres_operatorrK   r#   r#   r#   r$   r{          r{   c                   @   rz   )ContainedBy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~   r   r#   r#   r$   rK      r   zContainedBy.as_sqlNr   r#   r#   r#   r$   r      r   r   c                       sJ   e Zd ZdZdd ZdddZdd Zdd	 Z fd
dZdd Z	  Z
S )HasKeyLookupNc                 C   s   dt | S )Nz.%s)rB   r]   r   rw   r#   r#   r$   compile_json_path_final_key   s   z(HasKeyLookup.compile_json_path_final_keyc                 C   s   t | jtr| j||\}}}t|}n
| ||\}}d}|| }| j}	g }
t |	ttfs2|	g}	|	D ]-}t |trE|||^ }}n|g}|^ }}t|dd}|| 	|7 }|

||  q4| jrrd| j|gt|
  }|t|t|
 fS )Nrp   Frv   z(%s))r?   r   r@   preprocess_lhsry   r   r   listr   r   r5   logical_operatorrt   len)r   r   r9   templater   r   lhs_key_transformslhs_json_pathsqlr   r   keyrk   rhs_key_transforms	final_keyrhs_json_pathr#   r#   r$   rK      s.   



zHasKeyLookup.as_sqlc                 C      | j ||ddS )Nz"JSON_CONTAINS_PATH(%s, 'one', %%s)r   rK   r   r   r9   r#   r#   r$   as_mysql      zHasKeyLookup.as_mysqlc                 C   s$   | j ||dd\}}|t| g fS )NzJSON_EXISTS(%s, '%%s')r   )rK   r   )r   r   r9   r   r[   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)r?   r   r@   r   r   r   as_postgresql)r   r   r9   rk   r   r   r!   r#   r$   r     s   
zHasKeyLookup.as_postgresqlc                 C   r   )NJSON_TYPE(%s, %%s) IS NOT NULLr   r   r   r#   r#   r$   	as_sqlite  r   zHasKeyLookup.as_sqliterU   )rg   rh   ri   r   r   rK   r   r   r   r   ro   r#   r#   r!   r$   r      s    
r   c                   @      e Zd ZdZdZdZdS )HasKeyhas_key?FN)rg   rh   ri   r   r   prepare_rhsr#   r#   r#   r$   r         r   c                   @   s    e Zd ZdZdZdZdd ZdS )HasKeyshas_keysz?&z AND c                 C   s   dd | j D S )Nc                 S      g | ]}t |qS r#   )rA   ).0itemr#   r#   r$   
<listcomp>      z+HasKeys.get_prep_lookup.<locals>.<listcomp>)r   rH   r#   r#   r$   get_prep_lookup  s   zHasKeys.get_prep_lookupN)rg   rh   ri   r   r   r   r   r#   r#   r#   r$   r     s
    r   c                   @   r   )
HasAnyKeyshas_any_keysz?|z OR N)rg   rh   ri   r   r   r   r#   r#   r#   r$   r   !  r   r   c                   @   s   e Zd Zdd ZdS )HasKeyOrArrayIndexc                 C   s   t |gddS )NFr   )ry   r   r#   r#   r$   r   (  s   z.HasKeyOrArrayIndex.compile_json_path_final_keyN)rg   rh   ri   r   r#   r#   r#   r$   r   '  s    r   c                       s,   e Zd ZdZ fddZ fddZ  ZS )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 Nmysqlz	LOWER(%s))r   r   r2   )r   r   r9   r   r   r!   r#   r$   r   4     
z CaseInsensitiveMixin.process_lhsc                    r   r   )r   r   r2   r   r   r9   r   r   r!   r#   r$   r   :  r   z CaseInsensitiveMixin.process_rhs)rg   rh   ri   __doc__r   r   ro   r#   r#   r!   r$   r   ,  s    r   c                           e Zd ZdZ fddZ  ZS )	JSONExactTc                    sV   t  ||\}}|dkr|d gkrdg}|jdkr'dgt| }|t|; }||fS )N%snullr   JSON_EXTRACT(%s, '$'))r   r   r2   r   r   )r   r   r9   r   r   funcr!   r#   r$   r   D  s   
zJSONExact.process_rhs)rg   rh   ri   can_use_none_as_rhsr   ro   r#   r#   r!   r$   r   A  s    r   c                   @      e Zd ZdS )JSONIContainsNrg   rh   ri   r#   r#   r#   r$   r   O      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 )r@   z->z#>c                    s    t  j|i | t|| _d S rU   )r   r   rA   key_name)r   r   r<   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   r   r#   r#   r$   r   m  s    z/KeyTransform.preprocess_lhs.<locals>.<listcomp>)r   r   r?   r@   insertcompiler2   )r   r   r9   ru   previousr   r[   r#   r#   r$   r   d  s   



zKeyTransform.preprocess_lhsc                 C   s0   |  ||\}}}t|}d| t||f fS )NzJSON_EXTRACT(%s, %%s)r   ry   r   r   r   r9   r   r[   ru   	json_pathr#   r#   r$   r   p  s   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   u  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))r   r   postgres_nested_operatorr   rs   r   r   r   )r   r   r9   r   r[   ru   r   lookupr#   r#   r$   r   }  s   
zKeyTransform.as_postgresqlc                 C   sT   |  ||\}}}t|}ddd |jjD }d||||f t||f d fS )N,c                 S   r   r#   )repr)r   datatyper#   r#   r$   r     r   z*KeyTransform.as_sqlite.<locals>.<listcomp>z](CASE WHEN JSON_TYPE(%s, %%s) IN (%s) THEN JSON_TYPE(%s, %%s) ELSE JSON_EXTRACT(%s, %%s) END)   )r   ry   rt   rQ   jsonfield_datatype_valuesr   )r   r   r9   r   r[   ru   r   datatype_valuesr#   r#   r$   r     s   
zKeyTransform.as_sqlite)rg   rh   ri   r   r   r   r   r   r   r   r   ro   r#   r#   r!   r$   r@   \  s    r@   c                       s6   e Zd ZdZdZe Z fddZedd Z	  Z
S )KeyTextTransformz->>z#>>c                    sT   |j rt ||\}}d| |fS | ||\}}}t|}d| t||f fS )NJSON_UNQUOTE(%s)z(%s ->> %%s))mysql_is_mariadbr   r   r   ry   r   )r   r   r9   r   r[   r   ru   r   r!   r#   r$   r     s   zKeyTextTransform.as_mysqlc                 C   s2   | t^}}|std|D ]}| ||}q|S )Nz,Lookup must contain key or index transforms.)splitr
   r   )r>   r   rY   keysr   r#   r#   r$   from_lookup  s   zKeyTextTransform.from_lookup)rg   rh   ri   r   r   r   rM   r   classmethodr   ro   r#   r#   r!   r$   r     s    
r   c                       r   )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.)	r?   r@   r^   r   r   source_expressionsextrar   r   )r   rw   r<   r    key_text_transformr!   r#   r$   r     s   
z$KeyTransformTextLookupMixin.__init__)rg   rh   ri   r   r   ro   r#   r#   r!   r$   r     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   r   r   r   r   r   r   )r   r   r9   r   r[   r   r   rk   r#   r#   r$   r     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   )r   r   r   r   rK   )r   r   r9   r   r#   r#   r$   r     s   zKeyTransformIsNull.as_sqliteN)rg   rh   ri   r   r   r#   r#   r#   r$   r     s    r   c                          e Zd Z fddZ  ZS )KeyTransformInc                    s   t  ||||\}}t|dsE|jjsE|jdkr1t|}d}t|t	t
fr,|d; }n|d; }n|jdksC|jdkrE|d |jjvrEd	}|jdkrQ|jrQd
| }||fS )NrK   r   9%s(JSON_OBJECT('value' VALUE %%s FORMAT JSON), '$.value')
JSON_QUERY
JSON_VALUEr   sqliter   r   r   )r   resolve_expression_parameterrP   r4   has_native_json_fieldr2   rB   rC   r?   r   r   rQ   r   r   )r   r   r9   r   paramr[   rE   r!   r#   r$   r     s.   





z+KeyTransformIn.resolve_expression_parameter)rg   rh   ri   r   ro   r#   r#   r!   r$   r         r   c                       s(   e Zd Z fddZ fddZ  ZS )KeyTransformExactc                    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rog }|D ]}||jjv rc|d qU|d qU|t|; }||fS )Nr   r   r   r   r   r   r   )r?   r   r@   r   r	   Exactr   r2   rB   rC   r   r   r5   r   rQ   r   )r   r   r9   r   r   r   r   rE   r!   r#   r$   r     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   isnullTz	%s AND %s)	r   r   r   r   r   r   
get_lookuprK   r   )r   r   r9   r   r   has_key_exprhas_key_sqlhas_key_paramsis_null_expris_null_sqlis_null_paramsr!   r#   r$   r     s   

zKeyTransformExact.as_oracle)rg   rh   ri   r   r   ro   r#   r#   r!   r$   r     s    r   c                   @   r   )KeyTransformIExactNr   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  3  r  r  c                   @   r   )KeyTransformEndsWithNr   r#   r#   r#   r$   r  9  r   r  c                   @   r   )KeyTransformIEndsWithNr   r#   r#   r#   r$   r  =  r  r  c                   @   r   )KeyTransformRegexNr   r#   r#   r#   r$   r	  C  r   r	  c                   @   r   )KeyTransformIRegexNr   r#   r#   r#   r$   r
  G  r  r
  c                       r   )KeyTransformNumericLookupMixinc                    s0   t  ||\}}|jjsdd |D }||fS )Nc                 S   s   g | ]}t |qS r#   )rB   rC   )r   rE   r#   r#   r$   r   Q  s    z>KeyTransformNumericLookupMixin.process_rhs.<locals>.<listcomp>)r   r   r4   r   r   r!   r#   r$   r   N  s   z*KeyTransformNumericLookupMixin.process_rhs)rg   rh   ri   r   ro   r#   r#   r!   r$   r  M  r   r  c                   @   r   )KeyTransformLtNr   r#   r#   r#   r$   r  U  r   r  c                   @   r   )KeyTransformLteNr   r#   r#   r#   r$   r  Y  r   r  c                   @   r   )KeyTransformGtNr   r#   r#   r#   r$   r  ]  r   r  c                   @   r   )KeyTransformGteNr   r#   r#   r#   r$   r  a  r   r  c                   @   r   )rX   c                 C   s
   || _ d S rU   )r   )r   r   r#   r#   r$   r   x  rd   zKeyTransformFactory.__init__c                 O   s   t | jg|R i |S rU   )r@   r   )r   r<   r    r#   r#   r$   __call__{  s   zKeyTransformFactory.__call__N)rg   rh   ri   r   r  r#   r#   r#   r$   rX   w  s    rX   )T)RrB   rN   djangor   django.corer   r   	django.dbr   r   r   django.db.modelsr   r	   django.db.models.constantsr
   django.db.models.fieldsr   django.db.models.lookupsr   r   r   django.utils.deprecationr   django.utils.translationr   rk   rr   r   mixinsr   __all__r   ry   r{   r   r   r   r   r   r   r   r   r   	IContainsr   register_lookupr@   r   r   KTr   IsNullr   Inr   r   IExactr  r  
StartsWithr  IStartsWithr  EndsWithr  	IEndsWithr  Regexr	  IRegexr
  r  LessThanr  LessThanOrEqualr  GreaterThanr  GreaterThanOrEqualr  rX   r#   r#   r#   r$   <module>   s     
@	






8
(


















