
^Q\                 @   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 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)    )unicode_literals)ImproperlyConfigured)InvalidPage	Paginator)QuerySet)Http404)six)
force_text)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 d  Z d d   Z d d   Z d d   Z   f d d   Z   S)MultipleObjectMixinz:
    A mixin for views manipulating multiple objects.
    TNr   pagec             C   s   |  j  d k	 r9 |  j  } t | t  rz | j   } qz nA |  j d k	 r] |  j j j   } n t d i |  j j d 6  |  j	   } | r t | t
 j  r | f } n  | j |   } n  | 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   ?/var/www/dbchiro/venv/build/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   8   s    z MultipleObjectMixin.get_orderingc             C   s1  |  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 SWnO t k
 r,} z/ t t d  i | d 6t |  d 6  WYd	 d	 } ~ Xn Xd	 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   r	   )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_byW   s    z#MultipleObjectMixin.get_paginate_byc             K   s   |  j  | | d | 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%   f   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&   m   s    z#MultipleObjectMixin.get_allow_emptyc             C   s8   |  j  r |  j  St | d  r0 d | j j j Sd Sd 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_namet   s
    	z+MultipleObjectMixin.get_context_object_namec       	         s   | j  d |  j  } |  j |  } |  j |  } | r| |  j | |  \ } } } } i | d 6| d 6| d 6| d 6} n" i d d 6d d 6d d 6| d 6} | d k	 r | | | <n  | j |  t t |   j |   S)z0
        Get the context for this view.
        r/   r1   Zpage_objis_paginatedNF)	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   
__module____qualname____doc__r8   r   r   r4   r7   r9   r   r6   r'   r   r   r   r3   r5   r$   r%   r&   r=   rB   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   } | s |  j |  j  d  k	 r^ t |  j d  r^ |  j j   } n t |  j  d k } | r t t d  i |  j	 j
 d 6  q n  |  j   } |  j |  S)Nexistsr   z5Empty list and '%(class_name)s.allow_empty' is False.
class_name)r   r/   r&   r5   r:   rH   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   rG      s   rG   c                   s.   e  Z d  Z d Z d Z   f d d   Z   S)#MultipleObjectTemplateResponseMixinzC
    Mixin for responding with a template and list of objects.
    Z_listc                s   y t  t |   j   } Wn t k
 r3 g  } Yn Xt |  j d  r{ |  j j j } | j d | j	 | j
 |  j f  n  | 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   rL   get_template_namesr   r:   r/   r   r;   appendZ	app_labelr<   template_name_suffix)r   namesopts)r   r   r   rM      s    &z6MultipleObjectTemplateResponseMixin.get_template_names)r   rD   rE   rF   rO   rM   r   r   )r   r   rL      s   rL   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   rR      s   rR   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.encodingr	   Zdjango.utils.translationr
   r.   Zdjango.views.generic.baser   r   r   r   rG   rL   rR   r   r   r   r   <module>   s   