summaryrefslogtreecommitdiff
path: root/django/views/generic/date_based.py
diff options
context:
space:
mode:
authorAdrian Holovaty <adrian@holovaty.com>2006-05-02 01:31:56 +0000
committerAdrian Holovaty <adrian@holovaty.com>2006-05-02 01:31:56 +0000
commitf69cf70ed813a8cd7e1f963a14ae39103e8d5265 (patch)
treed3b32e84cd66573b3833ddf662af020f8ef2f7a8 /django/views/generic/date_based.py
parentd5dbeaa9be359a4c794885c2e9f1b5a7e5e51fb8 (diff)
MERGED MAGIC-REMOVAL BRANCH TO TRUNK. This change is highly backwards-incompatible. Please read http://code.djangoproject.com/wiki/RemovingTheMagic for upgrade instructions.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@2809 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django/views/generic/date_based.py')
-rw-r--r--django/views/generic/date_based.py168
1 files changed, 106 insertions, 62 deletions
diff --git a/django/views/generic/date_based.py b/django/views/generic/date_based.py
index 9b9a3034ba..1a6cbc8369 100644
--- a/django/views/generic/date_based.py
+++ b/django/views/generic/date_based.py
@@ -1,44 +1,37 @@
-from django.core.template import loader
-from django.core.exceptions import Http404, ObjectDoesNotExist
-from django.core.extensions import DjangoContext
+from django.template import loader, RequestContext
+from django.core.exceptions import ObjectDoesNotExist
from django.core.xheaders import populate_xheaders
-from django.models import get_module
-from django.utils.httpwrappers import HttpResponse
+from django.http import Http404, HttpResponse
import datetime, time
-def archive_index(request, app_label, module_name, date_field, num_latest=15,
- template_name=None, template_loader=loader, extra_lookup_kwargs={},
+def archive_index(request, queryset, date_field, num_latest=15,
+ template_name=None, template_loader=loader,
extra_context={}, allow_empty=False, context_processors=None):
"""
Generic top-level archive of date-based objects.
- Templates: ``<app_label>/<module_name>_archive``
+ Templates: ``<app_label>/<model_name>_archive.html``
Context:
date_list
List of years
latest
Latest N (defaults to 15) objects by date
"""
- mod = get_module(app_label, module_name)
- lookup_kwargs = {'%s__lte' % date_field: datetime.datetime.now()}
- lookup_kwargs.update(extra_lookup_kwargs)
- date_list = getattr(mod, "get_%s_list" % date_field)('year', **lookup_kwargs)[::-1]
+ model = queryset.model
+ queryset = queryset.filter(**{'%s__lte' % date_field: datetime.datetime.now()})
+ date_list = queryset.dates(date_field, 'year')[::-1]
if not date_list and not allow_empty:
- raise Http404("No %s.%s available" % (app_label, module_name))
+ raise Http404, "No %s available" % model._meta.verbose_name
if date_list and num_latest:
- lookup_kwargs.update({
- 'limit': num_latest,
- 'order_by': ('-' + date_field,),
- })
- latest = mod.get_list(**lookup_kwargs)
+ latest = queryset.order_by('-'+date_field)[:num_latest]
else:
latest = None
if not template_name:
- template_name = "%s/%s_archive" % (app_label, module_name)
+ template_name = "%s/%s_archive.html" % (model._meta.app_label, model._meta.object_name.lower())
t = template_loader.get_template(template_name)
- c = DjangoContext(request, {
+ c = RequestContext(request, {
'date_list' : date_list,
'latest' : latest,
}, context_processors)
@@ -49,33 +42,34 @@ def archive_index(request, app_label, module_name, date_field, num_latest=15,
c[key] = value
return HttpResponse(t.render(c))
-def archive_year(request, year, app_label, module_name, date_field,
- template_name=None, template_loader=loader, extra_lookup_kwargs={},
- extra_context={}, allow_empty=False, context_processors=None):
+def archive_year(request, year, queryset, date_field, template_name=None,
+ template_loader=loader, extra_context={}, allow_empty=False,
+ context_processors=None):
"""
Generic yearly archive view.
- Templates: ``<app_label>/<module_name>_archive_year``
+ Templates: ``<app_label>/<model_name>_archive_year.html``
Context:
date_list
List of months in this year with objects
year
This year
"""
- mod = get_module(app_label, module_name)
+ model = queryset.model
now = datetime.datetime.now()
+
lookup_kwargs = {'%s__year' % date_field: year}
+
# Only bother to check current date if the year isn't in the past.
if int(year) >= now.year:
lookup_kwargs['%s__lte' % date_field] = now
- lookup_kwargs.update(extra_lookup_kwargs)
- date_list = getattr(mod, "get_%s_list" % date_field)('month', **lookup_kwargs)
+ date_list = queryset.filter(**lookup_kwargs).dates(date_field, 'month')
if not date_list and not allow_empty:
raise Http404
if not template_name:
- template_name = "%s/%s_archive_year" % (app_label, module_name)
+ template_name = "%s/%s_archive_year.html" % (model._meta.app_label, model._meta.object_name.lower())
t = template_loader.get_template(template_name)
- c = DjangoContext(request, {
+ c = RequestContext(request, {
'date_list': date_list,
'year': year,
}, context_processors)
@@ -86,14 +80,14 @@ def archive_year(request, year, app_label, module_name, date_field,
c[key] = value
return HttpResponse(t.render(c))
-def archive_month(request, year, month, app_label, module_name, date_field,
+def archive_month(request, year, month, queryset, date_field,
month_format='%b', template_name=None, template_loader=loader,
- extra_lookup_kwargs={}, extra_context={}, allow_empty=False,
- context_processors=None, template_object_name='object'):
+ extra_context={}, allow_empty=False, context_processors=None,
+ template_object_name='object'):
"""
Generic monthly archive view.
- Templates: ``<app_label>/<module_name>_archive_month``
+ Templates: ``<app_label>/<model_name>_archive_month.html``
Context:
month:
(date) this month
@@ -109,8 +103,9 @@ def archive_month(request, year, month, app_label, module_name, date_field,
except ValueError:
raise Http404
- mod = get_module(app_label, module_name)
+ model = queryset.model
now = datetime.datetime.now()
+
# Calculate first and last day of month, for use in a date-range lookup.
first_day = date.replace(day=1)
if first_day.month == 12:
@@ -118,17 +113,17 @@ def archive_month(request, year, month, app_label, module_name, date_field,
else:
last_day = first_day.replace(month=first_day.month + 1)
lookup_kwargs = {'%s__range' % date_field: (first_day, last_day)}
+
# Only bother to check current date if the month isn't in the past.
if last_day >= now.date():
lookup_kwargs['%s__lte' % date_field] = now
- lookup_kwargs.update(extra_lookup_kwargs)
- object_list = mod.get_list(**lookup_kwargs)
+ object_list = queryset.filter(**lookup_kwargs)
if not object_list and not allow_empty:
raise Http404
if not template_name:
- template_name = "%s/%s_archive_month" % (app_label, module_name)
+ template_name = "%s/%s_archive_month.html" % (model._meta.app_label, model._meta.object_name.lower())
t = template_loader.get_template(template_name)
- c = DjangoContext(request, {
+ c = RequestContext(request, {
'%s_list' % template_object_name: object_list,
'month': date,
'next_month': (last_day < datetime.date.today()) and (last_day + datetime.timedelta(days=1)) or None,
@@ -141,14 +136,61 @@ def archive_month(request, year, month, app_label, module_name, date_field,
c[key] = value
return HttpResponse(t.render(c))
-def archive_day(request, year, month, day, app_label, module_name, date_field,
+def archive_week(request, year, week, queryset, date_field,
+ template_name=None, template_loader=loader,
+ extra_context={}, allow_empty=True, context_processors=None,
+ template_object_name='object'):
+ """
+ Generic weekly archive view.
+
+ Templates: ``<app_label>/<model_name>_archive_week.html``
+ Context:
+ week:
+ (date) this week
+ object_list:
+ list of objects published in the given week
+ """
+ try:
+ date = datetime.date(*time.strptime(year+'-0-'+week, '%Y-%w-%U')[:3])
+ except ValueError:
+ raise Http404
+
+ model = queryset.model
+ now = datetime.datetime.now()
+
+ # Calculate first and last day of week, for use in a date-range lookup.
+ first_day = date
+ last_day = date + datetime.timedelta(days=7)
+ lookup_kwargs = {'%s__range' % date_field: (first_day, last_day)}
+
+ # Only bother to check current date if the week isn't in the past.
+ if last_day >= now.date():
+ lookup_kwargs['%s__lte' % date_field] = now
+ object_list = queryset.filter(**lookup_kwargs)
+ if not object_list and not allow_empty:
+ raise Http404
+ if not template_name:
+ template_name = "%s/%s_archive_week.html" % (model._meta.app_label, model._meta.object_name.lower())
+ t = template_loader.get_template(template_name)
+ c = RequestContext(request, {
+ '%s_list' % template_object_name: object_list,
+ 'week': date,
+ })
+ for key, value in extra_context.items():
+ if callable(value):
+ c[key] = value()
+ else:
+ c[key] = value
+ return HttpResponse(t.render(c))
+
+def archive_day(request, year, month, day, queryset, date_field,
month_format='%b', day_format='%d', template_name=None,
- template_loader=loader, extra_lookup_kwargs={}, extra_context={},
- allow_empty=False, context_processors=None, template_object_name='object'):
+ template_loader=loader, extra_context={}, allow_empty=False,
+ context_processors=None, template_object_name='object'):
"""
Generic daily archive view.
- Templates: ``<app_label>/<module_name>_archive_day``
+ Templates: ``<app_label>/<model_name>_archive_day.html``
Context:
object_list:
list of objects published that day
@@ -164,22 +206,23 @@ def archive_day(request, year, month, day, app_label, module_name, date_field,
except ValueError:
raise Http404
- mod = get_module(app_label, module_name)
+ model = queryset.model
now = datetime.datetime.now()
+
lookup_kwargs = {
'%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max)),
}
+
# Only bother to check current date if the date isn't in the past.
if date >= now.date():
lookup_kwargs['%s__lte' % date_field] = now
- lookup_kwargs.update(extra_lookup_kwargs)
- object_list = mod.get_list(**lookup_kwargs)
+ object_list = queryset.filter(**lookup_kwargs)
if not allow_empty and not object_list:
raise Http404
if not template_name:
- template_name = "%s/%s_archive_day" % (app_label, module_name)
+ template_name = "%s/%s_archive_day.html" % (model._meta.app_label, model._meta.object_name.lower())
t = template_loader.get_template(template_name)
- c = DjangoContext(request, {
+ c = RequestContext(request, {
'%s_list' % template_object_name: object_list,
'day': date,
'previous_day': date - datetime.timedelta(days=1),
@@ -204,15 +247,15 @@ def archive_today(request, **kwargs):
})
return archive_day(request, **kwargs)
-def object_detail(request, year, month, day, app_label, module_name, date_field,
+def object_detail(request, year, month, day, queryset, date_field,
month_format='%b', day_format='%d', object_id=None, slug=None,
slug_field=None, template_name=None, template_name_field=None,
- template_loader=loader, extra_lookup_kwargs={}, extra_context={},
- context_processors=None, template_object_name='object'):
+ template_loader=loader, extra_context={}, context_processors=None,
+ template_object_name='object'):
"""
Generic detail view from year/month/day/slug or year/month/day/id structure.
- Templates: ``<app_label>/<module_name>_detail``
+ Templates: ``<app_label>/<model_name>_detail.html``
Context:
object:
the object to be detailed
@@ -222,34 +265,35 @@ def object_detail(request, year, month, day, app_label, module_name, date_field,
except ValueError:
raise Http404
- mod = get_module(app_label, module_name)
+ model = queryset.model
now = datetime.datetime.now()
+
lookup_kwargs = {
'%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max)),
}
+
# Only bother to check current date if the date isn't in the past.
if date >= now.date():
lookup_kwargs['%s__lte' % date_field] = now
if object_id:
- lookup_kwargs['%s__exact' % mod.Klass._meta.pk.name] = object_id
+ lookup_kwargs['%s__exact' % model._meta.pk.name] = object_id
elif slug and slug_field:
lookup_kwargs['%s__exact' % slug_field] = slug
else:
- raise AttributeError("Generic detail view must be called with either an object_id or a slug/slugfield")
- lookup_kwargs.update(extra_lookup_kwargs)
+ raise AttributeError, "Generic detail view must be called with either an object_id or a slug/slugfield"
try:
- object = mod.get_object(**lookup_kwargs)
+ obj = queryset.get(**lookup_kwargs)
except ObjectDoesNotExist:
- raise Http404("%s.%s does not exist for %s" % (app_label, module_name, lookup_kwargs))
+ raise Http404, "No %s found for" % model._meta.verbose_name
if not template_name:
- template_name = "%s/%s_detail" % (app_label, module_name)
+ template_name = "%s/%s_detail.html" % (model._meta.app_label, model._meta.object_name.lower())
if template_name_field:
- template_name_list = [getattr(object, template_name_field), template_name]
+ template_name_list = [getattr(obj, template_name_field), template_name]
t = template_loader.select_template(template_name_list)
else:
t = template_loader.get_template(template_name)
- c = DjangoContext(request, {
- template_object_name: object,
+ c = RequestContext(request, {
+ template_object_name: obj,
}, context_processors)
for key, value in extra_context.items():
if callable(value):
@@ -257,5 +301,5 @@ def object_detail(request, year, month, day, app_label, module_name, date_field,
else:
c[key] = value
response = HttpResponse(t.render(c))
- populate_xheaders(request, response, app_label, module_name, getattr(object, object._meta.pk.name))
+ populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name))
return response