3
(h                 @   s   d dl 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 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 G dd deeeZdS )    N)login_required)ImproperlyConfiguredPermissionDenied)reverse)QuerySet)JsonResponse)method_decorator)View)ContextMixinTemplateResponseMixin   )DataList)formsc                   s   e Zd ZdZdZdZdZdZdZdZ	e
Zd+Zf Zdddd	idddddd
dddddiddid
Zd,ddZd-ddZdd Zdd Zdd Zdd Zdd Zdd  Z fd!d"Zd#d$ Zd%d& Zd'd( Zeed)d* Z  ZS ).ListModelViewaT  List view sutable to work with jQuery Datatables.

    The view responsive for handling GET/POST requests from the browser
    and AJAX from the datatable.

    :keyword model: Model class views

    :keyword queryset: Base views queryset

    :keyword paginate_by: Page size

    :keyword datatable_config: Datatable default config overrides

    :keyword datalist_class: Queryset to data adapter implementation

    :keyword list_display: List of fields to display

    :keyword list_display_links: List of fields form `list_display`
                                 linked to change view

    N   Z_list__str__FTurl.Z	oPaginate z&rang;z&lang;)ZsFirstZsLastZsNextZ	sPreviousdetails)

processingZ
serverSideajaxZorderinginfoZbFilterZ
bAutoWidthZbLengthChangeZ	oLanguageZ
responsivec             C   s$   | j dk	r| j j||S tddS )zpObject view permission check.

        If view had a `viewset`, the `viewset.has_view_permission` used.
        NzViewset is not provided)viewsethas_view_permissionNotImplementedError)selfrequestobj r   I/tmp/pip-install-q3hcpn_q/django-material/material/frontend/views/list.pyr   K   s    
z!ListModelView.has_view_permissionc             C   s$   | j dk	r| j j||S tddS )ztObject change permission check.

        If view had a `viewset`, the `viewset.has_change_permission` used.
        NzViewset is not provided)r   has_change_permissionr   )r   r   r   r   r   r    r!   T   s    
z#ListModelView.has_change_permissionc             C   s4   | j dkr,| jjj}dj|j|j| jdgS | j gS )z
        List of templates for the view.

        If no `self.template_name` defined, uses::

             [<app_label>/<model_label>_list.html,
              'material/frontend/views/list.html']
        Nz{}/{}{}.htmlz!material/frontend/views/list.html)Ztemplate_nameobject_listmodel_metaformat	app_label
model_nametemplate_name_suffix)r   optsr   r   r    get_template_names]   s    	

z ListModelView.get_template_namesc             C   s   | j S )z!Return list of coluns to display.)list_display)r   r   r   r    get_list_displayq   s    zListModelView.get_list_displayc             C   s4   | j s| j dks| r t| j S t|dd S dS )zReturn columns list that would be linked to the object details.

        If `self.list_display_links` is not set, the first column would be used.
        N   )list_display_linkslist)r   r+   r   r   r    get_list_display_linksu   s
    

z$ListModelView.get_list_display_linksc             C   s<   | j  }| j|}| j| j| j| jr.| | jgn| g||dS )zCreate data adapter instance.)Zdata_sourcesr+   r.   )r,   r0   datalist_classr#   r"   r   )r   r+   r.   r   r   r    create_datalist   s    
zListModelView.create_datalistc             C   sT   | j dk	r$| j }t|trP|j }n,| jdk	r<| jjj }ntdd| jji |S )zRetrive the view queryset.Nzj%(cls)s is missing a QuerySet. Define %(cls)s.model, %(cls)s.queryset, or override %(cls)s.get_queryset().cls)	queryset
isinstancer   allr#   Z_default_managerr   	__class____name__)r   r4   r   r   r    get_queryset   s    



zListModelView.get_querysetc             C   sT   | j j }| j|d< | jj|d d< dd | jjD |d< | jdk	rP|j| j |S )zPrepare datatable config.ZiDisplayLengthr   r   c             S   s   g | ]}d |iqS )datar   ).0
field_namer   r   r    
<listcomp>   s   z6ListModelView.get_datatable_config.<locals>.<listcomp>columnsN)	datatable_default_configcopypaginate_byr   pathdatalistr+   datatable_configupdate)r   configr   r   r    get_datatable_config   s    


z"ListModelView.get_datatable_configc                sD   t t| jf |}|jtj| j | jj | jj	d| j
d |S )z}Update view context.

        Include `datatable_config`, 'headers' and initial `data` to
        first page render.
        r   )rD   headersr:   )superr   get_context_datarE   jsondumpsrG   rC   Zget_headers_dataget_datarA   )r   kwargscontext)r7   r   r    rJ      s    zListModelView.get_context_datac             O   s   | j  }| j|S )z%Response with rendered html template.)rJ   Zrender_to_response)r   r   argsrN   rO   r   r   r    get   s    zListModelView.getc             C   s>   | j j}i }| j| j|r:tdj|j|j|jgd|d< |S )zjRow data post-processing.

        Include link to object detail to `list_display_links` columns.
        z{}:{}_detail)rP   Zview_url)	r#   r$   r   r   r   r%   r&   r'   pk)r   itemr)   resultr   r   r    get_item_data   s    zListModelView.get_item_datac             O   s   t j|j}|j s"td|jiS |jd }|jd }|jd }g }x4| jj||D ]"\}	}
|
j	| j
|	 |j|
 qTW || jj | jj |d}t|S )z.Return `JSONResponse` with data for datatable.errordrawstartlength)rW   ZrecordsTotalZrecordsFilteredr:   )r   ZDatatableRequestFormGETZis_validr   errorsZcleaned_datarC   rM   rE   rU   appendtotalZtotal_filtered)r   r   rP   rN   formrW   rX   rY   rT   rS   Zcolumns_datar:   r   r   r    get_json_data   s    


zListModelView.get_json_datac             O   sr   | j | jst| j | _| j | _d|jkr6| j}n,|j	j
 | jkr\t| |j	j
 | j}n| j}||f||S )z:Handle for browser HTTP and AJAX requests from datatables.ZHTTP_DATATABLE)r   r   r   r9   r"   r2   rC   ZMETAr_   methodlowerZhttp_method_namesgetattrZhttp_method_not_allowed)r   r   rP   rN   handlerr   r   r    dispatch   s    


zListModelView.dispatch)r   )N)N)r8   
__module____qualname____doc__r#   r   r4   rA   rD   r(   r   r1   r+   r.   r?   r   r!   r*   r,   r0   r2   r9   rG   rJ   rQ   rU   r_   r   r   rd   __classcell__r   r   )r7   r    r      sJ   
	
	r   )rK   Zdjango.contrib.auth.decoratorsr   Zdjango.core.exceptionsr   r   Zdjango.core.urlresolversr   Zdjango.db.models.queryr   Zdjango.httpr   Zdjango.utils.decoratorsr   Zdjango.views.genericr	   Zdjango.views.generic.baser
   r   rC   r   r   r   r   r   r   r   r    <module>   s   