U
    8ÄT_"J  ã                   @   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                    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__© ú@/tmp/pip-unpacked-wheel-dv63caxw/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    $   s    zJSONField.checkc                 C   s^   g }|D ]P}t  || j¡sqt| }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   Z_metaZrequired_db_featuresÚfeaturesr%   Úappendr   ÚErrorZdisplay_name)r   r   r$   ÚdbÚ
connectionr   r   r   r#   *   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   r.   >   s    



zJSONField.deconstructc                 C   s>   |d kr|S zt j|| jd�W S  t jk
r8   | Y S X d S ©N©Úcls)ÚjsonÚloadsr   ÚJSONDecodeError)r   ÚvalueZ
expressionr-   r   r   r   Úfrom_db_valueF   s    zJSONField.from_db_valuec                 C   s   dS )Nr   r   ©r   r   r   r   Úget_internal_typeN   s    zJSONField.get_internal_typec                 C   s   |d kr|S t j|| jd�S r1   )r4   Údumpsr   )r   r7   r   r   r   Úget_prep_valueQ   s    zJSONField.get_prep_valuec                    s   t ƒ  |¡}|r|S t|ƒS ©N)r   Úget_transformÚKeyTransformFactory)r   r   Z	transformr   r   r   r>   V   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 )Nr2   r   r7   )ÚcodeÚparams)	r   Úvalidater4   r;   r   Ú	TypeErrorr   ZValidationErrorZerror_messages)r   r7   Zmodel_instancer   r   r   rB   \   s    ýzJSONField.validatec                 C   s
   |   |¡S r=   )Zvalue_from_object)r   r&   r   r   r   Úvalue_to_stringg   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   j   s    ýüzJSONField.formfield)NNNN)Ú__name__Ú
__module__Ú__qualname__Zempty_strings_allowedÚ_ÚdescriptionZdefault_error_messagesZ_default_hintr   r    r#   r.   r8   r:   r<   r>   rB   rD   rE   Ú__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   r*   r4   r;   Újoin)Úkey_transformsÚinclude_rootr/   Úkey_transformÚnumr   r   r   Úcompile_json_paths   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ƒ‚|  ||¡\}}|  ||¡\}}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_paramsrA   r   r   r   Úas_sql„   s    ÿzDataContains.as_sqlN©rF   rG   rH   Úlookup_nameÚpostgres_operatorrc   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ƒ‚|  ||¡\}}|  ||¡\}}t|ƒt|ƒ }d||f |fS )Nz>contained_by lookup is not supported on this database backend.rX   rY   r]   r   r   r   rc   “   s    ÿzContainedBy.as_sqlNrd   r   r   r   r   rg   �   s   rg   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ƒsd|	g}	|	D ]B}t |tƒrŠ| ||¡�^ }}n|g}|
 	d|t|dd�f ¡ qh| j
rÌd| j
 |gt|
ƒ ¡ }|t|ƒt|
ƒ fS )NrL   z%s%sF)rR   z(%s))Ú
isinstancer_   ÚKeyTransformÚpreprocess_lhsrU   rZ   ra   Úlistr\   r*   Úlogical_operatorrP   Úlen)r   r^   r-   Útemplater_   r`   Zlhs_key_transformsZlhs_json_pathÚsqlra   rb   ÚkeyrI   Úrhs_key_transformsr   r   r   rc   ¡   s*    


þ
zHasKeyLookup.as_sqlc                 C   s   | j ||dd�S )Nz"JSON_CONTAINS_PATH(%s, 'one', %%s)©ro   ©rc   ©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')rs   )rc   r\   )r   r^   r-   rp   rA   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éÿÿÿÿ)ri   ra   rj   rk   r_   r   Úas_postgresql)r   r^   r-   rI   rr   rq   r   r   r   ry   Æ   s    
zHasKeyLookup.as_postgresqlc                 C   s   | j ||dd�S )NzJSON_TYPE(%s, %%s) IS NOT NULLrs   rt   ru   r   r   r   Ú	as_sqliteÎ   s    zHasKeyLookup.as_sqlite)N)
rF   rG   rH   rm   rc   rv   rw   ry   rz   rK   r   r   r   r   rh   ž   s   
rh   c                   @   s   e Zd ZdZdZdZdS )ÚHasKeyZhas_keyú?FN)rF   rG   rH   re   rf   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   )Ústr)Ú.0Úitemr   r   r   Ú
<listcomp>Þ   s     z+HasKeys.get_prep_lookup.<locals>.<listcomp>)ra   r9   r   r   r   Úget_prep_lookupÝ   s    zHasKeys.get_prep_lookupN)rF   rG   rH   re   rf   rm   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)rF   rG   rH   re   rf   rm   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 )Ú	JSONExactTc                    sP   t ƒ  ||¡\}}|jdkrHt ƒ  ||¡\}}|dkrH|d gkrHd| }||fS )NÚsqliteú%szJSON_TYPE(%s, '$'))r   rZ   Úvendorr[   )r   r^   r-   r_   r`   ra   rb   r   r   r   rZ   ê   s    
zJSONExact.process_lhsc                    sV   t ƒ  ||¡\}}|dkr*|d gkr*dg}|jdkrNdgt|ƒ }|t|ƒ }||fS )Nr†   ÚnullÚmysqlúJSON_EXTRACT(%s, '$'))r   r[   r‡   rn   r\   )r   r^   r-   ra   rb   Úfuncr   r   r   r[   ó   s    
zJSONExact.process_rhs)rF   rG   rH   Zcan_use_none_as_rhsrZ   r[   rK   r   r   r   r   r„   ç   s   	r„   c                       sN   e Zd ZdZdZ‡ fdd„Zddd„Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
‡  ZS )rj   z->z#>c                    s   t ƒ j||Ž t|ƒ| _d S r=   )r   r   r~   Úkey_name)r   rŒ   r0   r   r   r   r   r   
  s    zKeyTransform.__init__Fc                 C   sr   |s| j g}| j}t|tƒr6|s.| d|j ¡ |j}q| |¡\}}|jdkr\dd„ |D ƒ}|sj|||fS ||fS )Nr   Úoraclec                 S   s   g | ]}|  d d¡‘qS )ú%z%%)Úreplace)r   rq   r   r   r   r�     s     z/KeyTransform.preprocess_lhs.<locals>.<listcomp>)rŒ   r_   ri   rj   ÚinsertÚcompiler‡   )r   r^   r-   Úlhs_onlyrQ   Úpreviousr_   rA   r   r   r   rk     s    

zKeyTransform.preprocess_lhsc                 C   s0   |   ||¡\}}}t|ƒ}d| t|ƒ|f fS ©NzJSON_EXTRACT(%s, %%s)©rk   rU   r\   ©r   r^   r-   r_   rA   rQ   Z	json_pathr   r   r   rv     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   rw   !  s    
ÿ
ýzKeyTransform.as_oraclec                 C   s|   |   ||¡\}}}t|ƒdkr6d|| jf ||g fS zt| jƒ}W n tk
r^   | j}Y nX d|| jf t|ƒ|f fS )Nr   z(%s %s %%s))rk   rn   Úpostgres_nested_operatorrO   rŒ   r   rf   r\   )r   r^   r-   r_   rA   rQ   Úlookupr   r   r   ry   )  s    zKeyTransform.as_postgresqlc                 C   s0   |   ||¡\}}}t|ƒ}d| t|ƒ|f fS r”   r•   r–   r   r   r   rz   3  s    zKeyTransform.as_sqlite)F)rF   rG   rH   rf   r˜   r   rk   rv   rw   ry   rz   rK   r   r   r   r   rj     s   

rj   c                   @   s   e Zd ZdZdZdS )ÚKeyTextTransformz->>z#>>N)rF   rG   rH   rf   r˜   r   r   r   r   rš   9  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.)	ri   rj   rC   rš   rŒ   Zsource_expressionsÚextrar   r   )r   rS   r0   r   Zkey_text_transformr   r   r   r   E  s    
ÿÿÿþz$KeyTransformTextLookupMixin.__init__)rF   rG   rH   Ú__doc__r   rK   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 ©Nr‰   z	LOWER(%s))r   rZ   r‡   )r   r^   r-   r_   r`   r   r   r   rZ   Y  s    
z CaseInsensitiveMixin.process_lhsc                    s0   t ƒ  ||¡\}}|jdkr(d| |fS ||fS rŸ   )r   r[   r‡   ©r   r^   r-   ra   rb   r   r   r   r[   _  s    
z CaseInsensitiveMixin.process_rhs)rF   rG   rH   r�   rZ   r[   rK   r   r   r   r   rž   R  s   rž   c                       s(   e Zd Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚKeyTransformIsNullc                    s.   | j s t| jj| jjƒ ||¡S tƒ  ||¡S r=   )ra   r{   r_   rŒ   rw   r   rc   ru   r   r   r   rw   h  s    zKeyTransformIsNull.as_oraclec                    s.   | j s t| jj| jjƒ ||¡S tƒ  ||¡S r=   )ra   r{   r_   rŒ   rz   r   rc   ru   r   r   r   rz   m  s    zKeyTransformIsNull.as_sqlite)rF   rG   rH   rw   rz   rK   r   r   r   r   r¡   f  s   r¡   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚKeyTransformInc              	      sÄ   t ƒ  ||¡\}}|jjs¼d}|jdkr€g }|D ]@}t |¡}t|tt	fƒrPdnd}| 
d|t d|i¡f ¡ q0t|ƒ}d}n4|jdkrž|jrždt|ƒ }n|jd	kr´d
t|ƒ }|| }||fS )Nr   r�   Ú
JSON_QUERYÚ
JSON_VALUEú%s('%s', '$.value')r7   r‰   )z#JSON_UNQUOTE(JSON_EXTRACT(%s, '$'))>   r‰   r…   )rŠ   )r   r[   r)   Úhas_native_json_fieldr‡   r4   r5   ri   rl   r   r*   r;   r\   Zmysql_is_mariadbrn   ©r   r^   r-   ra   rb   r‹   r7   Úfunctionr   r   r   r[   t  s(    

þ

zKeyTransformIn.process_rhs©rF   rG   rH   r[   rK   r   r   r   r   r¢   s  s   r¢   c                       s4   e Zd Z‡ fdd„Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚKeyTransformExactc                    sf   t ƒ  ||¡\}}|jdkr^t ƒ  ||¡\}}|dkr^|dgkr^| jj||dd�\}}d| }||fS )Nr…   r†   rˆ   T)r’   zJSON_TYPE(%s, %%s))r   rZ   r‡   r[   r_   rk   )r   r^   r-   r_   r`   ra   rb   rI   r   r   r   rZ   Œ  s    
zKeyTransformExact.process_lhsc              	      sÄ   t | jtƒr ttj| ƒ ||¡S tƒ  ||¡\}}|jdkr˜g }|D ]@}t 	|¡}t |t
tfƒrddnd}| d|t d|i¡f ¡ qD|t|ƒ }g }n$|jdkr¼dd„ |D ƒ}|t|ƒ }||fS )	Nr�   r£   r¤   r¥   r7   r…   c                 S   s   g | ]}|d krdnd‘qS )rˆ   rŠ   r†   r   ©r   r7   r   r   r   r�   ¥  s     z1KeyTransformExact.process_rhs.<locals>.<listcomp>)ri   ra   rj   r   r   ÚExactr[   r‡   r4   r5   rl   r   r*   r;   r\   r§   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ˆ   ZisnullTz	%s AND %s)	r   r[   r{   r_   rŒ   rw   Z
get_lookuprc   r\   )r   r^   r-   ra   rb   Zhas_key_exprZhas_key_sqlZhas_key_paramsZis_null_exprZis_null_sqlZis_null_paramsr   r   r   rw   ©  s    

þzKeyTransformExact.as_oracle)rF   rG   rH   rZ   r[   rw   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 )ÚKeyTransformIContainsNr®   r   r   r   r   r¯   ¼  s   r¯   c                   @   s   e Zd ZdS )ÚKeyTransformStartsWithNr®   r   r   r   r   r°   À  s   r°   c                   @   s   e Zd ZdS )ÚKeyTransformIStartsWithNr®   r   r   r   r   r±   Ä  s   r±   c                   @   s   e Zd ZdS )ÚKeyTransformEndsWithNr®   r   r   r   r   r²   È  s   r²   c                   @   s   e Zd ZdS )ÚKeyTransformIEndsWithNr®   r   r   r   r   r³   Ì  s   r³   c                   @   s   e Zd ZdS )ÚKeyTransformRegexNr®   r   r   r   r   r´   Ð  s   r´   c                   @   s   e Zd ZdS )ÚKeyTransformIRegexNr®   r   r   r   r   rµ   Ô  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   )r4   r5   r«   r   r   r   r�   Ü  s     z>KeyTransformNumericLookupMixin.process_rhs.<locals>.<listcomp>)r   r[   r)   r¦   r    r   r   r   r[   Ù  s    z*KeyTransformNumericLookupMixin.process_rhsr©   r   r   r   r   r¶   Ø  s   r¶   c                   @   s   e Zd ZdS )ÚKeyTransformLtNr®   r   r   r   r   r·   à  s   r·   c                   @   s   e Zd ZdS )ÚKeyTransformLteNr®   r   r   r   r   r¸   ä  s   r¸   c                   @   s   e Zd ZdS )ÚKeyTransformGtNr®   r   r   r   r   r¹   è  s   r¹   c                   @   s   e Zd ZdS )ÚKeyTransformGteNr®   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 r=   )rŒ   )r   rŒ   r   r   r   r     s    zKeyTransformFactory.__init__c                 O   s   t | jf|ž|ŽS r=   )rj   rŒ   )r   r0   r   r   r   r   Ú__call__  s    zKeyTransformFactory.__call__N)rF   rG   rH   r   r»   r   r   r   r   r?     s   r?   )T)Er4   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   rg   rh   r{   r}   rƒ   r¬   r„   Zregister_lookuprj   rš   r›   rž   ZIsNullr¡   Z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   c
4	





3-














