o
    e                     @   s:   d dl mZ d dlmZ d dlmZmZ G dd dZdS )    )	Container)DynamicError)Fieldset
MultiFieldc                   @   sV   e Zd ZeeefZdd Zdd Zdd Z	dd Z
d	d
 Zdd Zdd Zdd ZdS )LayoutSlicec                 C   s0   || _ t|trt||d d| _d S || _d S )N   )layout
isinstanceintslice)selfr   key r   Z/var/www/html/humari/django-venv/lib/python3.10/site-packages/crispy_forms/layout_slice.py__init__
   s   

zLayoutSlice.__init__c                 O   sp   |r$t |trt|}n|f}|| jv r|| }n|| }||i |S t |tr0||i |S ||fi |S )z|
        Returns a layout object of type `LayoutClass` with `args` and `kwargs` that
        wraps `fields` inside.
        )r	   listtuple
args_first)r   LayoutClassfieldsargskwargs	argumentsr   r   r   wrapped_object   s   




zLayoutSlice.wrapped_objectc              	   C   s   t | jtrt| jt| jj D ]}|| j| qdS t | jtre| jD ]@}|j}t|dkr:|| j|d  q&| jj|d  }|dd D ]}|j| }qHz	|||d  W q& t	yd   t
dw dS dS )z
        Iterates over layout objects pointed in `self.slice` executing `function` on them.
        It passes `function` penultimate layout object and the position where to find last one
        r   r   zqTrying to wrap a field within an already wrapped field,                             recheck your filter or layoutN)r	   r   rangeindiceslenr   r   r   	positions
IndexErrorr   )r   functionipointerr   layout_objectr   r   r   pre_map(   s*   
zLayoutSlice.pre_mapc                         fdd} | dS )z
        Wraps every layout object pointed in `self.slice` under a `LayoutClass` instance with
        `args` and `kwargs` passed.
        c                    s*   j  | j| gR i | j|< d S N)r   r   r#   jr   r   r   r   r   r   wrap_objectN   s   *z%LayoutSlice.wrap.<locals>.wrap_objectNr$   )r   r   r   r   r*   r   r)   r   wrapH   s   zLayoutSlice.wrapc                    r%   )z
        Wraps every layout object pointed in `self.slice` under a `LayoutClass` instance with
        `args` and `kwargs` passed, unless layout object's parent is already a subclass of
        `LayoutClass`.
        c                    s8   t |  sj | j| gR i | j|< d S d S r&   )r	   r   r   r'   r)   r   r   wrap_object_onceZ   s   
*z/LayoutSlice.wrap_once.<locals>.wrap_object_onceNr+   )r   r   r   r   r-   r   r)   r   	wrap_onceS   s   zLayoutSlice.wrap_oncec                 O   s   t | jtrD| jjdur| jjnd}| j|| jj| j g|R i || jj|< tt| jt	| jj D ]}||krA| jj|= q6dS t | jt
rNtddS )z
        Wraps all layout objects pointed in `self.slice` together under a `LayoutClass`
        instance with `args` and `kwargs` passed.
        Nr   z=wrap_together doesn't work with filter, only with [] operator)r	   r   startr   r   r   reversedr   r   r   r   r   )r   r   r   r   r/   r!   r   r   r   wrap_together`   s"    
zLayoutSlice.wrap_togetherc                 C   s   t | jtrt| jt| jj D ]
}|| jj|  qdS t | jtrY| jD ]2}|j}| jj|d  }|dd D ]	}|}|j| }q;|j	dkrTt |t
rT|| q(|| q(dS dS )z
        Iterates over layout objects pointed in `self.slice` executing `function` on them
        It passes `function` last layout object
        r   r   Nupdate_attrs)r	   r   r   r   r   r   r   r   r   __name__str)r   r    r!   r"   r   r#   previous_layout_objectr   r   r   mapt   s    


zLayoutSlice.mapc                    s    fdd}|  | dS )z`
        Updates attributes of every layout object pointed in `self.slice` using kwargs
        c                    sf      }t| dr1d|v r)d| jv r!| jd  d|d 7  < n|d| jd< | j| d S d S )Nattrs	css_classclassz %s)copyhasattrr7   popupdate)r#   r   original_kwargsr   r   r2      s   

z3LayoutSlice.update_attributes.<locals>.update_attrsN)r6   )r   r?   r2   r   r>   r   update_attributes   s   
zLayoutSlice.update_attributesN)r3   
__module____qualname__r   r   r   r   r   r   r$   r,   r.   r1   r6   r@   r   r   r   r   r      s    
 r   N)crispy_forms.bootstrapr   crispy_forms.exceptionsr   crispy_forms.layoutr   r   r   r   r   r   r   <module>   s    