B
    ª0H[£b  ã               @   s  d dl 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 d dlmZ d d	lmZ d d
lmZmZ d dlmZmZ G dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ dƒZG dd„ deeeƒZG dd„ deƒZG dd„ deeƒZG dd„ deeƒZ G dd„ dee ƒZ!G d d!„ d!eeeƒZ"G d"d#„ d#ee"ƒZ#G d$d%„ d%eeeƒZ$G d&d'„ d'ee$ƒZ%G d(d)„ d)eeeeƒZ&G d*d+„ d+ee&ƒZ'G d,d-„ d-e&ƒZ(G d.d/„ d/ee(ƒZ)G d0d1„ d1eeeeeƒZ*G d2d3„ d3ee*ƒZ+d<d6d7„Z,d8d9„ Z-d:d;„ Z.dS )=é    N)Úsettings)ÚImproperlyConfigured)Úmodels)ÚHttp404)Útimezone)Úcached_property)Úgettext)ÚView)ÚBaseDetailViewÚ!SingleObjectTemplateResponseMixin)ÚMultipleObjectMixinÚ#MultipleObjectTemplateResponseMixinc               @   sH   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdS )Ú	YearMixinz-Mixin for views manipulating year-based data.z%YNc             C   s   | j S )zv
        Get a year format string in strptime syntax to be used to parse the
        year from url variables.
        )Úyear_format)Úself© r   ú^C:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\views\generic\dates.pyÚget_year_format   s    zYearMixin.get_year_formatc             C   sh   | j }|dkrdy| jd }W nF tk
rb   y| jjd }W n  tk
r\   ttdƒƒ‚Y nX Y nX |S )z8Return the year for which this view should display data.NÚyearzNo year specified)r   ÚkwargsÚKeyErrorÚrequestÚGETr   Ú_)r   r   r   r   r   Úget_year   s    zYearMixin.get_yearc             C   s   t | |ddd�S )zGet the next valid year.Fr   )Úis_previousÚperiod)Ú_get_next_prev)r   Údater   r   r   Úget_next_year,   s    zYearMixin.get_next_yearc             C   s   t | |ddd�S )zGet the previous valid year.Tr   )r   r   )r   )r   r   r   r   r   Úget_previous_year0   s    zYearMixin.get_previous_yearc             C   s<   y|j |jd ddd�S  tk
r6   ttdƒƒ‚Y nX dS )zŒ
        Return the start date of the next interval.

        The interval is defined by start date <= item date < next start date.
        é   )r   ÚmonthÚdayzDate out of rangeN)Úreplacer   Ú
ValueErrorr   r   )r   r   r   r   r   Ú_get_next_year4   s    zYearMixin._get_next_yearc             C   s   |j ddd�S )z.Return the start date of the current interval.r!   )r"   r#   )r$   )r   r   r   r   r   Ú_get_current_year?   s    zYearMixin._get_current_year)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r    r&   r'   r   r   r   r   r      s   r   c               @   sH   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdS )Ú
MonthMixinz.Mixin for views manipulating month-based data.z%bNc             C   s   | j S )zx
        Get a month format string in strptime syntax to be used to parse the
        month from url variables.
        )Úmonth_format)r   r   r   r   Úget_month_formatI   s    zMonthMixin.get_month_formatc             C   sh   | j }|dkrdy| jd }W nF tk
rb   y| jjd }W n  tk
r\   ttdƒƒ‚Y nX Y nX |S )z9Return the month for which this view should display data.Nr"   zNo month specified)r"   r   r   r   r   r   r   )r   r"   r   r   r   Ú	get_monthP   s    zMonthMixin.get_monthc             C   s   t | |ddd�S )zGet the next valid month.Fr"   )r   r   )r   )r   r   r   r   r   Úget_next_month]   s    zMonthMixin.get_next_monthc             C   s   t | |ddd�S )zGet the previous valid month.Tr"   )r   r   )r   )r   r   r   r   r   Úget_previous_montha   s    zMonthMixin.get_previous_monthc             C   s\   |j dkrDy|j|jd ddd�S  tk
r@   ttdƒƒ‚Y qXX n|j|j d dd�S dS )zŒ
        Return the start date of the next interval.

        The interval is defined by start date <= item date < next start date.
        é   r!   )r   r"   r#   zDate out of range)r"   r#   N)r"   r$   r   r%   r   r   )r   r   r   r   r   Ú_get_next_monthe   s    
zMonthMixin._get_next_monthc             C   s   |j dd�S )z/Return the start date of the previous interval.r!   )r#   )r$   )r   r   r   r   r   Ú_get_current_months   s    zMonthMixin._get_current_month)r(   r)   r*   r+   r-   r"   r.   r/   r0   r1   r3   r4   r   r   r   r   r,   D   s   r,   c               @   sH   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ ZdS )ÚDayMixinz,Mixin for views manipulating day-based data.z%dNc             C   s   | j S )zt
        Get a day format string in strptime syntax to be used to parse the day
        from url variables.
        )Ú
day_format)r   r   r   r   Úget_day_format}   s    zDayMixin.get_day_formatc             C   sh   | j }|dkrdy| jd }W nF tk
rb   y| jjd }W n  tk
r\   ttdƒƒ‚Y nX Y nX |S )z7Return the day for which this view should display data.Nr#   zNo day specified)r#   r   r   r   r   r   r   )r   r#   r   r   r   Úget_day„   s    zDayMixin.get_dayc             C   s   t | |ddd�S )zGet the next valid day.Fr#   )r   r   )r   )r   r   r   r   r   Úget_next_day‘   s    zDayMixin.get_next_dayc             C   s   t | |ddd�S )zGet the previous valid day.Tr#   )r   r   )r   )r   r   r   r   r   Úget_previous_day•   s    zDayMixin.get_previous_dayc             C   s   |t jdd� S )zŒ
        Return the start date of the next interval.

        The interval is defined by start date <= item date < next start date.
        r!   )Údays)ÚdatetimeÚ	timedelta)r   r   r   r   r   Ú_get_next_day™   s    zDayMixin._get_next_dayc             C   s   |S )z.Return the start date of the current interval.r   )r   r   r   r   r   Ú_get_current_day¡   s    zDayMixin._get_current_day)r(   r)   r*   r+   r6   r#   r7   r8   r9   r:   r>   r?   r   r   r   r   r5   x   s   r5   c               @   sP   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ ZdS )Ú	WeekMixinz-Mixin for views manipulating week-based data.z%UNc             C   s   | j S )zv
        Get a week format string in strptime syntax to be used to parse the
        week from url variables.
        )Úweek_format)r   r   r   r   Úget_week_format«   s    zWeekMixin.get_week_formatc             C   sh   | j }|dkrdy| jd }W nF tk
rb   y| jjd }W n  tk
r\   ttdƒƒ‚Y nX Y nX |S )z8Return the week for which this view should display data.NÚweekzNo week specified)rC   r   r   r   r   r   r   )r   rC   r   r   r   Úget_week²   s    zWeekMixin.get_weekc             C   s   t | |ddd�S )zGet the next valid week.FrC   )r   r   )r   )r   r   r   r   r   Úget_next_week¿   s    zWeekMixin.get_next_weekc             C   s   t | |ddd�S )zGet the previous valid week.TrC   )r   r   )r   )r   r   r   r   r   Úget_previous_weekÃ   s    zWeekMixin.get_previous_weekc             C   s@   y|t jd|  |¡ d� S  tk
r:   ttdƒƒ‚Y nX dS )zŒ
        Return the start date of the next interval.

        The interval is defined by start date <= item date < next start date.
        é   )r;   zDate out of rangeN)r<   r=   Ú_get_weekdayÚOverflowErrorr   r   )r   r   r   r   r   Ú_get_next_weekÇ   s    zWeekMixin._get_next_weekc             C   s   |t  |  |¡¡ S )z.Return the start date of the current interval.)r<   r=   rH   )r   r   r   r   r   Ú_get_current_weekÒ   s    zWeekMixin._get_current_weekc             C   s@   |   ¡ }|dkr| ¡ S |dkr0| ¡ d d S td| ƒ‚dS )z†
        Return the weekday for a given date.

        The first day according to the week format is 0 and the last day is 6.
        z%Wz%Ur!   rG   zunknown week format: %sN)rB   Úweekdayr%   )r   r   rA   r   r   r   rH   Ö   s    zWeekMixin._get_weekday)r(   r)   r*   r+   rA   rC   rB   rD   rE   rF   rJ   rK   rH   r   r   r   r   r@   ¦   s   r@   c               @   sD   e Zd ZdZdZdZdd„ Zdd„ Zedd	„ ƒZ	d
d„ Z
dd„ ZdS )Ú	DateMixinz3Mixin class for views manipulating date-based data.NFc             C   s    | j dkrtd| jj ƒ‚| j S )z7Get the name of the date field to be used to filter by.Nz%s.date_field is required.)Ú
date_fieldr   Ú	__class__r(   )r   r   r   r   Úget_date_fieldê   s    
zDateMixin.get_date_fieldc             C   s   | j S )zi
        Return `True` if the view should be allowed to display objects from
        the future.
        )Úallow_future)r   r   r   r   Úget_allow_futureð   s    zDateMixin.get_allow_futurec             C   s6   | j dkr|  ¡ j n| j }|j |  ¡ ¡}t|tjƒS )zq
        Return `True` if the date field is a `DateTimeField` and `False`
        if it's a `DateField`.
        N)ÚmodelÚget_querysetÚ_metaÚ	get_fieldrP   Ú
isinstancer   ZDateTimeField)r   rS   Úfieldr   r   r   Úuses_datetime_fieldú   s    zDateMixin.uses_datetime_fieldc             C   s2   | j r.tj |tjj¡}tjr.t |t 	¡ ¡}|S )zó
        Convert a date into a datetime when the date field is a DateTimeField.

        When time zone support is enabled, `date` is assumed to be in the
        current time zone, so that displayed items are consistent with the URL.
        )
rY   r<   ÚcombineÚtimeÚminr   ÚUSE_TZr   Z
make_awareZget_current_timezone)r   Úvaluer   r   r   Ú_make_date_lookup_arg  s
    zDateMixin._make_date_lookup_argc             C   sN   |   ¡ }| jrB|  |¡}|  |tjdd� ¡}d| |d| |iS ||iS dS )z×
        Get the lookup kwargs for filtering on a single date.

        If the date field is a DateTimeField, we can't just filter on
        date_field=date because that doesn't take the time into account.
        r!   )r;   z%s__gtez%s__ltN)rP   rY   r_   r<   r=   )r   r   rN   ÚsinceÚuntilr   r   r   Ú_make_single_date_lookup  s    
z"DateMixin._make_single_date_lookup)r(   r)   r*   r+   rN   rQ   rP   rR   r   rY   r_   rb   r   r   r   r   rM   å   s   

rM   c               @   sJ   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
ddd„ZdS )ÚBaseDateListViewzFAbstract base class for date-based views displaying a list of objects.Fr   c             O   s6   |   ¡ \| _| _}| jf | j| jdœ|—Ž}|  |¡S )N)Úobject_listÚ	date_list)Úget_dated_itemsre   rd   Zget_context_dataZrender_to_response)r   r   Úargsr   Zextra_contextÚcontextr   r   r   Úget*  s    zBaseDateListView.getc             C   s   t dƒ‚dS )z#Obtain the list of dates and items.z>A DateView must provide an implementation of get_dated_items()N)ÚNotImplementedError)r   r   r   r   rf   3  s    z BaseDateListView.get_dated_itemsc             C   s   | j dkrd|  ¡  S | j S )zu
        Return the field or fields to use for ordering the queryset; use the
        date field by default.
        Nz-%s)ÚorderingrP   )r   r   r   r   Úget_ordering7  s    zBaseDateListView.get_orderingc       	      K   s¢   |   ¡ jf |Ž}|  ¡ }|  ¡ }|  ¡ }|  |¡}|s^| jrDt ¡ nt	ƒ }|jf d| |iŽ}|sž|dkrvt
|ƒdkn| ¡  }|ržttdƒd|jjji ƒ‚|S )zs
        Get a queryset properly filtered according to `allow_future` and any
        extra lookup kwargs.
        z%s__lteNr   z$No %(verbose_name_plural)s availableÚverbose_name_plural)rT   ÚfilterrP   rR   Úget_allow_emptyZget_paginate_byrY   r   ÚnowÚtimezone_todayÚlenÚexistsr   r   rS   rU   rm   )	r   ÚlookupÚqsrN   rQ   Úallow_emptyZpaginate_byrp   Zis_emptyr   r   r   Úget_dated_queryset>  s    
z#BaseDateListView.get_dated_querysetc             C   s   | j S )zf
        Get the aggregation period for the list of dates: 'year', 'month', or
        'day'.
        )Údate_list_period)r   r   r   r   Úget_date_list_periodX  s    z%BaseDateListView.get_date_list_periodNÚASCc             C   sr   |   ¡ }|  ¡ }|dkr |  ¡ }| jr6| |||¡}n| |||¡}|dk	rn|sn|snttdƒd|jj	j
i ƒ‚|S )zŽ
        Get a date list by calling `queryset.dates/datetimes()`, checking
        along the way for empty lists that aren't allowed.
        Nz$No %(verbose_name_plural)s availablerm   )rP   ro   ry   rY   Z	datetimesÚdatesr   r   rS   rU   rm   )r   ÚquerysetZ	date_typerk   rN   rv   re   r   r   r   Úget_date_list_  s    zBaseDateListView.get_date_list)Nrz   )r(   r)   r*   r+   rv   rx   ri   rf   rl   rw   ry   r}   r   r   r   r   rc   %  s   	rc   c               @   s   e Zd ZdZdZdd„ ZdS )ÚBaseArchiveIndexViewzQ
    Base class for archives of date-based items. Requires a response mixin.
    Úlatestc             C   s,   |   ¡ }| j|dd�}|s"| ¡ }||i fS )z:Return (date_list, items, extra_context) for this request.ZDESC)rk   )rw   r}   Únone)r   ru   re   r   r   r   rf   }  s
    z$BaseArchiveIndexView.get_dated_itemsN)r(   r)   r*   r+   Zcontext_object_namerf   r   r   r   r   r~   w  s   r~   c               @   s   e Zd ZdZdZdS )ÚArchiveIndexViewz&Top-level archive of date-based items.Z_archiveN)r(   r)   r*   r+   Útemplate_name_suffixr   r   r   r   r�   ˆ  s   r�   c               @   s(   e Zd ZdZdZdZdd„ Zdd„ ZdS )	ÚBaseYearArchiveViewz*List of objects published in a given year.r"   Fc       	      C   s�   |   ¡ }|  ¡ }t||  ¡ ƒ}|  |¡}|  |  |¡¡}d| |d| |i}| jf |Ž}|  |¡}|  ¡ sr| 	¡ }||||  
|¡|  |¡dœfS )z:Return (date_list, items, extra_context) for this request.z%s__gtez%s__lt)r   Z	next_yearZprevious_year)r   rP   Ú_date_from_stringr   r_   r&   rw   r}   Úget_make_object_listr€   r   r    )	r   r   rN   r   r`   ra   Úlookup_kwargsru   re   r   r   r   rf   ’  s    

z#BaseYearArchiveView.get_dated_itemsc             C   s   | j S )zo
        Return `True` if this view should contain the full list of objects in
        the given year.
        )Úmake_object_list)r   r   r   r   r…   ®  s    z(BaseYearArchiveView.get_make_object_listN)r(   r)   r*   r+   rx   r‡   rf   r…   r   r   r   r   rƒ   �  s
   rƒ   c               @   s   e Zd ZdZdZdS )ÚYearArchiveViewz*List of objects published in a given year.Z_archive_yearN)r(   r)   r*   r+   r‚   r   r   r   r   rˆ   ¶  s   rˆ   c               @   s   e Zd ZdZdZdd„ ZdS )ÚBaseMonthArchiveViewz+List of objects published in a given month.r#   c       
      C   s�   |   ¡ }|  ¡ }|  ¡ }t||  ¡ ||  ¡ ƒ}|  |¡}|  |  |¡¡}d| |d| |i}| jf |Ž}|  	|¡}	|	|||  
|¡|  |¡dœfS )z:Return (date_list, items, extra_context) for this request.z%s__gtez%s__lt)r"   Ú
next_monthÚprevious_month)r   r/   rP   r„   r   r.   r_   r3   rw   r}   r0   r1   )
r   r   r"   rN   r   r`   ra   r†   ru   re   r   r   r   rf   ¿  s    


z$BaseMonthArchiveView.get_dated_itemsN)r(   r)   r*   r+   rx   rf   r   r   r   r   r‰   »  s   r‰   c               @   s   e Zd ZdZdZdS )ÚMonthArchiveViewz+List of objects published in a given month.Z_archive_monthN)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 )ÚBaseWeekArchiveViewz*List of objects published in a given week.c             C   sœ   |   ¡ }|  ¡ }|  ¡ }|  ¡ }dddœ| }t||  ¡ |d||ƒ}|  |¡}|  |  |¡¡}d| |d| |i}	| jf |	Ž}
d|
||  	|¡|  
|¡dœfS )	z:Return (date_list, items, extra_context) for this request.Ú1Ú0)z%Wz%Uz%wz%s__gtez%s__ltN)rC   Z	next_weekZprevious_week)r   rD   rP   rB   r„   r   r_   rJ   rw   rE   rF   )r   r   rC   rN   rA   Z
week_startr   r`   ra   r†   ru   r   r   r   rf   á  s&    

z#BaseWeekArchiveView.get_dated_itemsN)r(   r)   r*   r+   rf   r   r   r   r   r�   Þ  s   r�   c               @   s   e Zd ZdZdZdS )ÚWeekArchiveViewz*List of objects published in a given week.Z_archive_weekN)r(   r)   r*   r+   r‚   r   r   r   r   r�      s   r�   c               @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚBaseDayArchiveViewz)List of objects published on a given day.c             C   s@   |   ¡ }|  ¡ }|  ¡ }t||  ¡ ||  ¡ ||  ¡ ƒ}|  |¡S )z:Return (date_list, items, extra_context) for this request.)r   r/   r8   r„   r   r.   r7   Ú_get_dated_items)r   r   r"   r#   r   r   r   r   rf     s    
z"BaseDayArchiveView.get_dated_itemsc          	   C   sD   |   |¡}| jf |Ž}d|||  |¡|  |¡|  |¡|  |¡dœfS )z•
        Do the actual heavy lifting of getting the dated items; this accepts a
        date object so that TodayArchiveView can be trivial.
        N)r#   Zprevious_dayZnext_dayr‹   rŠ   )rb   rw   r:   r9   r1   r0   )r   r   r†   ru   r   r   r   r’     s    
z#BaseDayArchiveView._get_dated_itemsN)r(   r)   r*   r+   rf   r’   r   r   r   r   r‘     s   r‘   c               @   s   e Zd ZdZdZdS )ÚDayArchiveViewz)List of objects published on a given day.Ú_archive_dayN)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 )ÚBaseTodayArchiveViewz List of objects published today.c             C   s   |   tj ¡ ¡S )z:Return (date_list, items, extra_context) for this request.)r’   r<   r   Útoday)r   r   r   r   rf   ,  s    z$BaseTodayArchiveView.get_dated_itemsN)r(   r)   r*   r+   rf   r   r   r   r   r•   )  s   r•   c               @   s   e Zd ZdZdZdS )ÚTodayArchiveViewz List of objects published today.r”   N)r(   r)   r*   r+   r‚   r   r   r   r   r—   1  s   r—   c                   s"   e Zd ZdZd‡ fdd„	Z‡  ZS )ÚBaseDateDetailViewz’
    Detail view of a single object on a single date; this differs from the
    standard DetailView by accepting a year/month/day in the URL.
    Nc                s¤   |   ¡ }|  ¡ }|  ¡ }t||  ¡ ||  ¡ ||  ¡ ƒ}|dkrF|  ¡ n|}|  ¡ s€|t	j
 ¡ kr€ttdƒ|jjj| jjdœ ƒ‚|  |¡}|jf |Ž}tƒ j|d�S )z%Get the object this request displays.NzZFuture %(verbose_name_plural)s not available because %(class_name)s.allow_future is False.)rm   Ú
class_name)r|   )r   r/   r8   r„   r   r.   r7   rT   rR   r<   r   r–   r   r   rS   rU   rm   rO   r(   rb   rn   ÚsuperÚ
get_object)r   r|   r   r"   r#   r   ru   r†   )rO   r   r   r›   ;  s    

zBaseDateDetailView.get_object)N)r(   r)   r*   r+   r›   Ú__classcell__r   r   )rO   r   r˜   6  s   r˜   c               @   s   e Zd ZdZdZdS )ÚDateDetailViewz’
    Detail view of a single object on a single date; this differs from the
    standard DetailView by accepting a year/month/day in the URL.
    Z_detailN)r(   r)   r*   r+   r‚   r   r   r   r   r�   Y  s   r�   Ú Ú__c       	      C   sv   || | | | }t | ƒ| t |ƒ | t |ƒ }ytj ||¡ ¡ S  tk
rp   ttdƒ||dœ ƒ‚Y nX dS )z”
    Get a datetime.date object given a format string and a year, month, and day
    (only year is mandatory). Raise a 404 for an invalid date.
    z;Invalid date string '%(datestr)s' given format '%(format)s')ÚdatestrÚformatN)Ústrr<   Ústrptimer   r%   r   r   )	r   r   r"   r-   r#   r6   Údelimr¡   r    r   r   r   r„   a  s     r„   c             C   sJ  |   ¡ }|  ¡ }|  ¡ }t| d| ƒ}t| d| ƒ}||ƒ||ƒ }	}
|r€|rd||	tjdd� ƒ}n|
}|sv|tƒ krz|S dS nÆ|r d| |  |	¡i}d| }nd| |  |
¡i}|}|sÜ| jrÊt	 
¡ }ntƒ }||d	| < |  ¡ jf |Ž |¡}yt|d
 |ƒ}W n tk
�r   dS X | j�r>tj�r6t	 |¡}| ¡ }||ƒS dS )aV  
    Get the next or the previous valid date. The idea is to allow links on
    month/day views to never be 404s by never providing a date that'll be
    invalid for the given view.

    This is a bit complicated since it handles different intervals of time,
    hence the coupling to generic_view.

    However in essence the logic comes down to:

        * If allow_empty and allow_future are both true, this is easy: just
          return the naive result (just the next/previous day/week/month,
          regardless of object existence.)

        * If allow_empty is true, allow_future is false, and the naive result
          isn't in the future, then return it; otherwise return None.

        * If allow_empty is false and allow_future is true, return the next
          date *that contains a valid object*, even if it's in the future. If
          there are no next objects, return None.

        * If allow_empty is false and allow_future is false, return the next
          date that contains a valid object. If that date is in the future, or
          if there are no next objects, return None.
    z_get_current_%sz_get_next_%sr!   )r;   Nz%s__ltz-%sz%s__gtez%s__lter   )rP   ro   rR   Úgetattrr<   r=   rq   r_   rY   r   rp   rT   rn   Zorder_byÚ
IndexErrorr   r]   Ú	localtimer   )Zgeneric_viewr   r   r   rN   rv   rQ   Zget_currentZget_nextÚstartÚendÚresultrt   rk   rp   ru   r   r   r   r   q  sB    


r   c               C   s   t jrt ¡ S tj ¡ S dS )z1Return the current date in the current time zone.N)r   r]   r   Z	localdater<   r   r–   r   r   r   r   rq   Ë  s    rq   )rž   rž   rž   rž   rŸ   )/r<   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.httpr   Zdjango.utilsr   Zdjango.utils.functionalr   Zdjango.utils.translationr   r   Zdjango.views.generic.baser	   Zdjango.views.generic.detailr
   r   Zdjango.views.generic.listr   r   r   r,   r5   r@   rM   rc   r~   r�   rƒ   rˆ   r‰   rŒ   r�   r�   r‘   r“   r•   r—   r˜   r�   r„   r   rq   r   r   r   r   Ú<module>   sB   14.?@R)"#
Z