a
    5Xh                      @   s   d dl Z d dl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 G d	d
 d
ejZG dd dejZG dd dejZdS )    N)chain)forms)ArrayMaxLengthValidatorArrayMinLengthValidator)ValidationError)gettext_lazy   )prefix_validation_errorc                       sr   e Zd ZdediZdddd f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  ZS )SimpleArrayFielditem_invalid+Item %(nth)s in the array did not validate:,N)	delimiter
max_length
min_lengthc                   sf   || _ || _t jf i | |d ur@|| _| jtt| |d urb|| _	| jt
t| d S N)
base_fieldr   super__init__r   Z
validatorsappendr   intr   r   )selfr   r   r   r   kwargs	__class__ h/var/www/viveiro_mudafortebrasil/venv/lib/python3.9/site-packages/django/contrib/postgres/forms/array.pyr      s    zSimpleArrayField.__init__c                    s   t  |} fdd|D S )Nc                    s   g | ]} j |qS r   )r   clean).0valr   r   r   
<listcomp>#       z*SimpleArrayField.clean.<locals>.<listcomp>)r   r   r   valuer   r    r   r   !   s    zSimpleArrayField.cleanc                    s(   t |tr$ j fdd|D S |S )Nc                 3   s   | ]}t  j|V  qd S r   )strr   prepare_value)r   vr    r   r   	<genexpr>'   s   z1SimpleArrayField.prepare_value.<locals>.<genexpr>)
isinstancelistr   joinr#   r   r    r   r&   %   s
    
zSimpleArrayField.prepare_valuec                 C   s   t |tr|}n|r"|| j}ng }g }g }t|D ]h\}}z|| j| W q6 ty } z0|t	|| j
d dd|d id W Y d }~q6d }~0 0 q6|rt||S Nr   nth   )prefixcodeparams)r)   r*   splitr   	enumerater   r   	to_pythonr   r	   error_messages)r   r$   itemserrorsvaluesindexitemerrorr   r   r   r4   ,   s,    

zSimpleArrayField.to_pythonc                    s   t  | g }t|D ]b\}}z| j| W q tyx } z0|t|| jd dd|d id W Y d }~qd }~0 0 q|rt|d S r,   )r   validater3   r   r   r   r	   r5   r   r$   r7   r9   r:   r;   r   r   r   r<   E   s     
zSimpleArrayField.validatec                    s   t  | g }t|D ]b\}}z| j| W q tyx } z0|t|| jd dd|d id W Y d }~qd }~0 0 q|rt|d S r,   )r   run_validatorsr3   r   r   r   r	   r5   r=   r   r   r   r>   W   s     
zSimpleArrayField.run_validatorsc                    sH   z|  |}W n ty    Y n0 || jv r:|| jv r:dS t ||S NF)r4   r   empty_valuesr   has_changed)r   initialdatar$   r   r   r   rA   i   s    zSimpleArrayField.has_changed)__name__
__module____qualname___default_error_messagesr   r   r&   r4   r<   r>   rA   __classcell__r   r   r   r   r
      s   r
   c                       sv   e Zd ZdZ fddZedd Zdd Zdd	 Zd
d Z	d fdd	Z
edd Z fddZedd Z  ZS )SplitArrayWidgetz!postgres/widgets/split_array.htmlc                    s2   t |tr| n|| _|| _t jf i | d S r   )r)   typewidgetsizer   r   )r   rL   rM   r   r   r   r   r   w   s    zSplitArrayWidget.__init__c                 C   s   | j jS r   )rL   	is_hiddenr    r   r   r   rN   |   s    zSplitArrayWidget.is_hiddenc                    s    fddt jD S )Nc              	      s$   g | ]}j  d |f qS )%s_%s)rL   value_from_datadictr   r9   rC   filesnamer   r   r   r!      s   z8SplitArrayWidget.value_from_datadict.<locals>.<listcomp>)rangerM   r   rC   rS   rT   r   rR   r   rP      s    z$SplitArrayWidget.value_from_datadictc                    s"   t  fddtjD S )Nc                 3   s&   | ]}j  d |f V  qdS )rO   N)rL   value_omitted_from_datarQ   rR   r   r   r(      s   z;SplitArrayWidget.value_omitted_from_data.<locals>.<genexpr>)allrU   rM   rV   r   rR   r   rW      s    z(SplitArrayWidget.value_omitted_from_datac                 C   s   |r|d7 }|S )NZ_0r   )r   id_r   r   r   id_for_label   s    zSplitArrayWidget.id_for_labelNc           	   	      s   |d u ri n|}t  |||}| jr0| j| j_|p6g }g |d d< | |}|d}ttt|| j	D ]n}z|| }W n t
y   d }Y n0 |ri |dd||f i}|d d | j|d|  ||d  ql|S )NrL   Z
subwidgetsidrO   z_%s)r   get_contextZis_localizedrL   Zbuild_attrsgetrU   maxlenrM   
IndexErrorr   )	r   rT   r$   attrscontextZfinal_attrsrY   iZwidget_valuer   r   r   r\      s*    



zSplitArrayWidget.get_contextc                 C   s   | j jS r   )rL   mediar    r   r   r   rd      s    zSplitArrayWidget.mediac                    s   t  |}t| j|_|S r   )r   __deepcopy__copydeepcopyrL   )r   memoobjr   r   r   re      s    zSplitArrayWidget.__deepcopy__c                 C   s   | j jS r   )rL   needs_multipart_formr    r   r   r   rj      s    z%SplitArrayWidget.needs_multipart_form)N)rD   rE   rF   Ztemplate_namer   propertyrN   rP   rW   rZ   r\   rd   re   rj   rI   r   r   r   r   rJ   t   s   

rJ   c                       sV   e Zd ZdediZdd fdd
Zdd Z fd	d
Zdd Z fddZ	  Z
S )SplitArrayFieldr   r   F)remove_trailing_nullsc                   sB   || _ || _|| _t|j|d}|d| t jf i | d S )N)rL   rM   rL   )r   rM   rm   rJ   rL   
setdefaultr   r   )r   r   rM   rm   r   rL   r   r   r   r      s    zSplitArrayField.__init__c                 C   sV   d }| j rNttt|D ]\}}|| jjv r4|}q q:q|d urN|d | }||fS r   )rm   reversedr*   r3   r   r@   )r   r8   r9   rc   r$   r   r   r   _remove_trailing_nulls   s    z&SplitArrayField._remove_trailing_nullsc                    s   t  |} fdd|D S )Nc                    s   g | ]} j |qS r   )r   r4   )r   r:   r    r   r   r!      r"   z-SplitArrayField.to_python.<locals>.<listcomp>)r   r4   r#   r   r    r   r4      s    zSplitArrayField.to_pythonc           	      C   s
  g }g }t |s$| jr$t| jd t| jt|}t|D ]}|| }z|| j	
| W nR ty } z:|t|| jd dd|d id |d  W Y d }~q<d }~0 0 |d  q<| |\}}|d ur|d | }ttd |}|rttt||S )Nrequiredr   r-   r.   )r0   r1   )anyrq   r   r5   r^   rM   r_   rU   r   r   r   r	   rp   r*   filterr   from_iterable)	r   r$   Zcleaned_datar7   max_sizer9   r:   r;   Z
null_indexr   r   r   r      s6    
 zSplitArrayField.cleanc                    sV   z|  |}W n ty    Y n(0 | |\}}|| jv rH|| jv rHdS t ||S r?   )r4   r   rp   r@   r   rA   )r   rB   rC   rG   r   r   r   rA      s    zSplitArrayField.has_changed)rD   rE   rF   rG   rH   r   rp   r4   r   rA   rI   r   r   r   r   rl      s   rl   )rf   	itertoolsr   Zdjangor   Z"django.contrib.postgres.validatorsr   r   Zdjango.core.exceptionsr   Zdjango.utils.translationr   rG   utilsr	   Z	CharFieldr
   ZWidgetrJ   ZFieldrl   r   r   r   r   <module>   s   eC