diff options
| author | Adrian Holovaty <adrian@holovaty.com> | 2006-05-02 01:31:56 +0000 |
|---|---|---|
| committer | Adrian Holovaty <adrian@holovaty.com> | 2006-05-02 01:31:56 +0000 |
| commit | f69cf70ed813a8cd7e1f963a14ae39103e8d5265 (patch) | |
| tree | d3b32e84cd66573b3833ddf662af020f8ef2f7a8 /django/views/generic/date_based.py | |
| parent | d5dbeaa9be359a4c794885c2e9f1b5a7e5e51fb8 (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.py | 168 |
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 |
