U
    d*                     @   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-unpacked-wheel-7vj2equ7/django/contrib/postgres/fields/array.pyr      s    zArrayField.__init__c                 C   s6   z| j d W S  tk
r0   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%   1   s    
c                    s   t |ttfpt |S N)
isinstancer   tupler   _choices_is_value)clsvaluer!   r#   r$   r.   6   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)msgr2   ).0errorr#   r#   r$   	<genexpr>H   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messagesr!   r#   r$   r7   :   s,    	

zArrayField.checkc                    s   t  | | j| d S r+   )r   set_attributes_from_namer   )r   namer!   r#   r$   r=   T   s    z#ArrayField.set_attributes_from_namec                 C   s   d| j j S )NzArray of %s)r   descriptionr*   r#   r#   r$   r?   X   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$   rB   \   s    
zArrayField.db_typec                 C   s   | j pd}d| j||f S r@   )r   r   cast_db_typerC   r#   r#   r$   rE   `   s    
zArrayField.cast_db_typec                 C   s   d | |S )Nz%s::{})formatrB   )r   r0   compilerrD   r#   r#   r$   get_placeholderd   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r4   irD   r   r#   r$   
<listcomp>i   s   z0ArrayField.get_db_prep_value.<locals>.<listcomp>)r,   r   r-   )r   r0   rD   rI   r#   rM   r$   rJ   g   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$   rO   o   s    zArrayField.deconstructc                    s*   t |tr&t|} fdd|D }|S )Nc                    s   g | ]} j |qS r#   )r   	to_python)r4   valr*   r#   r$   rN      s     z(ArrayField.to_python.<locals>.<listcomp>)r,   strjsonloads)r   r0   valsr#   r*   r$   rT   {   s    

zArrayField.to_pythonc                    s"   |d kr|S  fdd|D S )Nc                    s   g | ]}j | qS r#   )r   r   )r4   itemrD   
expressionr   r#   r$   rN      s   z-ArrayField._from_db_value.<locals>.<listcomp>r#   )r   r0   r\   rD   r#   r[   r$   r      s
    zArrayField._from_db_valuec                 C   sX   g }|  |}| j}|D ]4}|d kr0|d  qt|j|}||| qt|S r+   )Zvalue_from_objectr   r8   r   Zattnamevalue_to_stringrW   dumps)r   r1   valuesrY   r   rU   r#   r#   r$   r]      s    
zArrayField.value_to_stringc                    s   t  |}|r|S d|krRzt|}W n tk
r<   Y nX |d7 }t|| jS z&|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endr!   r#   r$   ra      s"    zArrayField.get_transformc                    s   t  || t|D ]^\}}z| j|| W q tjk
rr } z"t|| jd dd|d idW 5 d }~X Y qX qt| jt	rt
dd |D dkrtj| jd ddd S )	Nr   nthr   prefixcodeparamsc                 S   s   h | ]}t |qS r#   )lenrK   r#   r#   r$   	<setcomp>   s     z&ArrayField.validate.<locals>.<setcomp>r   )rm   )r   validate	enumerater   r   ValidationErrorr   error_messagesr,   r   ro   )r   r0   Zmodel_instancerg   partr5   r!   r#   r$   rq      s"    
zArrayField.validatec                    sv   t  | t|D ]\\}}z| j| W q tjk
rn } z"t|| jd dd|d idW 5 d }~X Y qX qd S )Nr   rj   r   rk   )r   run_validatorsrr   r   r   rs   r   rt   )r   r0   rg   ru   r5   r!   r#   r$   rv      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$   rx      s    zArrayField.formfield)N)F)r)   
__module____qualname__Zempty_strings_allowedr`   Zdefault_error_messagesZ_default_hintr   propertyr%   setterclassmethodr.   r7   r=   r?   rB   rE   rH   rJ   rO   rT   r   r]   ra   rq   rv   rx   __classcell__r#   r#   r!   r$   r      s8   



c                       s(   e Zd Z fddZ fddZ  ZS )ArrayRHSMixinc                    sh   t |ttfrVg }|D ].}t|ds:|j}t|j|}|| q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_valuer8   r   r   r   )r   lhsrhsZexpressionsr0   fieldr!   r#   r$   r      s    
zArrayRHSMixin.__init__c                    s0   t  ||\}}| jj|}d||f |fS )Nz%s::%s)r   process_rhsr   r   rE   )r   rG   rD   r   Z
rhs_paramsZ	cast_typer!   r#   r$   r      s    zArrayRHSMixin.process_rhs)r)   ry   rz   r   r   r~   r#   r#   r!   r$   r      s   r   c                   @   s   e Zd ZdS )ArrayContainsNr)   ry   rz   r#   r#   r#   r$   r      s   r   c                   @   s   e Zd ZdS )ArrayContainedByNr   r#   r#   r#   r$   r      s   r   c                   @   s   e Zd ZdS )
ArrayExactNr   r#   r#   r#   r$   r      s   r   c                   @   s   e Zd ZdS )ArrayOverlapNr   r#   r#   r#   r$   r      s   r   c                   @   s   e Zd ZdZe Zdd ZdS )ArrayLenTransformro   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   rG   rD   r   rn   r#   r#   r$   as_sql  s    zArrayLenTransform.as_sqlN)r)   ry   rz   lookup_namer	   r   r   r#   r#   r#   r$   r     s   r   c                       s   e Zd Z fddZ  ZS )ArrayInLookupc                    sN   t   }t|dr|S g }|D ](}t|dr:|| q |t| q |S )Nr   )r   get_prep_lookupr   r8   r-   )r   r_   Zprepared_valuesr0   r!   r#   r$   r     s    


zArrayInLookup.get_prep_lookup)r)   ry   rz   r   r~   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 r+   )r   r   rg   r   )r   rg   r   rS   r    r!   r#   r$   r   !  s    zIndexTransform.__init__c                 C   s$   | | j\}}d| || jg fS )Nz%s[%%s])r   r   rg   r   r#   r#   r$   r   &  s    zIndexTransform.as_sqlc                 C   s   | j S r+   )r   r*   r#   r#   r$   r   *  s    zIndexTransform.output_field)r)   ry   rz   r   r   r{   r   r~   r#   r#   r!   r$   r      s   r   c                   @   s   e Zd Zdd Zdd ZdS )rd   c                 C   s   || _ || _d S r+   )rg   r   )r   rg   r   r#   r#   r$   r   0  s    zIndexTransformFactory.__init__c                 O   s   t | j| jf||S r+   )r   rg   r   r   rS   r    r#   r#   r$   __call__4  s    zIndexTransformFactory.__call__Nr)   ry   rz   r   r   r#   r#   r#   r$   rd   /  s   rd   c                       s$   e Zd Z fddZdd Z  ZS )SliceTransformc                    s   t  j|| || _|| _d S r+   )r   r   rh   ri   )r   rh   ri   rS   r    r!   r#   r$   r   9  s    zSliceTransform.__init__c                 C   s(   | | j\}}d| || j| jg fS )Nz%s[%%s:%%s])r   r   rh   ri   r   r#   r#   r$   r   >  s    zSliceTransform.as_sql)r)   ry   rz   r   r   r~   r#   r#   r!   r$   r   8  s   r   c                   @   s   e Zd Zdd Zdd ZdS )rf   c                 C   s   || _ || _d S r+   )rh   ri   )r   rh   ri   r#   r#   r$   r   D  s    zSliceTransformFactory.__init__c                 O   s   t | j| jf||S r+   )r   rh   ri   r   r#   r#   r$   r   H  s    zSliceTransformFactory.__call__Nr   r#   r#   r#   r$   rf   C  s   rf   ),rW   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   r`   utilsr   r   __all__r   r   Zregister_lookupZDataContainsr   ZContainedByr   r   ZOverlapr   r   r   r   rd   r   rf   r#   r#   r#   r$   <module>   s<    F	