B
    CVvg/)  ã               @   s�  d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZ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G dd„ dƒZejG dd„ deejƒƒZ ejG dd„ deej!ƒƒZ"ejG dd„ deeƒƒZ#ejG dd„ deej$ƒƒZ%ejG dd„ deƒƒZ&ejG dd„ deƒƒZ'G dd„ deƒZ(G d d!„ d!ƒZ)G d"d#„ d#eƒZ*G d$d%„ d%ƒZ+dS )&é    N)Úlookups)ÚSimpleArrayField)ÚArrayMaxLengthValidator)ÚchecksÚ
exceptions)ÚFieldÚFuncÚIntegerFieldÚ	TransformÚValue)ÚCheckFieldDefaultMixin)ÚExactÚIn)Úgettext_lazyé   )Úprefix_validation_erroré   )ÚAttributeSetterÚ
ArrayFieldc                   sü   e Zd ZdZedƒedƒdœZdZd,‡ fdd„	Zed	d
„ ƒZ	e	j
dd
„ ƒZ	e‡ fdd„ƒZ‡ fdd„Z‡ fdd„Zedd„ ƒZdd„ Zdd„ Zdd„ Zd-dd„Z‡ fdd„Zdd„ Zd d!„ Zd"d#„ Z‡ fd$d%„Z‡ fd&d'„Z‡ fd(d)„Z‡ fd*d+„Z‡  ZS ).r   Fz+Item %(nth)s in the array did not validate:z(Nested arrays must have the same length.)Úitem_invalidÚnested_array_mismatch)Úlistz[]Nc                sL   || _ || _| jr&| jt| jƒf•| _t| j dƒr:| j| _tƒ jf |Ž d S )NÚfrom_db_value)	Ú
base_fieldÚsizeZdefault_validatorsr   ÚhasattrÚ_from_db_valuer   ÚsuperÚ__init__)Úselfr   r   Úkwargs)Ú	__class__© úH/tmp/pip-install-o3oxmrkh/Django/django/contrib/postgres/fields/array.pyr      s    zArrayField.__init__c             C   s4   y
| j d S  tk
r.   td| jj ƒ‚Y nX d S )NÚmodelz$'%s' object has no attribute 'model')Ú__dict__ÚKeyErrorÚAttributeErrorr!   Ú__name__)r   r"   r"   r#   r$   %   s    
zArrayField.modelc             C   s   || j d< || j_d S )Nr$   )r%   r   r$   )r   r$   r"   r"   r#   r$   ,   s    
c                s   t |ttfƒptƒ  |¡S )N)Ú
isinstancer   Útupler   Ú_choices_is_value)ÚclsÚvalue)r!   r"   r#   r+   1   s    zArrayField._choices_is_valuec                sn   t ƒ jf |Ž}| jjr.| tjd| dd�¡ n<| j ¡ }|rjd dd„ |D ƒ¡}| tjd| | dd�¡ |S )	Nz/Base field for array cannot be a related field.zpostgres.E002)ÚobjÚidz
    c             s   s   | ]}d |j |jf V  qdS )z%s (%s)N)Úmsgr/   )Ú.0Úerrorr"   r"   r#   ú	<genexpr>C   s    z#ArrayField.check.<locals>.<genexpr>z'Base field for array has errors:
    %szpostgres.E001)r   Úcheckr   Zremote_fieldÚappendr   ÚErrorÚjoin)r   r    ÚerrorsZbase_errorsÚmessages)r!   r"   r#   r4   5   s     

zArrayField.checkc                s   t ƒ  |¡ | j |¡ d S )N)r   Úset_attributes_from_namer   )r   Úname)r!   r"   r#   r:   M   s    z#ArrayField.set_attributes_from_namec             C   s   d| j j S )NzArray of %s)r   Údescription)r   r"   r"   r#   r<   Q   s    zArrayField.descriptionc             C   s   | j pd}d| j |¡|f S )NÚ z%s[%s])r   r   Údb_type)r   Ú
connectionr   r"   r"   r#   r>   U   s    
zArrayField.db_typec             C   s   | j pd}d| j |¡|f S )Nr=   z%s[%s])r   r   Úcast_db_type)r   r?   r   r"   r"   r#   r@   Y   s    
zArrayField.cast_db_typec             C   s   d  |  |¡¡S )Nz%s::{})Úformatr>   )r   r-   Úcompilerr?   r"   r"   r#   Úget_placeholder]   s    zArrayField.get_placeholderc                s&   t |ttfƒr"‡ ‡fdd„|D ƒS |S )Nc                s   g | ]}ˆj j|ˆ d d�‘qS )F)Úprepared)r   Úget_db_prep_value)r1   Úi)r?   r   r"   r#   ú
<listcomp>b   s    z0ArrayField.get_db_prep_value.<locals>.<listcomp>)r)   r   r*   )r   r-   r?   rD   r"   )r?   r   r#   rE   `   s    zArrayField.get_db_prep_valuec                sB   t ƒ  ¡ \}}}}|dkrd}| | j ¡ | jdœ¡ ||||fS )Nz/django.contrib.postgres.fields.array.ArrayFieldz)django.contrib.postgres.fields.ArrayField)r   r   )r   ÚdeconstructÚupdater   Úcloner   )r   r;   ÚpathÚargsr    )r!   r"   r#   rH   e   s    zArrayField.deconstructc                s*   t |tƒr&t |¡}‡ fdd„|D ƒ}|S )Nc                s   g | ]}ˆ j  |¡‘qS r"   )r   Ú	to_python)r1   Úval)r   r"   r#   rG   s   s    z(ArrayField.to_python.<locals>.<listcomp>)r)   ÚstrÚjsonÚloads)r   r-   Úvalsr"   )r   r#   rM   o   s    

zArrayField.to_pythonc                s"   |d kr|S ‡ ‡‡fdd„|D ƒS )Nc                s   g | ]}ˆj  |ˆˆ ¡‘qS r"   )r   r   )r1   Úitem)r?   Ú
expressionr   r"   r#   rG   z   s   z-ArrayField._from_db_value.<locals>.<listcomp>r"   )r   r-   rT   r?   r"   )r?   rT   r   r#   r   v   s    zArrayField._from_db_valuec             C   s\   g }|   |¡}| j}x<|D ]4}|d kr2| d ¡ qt|j|ƒ}| | |¡¡ qW t |¡S )N)Zvalue_from_objectr   r5   r   ZattnameÚvalue_to_stringrP   Údumps)r   r.   ÚvaluesrR   r   rN   r"   r"   r#   rU   ~   s    

zArrayField.value_to_stringc                sœ   t ƒ  |¡}|r|S d|krRyt|ƒ}W n tk
r<   Y nX |d7 }t|| jƒS y&| d¡\}}t|ƒd }t|ƒ}W n tk
rŒ   Y nX t||ƒS d S )NÚ_r   )r   Úget_transformÚintÚ
ValueErrorÚIndexTransformFactoryr   ÚsplitÚSliceTransformFactory)r   r;   Z	transformÚindexÚstartÚend)r!   r"   r#   rY   ‹   s"    zArrayField.get_transformc                s´   t ƒ  ||¡ xjt|ƒD ]^\}}y| j ||¡ W q tjk
rt } z"t|| jd dd|d id�‚W d d }~X Y qX qW t| jt	ƒr°t
dd„ |D ƒƒdkr°tj| jd dd�‚d S )	Nr   Únthr   )ÚprefixÚcodeÚparamsc             S   s   h | ]}t |ƒ’qS r"   )Úlen)r1   rF   r"   r"   r#   ú	<setcomp>­   s    z&ArrayField.validate.<locals>.<setcomp>r   )rd   )r   ÚvalidateÚ	enumerater   r   ÚValidationErrorr   Úerror_messagesr)   r   rf   )r   r-   Zmodel_instancer_   Úpartr2   )r!   r"   r#   rh       s    &zArrayField.validatec                sz   t ƒ  |¡ xht|ƒD ]\\}}y| j |¡ W q tjk
rp } z"t|| jd dd|d id�‚W d d }~X Y qX qW d S )Nr   rb   r   )rc   rd   re   )r   Úrun_validatorsri   r   r   rj   r   rk   )r   r-   r_   rl   r2   )r!   r"   r#   rm   ³   s    zArrayField.run_validatorsc                s"   t ƒ jf t| j ¡ | jdœ|–ŽS )N)Z
form_classr   Ú
max_length)r   Ú	formfieldr   r   r   )r   r    )r!   r"   r#   ro   À   s
    zArrayField.formfield)N)F)r(   Ú
__module__Ú__qualname__Zempty_strings_allowedrX   Zdefault_error_messagesZ_default_hintr   Úpropertyr$   ÚsetterÚclassmethodr+   r4   r:   r<   r>   r@   rC   rE   rH   rM   r   rU   rY   rh   rm   ro   Ú__classcell__r"   r"   )r!   r#   r      s.   

c                   s(   e Zd Z‡ fdd„Z‡ fdd„Z‡  ZS )ÚArrayRHSMixinc                sl   t |ttfƒrZg }x6|D ].}t|dƒs<|j}t|j |¡ƒ}| |¡ qW t	|dddœŽ}t
ƒ  ||¡ d S )NÚresolve_expressionÚARRAYz%(function)s[%(expressions)s])ÚfunctionÚtemplate)r)   r*   r   r   Úoutput_fieldr   r   Zget_prep_valuer5   r   r   r   )r   ÚlhsÚrhsZexpressionsr-   Úfield)r!   r"   r#   r   Ê   s    


zArrayRHSMixin.__init__c                s0   t ƒ  ||¡\}}| jj |¡}d||f |fS )Nz%s::%s)r   Úprocess_rhsr|   r{   r@   )r   rB   r?   r}   Z
rhs_paramsZ	cast_type)r!   r"   r#   r   Ù   s    zArrayRHSMixin.process_rhs)r(   rp   rq   r   r   ru   r"   r"   )r!   r#   rv   É   s   rv   c               @   s   e Zd ZdS )ÚArrayContainsN)r(   rp   rq   r"   r"   r"   r#   r€   ß   s   r€   c               @   s   e Zd ZdS )ÚArrayContainedByN)r(   rp   rq   r"   r"   r"   r#   r�   ä   s   r�   c               @   s   e Zd ZdS )Ú
ArrayExactN)r(   rp   rq   r"   r"   r"   r#   r‚   é   s   r‚   c               @   s   e Zd ZdS )ÚArrayOverlapN)r(   rp   rq   r"   r"   r"   r#   rƒ   î   s   rƒ   c               @   s   e Zd ZdZeƒ Zdd„ ZdS )ÚArrayLenTransformrf   c             C   s    |  | j¡\}}dd|i |fS )NzRCASE WHEN %(lhs)s IS NULL THEN NULL ELSE coalesce(array_length(%(lhs)s, 1), 0) ENDr|   )Úcompiler|   )r   rB   r?   r|   re   r"   r"   r#   Úas_sqlø   s    zArrayLenTransform.as_sqlN)r(   rp   rq   Úlookup_namer	   r{   r†   r"   r"   r"   r#   r„   ó   s   r„   c                   s   e Zd Z‡ fdd„Z‡  ZS )ÚArrayInLookupc                sR   t ƒ  ¡ }t|dƒr|S g }x0|D ](}t|dƒr<| |¡ q"| t|ƒ¡ q"W |S )Nrw   )r   Úget_prep_lookupr   r5   r*   )r   rW   Zprepared_valuesr-   )r!   r"   r#   r‰     s    



zArrayInLookup.get_prep_lookup)r(   rp   rq   r‰   ru   r"   r"   )r!   r#   rˆ     s   rˆ   c                   s0   e Zd Z‡ fdd„Zdd„ Zedd„ ƒZ‡  ZS )ÚIndexTransformc                s   t ƒ j||Ž || _|| _d S )N)r   r   r_   r   )r   r_   r   rL   r    )r!   r"   r#   r     s    zIndexTransform.__init__c             C   s$   |  | j¡\}}d| || jg fS )Nz%s[%%s])r…   r|   r_   )r   rB   r?   r|   re   r"   r"   r#   r†     s    zIndexTransform.as_sqlc             C   s   | j S )N)r   )r   r"   r"   r#   r{     s    zIndexTransform.output_field)r(   rp   rq   r   r†   rr   r{   ru   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"   r#   r   $  s    zIndexTransformFactory.__init__c             O   s   t | j| jf|ž|ŽS )N)rŠ   r_   r   )r   rL   r    r"   r"   r#   Ú__call__(  s    zIndexTransformFactory.__call__N)r(   rp   rq   r   r‹   r"   r"   r"   r#   r\   "  s   r\   c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚSliceTransformc                s   t ƒ j||Ž || _|| _d S )N)r   r   r`   ra   )r   r`   ra   rL   r    )r!   r"   r#   r   .  s    zSliceTransform.__init__c             C   s(   |  | j¡\}}d| || j| jg fS )Nz%s[%%s:%%s])r…   r|   r`   ra   )r   rB   r?   r|   re   r"   r"   r#   r†   3  s    zSliceTransform.as_sql)r(   rp   rq   r   r†   ru   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`   ra   )r   r`   ra   r"   r"   r#   r   :  s    zSliceTransformFactory.__init__c             O   s   t | j| jf|ž|ŽS )N)rŒ   r`   ra   )r   rL   r    r"   r"   r#   r‹   >  s    zSliceTransformFactory.__call__N)r(   rp   rq   r   r‹   r"   r"   r"   r#   r^   8  s   r^   ),rP   Zdjango.contrib.postgresr   Zdjango.contrib.postgres.formsr   Z"django.contrib.postgres.validatorsr   Zdjango.corer   r   Zdjango.db.modelsr   r   r	   r
   r   Zdjango.db.models.fields.mixinsr   Zdjango.db.models.lookupsr   r   Zdjango.utils.translationr   rX   Úutilsr   r   Ú__all__r   rv   Zregister_lookupZDataContainsr€   ZContainedByr�   r‚   ZOverlaprƒ   r„   rˆ   rŠ   r\   rŒ   r^   r"   r"   r"   r#   Ú<module>   s<    8

