o
    {,hI                     @   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 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 )    )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Zdd Zdd Zdd Zdd fdd
Z  ZS )MultipleObjectMixinz0A mixin for views manipulating multiple objects.TNr   pagec                 C   sz   | j dur| j }t|tr| }n| jdur| jj }n
tdd| jji | 	 }|r;t|t
r6|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model_default_managerr   	__class____name__get_orderingstrorder_by)selfr   ordering r   O/var/www/html/rh/venv/lib/python3.10/site-packages/django/views/generic/list.pyget_queryset   s$   





z MultipleObjectMixin.get_querysetc                 C      | j S )z<Return the field or fields to use for ordering the queryset.)r   r   r   r   r   r   1   s   z MultipleObjectMixin.get_orderingc              
   C   s   | j |||  |  d}| j}| j|p| jj|pd}zt|}W n t	y<   |dkr4|j
}nttdY nw z||}|||j| fW S  tye } zttd|t|d d}~ww )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
ValueError	num_pagesr   _r   object_listhas_other_pagesr   r   )r   r   	page_size	paginatorr)   r   r$   er   r   r   paginate_queryset5   s:   
z%MultipleObjectMixin.paginate_querysetc                 C   r   )zX
        Get the number of items to paginate by, or ``None`` for no pagination.
        )paginate_by)r   r   r   r   r   get_paginate_byQ   s   z#MultipleObjectMixin.get_paginate_byc                 K   s   | j ||f||d|S )z2Return an instance of the paginator for this view.r   )paginator_class)r   r   per_pager    r!   r*   r   r   r   r&   W   s   z!MultipleObjectMixin.get_paginatorc                 C   r   )zg
        Return the maximum number of orphans extend the last page by when
        paginating.
        )paginate_orphansr   r   r   r   r'   c      z(MultipleObjectMixin.get_paginate_orphansc                 C   r   )z
        Return ``True`` if the view should display empty lists and ``False``
        if a 404 should be raised instead.
        )allow_emptyr   r   r   r   r(   j   r=   z#MultipleObjectMixin.get_allow_emptyc                 C   s(   | j r| j S t|drd|jjj S d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   r2   r   r   r   get_context_object_nameq   s
   
z+MultipleObjectMixin.get_context_object_name)r2   c          
         s   |dur|n| j }| |}| |}|r'| ||\}}}}||||d}	nddd|d}	|dur6||	|< |	| t jdi |	S )zGet the context for this view.N)r5   page_objis_paginatedr2   Fr   )r2   r9   rC   r7   updatesuperget_context_data)
r   r2   r*   r   r4   r?   r5   r   rE   contextr   r   r   rH   z   s*   


z$MultipleObjectMixin.get_context_data)r   T)r   
__module____qualname____doc__r>   r   r   r8   r<   r?   r   r:   r)   r   r   r   r7   r9   r&   r'   r(   rC   rH   __classcell__r   r   rJ   r   r   	   s*    
	r   c                   @   s   e Zd ZdZdd ZdS )BaseListViewzq
    Base view for displaying a list of objects.

    This requires subclassing to provide a response mixin.
    c                 O   sv   |   | _|  }|s2| | jd ur t| jdr | j  }n| j }|r2ttdd| jj	i | 
 }| |S )Nexistsu9   Empty list and “%(class_name)s.allow_empty” is False.
class_name)r   r2   r(   r9   r@   rP   r   r1   r   r   rH   render_to_response)r   r,   argsr*   r>   is_emptyrI   r   r   r   r+      s"   

zBaseListView.getN)r   rK   rL   rM   r+   r   r   r   r   rO      s    rO   c                       s$   e Zd ZdZdZ fddZ  ZS )#MultipleObjectTemplateResponseMixinz9Mixin for responding with a template and list of objects._listc                    sv   zt   }W n ty   g }Y nw t| jdr-| jjj}|d|j|j	| j
f  |S |s9t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   )rG   get_template_namesr   r@   r2   r   rA   append	app_labelrB   template_name_suffixr   r   )r   namesoptsrJ   r   r   rW      s*   	
z6MultipleObjectTemplateResponseMixin.get_template_names)r   rK   rL   rM   rZ   rW   rN   r   r   rJ   r   rU      s    rU   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   rK   rL   rM   r   r   r   r   r]      s    r]   N)django.core.exceptionsr   django.core.paginatorr   r   django.db.modelsr   django.httpr   django.utils.translationr   r1   django.views.generic.baser   r	   r
   r   rO   rU   r]   r   r   r   r   <module>   s      &