o
    e )                     @   s   d Z zddlmZ W n ey   ddlmZ Y nw 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dlmZ dd	lmZ G d
d deZG dd deeZG dd deZG dd deeZG dd deZdS )zSelect2 view implementation.    )Sequence)OrderedDict)BaseQuerySetView	ViewMixin)http)ImproperlyConfigured)F)gettext)Viewc                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
Select2ViewMixinz1View mixin to render a JSON response for Select2.Fc                    s    fdd|d D S )z2Return data for the 'results' key of the response.c                    *   g | ]}  | | |d qS )idtextselected_textget_result_valueget_result_labelget_selected_result_label.0resultself ]/var/www/html/Testing_prj/Navya-Bakers/venv/lib/python3.10/site-packages/dal_select2/views.py
<listcomp>   s    z0Select2ViewMixin.get_results.<locals>.<listcomp>object_listr   )r   contextr   r   r   get_results   s   
zSelect2ViewMixin.get_resultsc                    s   g }d} j rB|rB|dd}|du s|jdkrd} js1 fdd|d D }| |v r0d}n fd	d|d D }||v rBd}|rW  jrW|td
d|i ddg}|S )z4Form the correct create_option to append to results.Fpage_objN   Tc                 3   s    | ]
}  | V  qd S N)r   lowerr   r   r   r   	<genexpr>-   s    z5Select2ViewMixin.get_create_option.<locals>.<genexpr>r   c                 3   s    | ]}  |V  qd S r"   )r   r   r   r   r   r$   2   s
    
Create "%(new_value)s"	new_valuer   r   	create_id)create_fieldgetnumbercase_sensitive_creater#   has_add_permissionrequest_)r   r   qcreate_optiondisplay_create_optionr    existing_optionsr   r   r   get_create_option!   s0   


z"Select2ViewMixin.get_create_optionc                 C   s@   | j jdd}| ||}t| || d| |idS )z)Return a JSON response in Select2 format.r0   Nmore)results
pagination)r.   GETr*   r4   r   JsonResponser   has_more)r   r   r0   r1   r   r   r   render_to_responseA   s   
z#Select2ViewMixin.render_to_responseN)__name__
__module____qualname____doc__r,   r   r4   r;   r   r   r   r   r      s    
 r   c                   @   s   e Zd ZdZdS )Select2QuerySetViewz"List options for a Select2 widget.N)r<   r=   r>   r?   r   r   r   r   r@   P   s    r@   c                   @   s    e Zd ZdZdZdZdd ZdS )Select2GroupQuerySetViewa  List of grouped options for a Select2 widget.

    .. py:attribute:: group_by_related

        Name of the field for the related Model on a One to Many relation

    .. py:attribute:: related_field_name

        Name of the related Model field to run filter against.
    Nnamec                    s~    j stdt }|d }|jt j  d j d}|D ]}t|d}||g  || | q fdd|	 D S )zReturn the options grouped by a common related model.

        Raises ImproperlyConfigured if self.group_by_name is not configured
        zMissing group_by_related.r   __)
group_namerD   c                    s*   g | ]\}}d | fdd|D dqS )Nc                    r   r   r   r   r   r   r   r   y   s    
zCSelect2GroupQuerySetView.get_results.<locals>.<listcomp>.<listcomp>r   r   childrenr   )r   groupr6   r   r   r   r   v   s    

z8Select2GroupQuerySetView.get_results.<locals>.<listcomp>)
group_by_relatedr   r   annotater   related_field_namegetattr
setdefaultappenditems)r   r   groupsr   r   rD   r   r   r   r   c   s   

z$Select2GroupQuerySetView.get_results)r<   r=   r>   r?   rH   rJ   r   r   r   r   r   rA   T   s
    rA   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )Select2ListViewz9Autocomplete from a list of items rather than a QuerySet.c                 C   s   g S )z3Return the list strings from which to autocomplete.r   r   r   r   r   get_list   s   zSelect2ListView.get_listc                 O   s`   |   }g }| jr"| |}t| dr"| jtdd| ji ddg}tjd| || iddS )	z!Return option list json response.creater%   r&   Tr'   r6   zapplication/json)content_type)rQ   r0   autocomplete_resultshasattrr/   r   r9   r6   )r   r.   argskwargsr6   r1   r   r   r   r*      s    

zSelect2ListView.getc                    sr   t dd |D rt|dkr fdd|D S t dd |D r0t|dkr0 fdd|D S  fdd|D S )	z9Return list of strings that match the autocomplete query.c                 s       | ]}t |tV  qd S r"   
isinstancelistr   elr   r   r   r$          z7Select2ListView.autocomplete_results.<locals>.<genexpr>r   c                    *   g | ]\}} j  | v r||gqS r   r0   r#   r   xyr   r   r   r         * z8Select2ListView.autocomplete_results.<locals>.<listcomp>c                 s   rX   r"   rZ   tupler\   r   r   r   r$      r^   c                    r_   r   r`   ra   r   r   r   r      rd   c                    s"   g | ]} j  | v r|qS r   r`   r   rb   r   r   r   r      s   " alllenr   r6   r   r   r   rT      s
   z$Select2ListView.autocomplete_resultsc                 C   sf   t dd |D rt|dkrdd |D S t dd |D r,t|dkr,dd |D S dd |D S )	zReturn the result dictionary.c                 s   rX   r"   rY   r\   r   r   r   r$      r^   z*Select2ListView.results.<locals>.<genexpr>r   c                 S      g | ]
\}}t ||d qS r   r   dictra   r   r   r   r          z+Select2ListView.results.<locals>.<listcomp>c                 s   rX   r"   re   r\   r   r   r   r$      r^   c                 S   rl   rm   ro   ra   r   r   r   r      rq   c                 S   s   g | ]}t ||d qS rm   ro   rg   r   r   r   r      s    rh   rk   r   r   r   r6      s
   zSelect2ListView.resultsc                 O   sZ   t | ds	td|jdd}|du rt S | |}|du r%t S t||dS )zAdd an option to the autocomplete list.

        If 'text' is not defined in POST or self.create(text) fails, raises
        bad request. Raises ImproperlyConfigured if self.create if not defined.
        rR   zMissing "create()"r   Nrn   )rU   r   POSTr*   r   HttpResponseBadRequestrR   r9   )r   r.   rV   rW   r   r   r   r   post   s   

zSelect2ListView.postN)	r<   r=   r>   r?   rQ   r*   rT   r6   rt   r   r   r   r   rP      s    		rP   c                   @   s    e Zd ZdZdd Zdd ZdS )Select2GroupListViewzView mixin for grouped options.c                 C   s   d}|}t |tr[t |ts[t|}tdd |D r,|dkr,|dd \}}||ffS tdd |D rF|dkrF|dd \}}||ffS |dkrS|dd \}}n|dkr[|d }t |tret |trh|f}||ffS )zReturn the item with its group.Nc                 s   rX   r"   rY   r\   r   r   r   r$      r^   z9Select2GroupListView.get_item_as_group.<locals>.<genexpr>r!   r      c                 s   rX   r"   rY   r\   r   r   r   r$      r^   )rZ   r   strrj   ri   )r   entryrG   itementry_lengthr   r   r   get_item_as_group   s"   


z&Select2GroupListView.get_item_as_groupc                    sd  i }  }|rtdd |D stdd |D rifdd|D }jr4j   fdd|D }|D ]\}}}	}
|||fg  |||f |	|
g q6tddd |d	g D d
d |	 D  iS fdd|D }jrj   fdd|D }|D ]\}}
||g  || |
 qtddd |dg D dd |	 D  iS dS )z2Return option list with children(s) json response.c                 s   rX   r"   rY   r\   r   r   r   r$      r^   z+Select2GroupListView.get.<locals>.<genexpr>c                 s   rX   r"   re   r\   r   r   r   r$      r^   c              	      sF   g | ]}  |D ]\}}|D ]}|d  |d |d  |d fqq	qS )r   r!   r{   r   rx   rG   rN   ry   r   r   r   r      s    
z,Select2GroupListView.get.<locals>.<listcomp>c                    s,   g | ]\}}}} |  v r||||fqS r   r#   )r   ghrb   rc   r0   r   r   r      s    
r6   c                 S      g | ]	\}}||d qS rm   r   ra   r   r   r   r      s
    )NNc                 S   s.   g | ]\}}|d  |d dd |D dqS )r   r!   c                 S   r   rm   r   ra   r   r   r   r     s    7Select2GroupListView.get.<locals>.<listcomp>.<listcomp>rE   r   r   r   lr   r   r   r      s    c                    s2   g | ]}  |D ]\}}|D ]}||fqq	qS r   r|   r}   r   r   r   r     s    c                    s$   g | ]\}} |  v r||fqS r   r~   )r   r   rb   r   r   r   r     s    c                 S      g | ]}||d qS rm   r   rg   r   r   r   r         
Nc                 S   s&   g | ]\}}||d d |D dqS )c                 S   r   rm   r   rg   r   r   r   r      r   r   rE   r   r   r   r   r   r     s    )
rQ   ri   r0   r#   rL   rM   r   r9   poprN   )r   r.   rV   rW   results_dictr6   flat_resultsgroup_idrG   item_idry   r   )r0   r   r   r*      sT   




zSelect2GroupListView.getN)r<   r=   r>   r?   r{   r*   r   r   r   r   ru      s    ru   N)r?   collections.abcr   ImportErrorcollectionsr   	dal.viewsr   r   djangor   django.core.exceptionsr   django.db.modelsr   django.utils.translationr	   r/   django.views.generic.listr
   objectr   r@   rA   rP   ru   r   r   r   r   <module>   s$    >-D