o
    [hV1                     @   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d0 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d1d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d.d/ Z  ZS )2r   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                    sb   || _ t| j dd | _|| _| jrg | jt| j| _t| j dr&| j| _t	 j
di | d S )Ndb_collationfrom_db_value )
base_fieldgetattrr   sizeZdefault_validatorsr   hasattr_from_db_valuer   super__init__)selfr   r   kwargs	__class__r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/contrib/postgres/fields/array.pyr!      s   zArrayField.__init__c                 C   s,   z| j d W S  ty   td| jj w )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di |}| jjr|tjd| dd |S | j }|rSddd |D }|r:|tjd| | dd dd	d |D }|rS|tjd
| | dd |S )Nz/Base field for array cannot be a related field.zpostgres.E002)objidz
    c                 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>H       

z#ArrayField.check.<locals>.<genexpr>z'Base field for array has errors:
    %szpostgres.E001c                 s   r5   r6   )r.   r   Warningr8   r4   r9   r   r   r&   r;   U   r<   z)Base field for array has warnings:
    %szpostgres.W004r   )	r    checkr   Zremote_fieldappendr   r7   joinr=   )r"   r#   errorsZbase_checkserror_messagesZwarning_messagesr$   r   r&   r>   ;   sJ   %


zArrayField.checkc                    s   t  | | j| d S r-   )r    set_attributes_from_namer   )r"   namer$   r   r&   rC   e   s   z#ArrayField.set_attributes_from_namec                 C   s   d| j j S )NzArray of %s)r   descriptionr,   r   r   r&   rE   i   s   zArrayField.descriptionc                 C      | j pd}d| j||f S N z%s[%s])r   r   db_typer"   
connectionr   r   r   r&   rI   m      
zArrayField.db_typec                 C   rF   rG   )r   r   cast_db_typerJ   r   r   r&   rM   q   rL   zArrayField.cast_db_typec                    s   t  |}| j|d< |S )NZ	collation)r    db_parametersr   )r"   rK   Z	db_paramsr$   r   r&   rN   u   s   
zArrayField.db_parametersc                 C   s   d | |S )Nz%s::{})formatrI   )r"   r2   compilerrK   r   r   r&   get_placeholderz   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r:   irK   r"   r   r&   
<listcomp>   s    z0ArrayField.get_db_prep_value.<locals>.<listcomp>)r.   r   r/   )r"   r2   rK   rR   r   rV   r&   rS   }   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"   rD   pathargsr#   r$   r   r&   rX      s   zArrayField.deconstructc                    s*   t |trt|} fdd|D }|S )Nc                    s   g | ]} j |qS r   )r   	to_python)r:   valr,   r   r&   rW      s    z(ArrayField.to_python.<locals>.<listcomp>)r.   strjsonloads)r"   r2   valsr   r,   r&   r]      s   

zArrayField.to_pythonc                    s"   |d u r|S  fdd|D S )Nc                    s   g | ]
}j | qS r   )r   r   )r:   itemrK   
expressionr"   r   r&   rW      s    z-ArrayField._from_db_value.<locals>.<listcomp>r   )r"   r2   re   rK   r   rd   r&   r      s
   zArrayField._from_db_valuec                 C   s\   g }|  |}| j}|D ]}|d u r|d  qt|j|}||| qtj|ddS )NF)ensure_ascii)Zvalue_from_objectr   r?   r   Zattnamevalue_to_stringr`   dumps)r"   r3   valuesrb   r   r^   r   r   r&   rg      s   
zArrayField.value_to_stringc                    s   t  |}|r
|S d|vr(zt|}W n	 ty   Y nw |d7 }t|| jS z|d\}}t|d }t|}W n
 tyE   Y d S w t||S )N_r   )r    get_transformint
ValueErrorIndexTransformFactoryr   splitSliceTransformFactory)r"   rD   	transformindexstartendr$   r   r&   rk      s&   
zArrayField.get_transformc                    s   t  || t|D ])\}}z	| j|| W q tjy4 } zt|| jd dd|d idd }~ww t| jt	rPt
dd |D dkrRtj| jd ddd S d S )	Nr   nthr   prefixcodeparamsc                 S   s   h | ]}t |qS r   )lenrT   r   r   r&   	<setcomp>   s    z&ArrayField.validate.<locals>.<setcomp>r   )rx   )r    validate	enumerater   r   ValidationErrorr   rB   r.   r   rz   )r"   r2   Zmodel_instancerr   parterrorr$   r   r&   r|      s*   
zArrayField.validatec                    sj   t  | t|D ](\}}z| j| W q
 tjy2 } zt|| jd dd|d idd }~ww d S )Nr   ru   r   rv   )r    run_validatorsr}   r   r   r~   r   rB   )r"   r2   rr   r   r   r$   r   r&   r      s   
zArrayField.run_validatorsc                    s&   t  jdi t| j | jd|S )N)Z
form_classr   
max_lengthr   )r    	formfieldr   r   r   )r"   r#   r$   r   r&   r      s   
zArrayField.formfieldc                 C   s$   |d u rd n|| d }t |||S )Nr   )SliceTransform)r"   re   rs   lengthrt   r   r   r&   slice_expression   s   zArrayField.slice_expressionr-   )F)r+   
__module____qualname__Zempty_strings_allowedrj   Zdefault_error_messagesZ_default_hintr!   propertyr'   setterclassmethodr0   r>   rC   rE   rI   rM   rN   rQ   rS   rX   r]   r   rg   rk   r|   r   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r2t| |r2g }|D ]}t|ds$|j}t|j	|}|
| qt|ddd}t || d S )Nresolve_expressionZ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   rM   )r"   rP   rK   r   Z
rhs_paramsZ	cast_typer$   r   r&   r     s   zArrayRHSMixin.process_rhsc                 c   s>    |D ]}t |ttfr| |E d H  q|d u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                   @      e Zd ZdS )ArrayContainsNr+   r   r   r   r   r   r&   r         r   c                   @   r   )ArrayContainedByNr   r   r   r   r&   r     r   r   c                   @   r   )
ArrayExactNr   r   r   r   r&   r     r   r   c                   @   r   )ArrayOverlapNr   r   r   r   r&   r   !  r   r   c                   @   s   e Zd ZdZe Zdd ZdS )ArrayLenTransformrz   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"   rP   rK   r   ry   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"   ri   Zprepared_valuesr2   r$   r   r&   r   6  s   


zArrayInLookup.get_prep_lookup)r+   r   r   r   r   r   r   r$   r&   r   4  s    r   c                       s0   e Zd Z fddZdd Zedd Z  ZS )IndexTransformc                    "   t  j|i | || _|| _d S r-   )r    r!   rr   r   )r"   rr   r   r\   r#   r$   r   r&   r!   F     
zIndexTransform.__init__c                 C   s:   | | j\}}|dsd| }d| g || jR fS )N]z(%s)z%s[%%s])r   r   endswithrr   r   r   r   r&   r   K  s   
zIndexTransform.as_sqlc                 C   s   | j S r-   )r   r,   r   r   r&   r   Q  s   zIndexTransform.output_field)r+   r   r   r!   r   r   r   r   r   r   r$   r&   r   E  s
    r   c                   @      e Zd Zdd Zdd ZdS )rn   c                 C      || _ || _d S r-   )rr   r   )r"   rr   r   r   r   r&   r!   W     
zIndexTransformFactory.__init__c                 O      t | j| jg|R i |S r-   )r   rr   r   r"   r\   r#   r   r   r&   __call__[     zIndexTransformFactory.__call__Nr+   r   r   r!   r   r   r   r   r&   rn   V      rn   c                       s$   e Zd Z fddZdd Z  ZS )r   c                    r   r-   )r    r!   rs   rt   )r"   rs   rt   r\   r#   r$   r   r&   r!   `  r   zSliceTransform.__init__c                 C   sX   | | j\}}| jd u rd| dg || jR fS d| dg || j| jR fS )N(z)[%s:]z)[%s:%s])r   r   rt   rs   r   r   r   r&   r   e  s   
"zSliceTransform.as_sql)r+   r   r   r!   r   r   r   r   r$   r&   r   _  s    r   c                   @   r   )rp   c                 C   r   r-   )rs   rt   )r"   rs   rt   r   r   r&   r!   o  r   zSliceTransformFactory.__init__c                 O   r   r-   )r   rs   rt   r   r   r   r&   r   s  r   zSliceTransformFactory.__call__Nr   r   r   r   r&   rp   n  r   rp   ),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   rj   utilsr   r   __all__r   r   Zregister_lookupZDataContainsr   ZContainedByr   r   ZOverlapr   r   r   r   rn   r   rp   r   r   r   r&   <module>   s>     b	