a
    Kcòf0  ã                   @   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d.‡ 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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‡  ZS )0r   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r8g | j¢t| jƒ‘| _t| j dƒrL| j| _t	ƒ j
f 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__© úa/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/contrib/postgres/fields/array.pyr       s    ÿþzArrayField.__init__c                 C   s4   z| j d W S  ty.   td| jj ƒ‚Y n0 d 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'   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f i |¤Ž}| jjr2| tjd| dd�¡ nr| j ¡ }|r¤d dd„ |D ƒ¡}|rr| tjd| | dd�¡ d d	d„ |D ƒ¡}|r¤| tjd
| | dd�¡ |S )Nz/Base field for array cannot be a related field.zpostgres.E002)ÚobjÚidz
    c                 s   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>I   s   þz#ArrayField.check.<locals>.<genexpr>z'Base field for array has errors:
    %szpostgres.E001c                 s   s*   | ]"}t |tjƒrd |j|jf V  qdS r5   )r.   r   ÚWarningr7   r4   r8   r%   r%   r&   r:   V   s   þz)Base field for array has warnings:
    %szpostgres.W004)	r   Úcheckr   Zremote_fieldÚappendr   r6   Újoinr;   )r!   r"   ÚerrorsZbase_checksÚerror_messagesZwarning_messagesr#   r%   r&   r<   ;   sH    ýÿ	

þýÿ
þÿüÿzArrayField.checkc                    s   t ƒ  |¡ | j |¡ d S r-   )r   Úset_attributes_from_namer   )r!   Únamer#   r%   r&   rA   f   s    z#ArrayField.set_attributes_from_namec                 C   s   d| j j S )NzArray of %s)r   Údescriptionr,   r%   r%   r&   rC   j   s    zArrayField.descriptionc                 C   s   | j pd}d| j |¡|f S ©NÚ z%s[%s])r   r   Údb_type©r!   Ú
connectionr   r%   r%   r&   rF   n   s    
zArrayField.db_typec                 C   s   | j pd}d| j |¡|f S rD   )r   r   Úcast_db_typerG   r%   r%   r&   rI   r   s    
zArrayField.cast_db_typec                    s   t ƒ  |¡}| j|d< |S )NZ	collation)r   Údb_parametersr   )r!   rH   Z	db_paramsr#   r%   r&   rJ   v   s    
zArrayField.db_parametersc                 C   s   d  |  |¡¡S )Nz%s::{})ÚformatrF   )r!   r2   ÚcompilerrH   r%   r%   r&   Úget_placeholder{   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©r9   Úi©rH   r!   r%   r&   Ú
<listcomp>€   s   ÿz0ArrayField.get_db_prep_value.<locals>.<listcomp>)r.   r   r/   )r!   r2   rH   rN   r%   rR   r&   rO   ~   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!   rB   ÚpathÚargsr"   r#   r%   r&   rT   †   s    þÿzArrayField.deconstructc                    s*   t |tƒr&t |¡}‡ fdd„|D ƒ}|S )Nc                    s   g | ]}ˆ j  |¡‘qS r%   )r   Ú	to_python)r9   Úvalr,   r%   r&   rS   –   ó    z(ArrayField.to_python.<locals>.<listcomp>)r.   ÚstrÚjsonÚloads)r!   r2   Úvalsr%   r,   r&   rY   ’   s    

zArrayField.to_pythonc                    s"   |d u r|S ‡ ‡‡fdd„|D ƒS )Nc                    s   g | ]}ˆj  |ˆˆ ¡‘qS r%   )r   r   )r9   Úitem©rH   Ú
expressionr!   r%   r&   rS   œ   s   ÿz-ArrayField._from_db_value.<locals>.<listcomp>r%   )r!   r2   rb   rH   r%   ra   r&   r   ™   s
    þzArrayField._from_db_valuec                 C   sX   g }|   |¡}| j}|D ]4}|d u r0| d ¡ qt|j|ƒ}| | |¡¡ qt |¡S r-   )Zvalue_from_objectr   r=   r   ZattnameÚvalue_to_stringr]   Údumps)r!   r3   Úvaluesr_   r   rZ   r%   r%   r&   rc   ¡   s    
zArrayField.value_to_stringc                    s˜   t ƒ  |¡}|r|S d|vrPzt|ƒ}W n ty:   Y n0 |d7 }t|| jƒS z&| d¡\}}t|ƒd }t|ƒ}W n tyˆ   Y n0 t||ƒS d S )NÚ_r   )r   Úget_transformÚintÚ
ValueErrorÚIndexTransformFactoryr   ÚsplitÚSliceTransformFactory)r!   rB   Z	transformÚindexÚstartÚendr#   r%   r&   rg   ®   s"    zArrayField.get_transformc                    s²   t ƒ  ||¡ t|ƒD ]`\}}z| j ||¡ W q tjyt } z*t|| jd dd|d id�‚W Y d }~qd }~0 0 qt| jt	ƒr®t
dd„ |D ƒƒdkr®tj| jd dd�‚d S )	Nr   Únthr   ©ÚprefixÚcodeÚparamsc                 S   s   h | ]}t |ƒ’qS r%   )ÚlenrP   r%   r%   r&   Ú	<setcomp>Ð   r[   z&ArrayField.validate.<locals>.<setcomp>r   )rs   )r   ÚvalidateÚ	enumerater   r   ÚValidationErrorr   r@   r.   r   ru   )r!   r2   Zmodel_instancerm   ÚpartÚerrorr#   r%   r&   rw   Ã   s"    
üþzArrayField.validatec                    sx   t ƒ  |¡ t|ƒD ]^\}}z| j |¡ W q tjyp } z*t|| jd dd|d id�‚W Y d }~qd }~0 0 qd S )Nr   rp   r   rq   )r   Úrun_validatorsrx   r   r   ry   r   r@   )r!   r2   rm   rz   r{   r#   r%   r&   r|   Ö   s    
üzArrayField.run_validatorsc                    s&   t ƒ jf i t| j ¡ | jdœ|¥¤ŽS )N)Z
form_classr   Ú
max_length)r   Ú	formfieldr   r   r   )r!   r"   r#   r%   r&   r~   ã   s    
ýüÿzArrayField.formfield)N)F)r+   Ú
__module__Ú__qualname__Zempty_strings_allowedrf   Zdefault_error_messagesZ_default_hintr    Úpropertyr'   ÚsetterÚclassmethodr0   r<   rA   rC   rF   rI   rJ   rM   rO   rT   rY   r   rc   rg   rw   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ƒrdt|  |¡ƒrdg }|D ].}t|dƒsH|j}t|j 	|¡ƒ}| 
|¡ q$t|dddœŽ}tƒ  ||¡ d S )NÚresolve_expressionÚ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Œ   rI   )r!   rL   rH   rŽ   Z
rhs_paramsZ	cast_typer#   r%   r&   r�      s    zArrayRHSMixin.process_rhsc                 c   s<   |D ]2}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                   @   s   e Zd ZdS )ÚArrayContainsN©r+   r   r€   r%   r%   r%   r&   r’     s   r’   c                   @   s   e Zd ZdS )ÚArrayContainedByNr“   r%   r%   r%   r&   r”     s   r”   c                   @   s   e Zd ZdS )Ú
ArrayExactNr“   r%   r%   r%   r&   r•     s   r•   c                   @   s   e Zd ZdS )ÚArrayOverlapNr“   r%   r%   r%   r&   r–     s   r–   c                   @   s   e Zd ZdZeƒ Zdd„ ZdS )ÚArrayLenTransformru   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!   rL   rH   r�   rt   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!   re   Zprepared_valuesr2   r#   r%   r&   r�   1  s    


zArrayInLookup.get_prep_lookup)r+   r   r€   r�   r„   r%   r%   r#   r&   rœ   /  s   rœ   c                       s0   e Zd Z‡ fdd„Zdd„ Zedd„ ƒZ‡  ZS )ÚIndexTransformc                    s"   t ƒ j|i |¤Ž || _|| _d S r-   )r   r    rm   r   )r!   rm   r   rX   r"   r#   r%   r&   r    A  s    zIndexTransform.__init__c                 C   s:   |  | j¡\}}| d¡s"d| }d| g |¢| j‘R fS )Nú]ú(%s)z%s[%%s])r˜   r�   Úendswithrm   r™   r%   r%   r&   rš   F  s    
zIndexTransform.as_sqlc                 C   s   | j S r-   )r   r,   r%   r%   r&   rŒ   L  s    zIndexTransform.output_field)r+   r   r€   r    rš   r�   rŒ   r„   r%   r%   r#   r&   rž   @  s   rž   c                   @   s   e Zd Zdd„ Zdd„ ZdS )rj   c                 C   s   || _ || _d S r-   )rm   r   )r!   rm   r   r%   r%   r&   r    R  s    zIndexTransformFactory.__init__c                 O   s   t | j| jg|¢R i |¤ŽS r-   )rž   rm   r   ©r!   rX   r"   r%   r%   r&   Ú__call__V  s    zIndexTransformFactory.__call__N©r+   r   r€   r    r£   r%   r%   r%   r&   rj   Q  s   rj   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )ÚSliceTransformc                    s"   t ƒ j|i |¤Ž || _|| _d S r-   )r   r    rn   ro   )r!   rn   ro   rX   r"   r#   r%   r&   r    [  s    zSliceTransform.__init__c                 C   s@   |  | j¡\}}| d¡s"d| }d| g |¢| j‘| j‘R fS )NrŸ   r    z%s[%%s:%%s])r˜   r�   r¡   rn   ro   r™   r%   r%   r&   rš   `  s    
zSliceTransform.as_sql)r+   r   r€   r    rš   r„   r%   r%   r#   r&   r¥   Z  s   r¥   c                   @   s   e Zd Zdd„ Zdd„ ZdS )rl   c                 C   s   || _ || _d S r-   )rn   ro   )r!   rn   ro   r%   r%   r&   r    h  s    zSliceTransformFactory.__init__c                 O   s   t | j| jg|¢R i |¤ŽS r-   )r¥   rn   ro   r¢   r%   r%   r&   r£   l  s    zSliceTransformFactory.__call__Nr¤   r%   r%   r%   r&   rl   g  s   rl   ),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   rf   Úutilsr   r   Ú__all__r   r…   Zregister_lookupZDataContainsr’   ZContainedByr”   r•   ZOverlapr–   r—   rœ   rž   rj   r¥   rl   r%   r%   r%   r&   Ú<module>   s<    ]	