
    k"g1                        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ee      Z G d d      Zej<                   G d deej>                               Z ej<                   G d deejB                               Z"ej<                   G d dee             Z#ej<                   G d deejH                               Z%ej<                   G d de             Z&ej<                   G d de             Z' G d de      Z( G d  d!      Z) G d" d#e      Z* G d$ d%      Z+y)&    N)lookups)SimpleArrayField)ArrayMaxLengthValidator)checks
exceptions)FieldFuncIntegerField	TransformValue)CheckFieldDefaultMixin)ExactIn)gettext_lazy   )prefix_validation_error   )AttributeSetter
ArrayFieldc                   $    e Zd ZdZ ed       ed      dZdZd fd	Zed        Z	e	j                  d        Z	e fd	       Z fd
Z fdZed        Zd Zd Z fdZd ZddZ fdZd Zd Zd Z fdZ fdZ fdZ fdZd Z x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[]c                 .   || _         t        | j                   dd       | _        || _        | j                  r(g | j                  t        | j                        | _        t        | j                   d      r| j                  | _        t        | (  di | y )Ndb_collationfrom_db_value )
base_fieldgetattrr   sizedefault_validatorsr   hasattr_from_db_valuer   super__init__)selfr   r    kwargs	__class__s       ]/var/www/html/djangosite/lib/python3.12/site-packages/django/contrib/postgres/fields/array.pyr%   zArrayField.__init__   s    $#DOO^TJ	99'((''		2'D# 4??O4!%!4!4D"6"    c                     	 | j                   d   S # t        $ r# t        d| j                  j                  z        w xY w)Nmodelz$'%s' object has no attribute 'model')__dict__KeyErrorAttributeErrorr(   __name__r&   s    r)   r,   zArrayField.model)   sD    	==)) 	 69P9PP 	s    ,=c                 D    || j                   d<   || j                  _        y )Nr,   )r-   r   r,   )r&   r,   s     r)   r,   zArrayField.model2   s    !&g %r*   c                 R    t        |t        t        f      xs t        |   |      S N)
isinstancer   tupler$   _choices_is_value)clsvaluer(   s     r)   r7   zArrayField._choices_is_value7   s#    %$/S573LU3SSr*   c                    t        |   di |}| j                  j                  r)|j	                  t        j                  d| d             |S | j                  j                         }|rdj                  d |D              }|r*|j	                  t        j                  d|z  | d             dj                  d |D              }|r*|j	                  t        j                  d	|z  | d
             |S )Nz/Base field for array cannot be a related field.zpostgres.E002)objidz
    c              3      K   | ]:  }t        |t        j                        r|j                  d |j                  d < ywz ()N)r5   r   Errormsgr<   .0
base_checks     r)   	<genexpr>z#ArrayField.check.<locals>.<genexpr>I   s3      /"!*fll; ",?/   A Az'Base field for array has errors:
    %szpostgres.E001c              3      K   | ]:  }t        |t        j                        r|j                  d |j                  d < ywr>   )r5   r   WarningrA   r<   rB   s     r)   rE   z#ArrayField.check.<locals>.<genexpr>V   s3      1"!*fnn= ",?1rF   z)Base field for array has warnings:
    %szpostgres.W004r   )	r$   checkr   remote_fieldappendr   r@   joinrH   )r&   r'   errorsbase_checkserror_messageswarning_messagesr(   s         r)   rI   zArrayField.check;   s    ((??''MME&L ; ////1K!) /&1/ "
 "MMFW $. $,== 1&11 $ 
 $MMH./ $.	 r*   c                 Z    t         |   |       | j                  j                  |       y r4   )r$   set_attributes_from_namer   )r&   namer(   s     r)   rR   z#ArrayField.set_attributes_from_namef   s"    (.006r*   c                 4    d| j                   j                  z  S )NzArray of %s)r   descriptionr1   s    r)   rU   zArrayField.descriptionj   s    t::::r*   c                 d    | j                   xs d}| j                  j                  |      d|dS N [])r    r   db_typer&   
connectionr    s      r)   r[   zArrayField.db_typen   s)    yyB??22:>EEr*   c                 d    | j                   xs d}| j                  j                  |      d|dS rW   )r    r   cast_db_typer\   s      r)   r_   zArrayField.cast_db_typer   s)    yyB??77
CTJJr*   c                 D    t         |   |      }| j                  |d<   |S )N	collation)r$   db_parametersr   )r&   r]   	db_paramsr(   s      r)   rb   zArrayField.db_parametersv   s(    G)*5	!%!2!2	+r*   c                 B    dj                  | j                  |            S )Nz%s::{})formatr[   )r&   r9   compilerr]   s       r)   get_placeholderzArrayField.get_placeholder{   s    t||J788r*   c                     t        |t        t        f      r,|D cg c]   }| j                  j	                  ||d      " c}S |S c c}w )NF)prepared)r5   r   r6   r   get_db_prep_value)r&   r9   r]   ri   is        r)   rj   zArrayField.get_db_prep_value~   sO    edE]+  11!Z%1P  	s   %Ac                     t         |          \  }}}}|dk(  rd}|j                  | j                  j	                         | j
                  d       ||||fS )Nz/django.contrib.postgres.fields.array.ArrayFieldz)django.contrib.postgres.fields.ArrayField)r   r    )r$   deconstructupdater   cloner    )r&   rS   pathargsr'   r(   s        r)   rm   zArrayField.deconstruct   s`    #(7#6#8 dD&DD>D"oo335			
 T4''r*   c                     t        |t              r=t        j                  |      }|D cg c]  }| j                  j                  |       }}|S c c}w r4   )r5   strjsonloadsr   	to_python)r&   r9   valsvals       r)   rv   zArrayField.to_python   sG    eS!::e$D?CDT__..s3DED Es   "Ac                 j    ||S |D cg c]  }| j                   j                  |||      ! c}S c c}w r4   )r   r   )r&   r9   
expressionr]   items        r)   r#   zArrayField._from_db_value   sA    =L 
 OO))$
JG
 	
 
s   $0c                    g }| j                  |      }| j                  }|D ]L  }||j                  d        t        |j                  |      }|j                  |j                  |             N t        j                  |      S r4   )value_from_objectr   rK   r   attnamevalue_to_stringrt   dumps)r&   r;   valuesrw   r   rx   s         r)   r   zArrayField.value_to_string   sz    %%c*__
 	?C{d#%j&8&8#>j88=>	? zz&!!r*   c                 0   t         |   |      }|r|S d|vr'	 t        |      }|dz  }t        || j                        S 	 |j                  d      \  }}t        |      dz   }t        |      }t        ||      S # t
        $ r Y Ew xY w# t
        $ r Y y w xY w)N_r   )r$   get_transformintIndexTransformFactoryr   
ValueErrorsplitSliceTransformFactory)r&   rS   	transformindexstartendr(   s         r)   r   zArrayField.get_transform   s    G)$/	d?ED	 
,UDOODD	5CJE3JNEc(C )44    		s#   A: -B	 :	BB		BBc           
         t         |   ||       t        |      D ]"  \  }}	 | j                  j                  ||       $ t        | j                  t              rJt        |D ch c]  }t        |       c}      dkD  r$t	        j
                  | j                  d   d      y y # t        j
                  $ r&}t        || j                  d   dd|dz   i      d }~ww xY wc c}w )Nr   nthr   prefixcodeparamsr   )r   )r$   validate	enumerater   r   ValidationErrorr   rO   r5   r   len)r&   r9   model_instancer   parterrorrk   r(   s          r)   r   zArrayField.validate   s    /$U+ 		KE4((~>		 dooz2E*qCF*+a/ 00''(?@0  0 3 -- -..~>'!519-	  +s   B'%C#'C :!CC c           
          t         |   |       t        |      D ]!  \  }}	 | j                  j                  |       # y # t        j
                  $ r&}t        || j                  d   dd|dz   i      d }~ww xY w)Nr   r   r   r   )r$   run_validatorsr   r   r   r   r   rO   )r&   r9   r   r   r   r(   s        r)   r   zArrayField.run_validators   s    u%$U+ 		KE4..t4		 -- -..~>'!519-	 s   AA:!A55A:c                 z    t        |   di t        | j                  j                         | j                  d|S )N)
form_classr   
max_lengthr   )r$   	formfieldr   r   r    )r&   r'   r(   s     r)   r   zArrayField.formfield   sC    w  
."oo779"ii 	
 	
r*   c                 4    |d n||z   dz
  }t        |||      S )Nr   )SliceTransform)r&   rz   r   lengthr   s        r)   slice_expressionzArrayField.slice_expression   s'     nd%&.1*<eS*55r*   r4   )F)r0   
__module____qualname__empty_strings_allowedr   default_error_messages_default_hintr%   propertyr,   setterclassmethodr7   rI   rR   rU   r[   r_   rb   rg   rj   rm   rv   r#   r   r   r   r   r   r   __classcell__r(   s   @r)   r   r      s    !GH!"#M!N #M#   \\& & T T)V7 ; ;FK
9
(
"5*&
6r*   c                   .     e Zd Z fdZ fdZd Z xZS )ArrayRHSMixinc                 J   t        |t        t        f      r|t        | j	                  |            rbg }|D ]O  }t        |d      s0|j                  }t        |j                  j                  |            }|j                  |       Q t        |ddd}t        | 5  ||       y )Nresolve_expressionARRAYz%(function)s[%(expressions)s])functiontemplate)r5   r6   r   any_rhs_not_none_valuesr"   output_fieldr   r   get_prep_valuerK   r	   r$   r%   )r&   lhsrhsexpressionsr9   fieldr(   s         r)   r%   zArrayRHSMixin.__init__   s     cE4=)c$2K2KC2P.QK *u&:;,,E!%"2"2"A"A%"HIE""5)	*
  8C
 	c"r*   c                     t         |   ||      \  }}| j                  j                  j	                  |      }|d||fS )Nz::)r$   process_rhsr   r   r_   )r&   rf   r]   r   
rhs_params	cast_typer(   s         r)   r   zArrayRHSMixin.process_rhs  sB    '-h
CZHH))66zB		*J66r*   c              #      K   |D ]9  }t        |t        t        f      r| j                  |      E d {    3|6d ; y 7 w)NT)r5   r   r6   r   )r&   r   xs      r)   r   z"ArrayRHSMixin._rhs_not_none_values  sD      	A!dE]+44Q777
		7s   0AAAA)r0   r   r   r%   r   r   r   r   s   @r)   r   r      s    #"7
r*   r   c                       e Zd Zy)ArrayContainsNr0   r   r   r   r*   r)   r   r         r*   r   c                       e Zd Zy)ArrayContainedByNr   r   r*   r)   r   r     r   r*   r   c                       e Zd Zy)
ArrayExactNr   r   r*   r)   r   r     r   r*   r   c                       e Zd Zy)ArrayOverlapNr   r   r*   r)   r   r   "  r   r*   r   c                   $    e Zd ZdZ e       Zd Zy)ArrayLenTransformr   c                 V    |j                  | j                        \  }}dd|iz  |dz  fS )NzRCASE WHEN %(lhs)s IS NULL THEN NULL ELSE coalesce(array_length(%(lhs)s, 1), 0) ENDr   r   )compiler   r&   rf   r]   r   r   s        r)   as_sqlzArrayLenTransform.as_sql,  s>    &&txx0V8CL !1*% 	%r*   N)r0   r   r   lookup_namer
   r   r   r   r*   r)   r   r   '  s    K>L%r*   r   c                        e Zd Z fdZ xZS )ArrayInLookupc                     t         |          }t        |d      r|S g }|D ]:  }t        |d      r|j                  |       !|j                  t	        |             < |S )Nr   )r$   get_prep_lookupr"   rK   r6   )r&   r   prepared_valuesr9   r(   s       r)   r   zArrayInLookup.get_prep_lookup7  si    (*6/0M  	5Eu23&&u-&&uU|4		5
 r*   )r0   r   r   r   r   r   s   @r)   r   r   5  s     r*   r   c                   4     e Zd Z fdZd Zed        Z xZS )IndexTransformc                 @    t        |   |i | || _        || _        y r4   )r$   r%   r   r   )r&   r   r   rq   r'   r(   s        r)   r%   zIndexTransform.__init__G  s#    $)&)
$r*   c                     |j                  | j                        \  }}|j                  d      sd|z  }d|z  g || j                  fS )NrZ   z(%s)z%s[%%s])r   r   endswithr   r   s        r)   r   zIndexTransform.as_sqlL  sM    &&txx0V||C 3,C3 5& 5$** 555r*   c                     | j                   S r4   )r   r1   s    r)   r   zIndexTransform.output_fieldR  s    r*   )r0   r   r   r%   r   r   r   r   r   s   @r)   r   r   F  s!    %
6  r*   r   c                       e Zd Zd Zd Zy)r   c                      || _         || _        y r4   )r   r   )r&   r   r   s      r)   r%   zIndexTransformFactory.__init__X  s    
$r*   c                 J    t        | j                  | j                  g|i |S r4   )r   r   r   r&   rq   r'   s      r)   __call__zIndexTransformFactory.__call__\  s!    djj$//KDKFKKr*   Nr0   r   r   r%   r   r   r*   r)   r   r   W  s    %Lr*   r   c                   $     e Zd Z fdZd Z xZS )r   c                 @    t        |   |i | || _        || _        y r4   )r$   r%   r   r   )r&   r   r   rq   r'   r(   s        r)   r%   zSliceTransform.__init__a  s#    $)&)
r*   c                     |j                  | j                        \  }}| j                  d| dg || j                  fS d| dg || j                  | j                  fS )N(z)[%s:]z)[%s:%s])r   r   r   r   r   s        r)   r   zSliceTransform.as_sqlf  sr    &&txx0V88se6?$9f$9djj$999se8$&E&E

&EDHH&EEEr*   )r0   r   r   r%   r   r   r   s   @r)   r   r   `  s    
Fr*   r   c                       e Zd Zd Zd Zy)r   c                      || _         || _        y r4   )r   r   )r&   r   r   s      r)   r%   zSliceTransformFactory.__init__p  s    
r*   c                 J    t        | j                  | j                  g|i |S r4   )r   r   r   r   s      r)   r   zSliceTransformFactory.__call__t  s!    djj$((DTDVDDr*   Nr   r   r*   r)   r   r   o  s    Er*   r   ),rt   django.contrib.postgresr   django.contrib.postgres.formsr   "django.contrib.postgres.validatorsr   django.corer   r   django.db.modelsr   r	   r
   r   r   django.db.models.fields.mixinsr   django.db.models.lookupsr   r   django.utils.translationr   r   utilsr   r   __all__r   r   register_lookupDataContainsr   ContainedByr   r   Overlapr   r   r   r   r   r   r   r   r*   r)   <module>r      s\    + : F * H H A . 6 + "._6' _6D > 	M7#7#7 	 	 	}g&9&9 	 	 	 	 	 	='// 	 	 
%	 
% 
% B   Y "L LFY FE Er*   