U
    e0                     @   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 f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 )0r   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                    s\   || _ t| j dd | _|| _| jr6| jt| jf| _t| j drJ| j| _t	 j
f | d S )Ndb_collationfrom_db_value)
base_fieldgetattrr   sizeZdefault_validatorsr   hasattr_from_db_valuer   super__init__)selfr   r   kwargs	__class__ H/tmp/pip-unpacked-wheel-lctamlir/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'   2   s    
c                    s   t |ttfpt |S N)
isinstancer   tupler   _choices_is_value)clsvaluer#   r%   r&   r0   7   s    zArrayField._choices_is_valuec                    s   t  jf |}| jjr.|tjd| dd nr| j }|rddd |D }|rn|tjd| | dd dd	d |D }|r|tjd
| | dd |S )Nz/Base field for array cannot be a related field.zpostgres.E002)objidz
    c                 s   s*   | ]"}t |tjrd |j|jf V  qdS z%s (%s)N)r.   r   Errormsgr4   .0Z
base_checkr%   r%   r&   	<genexpr>I   s   z#ArrayField.check.<locals>.<genexpr>z'Base field for array has errors:
    %szpostgres.E001c                 s   s*   | ]"}t |tjrd |j|jf V  qdS r5   )r.   r   Warningr7   r4   r8   r%   r%   r&   r:   V   s   z)Base field for array has warnings:
    %szpostgres.W004)	r   checkr   Zremote_fieldappendr   r6   joinr;   )r!   r"   errorsZbase_checkserror_messagesZwarning_messagesr#   r%   r&   r<   ;   sH    	


zArrayField.checkc                    s   t  | | j| d S r-   )r   set_attributes_from_namer   )r!   namer#   r%   r&   rA   f   s    z#ArrayField.set_attributes_from_namec                 C   s   d| j j S )NzArray of %s)r   descriptionr,   r%   r%   r&   rC   j   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&   rF   n   s    
zArrayField.db_typec                 C   s   | j pd}d| j||f S rD   )r   r   cast_db_typerG   r%   r%   r&   rI   r   s    
zArrayField.cast_db_typec                    s   t  |}| j|d< |S )NZ	collation)r   db_parametersr   )r!   rH   Z	db_paramsr#   r%   r&   rJ   v   s    
zArrayField.db_parametersc                 C   s   d | |S )Nz%s::{})formatrF   )r!   r2   compilerrH   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r9   irH   r!   r%   r&   
<listcomp>   s   z0ArrayField.get_db_prep_value.<locals>.<listcomp>)r.   r   r/   )r!   r2   rH   rN   r%   rR   r&   rO   ~   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!   rB   pathargsr"   r#   r%   r&   rT      s    zArrayField.deconstructc                    s*   t |tr&t|} fdd|D }|S )Nc                    s   g | ]} j |qS r%   )r   	to_python)r9   valr,   r%   r&   rS      s     z(ArrayField.to_python.<locals>.<listcomp>)r.   strjsonloads)r!   r2   valsr%   r,   r&   rY      s    

zArrayField.to_pythonc                    s"   |d kr|S  fdd|D S )Nc                    s   g | ]}j | qS r%   )r   r   )r9   itemrH   
expressionr!   r%   r&   rS      s   z-ArrayField._from_db_value.<locals>.<listcomp>r%   )r!   r2   ra   rH   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   r=   r   Zattnamevalue_to_stringr\   dumps)r!   r3   valuesr^   r   rZ   r%   r%   r&   rb      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!   rB   Z	transformindexstartendr#   r%   r&   rf      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%   )lenrP   r%   r%   r&   	<setcomp>   s     z&ArrayField.validate.<locals>.<setcomp>r   )rr   )r   validate	enumerater   r   ValidationErrorr   r@   r.   r   rt   )r!   r2   Zmodel_instancerl   parterrorr#   r%   r&   rv      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   ro   r   rp   )r   run_validatorsrw   r   r   rx   r   r@   )r!   r2   rl   ry   rz   r#   r%   r&   r{      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&   r}      s    zArrayField.formfield)N)F)r+   
__module____qualname__Zempty_strings_allowedre   Zdefault_error_messagesZ_default_hintr    propertyr'   setterclassmethodr0   r<   rA   rC   rF   rI   rJ   rM   rO   rT   rY   r   rb   rf   rv   r{   r}   __classcell__r%   r%   r#   r&   r      s:   

+

c                       s0   e Zd Z fddZ fddZdd Z  ZS )ArrayRHSMixinc                    sv   t |ttfrdt| |rdg }|D ].}t|dsH|j}t|j	|}|
| q$t|ddd}t || d S )Nresolve_expressionARRAYz%(function)s[%(expressions)s])functiontemplate)r.   r/   r   any_rhs_not_none_valuesr   output_fieldr   r   Zget_prep_valuer=   r   r   r    )r!   lhsrhsZexpressionsr2   fieldr#   r%   r&   r       s    
zArrayRHSMixin.__init__c                    s0   t  ||\}}| jj|}d||f |fS )Nz%s::%s)r   process_rhsr   r   rI   )r!   rL   rH   r   Z
rhs_paramsZ	cast_typer#   r%   r&   r      s    zArrayRHSMixin.process_rhsc                 c   s<   |D ]2}t |ttfr(| |E d H  q|d k	rdV  qd S )NT)r.   r   r/   r   )r!   r   xr%   r%   r&   r     s
    z"ArrayRHSMixin._rhs_not_none_values)r+   r~   r   r    r   r   r   r%   r%   r#   r&   r      s   r   c                   @   s   e Zd ZdS )ArrayContainsNr+   r~   r   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 )ArrayLenTransformrt   c                 C   s$   | | j\}}dd|i |d fS )NzRCASE WHEN %(lhs)s IS NULL THEN NULL ELSE coalesce(array_length(%(lhs)s, 1), 0) ENDr   r   )compiler   r!   rL   rH   r   rs   r%   r%   r&   as_sql&  s    zArrayLenTransform.as_sqlN)r+   r~   r   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   r=   r/   )r!   rd   Zprepared_valuesr2   r#   r%   r&   r   1  s    


zArrayInLookup.get_prep_lookup)r+   r~   r   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    rl   r   )r!   rl   r   rX   r"   r#   r%   r&   r    A  s    zIndexTransform.__init__c                 C   s6   | | j\}}|ds"d| }d| || jffS )N](%s)z%s[%%s])r   r   endswithrl   r   r%   r%   r&   r   F  s    
zIndexTransform.as_sqlc                 C   s   | j S r-   )r   r,   r%   r%   r&   r   L  s    zIndexTransform.output_field)r+   r~   r   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 )ri   c                 C   s   || _ || _d S r-   )rl   r   )r!   rl   r   r%   r%   r&   r    R  s    zIndexTransformFactory.__init__c                 O   s   t | j| jf||S r-   )r   rl   r   r!   rX   r"   r%   r%   r&   __call__V  s    zIndexTransformFactory.__call__Nr+   r~   r   r    r   r%   r%   r%   r&   ri   Q  s   ri   c                       s$   e Zd Z fddZdd Z  ZS )SliceTransformc                    s   t  j|| || _|| _d S r-   )r   r    rm   rn   )r!   rm   rn   rX   r"   r#   r%   r&   r    [  s    zSliceTransform.__init__c                 C   s:   | | j\}}|ds"d| }d| || j| jffS )Nr   r   z%s[%%s:%%s])r   r   r   rm   rn   r   r%   r%   r&   r   `  s    
zSliceTransform.as_sql)r+   r~   r   r    r   r   r%   r%   r#   r&   r   Z  s   r   c                   @   s   e Zd Zdd Zdd ZdS )rk   c                 C   s   || _ || _d S r-   )rm   rn   )r!   rm   rn   r%   r%   r&   r    h  s    zSliceTransformFactory.__init__c                 O   s   t | j| jf||S r-   )r   rm   rn   r   r%   r%   r&   r   l  s    zSliceTransformFactory.__call__Nr   r%   r%   r%   r&   rk   g  s   rk   ),r\   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   re   utilsr   r   __all__r   r   Zregister_lookupZDataContainsr   ZContainedByr   r   ZOverlapr   r   r   r   ri   r   rk   r%   r%   r%   r&   <module>   s<    ]	