3
g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j!e ej!e ej!e ej!e ej!e ej!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"j!e) e"j!e* e"j!e, e"j!e' e"j!e. e"j!e0 e"j!e2 e"j!e4 e"j!e6 e"j!e8 e"j!e: e"j!e= e"j!e? e"j!eA e"j!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.dict{}Nc                sN   |rt | rtd|r,t | r,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__ Z/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/db/models/fields/json.pyr      s    zJSONField.__init__c                s0   t  jf |}|jdpg }|j| j| |S )N	databases)r   checkgetextend_check_supported)r   r   errorsr   )r   r   r   r    $   s    zJSONField.checkc             C   s~   g }xt|D ]l}t j|| jsq
t| }| jjjrB| jjj|jkrBq
d| jjjkpV|jj	s
|j
tjd|j | jdd q
W |S )Nsupports_json_fieldz%s does not support JSONFields.zfields.E180)objid)r   Zallow_migrate_modelmodelr   Z_metaZrequired_db_vendorvendorZrequired_db_featuresfeaturesr%   appendr   ErrorZdisplay_name)r   r   r$   db
connectionr   r   r   r#   *   s"    

zJSONField._check_supportedc                sF   t  j \}}}}| 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   r/   C   s    



zJSONField.deconstructc             C   sR   |d kr|S t |tr&t |t r&|S ytj|| jdS  tjk
rL   |S X d S )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 kr|S t j|| jdS )N)r2   )r6   dumpsr   )r   r9   r   r   r   get_prep_valueZ   s    zJSONField.get_prep_valuec                s   t  j|}|r|S t|S )N)r   get_transformKeyTransformFactory)r   r   Z	transform)r   r   r   r>   _   s    zJSONField.get_transformc                sV   t  j|| ytj|| jd W n. tk
rP   tj| jd dd|idY nX d S )N)r2   r   r9   )codeparams)	r   validater6   r<   r   	TypeErrorr   ZValidationErrorZerror_messages)r   r9   Zmodel_instance)r   r   r   rB   e   s    zJSONField.validatec             C   s
   | j |S )N)Zvalue_from_object)r   r&   r   r   r   value_to_stringp   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   rE   s   s
    zJSONField.formfield)r   r   )NNNN)__name__
__module____qualname__Zempty_strings_allowed_descriptionZdefault_error_messagesZ_default_hintr   r    r#   r/   r:   r;   r=   r>   rB   rD   rE   __classcell__r   r   )r   r   r      s   Tc             C   sp   |r
dgng }xV| D ]N}yt |}W n. tk
rR   |jd |jtj| Y qX |jd|  qW dj|S )N$.z[%s] )intr   r+   r6   r<   join)key_transformsinclude_rootr0   key_transformnumr   r   r   compile_json_path|   s    

rU   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| j||\}}| j||\}}t|t| }d||f |fS )Nz:contains lookup is not supported on this database backend.zJSON_CONTAINS(%s, %s))r*   supports_json_field_containsr   process_lhsprocess_rhstuple)r   compilerr.   lhs
lhs_paramsrhs
rhs_paramsrA   r   r   r   as_sql   s    zDataContains.as_sqlN)rF   rG   rH   lookup_namepostgres_operatorra   r   r   r   r   rV      s   rV   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| j||\}}| j||\}}t|t| }d||f |fS )Nz>contained_by lookup is not supported on this database backend.zJSON_CONTAINS(%s, %s))r*   rX   r   rY   rZ   r[   )r   r\   r.   r]   r^   r_   r`   rA   r   r   r   ra      s    zContainedBy.as_sqlN)rF   rG   rH   rb   rc   ra   r   r   r   r   rd      s   rd   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j||\}}}t|}n| j||\}}d}|| }| j}	g }
t |	ttfsd|	g}	xJ|	D ]B}t |tr|j||^ }}n|g}|
j	d|t|ddf  qjW | j
rd| j
j|gt|
  }|t|t|
 fS )NrL   z%s%sF)rR   z(%s))r3   r]   r4   preprocess_lhsrU   rY   r_   listr[   r+   logical_operatorrP   len)r   r\   r.   templater]   r^   Zlhs_key_transformsZlhs_json_pathsqlr_   r`   keyrI   rhs_key_transformsr   r   r   ra      s(    


zHasKeyLookup.as_sqlc             C   s   | j ||ddS )Nz"JSON_CONTAINS_PATH(%s, 'one', %%s))rj   )ra   )r   r\   r.   r   r   r   as_mysql   s    zHasKeyLookup.as_mysqlc             C   s$   | j ||dd\}}|t| g fS )NzJSON_EXISTS(%s, '%%s'))rj   )ra   r[   )r   r\   r.   rk   rA   r   r   r   	as_oracle   s    zHasKeyLookup.as_oraclec                s\   t | jtrN| jj||^ }}x"|d d D ]}t|| j| _q.W |d | _t j||S )Nr   rp   )r3   r_   r4   rf   r]   r   as_postgresql)r   r\   r.   rI   rm   rl   )r   r   r   rq      s    
zHasKeyLookup.as_postgresqlc             C   s   | j ||ddS )NzJSON_TYPE(%s, %%s) IS NOT NULL)rj   )ra   )r   r\   r.   r   r   r   	as_sqlite   s    zHasKeyLookup.as_sqlite)N)
rF   rG   rH   rh   ra   rn   ro   rq   rr   rK   r   r   )r   r   re      s   
re   c               @   s   e Zd ZdZdZdZdS )HasKeyZhas_key?FN)rF   rG   rH   rb   rc   Zprepare_rhsr   r   r   r   rs      s   rs   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   )r5   ).0itemr   r   r   
<listcomp>   s    z+HasKeys.get_prep_lookup.<locals>.<listcomp>)r_   )r   r   r   r   get_prep_lookup   s    zHasKeys.get_prep_lookupN)rF   rG   rH   rb   rc   rh   ry   r   r   r   r   ru      s   ru   c               @   s   e Zd ZdZdZdZdS )
HasAnyKeysZhas_any_keysz?|z OR N)rF   rG   rH   rb   rc   rh   r   r   r   r   rz      s   rz   c                   s,   e Zd ZdZ fddZ fddZ  ZS )	JSONExactTc                sP   t  j||\}}|jdkrHt  j||\}}|dkrH|d gkrHd| }||fS )Nsqlitez%szJSON_TYPE(%s, '$'))r   rY   r)   rZ   )r   r\   r.   r]   r^   r_   r`   )r   r   r   rY      s    
zJSONExact.process_lhsc                sV   t  j||\}}|dkr*|d gkr*dg}|jdkrNdgt| }|t| }||fS )Nz%snullmysqlzJSON_EXTRACT(%s, '$'))r   rZ   r)   ri   r[   )r   r\   r.   r_   r`   func)r   r   r   rZ      s    
zJSONExact.process_rhs)rF   rG   rH   Zcan_use_none_as_rhsrY   rZ   rK   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 )r4   z->z#>c                s   t  j|| t|| _d S )N)r   r   r5   key_name)r   r   r1   r   )r   r   r   r     s    zKeyTransform.__init__c             C   sb   | j g}| j}x"t|tr0|jd|j  |j}qW |j|\}}|jdkrXdd |D }|||fS )Nr   oraclec             S   s   g | ]}|j d dqS )%z%%)replace)rv   rl   r   r   r   rx      s    z/KeyTransform.preprocess_lhs.<locals>.<listcomp>)r   r]   r3   r4   insertcompiler)   )r   r\   r.   rQ   previousr]   rA   r   r   r   rf     s    

zKeyTransform.preprocess_lhsc             C   s0   | j ||\}}}t|}d| t||f fS )NzJSON_EXTRACT(%s, %%s))rf   rU   r[   )r   r\   r.   r]   rA   rQ   	json_pathr   r   r   rn   #  s    zKeyTransform.as_mysqlc             C   s6   | j ||\}}}t|}d||fd  t|d fS )Nz4COALESCE(JSON_QUERY(%s, '%s'), JSON_VALUE(%s, '%s'))   )rf   rU   r[   )r   r\   r.   r]   rA   rQ   r   r   r   r   ro   (  s
    zKeyTransform.as_oraclec             C   s   | j ||\}}}t|dkr>d|| jf }|t||f fS yt| j}W n tk
rf   | j}Y nX d|| jf t||f fS )Nr   z(%s %s %%s))rf   ri   postgres_nested_operatorr[   rO   r   r   rc   )r   r\   r.   r]   rA   rQ   rk   lookupr   r   r   rq   0  s    zKeyTransform.as_postgresqlc             C   s0   | j ||\}}}t|}d| t||f fS )NzJSON_EXTRACT(%s, %%s))rf   rU   r[   )r   r\   r.   r]   rA   rQ   r   r   r   r   rr   ;  s    zKeyTransform.as_sqlite)rF   rG   rH   rc   r   r   rf   rn   ro   rq   rr   rK   r   r   )r   r   r4     s   r4   c               @   s   e Zd ZdZdZdS )KeyTextTransformz->>z#>>N)rF   rG   rH   rc   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                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.)	r3   r4   rC   r   r   Zsource_expressionsextrar   r   )r   rS   r1   r   Zkey_text_transform)r   r   r   r   M  s    
z$KeyTransformTextLookupMixin.__init__)rF   rG   rH   __doc__r   rK   r   r   )r   r   r   F  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||\}}|jdkr(d| |fS ||fS )Nr~   z	LOWER(%s))r   rY   r)   )r   r\   r.   r]   r^   )r   r   r   rY   a  s    
z CaseInsensitiveMixin.process_lhsc                s0   t  j||\}}|jdkr(d| |fS ||fS )Nr~   z	LOWER(%s))r   rZ   r)   )r   r\   r.   r_   r`   )r   r   r   rZ   g  s    
z CaseInsensitiveMixin.process_rhs)rF   rG   rH   r   rY   rZ   rK   r   r   )r   r   r   Z  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||\}}| js,||fS | jj||\}}}d||f t|t| fS )Nz(NOT %s OR %s IS NULL))rs   r]   r   ro   r_   rf   r[   )r   r\   r.   rk   rA   r]   r^   rI   r   r   r   ro   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 NULLzJSON_TYPE(%s, %%s) IS NOT NULL)rj   )r_   rs   r]   r   ra   )r   r\   r.   rj   r   r   r   rr   {  s    zKeyTransformIsNull.as_sqliteN)rF   rG   rH   ro   rr   r   r   r   r   r   n  s   r   c                   s   e Zd Z fddZ  ZS )KeyTransformInc                s   t  j||||\}}t|d rt|jj rt|jdkrftj|}d}t|t	t
fr\|d }qt|d }n|jd
krtd}|jdkr|jrd	| }||fS )Nra   r   z9%s(JSON_OBJECT('value' VALUE %%s FORMAT JSON), '$.value')
JSON_QUERY
JSON_VALUEr|   r~   zJSON_EXTRACT(%s, '$')zJSON_UNQUOTE(%s)>   r~   r|   )r   resolve_expression_parameterhasattrr*   has_native_json_fieldr)   r6   r7   r3   rg   r   Zmysql_is_mariadb)r   r\   r.   rk   paramrA   r9   )r   r   r   r     s    





z+KeyTransformIn.resolve_expression_parameter)rF   rG   rH   r   rK   r   r   )r   r   r     s   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||\}}|jdkrZt  j||\}}|dkrZ|dgkrZ| jj||^}}d| }||fS )Nr|   z%sr}   zJSON_TYPE(%s, %%s))r   rY   r)   rZ   r]   rf   )r   r\   r.   r]   r^   r_   r`   rI   )r   r   r   rY     s    
zKeyTransformExact.process_lhsc                s   t | jtr ttj| j||S t j||\}}|jdkrg }d}xB|D ]:}tj	|}t |t
tfrv|j|d  qJ|j|d  qJW |t| }n$|jdkrdd |D }|t| }||fS )Nr   z9%s(JSON_OBJECT('value' VALUE %%s FORMAT JSON), '$.value')r   r   r|   c             S   s   g | ]}|d krdndqS )r}   zJSON_EXTRACT(%s, '$')z%sr   )rv   r9   r   r   r   rx     s    z1KeyTransformExact.process_rhs.<locals>.<listcomp>)r3   r_   r4   r   r   ExactrZ   r)   r6   r7   rg   r   r+   r[   )r   r\   r.   r_   r`   r   rk   r9   )r   r   r   rZ     s     



zKeyTransformExact.process_rhsc                s   t  j||\}}|dgkr~t| jj| jj}|j||\}}| jjd| jd}|j||\}	}
d||	f t|t|
 fS t  j||S )Nr}   ZisnullTz	%s AND %s)	r   rZ   rs   r]   r   ro   Z
get_lookupra   r[   )r   r\   r.   r_   r`   Zhas_key_exprZhas_key_sqlZhas_key_paramsZis_null_exprZis_null_sqlZis_null_params)r   r   r   ro     s    

zKeyTransformExact.as_oracle)rF   rG   rH   rY   rZ   ro   rK   r   r   )r   r   r     s   	r   c               @   s   e Zd ZdS )KeyTransformIExactN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformIContainsN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformStartsWithN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformIStartsWithN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformEndsWithN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformIEndsWithN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformRegexN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformIRegexN)rF   rG   rH   r   r   r   r   r     s   r   c                   s   e Zd Z fddZ  ZS )KeyTransformNumericLookupMixinc                s0   t  j||\}}|jjs(dd |D }||fS )Nc             S   s   g | ]}t j|qS r   )r6   r7   )rv   r9   r   r   r   rx     s    z>KeyTransformNumericLookupMixin.process_rhs.<locals>.<listcomp>)r   rZ   r*   r   )r   r\   r.   r_   r`   )r   r   r   rZ     s    z*KeyTransformNumericLookupMixin.process_rhs)rF   rG   rH   rZ   rK   r   r   )r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformLtN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformLteN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformGtN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )KeyTransformGteN)rF   rG   rH   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )r?   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zKeyTransformFactory.__init__c             O   s   t | jf||S )N)r4   r   )r   r1   r   r   r   r   __call__  s    zKeyTransformFactory.__call__N)rF   rG   rH   r   r   r   r   r   r   r?     s   r?   )T)Er6   Zdjangor   Zdjango.corer   r   Z	django.dbr   r   r   Zdjango.db.modelsr   Zdjango.db.models.lookupsr	   r
   Zdjango.utils.translationr   rI   rN   r   Zmixinsr   __all__r   rU   rV   rd   re   rs   ru   rz   r   r{   Zregister_lookupr4   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   r?   r   r   r   r   <module>   sx   l
4	





2,














