o
    ô<âg  ã                   @   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   úL/var/www/html/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 )ÚBaseListViewz-A base view for displaying a list of objects.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     &