
v^h&                 @   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 d  d l m Z m Z d  d l m Z d	 d
 l m Z d d l m Z d d l m Z d g Z Gd d   d e e  Z Gd d   d  Z e j Gd d   d e e j   Z e j Gd d   d e e j   Z  e j Gd d   d e e   Z! e j Gd d   d e e j"   Z# e j Gd d   d e   Z$ e j Gd d   d e   Z% Gd d   d e  Z& Gd  d!   d!  Z' Gd" d#   d# e  Z( Gd$ d%   d%  Z) d S)&    N)lookups)SimpleArrayField)ArrayMaxLengthValidator)checks
exceptions)FieldIntegerField	Transform)ExactIn)gettext_lazy   )prefix_validation_error   )CheckFieldDefaultMixin)AttributeSetter
ArrayFieldc                   s]  e  Z d  Z d Z d e d  d e d  i Z d, Z d   f d	 d
  Z e d d    Z	 e	 j
 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   S)-r   Fitem_invalidz+Item %(nth)s in the array did not validate:nested_array_mismatchz(Nested arrays must have the same length.list[]Nc                sk   | |  _  | |  _ |  j r9 |  j t |  j  f  |  _ t |  j  d  rW |  j |  _ t   j |   d  S)Nfrom_db_value)	
base_fieldsizeZdefault_validatorsr   hasattr_from_db_valuer   super__init__)selfr   r   kwargs)	__class__ F/tmp/pip-build-8lau8j11/django/django/contrib/postgres/fields/array.pyr      s    			zArrayField.__init__c             C   s>   y |  j  d SWn( t k
 r9 t d |  j j   Yn Xd  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    j |   } |  j j rC | j t j d d |  d d  nW |  j j   } | r d j d d   | D  } | j t j d | d |  d d	  | S)
Nz/Base field for array cannot be a related field.objidzpostgres.E002z
    c             s   s%   |  ] } d  | j  | j f Vq d S)z%s (%s)N)msgr)   ).0errorr!   r!   r"   	<genexpr>?   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"   r.   1   s     

zArrayField.checkc                s$   t    j |  |  j j |  d  S)N)r   set_attributes_from_namer   )r   name)r    r!   r"   r4   I   s    z#ArrayField.set_attributes_from_namec             C   s   d |  j  j S)NzArray of %s)r   description)r   r!   r!   r"   r6   M   s    zArrayField.descriptionc             C   s)   |  j  p d } d |  j j |  | f S)N z%s[%s])r   r   db_type)r   
connectionr   r!   r!   r"   r8   Q   s    zArrayField.db_typec             C   s)   |  j  p d } d |  j j |  | f S)Nr7   z%s[%s])r   r   cast_db_type)r   r9   r   r!   r!   r"   r:   U   s    zArrayField.cast_db_typec             C   s   d j  |  j |   S)Nz%s::{})formatr8   )r   valuecompilerr9   r!   r!   r"   get_placeholderY   s    zArrayField.get_placeholderc                s3   t  | t t f  r/    f d d   | D S| S)Nc                s+   g  |  ]! }  j  j |   d  d  q S)preparedF)r   get_db_prep_value)r+   i)r9   r   r!   r"   
<listcomp>^   s   	 z0ArrayField.get_db_prep_value.<locals>.<listcomp>)
isinstancer   tuple)r   r<   r9   r?   r!   )r9   r   r"   r@   \   s    zArrayField.get_db_prep_valuec                sb   t    j   \ } } } } | d k r- d } | j d |  j j   d |  j i  | | | | f S)Nz/django.contrib.postgres.fields.array.ArrayFieldz)django.contrib.postgres.fields.ArrayFieldr   r   )r   deconstructupdater   cloner   )r   r5   pathargsr   )r    r!   r"   rE   a   s    zArrayField.deconstructc                s;   t  | t  r7 t j |  }   f d d   | D } | S)Nc                s"   g  |  ] }   j  j |   q Sr!   )r   	to_python)r+   val)r   r!   r"   rB   o   s   	 z(ArrayField.to_python.<locals>.<listcomp>)rC   strjsonloads)r   r<   valsr!   )r   r"   rJ   k   s    zArrayField.to_pythonc                s-   | d  k r | S    f d d   | D S)Nc                s(   g  |  ] }  j  j |      q Sr!   )r   r   )r+   item)r9   
expressionr   r!   r"   rB   v   s   	z-ArrayField._from_db_value.<locals>.<listcomp>r!   )r   r<   rQ   r9   r!   )r9   rQ   r   r"   r   r   s    zArrayField._from_db_valuec             C   s   g  } |  j  |  } |  j } xR | D]J } | d  k rG | j d   q% t | j |  } | j | j |   q% Wt j |  S)N)Zvalue_from_objectr   r/   r   Zattnamevalue_to_stringrM   dumps)r   r(   valuesrO   r   rK   r!   r!   r"   rR   z   s    	zArrayField.value_to_stringc                s   t    j |  } | r | Sd | k rg y t |  } Wn t k
 rL Yn X| d 7} t | |  j  Sy5 | j d  \ } } t |  d } t |  } Wn t k
 r Yn Xt | |  Sd  S)N_r   )r   get_transformint
ValueErrorIndexTransformFactoryr   splitSliceTransformFactory)r   r5   Z	transformindexstartend)r    r!   r"   rV      s"    
zArrayField.get_transformc                s   t    j | |  x t |  D]} \ } } y |  j j | |  Wq  t j k
 r } z4 t | d |  j d d d d d | d i  WYd  d  } ~ Xq  Xq  Wt |  j t	  r t
 d d   | D  d k r t j |  j d	 d d	  d  S)
Nprefixr   codeparamsnthr   c             S   s   h  |  ] } t  |   q Sr!   )len)r+   rA   r!   r!   r"   	<setcomp>   s   	 z&ArrayField.validate.<locals>.<setcomp>r   )r   validate	enumerater   r   ValidationErrorr   error_messagesrC   r   rc   )r   r<   Zmodel_instancer\   partr,   )r    r!   r"   re      s    *zArrayField.validatec                s   t    j |  x t |  D]z \ } } y |  j j |  Wq t j k
 r } z4 t | d |  j d d d d d | d i  WYd  d  } ~ Xq Xq Wd  S)Nr_   r   r`   ra   rb   r   )r   run_validatorsrf   r   r   rg   r   rh   )r   r<   r\   ri   r,   )r    r!   r"   rj      s    zArrayField.run_validatorsc                s4   t    j d t d |  j j   d |  j i |    S)NZ
form_classr   
max_length)r   	formfieldr   r   r   )r   r   )r    r!   r"   rl      s
    	zArrayField.formfield)zlistr   )r'   
__module____qualname__Zempty_strings_allowedrU   Zdefault_error_messagesZ_default_hintr   propertyr#   setterr.   r4   r6   r8   r:   r>   r@   rE   rJ   r   rR   rV   re   rj   rl   r!   r!   )r    r"   r      s,   
c                   s"   e  Z d  Z   f d d   Z   S)ArrayCastRHSMixinc                sD   t    j | |  \ } } |  j j j |  } d | | f | f S)Nz%s::%s)r   process_rhslhsoutput_fieldr:   )r   r=   r9   rhsZ
rhs_paramsZ	cast_type)r    r!   r"   rr      s    zArrayCastRHSMixin.process_rhs)r'   rm   rn   rr   r!   r!   )r    r"   rq      s   rq   c               @   s   e  Z d  Z d S)ArrayContainsN)r'   rm   rn   r!   r!   r!   r"   rv      s   rv   c               @   s   e  Z d  Z d S)ArrayContainedByN)r'   rm   rn   r!   r!   r!   r"   rw      s   rw   c               @   s   e  Z d  Z d S)
ArrayExactN)r'   rm   rn   r!   r!   r!   r"   rx      s   rx   c               @   s   e  Z d  Z d S)ArrayOverlapN)r'   rm   rn   r!   r!   r!   r"   ry      s   ry   c               @   s+   e  Z d  Z d Z e   Z d d   Z d S)ArrayLenTransformrc   c             C   s,   | j  |  j  \ } } d d | i | f S)NzRCASE WHEN %(lhs)s IS NULL THEN NULL ELSE coalesce(array_length(%(lhs)s, 1), 0) ENDrs   )compilers   )r   r=   r9   rs   ra   r!   r!   r"   as_sql   s    zArrayLenTransform.as_sqlN)r'   rm   rn   lookup_namer   rt   r|   r!   r!   r!   r"   rz      s   	rz   c                   s"   e  Z d  Z   f d d   Z   S)ArrayInLookupc                so   t    j   } t | d  r" | Sg  } x@ | D]8 } t | d  rT | j |  q/ | j t |   q/ W| S)NZresolve_expression)r   get_prep_lookupr   r/   rD   )r   rT   Zprepared_valuesr<   )r    r!   r"   r      s    zArrayInLookup.get_prep_lookup)r'   rm   rn   r   r!   r!   )r    r"   r~      s   r~   c                   s@   e  Z d  Z   f d d   Z d d   Z e d d    Z   S)IndexTransformc                s)   t    j | |   | |  _ | |  _ d  S)N)r   r   r\   r   )r   r\   r   rI   r   )r    r!   r"   r     s    	zIndexTransform.__init__c             C   s0   | j  |  j  \ } } d | | |  j g f S)Nz%s[%%s])r{   rs   r\   )r   r=   r9   rs   ra   r!   r!   r"   r|     s    zIndexTransform.as_sqlc             C   s   |  j  S)N)r   )r   r!   r!   r"   rt   
  s    zIndexTransform.output_field)r'   rm   rn   r   r|   ro   rt   r!   r!   )r    r"   r      s   r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)rY   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 | |  S)N)r   r\   r   )r   rI   r   r!   r!   r"   __call__  s    zIndexTransformFactory.__call__N)r'   rm   rn   r   r   r!   r!   r!   r"   rY     s   rY   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)SliceTransformc                s)   t    j | |   | |  _ | |  _ d  S)N)r   r   r]   r^   )r   r]   r^   rI   r   )r    r!   r"   r     s    	zSliceTransform.__init__c             C   s6   | j  |  j  \ } } d | | |  j |  j g f S)Nz%s[%%s:%%s])r{   rs   r]   r^   )r   r=   r9   rs   ra   r!   r!   r"   r|      s    zSliceTransform.as_sql)r'   rm   rn   r   r|   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SliceTransformFactory.__init__c             O   s   t  |  j |  j | |  S)N)r   r]   r^   )r   rI   r   r!   r!   r"   r   +  s    zSliceTransformFactory.__call__N)r'   rm   rn   r   r   r!   r!   r!   r"   r[   %  s   r[   )*rM   Zdjango.contrib.postgresr   Zdjango.contrib.postgres.formsr   Z"django.contrib.postgres.validatorsr   Zdjango.corer   r   Zdjango.db.modelsr   r   r	   Zdjango.db.models.lookupsr
   r   Zdjango.utils.translationr   rU   utilsr   Zmixinsr   r   __all__r   rq   Zregister_lookupZDataContainsrv   ZContainedByrw   rx   ZOverlapry   rz   r~   r   rY   r   r[   r!   r!   r!   r"   <module>   s:   	
