

_Vz#                 @   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 d  d l m Z d  d	 l m Z m Z d
 d l m Z d g Z Gd d   d e  Z e j Gd d   d e j   Z e j Gd d   d e j   Z e j Gd d   d e   Z e j Gd d   d e j    Z! e j Gd d   d e   Z" Gd d   d e  Z# Gd d   d e$  Z% Gd d   d e  Z& Gd d   d e$  Z' d S)     N)lookups)SimpleArrayField)ArrayMaxLengthValidator)checks
exceptions)FieldIntegerField	Transform)Exact)six)string_concatugettext_lazy   )AttributeSetter
ArrayFieldc                   s5  e  Z d  Z d Z i e d  d 6e d  d 6Z 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 d  Z   f 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   Fz,Item %(nth)s in the array did not validate: item_invalidz(Nested arrays must have the same length.nested_array_mismatchNc                sg   | |  _  | |  _ |  j rM |  j d  d   |  _ |  j j t |  j   n  t t |   j |   d  S)N)
base_fieldsizeZdefault_validatorsappendr   superr   __init__)selfr   r   kwargs)	__class__ F/tmp/pip-build-ghmbqnp_/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  t |   j |   } |  j j rO | j t j d d d  d |  d d  n` |  j j   } | r d j d d   | D  } | j t j d	 | d d  d |  d d
  n  | S)Nz/Base field for array cannot be a related field.Zhint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   r   checkr   Zremote_fieldr   r   Errorjoin)r   r   errorsZbase_errorsmessages)r   r   r   r(   ,   s$    
zArrayField.checkc                s*   t  t |   j |  |  j j |  d  S)N)r   r   set_attributes_from_namer   )r   name)r   r   r   r-   F   s    z#ArrayField.set_attributes_from_namec             C   s   d |  j  j S)NzArray of %s)r   description)r   r   r   r   r/   J   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   r1   N   s    zArrayField.db_typec                s?   t  | t  s t  | t  r;     f d d   | D S| S)Nc                s(   g  |  ] }  j  j |      q Sr   )r   get_db_prep_value)r%   i)r2   preparedr   r   r   
<listcomp>T   s   	 z0ArrayField.get_db_prep_value.<locals>.<listcomp>)
isinstancelisttuple)r   valuer2   r5   r   )r2   r5   r   r   r3   R   s    zArrayField.get_db_prep_valuec                sg   t  t |   j   \ } } } } | d k r6 d } n  | j i |  j d 6|  j d 6 | | | | f S)Nz/django.contrib.postgres.fields.array.ArrayFieldz)django.contrib.postgres.fields.ArrayFieldr   r   )r   r   deconstructupdater   r   )r   r.   pathargsr   )r   r   r   r;   W   s    !		
zArrayField.deconstructc                sA   t  | t j  r= t j |  }   f d d   | D } n  | S)Nc                s"   g  |  ] }   j  j |   q Sr   )r   	to_python)r%   val)r   r   r   r6   e   s   	 z(ArrayField.to_python.<locals>.<listcomp>)r7   r   string_typesjsonloads)r   r:   valsr   )r   r   r?   a   s    zArrayField.to_pythonc             C   sd   g  } |  j  |  } |  j } x6 | D]. } t | j |  } | j | j |   q% Wt j |  S)N)Zvalue_from_objectr   r   Zattnamer   value_to_stringrB   dumps)r   r"   valuesrD   r   r@   r   r   r   rE   h   s    	zArrayField.value_to_stringc                s   t  t |   j |  } | r" | Sy t |  } Wn t k
 rF Yn X| d 7} t | |  j  Sy5 | j d  \ } } t |  d } t |  } Wn t k
 r Yn Xt | |  Sd  S)Nr   _)	r   r   get_transformint
ValueErrorIndexTransformFactoryr   splitSliceTransformFactory)r   r.   Z	transformindexstartend)r   r   r   rI   r   s     
zArrayField.get_transformc                s  t  t |   j | |  x t |  D] \ } } y |  j j | |  Wq& t j k
 r } z: t j t |  j d | j	  d d d i | d 6 WYd  d  } ~ Xq& Xq& Wt
 |  j t  r t d d   | D  d k r t j |  j d d d  q n  d  S)	Nr   codeparamsnthc             S   s   h  |  ] } t  |   q Sr   )len)r%   r4   r   r   r   	<setcomp>   s   	 z&ArrayField.validate.<locals>.<setcomp>r   r   )r   r   validate	enumerater   r   ValidationErrorr   error_messagesmessager7   rU   )r   r:   Zmodel_instancer4   parte)r   r   r   rW      s    'zArrayField.validatec                s   t  t |   j |  x t |  D] \ } } y |  j j |  Wq# t j k
 r } zC t j t |  j d d j	 | j
   d d d i | d 6 WYd  d  } ~ Xq# Xq# Wd  S)Nr    rR   rS   rT   )r   r   run_validatorsrX   r   r   rY   r   rZ   r*   r,   )r   r:   r4   r\   r]   )r   r   r   r_      s    "zArrayField.run_validatorsc                sJ   i t  d 6|  j j   d 6|  j d 6} | j |  t t |   j |   S)NZ
form_classr   
max_length)r   r   	formfieldr   r<   r   r   )r   r   defaults)r   r   r   ra      s    zArrayField.formfield)r!   
__module____qualname__Zempty_strings_allowedrH   Zdefault_error_messagesr   propertyr   setterr(   r-   r/   r1   r3   r;   r?   rE   rI   rW   r_   ra   r   r   )r   r   r      s&   

c                   s"   e  Z d  Z   f d d   Z   S)ArrayContainsc                sJ   t  t |   j | |  \ } } d | |  j j j |  f } | | f S)Nz%s::%s)r   rg   as_sqllhsoutput_fieldr1   )r   qnr2   sqlrS   )r   r   r   rh      s    !zArrayContains.as_sql)r!   rc   rd   rh   r   r   )r   r   rg      s   rg   c                   s"   e  Z d  Z   f d d   Z   S)ArrayContainedByc                sJ   t  t |   j | |  \ } } d | |  j j j |  f } | | f S)Nz%s::%s)r   rm   rh   ri   rj   r1   )r   rk   r2   rl   rS   )r   r   r   rh      s    !zArrayContainedBy.as_sql)r!   rc   rd   rh   r   r   )r   r   rm      s   rm   c                   s"   e  Z d  Z   f d d   Z   S)
ArrayExactc                sJ   t  t |   j | |  \ } } d | |  j j j |  f } | | f S)Nz%s::%s)r   rn   rh   ri   rj   r1   )r   rk   r2   rl   rS   )r   r   r   rh      s    !zArrayExact.as_sql)r!   rc   rd   rh   r   r   )r   r   rn      s   rn   c                   s"   e  Z d  Z   f d d   Z   S)ArrayOverlapc                sJ   t  t |   j | |  \ } } d | |  j j j |  f } | | f S)Nz%s::%s)r   ro   rh   ri   rj   r1   )r   rk   r2   rl   rS   )r   r   r   rh      s    !zArrayOverlap.as_sql)r!   rc   rd   rh   r   r   )r   r   ro      s   ro   c               @   s+   e  Z d  Z d Z e   Z d d   Z d S)ArrayLenTransformrU   c             C   s-   | j  |  j  \ } } d i | d 6| f S)NzRCASE WHEN %(lhs)s IS NULL THEN NULL ELSE coalesce(array_length(%(lhs)s, 1), 0) ENDri   )compileri   )r   compilerr2   ri   rS   r   r   r   rh      s    zArrayLenTransform.as_sqlN)r!   rc   rd   lookup_namer   rj   rh   r   r   r   r   rp      s   	rp   c                   s@   e  Z d  Z   f d d   Z d d   Z e d d    Z   S)IndexTransformc                s/   t  t |   j | |   | |  _ | |  _ d  S)N)r   rt   r   rO   r   )r   rO   r   r>   r   )r   r   r   r      s    	zIndexTransform.__init__c             C   s/   | j  |  j  \ } } d | |  j f | f S)Nz%s[%s])rq   ri   rO   )r   rr   r2   ri   rS   r   r   r   rh      s    zIndexTransform.as_sqlc             C   s   |  j  S)N)r   )r   r   r   r   rj      s    zIndexTransform.output_field)r!   rc   rd   r   rh   re   rj   r   r   )r   r   rt      s   rt   c               @   s(   e  Z d  Z d d   Z d d   Z d S)rL   c             C   s   | |  _  | |  _ d  S)N)rO   r   )r   rO   r   r   r   r   r      s    	zIndexTransformFactory.__init__c             O   s   t  |  j |  j | |  S)N)rt   rO   r   )r   r>   r   r   r   r   __call__   s    zIndexTransformFactory.__call__N)r!   rc   rd   r   ru   r   r   r   r   rL      s   rL   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)SliceTransformc                s/   t  t |   j | |   | |  _ | |  _ d  S)N)r   rv   r   rP   rQ   )r   rP   rQ   r>   r   )r   r   r   r      s    	zSliceTransform.__init__c             C   s5   | j  |  j  \ } } d | |  j |  j f | f S)Nz	%s[%s:%s])rq   ri   rP   rQ   )r   rr   r2   ri   rS   r   r   r   rh      s    zSliceTransform.as_sql)r!   rc   rd   r   rh   r   r   )r   r   rv      s   rv   c               @   s(   e  Z d  Z d d   Z d d   Z d S)rN   c             C   s   | |  _  | |  _ d  S)N)rP   rQ   )r   rP   rQ   r   r   r   r     s    	zSliceTransformFactory.__init__c             O   s   t  |  j |  j | |  S)N)rv   rP   rQ   )r   r>   r   r   r   r   ru     s    zSliceTransformFactory.__call__N)r!   rc   rd   r   ru   r   r   r   r   rN     s   rN   )(rB   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
   Zdjango.utilsr   Zdjango.utils.translationr   r   rH   utilsr   __all__r   Zregister_lookupZDataContainsrg   ZContainedByrm   rn   ZOverlapro   rp   rt   objectrL   rv   rN   r   r   r   r   <module>   s2   	
