
^Q\e                 @   s  d  d l  m Z 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 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 Gd d   d e  Z Gd d   d e  Z Gd d   d e  Z  Gd d   d e  Z! Gd d   d e  Z" Gd d   d e e" e  Z# Gd d   d e#  Z$ Gd d   d e e$  Z% Gd d   d e e#  Z& Gd  d!   d! e e&  Z' Gd" d#   d# e e e#  Z( Gd$ d%   d% e e(  Z) Gd& d'   d' e e! e#  Z* Gd( d)   d) e e*  Z+ Gd* d+   d+ e e e  e#  Z, Gd, d-   d- e e,  Z- Gd. d/   d/ e,  Z. Gd0 d1   d1 e e.  Z/ Gd2 d3   d3 e e e  e" e  Z0 Gd4 d5   d5 e e0  Z1 d6 d6 d6 d6 d7 d8 d9  Z2 d: d;   Z3 d< d=   Z4 d S)>    )unicode_literalsN)settings)ImproperlyConfigured)models)Http404)timezone)	force_str
force_text)cached_property)ugettext)View)BaseDetailView!SingleObjectTemplateResponseMixin)MultipleObjectMixin#MultipleObjectTemplateResponseMixinc               @   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   Z d S)	YearMixinz7
    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   @/var/www/dbchiro/venv/build/Django/django/views/generic/dates.pyget_year_format   s    zYearMixin.get_year_formatc             C   s}   |  j  } | d k ry y |  j d } Wqy t k
 ru y |  j j d } Wn$ t k
 rp t t d    Yn XYqy Xn  | S)zJ
        Return 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 d S)z*
        Get the next valid year.
        is_previousFperiodr   )_get_next_prev)r   dater   r   r   get_next_year3   s    zYearMixin.get_next_yearc             C   s   t  |  | d d d d S)z.
        Get the previous valid year.
        r   Tr   r   )r    )r   r!   r   r   r   get_previous_year9   s    zYearMixin.get_previous_yearc             C   sR   y' | j  d | j d d d d d  SWn$ t k
 rM t t d    Yn Xd 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_year?   s    'zYearMixin._get_next_yearc             C   s   | j  d d d d  S)z@
        Return the start date of the current interval.
        r%   r$   r&   )r'   )r   r!   r   r   r   _get_current_yearJ   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               @   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   Z d S)
MonthMixinz8
    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_formatX   s    zMonthMixin.get_month_formatc             C   s}   |  j  } | d k ry y |  j d } Wqy t k
 ru y |  j j d } Wn$ t k
 rp t t d    Yn XYqy Xn  | S)zK
        Return 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_month_   s    	zMonthMixin.get_monthc             C   s   t  |  | d d d d S)z+
        Get the next valid month.
        r   Fr   r%   )r    )r   r!   r   r   r   get_next_monthn   s    zMonthMixin.get_next_monthc             C   s   t  |  | d d d d S)z/
        Get the previous valid month.
        r   Tr   r%   )r    )r   r!   r   r   r   get_previous_montht   s    zMonthMixin.get_previous_monthc             C   s   | j  d k r` y' | j d | j d d d d d  SWq} t k
 r\ t t d    Yq} Xn | j d | j  d d d  Sd 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 rangeN)r%   r'   r   r(   r   r   )r   r!   r   r   r   _get_next_monthz   s    'zMonthMixin._get_next_monthc             C   s   | j  d d  S)zA
        Return the start date of the previous interval.
        r&   r$   )r'   )r   r!   r   r   r   _get_current_month   s    zMonthMixin._get_current_month)r+   r,   r-   r.   r0   r%   r1   r2   r3   r4   r6   r7   r   r   r   r   r/   Q   s   r/   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   Z d S)DayMixinz6
    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   s}   |  j  } | d k ry y |  j d } Wqy t k
 ru y |  j j d } Wn$ t k
 rp t t d    Yn XYqy Xn  | S)zI
        Return 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 d S)z)
        Get the next valid day.
        r   Fr   r&   )r    )r   r!   r   r   r   get_next_day   s    zDayMixin.get_next_dayc             C   s   t  |  | d d d d S)z-
        Get the previous valid day.
        r   Tr   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.
        daysr$   )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.   r9   r&   r:   r;   r<   r=   rA   rB   r   r   r   r   r8      s   r8   c               @   sv   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)	WeekMixinz7
    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   s}   |  j  } | d k ry y |  j d } Wqy t k
 ru y |  j j d } Wn$ t k
 rp t t d    Yn XYqy Xn  | S)zI
        Return the week for which this view should display data
        NweekzNo week specified)rF   r   r   r   r   r   r   )r   rF   r   r   r   get_week   s    	zWeekMixin.get_weekc             C   s   t  |  | d d d d S)z*
        Get the next valid week.
        r   Fr   rF   )r    )r   r!   r   r   r   get_next_week   s    zWeekMixin.get_next_weekc             C   s   t  |  | d d d d S)z.
        Get the previous valid week.
        r   Tr   rF   )r    )r   r!   r   r   r   get_previous_week   s    zWeekMixin.get_previous_weekc             C   sP   y% | t  j d d |  j |   SWn$ t k
 rK t t d    Yn Xd 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  j |  j |   S)z@
        Return the start date of the current interval.
        )r?   r@   rK   )r   r!   r   r   r   _get_current_week   s    zWeekMixin._get_current_weekc             C   sT   |  j    } | d k r" | j   S| d k r@ | j   d d St 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$   rJ   zunknown week format: %sN)rE   weekdayr(   )r   r!   rD   r   r   r   rK     s    
zWeekMixin._get_weekday)r+   r,   r-   r.   rD   rF   rE   rG   rH   rI   rM   rN   rK   r   r   r   r   rC      s   rC   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)	DateMixinz=
    Mixin class for views manipulating date-based data.
    NFc             C   s/   |  j  d k r( t d |  j j   n  |  j  S)zI
        Get 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)zj
        Returns `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   sO   |  j  d k r |  j   j  n |  j  } | j 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_fieldrS   
isinstancer   ZDateTimeField)r   rV   fieldr   r   r   uses_datetime_field)  s    'zDateMixin.uses_datetime_fieldc             C   sO   |  j  rK t j j | t j j  } t j rK t j | t j	    } qK n  | 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.
        )
r\   r?   combinetimeminr   USE_TZr   Z
make_awareZget_current_timezone)r   valuer   r   r   _make_date_lookup_arg3  s
    		zDateMixin._make_date_lookup_argc             C   sl   |  j    } |  j r] |  j |  } |  j | t j d d   } i | d | 6| d | 6Si | | 6Sd 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)rS   r\   rb   r?   r@   )r   r!   rQ   sinceuntilr   r   r   _make_single_date_lookup@  s    	z"DateMixin._make_single_date_lookup)r+   r,   r-   r.   rQ   rT   rS   rU   r
   r\   rb   re   r   r   r   r   rP     s   

rP   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 d d  Z d S)BaseDateListViewzP
    Abstract base class for date-based views displaying a list of objects.
    Fr   c             O   sS   |  j    \ |  _ |  _ } |  j d |  j d |  j  } | j |  |  j |  S)Nobject_list	date_list)get_dated_itemsrh   rg   Zget_context_dataupdateZrender_to_response)r   r   argsr   Zextra_contextcontextr   r   r   get[  s
    zBaseDateListView.getc             C   s   t  d   d S)z5
        Obtain the list of dates and items.
        z>A DateView must provide an implementation of get_dated_items()N)NotImplementedError)r   r   r   r   ri   b  s    z BaseDateListView.get_dated_itemsc             C   s$   |  j  d k r d |  j   S|  j  S)zw
        Returns the field or fields to use for ordering the queryset; uses the
        date field by default.
        Nz-%s)orderingrS   )r   r   r   r   get_orderingh  s    zBaseDateListView.get_orderingc       	      K   s   |  j    j |   } |  j   } |  j   } |  j   } |  j |  } | s |  j rc t j   n t	   } | j i | d | 6  } n  | s | d k r t
 |  d k n
 | j   } | r t t d  i t | j j j  d 6  q n  | 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)rW   filterrS   rU   get_allow_emptyZget_paginate_byr\   r   nowtimezone_todaylenexistsr   r   r	   rV   rX   rq   )	r   lookupqsrQ   rT   allow_emptyZpaginate_byrt   Zis_emptyr   r   r   get_dated_queryseto  s    +#z#BaseDateListView.get_dated_querysetc             C   s   |  j  S)z^
        Get the aggregation period for the list of dates: 'year', 'month', or 'day'.
        )date_list_period)r   r   r   r   get_date_list_period  s    z%BaseDateListView.get_date_list_periodNZASCc             C   s   |  j    } |  j   } | d k r3 |  j   } n  |  j rT | j | | |  } n | j | | |  } | d k	 r | r | r t | j j j	  } t
 t d  i | d 6  n  | 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 availablerq   )rS   rs   r}   r\   Z	datetimesdatesr	   rV   rX   rq   r   r   )r   querysetZ	date_typero   rQ   rz   rh   namer   r   r   get_date_list  s    	zBaseDateListView.get_date_list)r+   r,   r-   r.   rz   r|   rm   ri   rp   r{   r}   r   r   r   r   r   rf   T  s   rf   c               @   s(   e  Z d  Z d Z d Z d d   Z d S)BaseArchiveIndexViewzV
    Base class for archives of date-based items.

    Requires a response mixin.
    latestc             C   sC   |  j    } |  j | d d } | s6 | j   } n  | | i  f S)zL
        Return (date_list, items, extra_context) for this request.
        ro   ZDESC)r{   r   none)r   ry   rh   r   r   r   ri     s
    z$BaseArchiveIndexView.get_dated_itemsN)r+   r,   r-   r.   Zcontext_object_nameri   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d Z d S)ArchiveIndexViewz0
    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)	BaseYearArchiveViewz4
    List of objects published in a given year.
    r%   Fc       	      C   s   |  j    } |  j   } t | |  j    } |  j |  } |  j |  j |   } i | d | 6| d | 6} |  j |   } |  j |  } |  j   s | j	   } n  | | i | d 6|  j
 |  d 6|  j |  d 6f S)zL
        Return (date_list, items, extra_context) for this request.
        z%s__gtez%s__ltr   Z	next_yearZprevious_year)r   rS   _date_from_stringr   rb   r)   r{   r   get_make_object_listr   r"   r#   )	r   r   rQ   r!   rc   rd   lookup_kwargsry   rh   r   r   r   ri     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.   r|   r   ri   r   r   r   r   r   r     s
   r   c               @   s   e  Z d  Z d Z d Z d S)YearArchiveViewz4
    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)BaseMonthArchiveViewz5
    List of objects published in a given month.
    r&   c       
      C   s   |  j    } |  j   } |  j   } t | |  j   | |  j    } |  j |  } |  j |  j |   } i | d | 6| d | 6} |  j |   } |  j	 |  }	 |	 | i | d 6|  j
 |  d 6|  j |  d 6f S)zL
        Return (date_list, items, extra_context) for this request.
        z%s__gtez%s__ltr%   
next_monthprevious_month)r   r2   rS   r   r   r1   rb   r6   r{   r   r3   r4   )
r   r   r%   rQ   r!   rc   rd   r   ry   rh   r   r   r   ri     s     	z$BaseMonthArchiveView.get_dated_itemsN)r+   r,   r-   r.   r|   ri   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d Z d S)MonthArchiveViewz5
    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)BaseWeekArchiveViewz4
    List of objects published in a given week.
    c             C   s   |  j    } |  j   } |  j   } |  j   } i d d 6d d 6| } t | |  j   | d | |  } |  j |  } |  j |  j |   } i | d | 6| d | 6}	 |  j |	   }
 d |
 i | d	 6|  j	 |  d
 6|  j
 |  d 6f S)zL
        Return (date_list, items, extra_context) for this request.
        1z%W0z%Uz%wz%s__gtez%s__ltNrF   Z	next_weekZprevious_week)r   rG   rS   rE   r   r   rb   rM   r{   rH   rI   )r   r   rF   rQ   rD   Z
week_startr!   rc   rd   r   ry   r   r   r   ri   #  s*    	z#BaseWeekArchiveView.get_dated_itemsN)r+   r,   r-   r.   ri   r   r   r   r   r     s   r   c               @   s   e  Z d  Z d Z d Z d S)WeekArchiveViewz4
    List of objects published in a given week.
    Z_archive_weekN)r+   r,   r-   r.   r   r   r   r   r   r   D  s   r   c               @   s.   e  Z d  Z d Z d d   Z d d   Z d S)BaseDayArchiveViewz3
    List of objects published on a given day.
    c             C   s^   |  j    } |  j   } |  j   } t | |  j   | |  j   | |  j    } |  j |  S)zL
        Return (date_list, items, extra_context) for this request.
        )r   r2   r;   r   r   r1   r:   _get_dated_items)r   r   r%   r&   r!   r   r   r   ri   O  s    z"BaseDayArchiveView.get_dated_itemsc             C   sr   |  j  |  } |  j |   } d | i | d 6|  j |  d 6|  j |  d 6|  j |  d 6|  j |  d 6f S)z
        Do the actual heavy lifting of getting the dated items; this accepts a
        date object so that TodayArchiveView can be trivial.
        Nr&   Zprevious_dayZnext_dayr   r   )re   r{   r=   r<   r4   r3   )r   r!   r   ry   r   r   r   r   ]  s    	z#BaseDayArchiveView._get_dated_itemsN)r+   r,   r-   r.   ri   r   r   r   r   r   r   K  s   r   c               @   s   e  Z d  Z d Z d Z d S)DayArchiveViewz3
    List of objects published on a given day.
    _archive_dayN)r+   r,   r-   r.   r   r   r   r   r   r   n  s   r   c               @   s"   e  Z d  Z d Z d d   Z d S)BaseTodayArchiveViewz*
    List of objects published today.
    c             C   s   |  j  t j j    S)zL
        Return (date_list, items, extra_context) for this request.
        )r   r?   r!   today)r   r   r   r   ri   z  s    z$BaseTodayArchiveView.get_dated_itemsN)r+   r,   r-   r.   ri   r   r   r   r   r   u  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     s   r   c                   s+   e  Z d  Z d Z d   f d d  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   |  j    } |  j   } |  j   } t | |  j   | |  j   | |  j    } | d k ri |  j   n | } |  j   r | t	 j
 j   k r t t d  i | j j j d 6|  j j d 6  n  |  j |  } | j |   } t t |   j d |  S)z7
        Get the object this request displays.
        NzZFuture %(verbose_name_plural)s not available because %(class_name)s.allow_future is False.rq   
class_namer   )r   r2   r;   r   r   r1   r:   rW   rU   r?   r!   r   r   r   rV   rX   rq   rR   r+   re   rr   superr   
get_object)r   r   r   r%   r&   r!   ry   r   )rR   r   r   r     s     "zBaseDateDetailView.get_object)r+   r,   r-   r.   r   r   r   )rR   r   r     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     s   r    __c       	      C   s   | j  | | | f  } | j  |  | | f  } y# t j j t |  |  j   SWn6 t k
 r t t d  i | d 6| d 6  Yn Xd S)z
    Helper: 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)joinr?   strptimer   r!   r(   r   r   )	r   r   r%   r0   r&   r9   delimr   r   r   r   r   r     s    #r   c             C   s  |  j    } |  j   } |  j   } t |  d |  } t |  d |  } | |  | |  }	 }
 | r | r | |	 t j d d   } n |
 } | s | t   k r | Sd Sn| r i |  j |	  d | 6} d | } n  i |  j |
  d | 6} | } | s9|  j rt	 j
   } n	 t   } | | d	 | <n  |  j   j |   j |  } y t | d
 |  } Wn t k
 rd SYn X|  j rt j rt	 j |  } n  | j   } n  | |  Sd S)a^  
    Helper: 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   )rS   rs   rU   getattrr?   r@   ru   rb   r\   r   rt   rW   rr   Zorder_by
IndexErrorr   r`   	localtimer!   )Zgeneric_viewr!   r   r   rQ   rz   rT   Zget_currentZget_nextstartendresultrx   ro   rt   ry   r   r   r   r      sB    					r    c               C   s$   t  j r t j   St j j   Sd S)z;
    Return the current date in the current time zone.
    N)r   r`   r   Z	localdater?   r!   r   r   r   r   r   ru     s    	
ru   )5
__future__r   r?   Zdjango.confr   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.httpr   Zdjango.utilsr   Zdjango.utils.encodingr   r	   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   objectr   r/   r8   rC   rP   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    ru   r   r   r   r   <module>   sF   ;>8IDQ-"&#"%Z