
v^                 @   s   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 m Z m Z Gd d   d e  Z Gd	 d
   d
 e e  Z Gd d   d e  Z Gd d   d e e  Z d S)    )ImproperlyConfigured)InvalidPage	Paginator)QuerySet)Http404)gettext)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 d  Z d d   Z d d   Z d d   Z d d   f d d  Z   S)MultipleObjectMixinz0A mixin for views manipulating multiple objects.TNr   pagec             C   s   |  j  d k	 r6 |  j  } t | t  rv | j   } n@ |  j d k	 rZ |  j j j   } n t d d |  j j i   |  j	   } | r t | t
  r | 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_orderingstrZorder_by)selfr   ordering r   ;/tmp/pip-build-8lau8j11/django/django/views/generic/list.pyget_queryset   s    		z MultipleObjectMixin.get_querysetc             C   s   |  j  S)z<Return the field or fields to use for ordering the queryset.)r   )r   r   r   r   r   2   s    z MultipleObjectMixin.get_orderingc             C   s/  |  j  | | d |  j   d |  j   } |  j } |  j j |  p] |  j j j |  p] d } y t |  } Wn< t	 k
 r | d k r | j
 } n t t d    Yn Xy, | j |  } | | | j | j   f SWnM t k
 r*} z- t t d  d | d t |  i   WYd	 d	 } ~ Xn Xd	 S)
z!Paginate the queryset, if needed.orphansallow_empty_first_page   lastu:   Page 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   r   )r   r   	page_size	paginatorr$   r   r   er   r   r   paginate_queryset6   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_byM   s    z#MultipleObjectMixin.get_paginate_byc             K   s   |  j  | | d | d | | S)z2Return an instance of the paginator for this view.r   r   )paginator_class)r   r   Zper_pager   r   r%   r   r   r   r!   S   s    z!MultipleObjectMixin.get_paginatorc             C   s   |  j  S)zg
        Return the maximum number of orphans extend the last page by when
        paginating.
        )paginate_orphans)r   r   r   r   r"   Z   s    z(MultipleObjectMixin.get_paginate_orphansc             C   s   |  j  S)z
        Return ``True`` if the view should display empty lists and ``False``
        if a 404 should be raised instead.
        )allow_empty)r   r   r   r   r#   a   s    z#MultipleObjectMixin.get_allow_emptyc             C   s8   |  j  r |  j  St | d  r0 d | j j j Sd Sd S)z3Get 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_nameh   s
    	z+MultipleObjectMixin.get_context_object_namer,   c      
         s   | d k	 r | n |  j  } |  j |  } |  j |  } | r~ |  j | |  \ } } } } d | d | d | d | i }	 n d d d d d d d | i }	 | d k	 r | |	 | <|	 j |  t   j |	   S)zGet the context for this view.Nr.   Zpage_objis_paginatedr,   F)r,   r2   r:   r0   updatesuperget_context_data)
r   r,   r%   r   r-   r6   r.   r   r;   context)r   r   r   r>   q   s"    
z$MultipleObjectMixin.get_context_data)r   
__module____qualname____doc__r5   r   r   r1   r4   r6   r   r3   r$   r   r   r   r0   r2   r!   r"   r#   r:   r>   r   r   )r   r   r   	   s(   	r   c               @   s"   e  Z d  Z d Z d d   Z d S)BaseListViewz-A base view for displaying a list of objects.c             O   s   |  j    |  _ |  j   } | s |  j |  j  d  k	 r^ t |  j d  r^ |  j j   } n
 |  j } | r t t d  d |  j j	 i   |  j
   } |  j |  S)Nexistsu9   Empty list and “%(class_name)s.allow_empty” is False.
class_name)r   r,   r#   r2   r7   rD   r   r+   r   r   r>   Zrender_to_response)r   r'   argsr%   r5   Zis_emptyr?   r   r   r   r&      s    *
zBaseListView.getN)r   r@   rA   rB   r&   r   r   r   r   rC      s   rC   c                   s.   e  Z d  Z d Z d Z   f d d   Z   S)#MultipleObjectTemplateResponseMixinz9Mixin for responding with a template and list of objects.Z_listc                s   y t    j   } Wn t k
 r- g  } Yn Xt |  j d  ru |  j j j } | j d | j | j	 |  j
 f  n" | s t d d |  j j i   | 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.htmlzg%(cls)s requires either a 'template_name' attribute or a get_queryset() method that returns a QuerySet.r   )r=   get_template_namesr   r7   r,   r   r8   appendZ	app_labelr9   template_name_suffixr   r   )r   namesopts)r   r   r   rH      s    &z6MultipleObjectTemplateResponseMixin.get_template_names)r   r@   rA   rB   rJ   rH   r   r   )r   r   rG      s   rG   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   r@   rA   rB   r   r   r   r   rM      s   rM   N)Zdjango.core.exceptionsr   Zdjango.core.paginatorr   r   Zdjango.db.models.queryr   Zdjango.httpr   Zdjango.utils.translationr   r+   Zdjango.views.generic.baser   r	   r
   r   rC   rG   rM   r   r   r   r   <module>   s   !