U
    yhZ                     @   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                    sJ   |rt |std|r(t |s(td|| _|| _t j||f| 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__ d/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/django/db/models/fields/json.pyr       s    zJSONField.__init__c                    s0   t  jf |}|dpg }|| | |S )N	databases)r   checkgetextend_check_supported)r   r   errorsr$   r    r"   r#   r%   0   s    zJSONField.checkc                 C   sz   g }|D ]l}t || jsqt| }| jjjr@| jjj|jkr@qd| jjjk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   Errordisplay_name)r   r$   r)   db
connectionr"   r"   r#   r(   6   s,    zJSONField._check_supportedc                    sF   t   \}}}}| jd k	r&| j|d< | jd k	r:| j|d< ||||fS )Nr   r   )r   deconstructr   r   )r   r   pathargsr   r    r"   r#   r6   N   s    



zJSONField.deconstructc                 C   sV   |d kr|S t |tr$t |ts$|S ztj|| jdW S  tjk
rP   | Y S X d S )Ncls)
isinstanceKeyTransformstrjsonloadsr   JSONDecodeError)r   value
expressionr5   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   |s|  |}t|tjrt|jtr~t|jts~ztj	|j| j
d}W n tjk
rd   |j}Y qX tjd|dtd qt|jtr|j}q|S nt|dr|S |j|| jS )Nr9   zFProviding an encoded JSON string via Value() is deprecated. Use Value(z$, output_field=JSONField()) instead.)categoryas_sql)Zget_prep_valuer;   r   ValuerA   r=   output_fieldr   r>   r?   r   r@   warningswarnr   hasattropsZadapt_json_valuer   )r   rA   r5   preparedr"   r"   r#   get_db_prep_valuee   s*    
 

zJSONField.get_db_prep_valuec                 C   s   |d kr|S |  ||S N)rO   )r   rA   r5   r"   r"   r#   get_db_prep_save   s    zJSONField.get_db_prep_savec                    s   t  |}|r|S t|S rP   )r   get_transformKeyTransformFactory)r   r   	transformr    r"   r#   rR      s    zJSONField.get_transformc                    sV   t  || ztj|| jd W n. tk
rP   tj| jd dd|idY nX d S )Nr9   r   rA   )codeparams)	r   validater>   dumpsr   	TypeErrorr   ZValidationErrorZerror_messages)r   rA   Zmodel_instancer    r"   r#   rW      s    zJSONField.validatec                 C   s
   |  |S rP   )Zvalue_from_object)r   r+   r"   r"   r#   value_to_string   s    zJSONField.value_to_stringc                    s    t  jf tj| j| jd|S )N)Z
form_classr   r   )r   	formfieldr   r   r   r   )r   r   r    r"   r#   r[      s    zJSONField.formfield)NNNN)F)__name__
__module____qualname__Zempty_strings_allowed_descriptionZdefault_error_messagesZ_default_hintr   r%   r(   r6   rC   rE   rO   rQ   rR   rW   rZ   r[   __classcell__r"   r"   r    r#   r      s,        
 Tc              	   C   sl   |r
dgng }| D ]N}zt |}W n. tk
rP   |d |t| Y qX |d|  qd|S )N$.z[%s] )intr   r1   r>   rX   join)key_transformsinclude_rootr7   key_transformnumr"   r"   r#   compile_json_path   s    
rk   c                   @   s   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)r0   Zsupports_json_field_containsr   process_lhsprocess_rhstupler   compilerr5   lhs
lhs_paramsrhs
rhs_paramsrV   r"   r"   r#   rG      s    zDataContains.as_sqlNr\   r]   r^   lookup_namepostgres_operatorrG   r"   r"   r"   r#   rl      s   rl   c                   @   s   e Zd ZdZdZdd ZdS )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.rn   ro   rs   r"   r"   r#   rG      s    zContainedBy.as_sqlNry   r"   r"   r"   r#   r|      s   r|   c                       sZ   e Zd ZdZdd Zd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)r>   rX   r   ri   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}t |ttfsX|g}|D ]\}t |tr~|||^ }	}
n|g}
|
^ }
}t|
dd}|| 	|7 }|||| fV  q\d S )Nrb   Frh   )
r;   ru   r<   preprocess_lhsrk   rp   rw   listrr   r   )r   rt   r5   lhs_sqlrv   Zlhs_key_transformsZlhs_json_pathrw   keyr_   rhs_key_transformsZ	final_keyrhs_json_pathr"   r"   r#   _as_sql_parts   s&     



zHasKeyLookup._as_sql_partsc                 C   s    | j rd| j | S d|S )Nz(%s)rd   )logical_operatorrf   )r   partsr"   r"   r#   _combine_sql_parts   s    zHasKeyLookup._combine_sql_partsc           	      C   sT   g }g }|  ||D ],\}}}|||df  |||g  q| |t|fS )N%sr   r1   r'   r   rr   	r   rt   r5   templateZ	sql_partsrV   r   rv   r   r"   r"   r#   rG      s     zHasKeyLookup.as_sqlc                 C   s   | j ||ddS )Nz!JSON_CONTAINS_PATH(%s, 'one', %s)r   rG   r   rt   r5   r"   r"   r#   as_mysql  s
      zHasKeyLookup.as_mysqlc           	      C   sR   d}g }g }|  ||D ]&\}}}||||f  || q| |t|fS )NzJSON_EXISTS(%s, '%s')r   r   r"   r"   r#   	as_oracle  s     zHasKeyLookup.as_oraclec                    sX   t | jtrJ| j||^ }}|d d D ]}t|| j| _q,|d | _t ||S )N)r;   rw   r<   r   ru   r   as_postgresql)r   rt   r5   r_   r   r   r    r"   r#   r     s    
zHasKeyLookup.as_postgresqlc                 C   s   | j ||ddS )NJSON_TYPE(%s, %s) IS NOT NULLr   r   r   r"   r"   r#   	as_sqlite  s
      zHasKeyLookup.as_sqlite)N)r\   r]   r^   r   r   r   r   rG   r   r   r   r   ra   r"   r"   r    r#   r}      s   

r}   c                   @   s   e Zd ZdZdZdZdS )HasKeyZhas_key?FN)r\   r]   r^   rz   r{   Zprepare_rhsr"   r"   r"   r#   r   %  s   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"   )r=   ).0itemr"   r"   r#   
<listcomp>1  s     z+HasKeys.get_prep_lookup.<locals>.<listcomp>)rw   rD   r"   r"   r#   get_prep_lookup0  s    zHasKeys.get_prep_lookupN)r\   r]   r^   rz   r{   r   r   r"   r"   r"   r#   r   +  s   r   c                   @   s   e Zd ZdZdZdZdS )
HasAnyKeysZhas_any_keysz?|z OR N)r\   r]   r^   rz   r{   r   r"   r"   r"   r#   r   4  s   r   c                   @   s   e Zd Zdd ZdS )HasKeyOrArrayIndexc                 C   s   t |gddS )NFr   )rk   r~   r"   r"   r#   r   ;  s    z.HasKeyOrArrayIndex.compile_json_path_final_keyN)r\   r]   r^   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                    s0   t  ||\}}|jdkr(d| |fS ||fS Nmysqlz	LOWER(%s))r   rp   r/   )r   rt   r5   ru   rv   r    r"   r#   rp   G  s    
z CaseInsensitiveMixin.process_lhsc                    s0   t  ||\}}|jdkr(d| |fS ||fS r   )r   rq   r/   r   rt   r5   rw   rx   r    r"   r#   rq   M  s    
z CaseInsensitiveMixin.process_rhs)r\   r]   r^   __doc__rp   rq   ra   r"   r"   r    r#   r   ?  s   r   c                       s    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rNdgt| }|t|; }||fS )Nr   nullr   JSON_EXTRACT(%s, '$'))r   rq   r/   lenrr   )r   rt   r5   rw   rx   funcr    r"   r#   rq   W  s    
zJSONExact.process_rhs)r\   r]   r^   Zcan_use_none_as_rhsrq   ra   r"   r"   r    r#   r   T  s   r   c                   @   s   e Zd ZdS )JSONIContainsNr\   r]   r^   r"   r"   r"   r#   r   b  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 )r<   z->z#>c                    s   t  j|| t|| _d S rP   )r   r   r=   key_name)r   r   r8   r   r    r"   r#   r   s  s    zKeyTransform.__init__c                 C   s^   | j g}| j}t|tr.|d|j  |j}q||\}}|jdkrTdd |D }|||fS )Nr   oraclec                 S   s   g | ]}| d dqS )%z%%)replace)r   r   r"   r"   r#   r     s     z/KeyTransform.preprocess_lhs.<locals>.<listcomp>)r   ru   r;   r<   insertcompiler/   )r   rt   r5   rg   previousru   rV   r"   r"   r#   r   w  s    

zKeyTransform.preprocess_lhsc                 C   s0   |  ||\}}}t|}d| t||f fS )NzJSON_EXTRACT(%s, %%s)r   rk   rr   r   rt   r5   ru   rV   rg   	json_pathr"   r"   r#   r     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     s    

zKeyTransform.as_oraclec                 C   s   |  ||\}}}t|dkr>d|| jf }|t||f fS zt| j}W n tk
rf   | j}Y nX d|| jf t||f fS )Nr   z(%s %s %%s))r   r   postgres_nested_operatorrr   re   r   r   r{   )r   rt   r5   ru   rV   rg   sql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   s   g | ]}t |qS r"   )repr)r   datatyper"   r"   r#   r     s     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   rk   rf   rM   jsonfield_datatype_valuesrr   )r   rt   r5   ru   rV   rg   r   Zdatatype_valuesr"   r"   r#   r     s    
zKeyTransform.as_sqlite)r\   r]   r^   r{   r   r   r   r   r   r   r   ra   r"   r"   r    r#   r<   o  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                    sX   |j r$t ||\}}d| |fS | ||\}}}t|}d| t||f fS d S )NJSON_UNQUOTE(%s)z(%s ->> %%s))mysql_is_mariadbr   r   r   rk   rr   )r   rt   r5   r   rV   ru   rg   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   rT   keysr   r"   r"   r#   from_lookup  s    zKeyTextTransform.from_lookup)r\   r]   r^   r{   r   r   rI   r   classmethodr   ra   r"   r"   r    r#   r     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                    s@   t |tstdt|jf|j|j}t j|f|| d S )NzLTransform should be an instance of KeyTransform in order to use this lookup.)	r;   r<   rY   r   r   Zsource_expressionsextrar   r   )r   ri   r8   r   Zkey_text_transformr    r"   r#   r     s    
z$KeyTransformTextLookupMixin.__init__)r\   r]   r^   r   r   ra   r"   r"   r    r#   r     s   r   c                   @   s   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   ru   r   r   rw   r   rr   )r   rt   r5   r   rV   ru   rv   r_   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   )rw   r   ru   r   rG   )r   rt   r5   r   r"   r"   r#   r     s    zKeyTransformIsNull.as_sqliteN)r\   r]   r^   r   r   r"   r"   r"   r#   r     s   r   c                       s   e Zd Z fddZ  ZS )KeyTransformInc                    s   t  ||||\}}t|ds|jjs|jdkrbt|}d}t|t	t
frX|d; }q|d; }n(|jdks|jdkr|d |jjkrd	}|jdkr|jrd
| }||fS )NrG   r   9%s(JSON_OBJECT('value' VALUE %%s FORMAT JSON), '$.value')
JSON_QUERY
JSON_VALUEr   sqliter   r   r   )r   resolve_expression_parameterrL   r0   has_native_json_fieldr/   r>   r?   r;   r   r   rM   r   r   )r   rt   r5   r   paramrV   rA   r    r"   r#   r     s2    




z+KeyTransformIn.resolve_expression_parameter)r\   r]   r^   r   ra   r"   r"   r    r#   r     s   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rg }d}|D ]:}t	|}t |t
tfrt||d  qH||d  qH|t|; }nF|jdkrg }|D ]&}||jjkr|d q|d q|t|; }||fS )Nr   r   r   r   r   r   r   )r;   rw   r<   r   r	   Exactrq   r/   r>   r?   r   r   r1   rr   rM   r   )r   rt   r5   rw   rx   r   r   rA   r    r"   r#   rq     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   rq   r   ru   r   r   Z
get_lookuprG   rr   )r   rt   r5   rw   rx   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)r\   r]   r^   rq   r   ra   r"   r"   r    r#   r     s   r   c                   @   s   e Zd ZdS )KeyTransformIExactNr   r"   r"   r"   r#   r   6  s   r   c                   @   s   e Zd ZdS )KeyTransformIContainsNr   r"   r"   r"   r#   r   <  s   r   c                   @   s   e Zd ZdS )KeyTransformStartsWithNr   r"   r"   r"   r#   r   B  s   r   c                   @   s   e Zd ZdS )KeyTransformIStartsWithNr   r"   r"   r"   r#   r   F  s   r   c                   @   s   e Zd ZdS )KeyTransformEndsWithNr   r"   r"   r"   r#   r   L  s   r   c                   @   s   e Zd ZdS )KeyTransformIEndsWithNr   r"   r"   r"   r#   r   P  s   r   c                   @   s   e Zd ZdS )KeyTransformRegexNr   r"   r"   r"   r#   r   V  s   r   c                   @   s   e Zd ZdS )KeyTransformIRegexNr   r"   r"   r"   r#   r   Z  s   r   c                       s   e Zd Z fddZ  ZS )KeyTransformNumericLookupMixinc                    s0   t  ||\}}|jjs(dd |D }||fS )Nc                 S   s   g | ]}t |qS r"   )r>   r?   )r   rA   r"   r"   r#   r   d  s     z>KeyTransformNumericLookupMixin.process_rhs.<locals>.<listcomp>)r   rq   r0   r   r   r    r"   r#   rq   a  s    z*KeyTransformNumericLookupMixin.process_rhs)r\   r]   r^   rq   ra   r"   r"   r    r#   r   `  s   r   c                   @   s   e Zd ZdS )KeyTransformLtNr   r"   r"   r"   r#   r   h  s   r   c                   @   s   e Zd ZdS )KeyTransformLteNr   r"   r"   r"   r#   r   l  s   r   c                   @   s   e Zd ZdS )KeyTransformGtNr   r"   r"   r"   r#   r   p  s   r   c                   @   s   e Zd ZdS )KeyTransformGteNr   r"   r"   r"   r#   r   t  s   r   c                   @   s   e Zd Zdd Zdd ZdS )rS   c                 C   s
   || _ d S rP   )r   )r   r   r"   r"   r#   r     s    zKeyTransformFactory.__init__c                 O   s   t | jf||S rP   )r<   r   )r   r8   r   r"   r"   r#   __call__  s    zKeyTransformFactory.__call__N)r\   r]   r^   r   r   r"   r"   r"   r#   rS     s   rS   )T)Rr>   rJ   djangor   Zdjango.corer   r   Z	django.dbr   r   r   Zdjango.db.modelsr   r	   Zdjango.db.models.constantsr
   Zdjango.db.models.fieldsr   Zdjango.db.models.lookupsr   r   r   Zdjango.utils.deprecationr   Zdjango.utils.translationr   r_   rd   r   Zmixinsr   __all__r   rk   rl   r|   r}   r   r   r   r   r   r   r   Z	IContainsr   Zregister_lookupr<   r   r   KTr   ZIsNullr   Inr   r   ZIExactr   r   Z
StartsWithr   ZIStartsWithr   ZEndsWithr   Z	IEndsWithr   Regexr   ZIRegexr   r   ZLessThanr   ZLessThanOrEqualr   ZGreaterThanr   ZGreaterThanOrEqualr   rS   r"   r"   r"   r#   <module>   s    
Q	






8(
  
  
  
  
  














