
 X&                 @   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  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# 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In)six)ugettext_lazy   )prefix_validation_error   )AttributeSetter
ArrayFieldc                   sA  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 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                s   | |  _  | |  _ |  j rM |  j d  d   |  _ |  j j t |  j   n  t |  j  d  rn |  j |  _ n  t t	 |   j
 |   d  S)Nfrom_db_value)
base_fieldsizeZdefault_validatorsappendr   hasattr_from_db_valuer   superr   __init__)selfr   r   kwargs)	__class__ R/home/ubuntu/projects/ifolica/build/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 rI | j t j d d |  d d  nZ |  j j   } | r d j d d   | D  } | j t j d | d |  d d	  n  | 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   r   checkr   Zremote_fieldr   r   Errorjoin)r   r   errorsZbase_errorsmessages)r   r    r!   r-   1   s     
zArrayField.checkc                s*   t  t |   j |  |  j j |  d  S)N)r   r   set_attributes_from_namer   )r   name)r   r    r!   r2   I   s    z#ArrayField.set_attributes_from_namec             C   s   d |  j  j S)NzArray of %s)r   description)r   r    r    r!   r4   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!   r6   Q   s    zArrayField.db_typec                s<   t  | t  s t  | t  r8    f d d   | D S| S)Nc                s+   g  |  ]! }  j  j |   d  d  q S)preparedF)r   get_db_prep_value)r*   i)r7   r   r    r!   
<listcomp>W   s   	 z0ArrayField.get_db_prep_value.<locals>.<listcomp>)
isinstancelisttuple)r   valuer7   r8   r    )r7   r   r!   r9   U   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   r3   pathargsr   )r   r    r!   r@   Z   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!   r;   h   s   	 z(ArrayField.to_python.<locals>.<listcomp>)r<   r   string_typesjsonloads)r   r?   valsr    )r   r!   rD   d   s    zArrayField.to_pythonc                s0   | d  k r | S     f d d   | D S)Nc                s+   g  |  ]! }  j  j |       q Sr    )r   r   )r*   item)r7   context
expressionr   r    r!   r;   o   s   	z-ArrayField._from_db_value.<locals>.<listcomp>r    )r   r?   rL   r7   rK   r    )r7   rK   rL   r   r!   r   k   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_stringrG   dumps)r   r'   valuesrI   r   rE   r    r    r!   rM   s   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   r3   Z	transformindexstartend)r   r    r!   rQ      s     
zArrayField.get_transformc                s   t  t |   j | |  x t |  D]z \ } } y |  j j | |  Wq& t j k
 r } z1 t | d |  j d 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)
Nprefixr   codeparamsnthc             S   s   h  |  ] } t  |   q Sr    )len)r*   r:   r    r    r!   	<setcomp>   s   	 z&ArrayField.validate.<locals>.<setcomp>r   r   )r   r   validate	enumerater   r   ValidationErrorr   error_messagesr<   r^   )r   r?   Zmodel_instancerW   partr+   )r   r    r!   r`      s    'zArrayField.validatec                s   t  t |   j |  x t |  D]w \ } } y |  j j |  Wq# t j k
 r } z1 t | d |  j d d d d i | d 6 WYd  d  } ~ Xq# Xq# Wd  S)NrZ   r   r[   r\   r]   )	r   r   run_validatorsra   r   r   rb   r   rc   )r   r?   rW   rd   r+   )r   r    r!   re      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   rA   r   r   )r   r   defaults)r   r    r!   rg      s    zArrayField.formfield)r&   
__module____qualname__Zempty_strings_allowedrP   Zdefault_error_messagesr   propertyr"   setterr-   r2   r4   r6   r9   r@   rD   r   rM   rQ   r`   re   rg   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   rm   as_sqllhsoutput_fieldr6   )r   qnr7   sqlr\   )r   r    r!   rn      s    !zArrayContains.as_sql)r&   ri   rj   rn   r    r    )r   r!   rm      s   rm   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   rs   rn   ro   rp   r6   )r   rq   r7   rr   r\   )r   r    r!   rn      s    !zArrayContainedBy.as_sql)r&   ri   rj   rn   r    r    )r   r!   rs      s   rs   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   rt   rn   ro   rp   r6   )r   rq   r7   rr   r\   )r   r    r!   rn      s    !zArrayExact.as_sql)r&   ri   rj   rn   r    r    )r   r!   rt      s   rt   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   ru   rn   ro   rp   r6   )r   rq   r7   rr   r\   )r   r    r!   rn      s    !zArrayOverlap.as_sql)r&   ri   rj   rn   r    r    )r   r!   ru      s   ru   c               @   s+   e  Z d  Z d Z e   Z d d   Z d S)ArrayLenTransformr^   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) ENDro   )compilero   )r   compilerr7   ro   r\   r    r    r!   rn      s    zArrayLenTransform.as_sqlN)r&   ri   rj   lookup_namer   rp   rn   r    r    r    r!   rv      s   	rv   c                   s"   e  Z d  Z   f d d   Z   S)ArrayInLookupc                s&   t  t |   j   } d d   | D S)Nc             S   s   g  |  ] } t  |   q Sr    )r>   )r*   r?   r    r    r!   r;      s   	 z1ArrayInLookup.get_prep_lookup.<locals>.<listcomp>)r   rz   get_prep_lookup)r   rO   )r   r    r!   r{      s    zArrayInLookup.get_prep_lookup)r&   ri   rj   r{   r    r    )r   r!   rz      s   rz   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   r|   r   rW   r   )r   rW   r   rC   r   )r   r    r!   r      s    	zIndexTransform.__init__c             C   s/   | j  |  j  \ } } d | |  j f | f S)Nz%s[%s])rw   ro   rW   )r   rx   r7   ro   r\   r    r    r!   rn      s    zIndexTransform.as_sqlc             C   s   |  j  S)N)r   )r   r    r    r!   rp      s    zIndexTransform.output_field)r&   ri   rj   r   rn   rk   rp   r    r    )r   r!   r|      s   r|   c               @   s(   e  Z d  Z d d   Z d d   Z d S)rT   c             C   s   | |  _  | |  _ d  S)N)rW   r   )r   rW   r   r    r    r!   r     s    	zIndexTransformFactory.__init__c             O   s   t  |  j |  j | |  S)N)r|   rW   r   )r   rC   r   r    r    r!   __call__  s    zIndexTransformFactory.__call__N)r&   ri   rj   r   r}   r    r    r    r!   rT     s   rT   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)SliceTransformc                s/   t  t |   j | |   | |  _ | |  _ d  S)N)r   r~   r   rX   rY   )r   rX   rY   rC   r   )r   r    r!   r     s    	zSliceTransform.__init__c             C   s5   | j  |  j  \ } } d | |  j |  j f | f S)Nz	%s[%s:%s])rw   ro   rX   rY   )r   rx   r7   ro   r\   r    r    r!   rn     s    zSliceTransform.as_sql)r&   ri   rj   r   rn   r    r    )r   r!   r~     s   r~   c               @   s(   e  Z d  Z d d   Z d d   Z d S)rV   c             C   s   | |  _  | |  _ d  S)N)rX   rY   )r   rX   rY   r    r    r!   r     s    	zSliceTransformFactory.__init__c             O   s   t  |  j |  j | |  S)N)r~   rX   rY   )r   rC   r   r    r    r!   r}   !  s    zSliceTransformFactory.__call__N)r&   ri   rj   r   r}   r    r    r    r!   rV     s   rV   )*rG   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.utilsr   Zdjango.utils.translationr   rP   utilsr   r   __all__r   Zregister_lookupZDataContainsrm   ZContainedByrs   rt   ZOverlapru   rv   rz   r|   objectrT   r~   rV   r    r    r    r!   <module>   s8   	
