3
(h                 @   s   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 d dlmZ d dlmZmZ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dS )    )unicode_literals)ImproperlyConfigured)InvalidPage	Paginator)QuerySet)Http404)six)ugettext)ContextMixinTemplateResponseMixinViewc                   s   e Zd ZdZdZdZdZdZdZdZ	e
ZdZdZdd Zdd	 Zd
d Zdd ZdddZdd Zdd Zdd Z fddZ  ZS )MultipleObjectMixinz:
    A mixin for views manipulating multiple objects.
    TNr   pagec             C   s|   | j dk	r$| j }t|trP|j }n,| jdk	r<| jjj }ntdd| jji | j	 }|rxt|t
jrn|f}|j| }|S )z
        Return the list of items for this view.

        The return value must be an iterable and may be an instance of
        `QuerySet` in which case `QuerySet` specific behavior will be enabled.
        Nzj%(cls)s is missing a QuerySet. Define %(cls)s.model, %(cls)s.queryset, or override %(cls)s.get_queryset().cls)queryset
isinstancer   allmodelZ_default_managerr   	__class____name__get_orderingr   string_typesZorder_by)selfr   ordering r   =/tmp/pip-install-q3hcpn_q/Django/django/views/generic/list.pyget_queryset   s    




z MultipleObjectMixin.get_querysetc             C   s   | j S )zN
        Return the field or fields to use for ordering the queryset.
        )r   )r   r   r   r   r   7   s    z MultipleObjectMixin.get_orderingc             C   s   | j ||| j | j d}| j}| jj|p<| jjj|p<d}yt|}W n0 t	k
rz   |dkrj|j
}nttdY nX y|j|}|||j|j fS  tk
r } z ttd|t|d W Y dd}~X nX dS )z3
        Paginate the queryset, if needed.
        )orphansallow_empty_first_page   lastz6Page is not 'last', nor can it be converted to an int.z+Invalid page (%(page_number)s): %(message)s)page_numbermessageN)get_paginatorget_paginate_orphansget_allow_empty
page_kwargkwargsgetrequestGETint
ValueErrorZ	num_pagesr   _r   object_listZhas_other_pagesr   str)r   r   	page_size	paginatorr&   r   r!   er   r   r   paginate_queryset=   s$    

z%MultipleObjectMixin.paginate_querysetc             C   s   | j S )zX
        Get the number of items to paginate by, or ``None`` for no pagination.
        )paginate_by)r   r   r   r   r   get_paginate_byV   s    z#MultipleObjectMixin.get_paginate_byc             K   s   | j ||f||d|S )zD
        Return an instance of the paginator for this view.
        )r   r   )paginator_class)r   r   Zper_pager   r   r'   r   r   r   r#   \   s    z!MultipleObjectMixin.get_paginatorc             C   s   | j S )zh
        Returns the maximum number of orphans extend the last page by when
        paginating.
        )paginate_orphans)r   r   r   r   r$   e   s    z(MultipleObjectMixin.get_paginate_orphansc             C   s   | j S )z
        Returns ``True`` if the view should display empty lists, and ``False``
        if a 404 should be raised instead.
        )allow_empty)r   r   r   r   r%   l   s    z#MultipleObjectMixin.get_allow_emptyc             C   s,   | j r| j S t|dr$d|jjj S dS dS )zE
        Get the name of the item to be used in the context.
        r   z%s_listN)context_object_namehasattrr   _meta
model_name)r   r.   r   r   r   get_context_object_names   s
    
z+MultipleObjectMixin.get_context_object_namec       	         s   |j d| j}| j|}| j|}|rJ| j||\}}}}||||d}nddd|d}|dk	rh|||< |j| tt| jf |S )z0
        Get the context for this view.
        r.   )r1   Zpage_objis_paginatedr.   NF)	popr.   r5   r=   r3   updatesuperr   get_context_data)	r   r'   r   r0   r9   r1   r   r>   context)r   r   r   rB   ~   s"    



z$MultipleObjectMixin.get_context_data)r   T)r   
__module____qualname____doc__r8   r   r   r4   r7   r9   r   r6   r&   r   r   r   r3   r5   r#   r$   r%   r=   rB   __classcell__r   r   )r   r   r      s(    
r   c               @   s   e Zd ZdZdd ZdS )BaseListViewz7
    A base view for displaying a list of objects.
    c             O   s|   | j  | _| j }|sj| j| jd k	r@t| jdr@| jj  }nt| jdk}|rjttdd| j	j
i | j }| j|S )Nexistsr   z5Empty list and '%(class_name)s.allow_empty' is False.
class_name)r   r.   r%   r5   r:   rI   lenr   r-   r   r   rB   Zrender_to_response)r   r)   argsr'   r8   Zis_emptyrC   r   r   r   r(      s    
zBaseListView.getN)r   rD   rE   rF   r(   r   r   r   r   rH      s   rH   c                   s$   e Zd ZdZdZ fddZ  ZS )#MultipleObjectTemplateResponseMixinzC
    Mixin for responding with a template and list of objects.
    Z_listc                s`   yt t| j }W n tk
r*   g }Y nX t| jdr\| jjj}|jd|j	|j
| jf  |S )z
        Return a list of template names to be used for the request. Must return
        a list. May not be called if render_to_response is overridden.
        r   z%s/%s%s.html)rA   rM   get_template_namesr   r:   r.   r   r;   appendZ	app_labelr<   template_name_suffix)r   namesopts)r   r   r   rN      s    

z6MultipleObjectTemplateResponseMixin.get_template_names)r   rD   rE   rF   rP   rN   rG   r   r   )r   r   rM      s   rM   c               @   s   e Zd ZdZdS )ListViewz
    Render some list of objects, set by `self.model` or `self.queryset`.
    `self.queryset` can actually be any iterable of items, not just a queryset.
    N)r   rD   rE   rF   r   r   r   r   rS      s   rS   N)
__future__r   Zdjango.core.exceptionsr   Zdjango.core.paginatorr   r   Zdjango.db.models.queryr   Zdjango.httpr   Zdjango.utilsr   Zdjango.utils.translationr	   r-   Zdjango.views.generic.baser
   r   r   r   rH   rM   rS   r   r   r   r   <module>   s    