3
g0                 @   sL   d dl mZ d dlmZmZ d dlmZmZ d dlm	Z	 G dd de	Z
dS )    )apps)FieldDoesNotExistPermissionDenied)Http404JsonResponse)BaseListViewc               @   sB   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dddZ
dS )AutocompleteJsonViewz3Handle AutocompleteWidget's AJAX requests for data.   Nc                sd   | j |\| _| _| _ | j|s&t| j | _| j }t	 fdd|d D d|d j
 idS )z
        Return a JsonResponse with search results of the form:
        {
            results: [{id: "123" text: "foo"}],
            pagination: {more: true}
        }
        c                s$   g | ]}t t| t |d qS ))idtext)strgetattr).0obj)to_field_name e/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/contrib/admin/views/autocomplete.py
<listcomp>   s   z,AutocompleteJsonView.get.<locals>.<listcomp>object_listmoreZpage_obj)resultsZ
pagination)process_requesttermmodel_adminsource_fieldhas_permr   get_querysetr   Zget_context_datar   Zhas_next)selfrequestargskwargscontextr   )r   r   get   s    



zAutocompleteJsonView.getc             O   s   | j j| jf||S )zUse the ModelAdmin's paginator.)r   get_paginatorr   )r   r   r    r   r   r   r#   #   s    z"AutocompleteJsonView.get_paginatorc             C   sF   | j j| j}|j| jj }| j j| j|| j\}}|rB|j }|S )z9Return queryset based on ModelAdmin.get_search_results().)	r   r   r   Zcomplex_filterr   Zget_limit_choices_toZget_search_resultsr   Zdistinct)r   qsZsearch_use_distinctr   r   r   r   '   s    z!AutocompleteJsonView.get_querysetc          J   C   s  |j jdd}y"|j d }|j d }|j d }W n( tk
rX } zt|W Y dd}~X nX ytj||}W n( tk
r } zt|W Y dd}~X nX y|jj|}W n( t	k
r } zt|W Y dd}~X nX y|j
j}	W n* tk
r } zt|W Y dd}~X nX y| jj|	 }
W n* tk
r@ } zt|W Y dd}~X nX |
j|s`tdt|
j t|j
d|	jjj}|	jj|j}|
j||st||
||fS )a  
        Validate request integrity, extract and return request parameters.

        Since the subsequent view permission check requires the target model
        admin, which is determined here, raise PermissionDenied if the
        requested app, model or field are malformed.

        Raise Http404 if the target model admin is not configured properly with
        search_fields.
        r    	app_label
model_name
field_nameNz5%s must have search_fields for the autocomplete_view.)GETr"   KeyErrorr   r   Z	get_modelLookupErrorZ_meta	get_fieldr   Zremote_fieldmodelAttributeError
admin_site	_registryZget_search_fieldsr   type__qualname__r   pkZattnameZto_field_allowed)r   r   r   r&   r'   r(   eZsource_modelr   Zremote_modelr   r   r   r   r   r   0   s@    

z$AutocompleteJsonView.process_requestc             C   s   | j j||dS )z9Check if user has permission to access the related model.)r   )r   Zhas_view_permission)r   r   r   r   r   r   r   d   s    zAutocompleteJsonView.has_perm)N)__name__
__module__r2   __doc__Zpaginate_byr/   r"   r#   r   r   r   r   r   r   r   r      s   	4r   N)Zdjango.appsr   Zdjango.core.exceptionsr   r   Zdjango.httpr   r   Zdjango.views.generic.listr   r   r   r   r   r   <module>   s   