diff options
Diffstat (limited to 'google_appengine/lib/django/django/views/generic/list_detail.py')
-rwxr-xr-x | google_appengine/lib/django/django/views/generic/list_detail.py | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/google_appengine/lib/django/django/views/generic/list_detail.py b/google_appengine/lib/django/django/views/generic/list_detail.py new file mode 100755 index 0000000..16d5520 --- /dev/null +++ b/google_appengine/lib/django/django/views/generic/list_detail.py @@ -0,0 +1,131 @@ +from django.template import loader, RequestContext +from django.http import Http404, HttpResponse +from django.core.xheaders import populate_xheaders +from django.core.paginator import ObjectPaginator, InvalidPage +from django.core.exceptions import ObjectDoesNotExist + +def object_list(request, queryset, paginate_by=None, page=None, + allow_empty=False, template_name=None, template_loader=loader, + extra_context=None, context_processors=None, template_object_name='object', + mimetype=None): + """ + Generic list of objects. + + Templates: ``<app_label>/<model_name>_list.html`` + Context: + object_list + list of objects + is_paginated + are the results paginated? + results_per_page + number of objects per page (if paginated) + has_next + is there a next page? + has_previous + is there a prev page? + page + the current page + next + the next page + previous + the previous page + pages + number of pages, total + hits + number of objects, total + last_on_page + the result number of the last of object in the + object_list (1-indexed) + first_on_page + the result number of the first object in the + object_list (1-indexed) + """ + if extra_context is None: extra_context = {} + queryset = queryset._clone() + if paginate_by: + paginator = ObjectPaginator(queryset, paginate_by) + if not page: + page = request.GET.get('page', 1) + try: + page = int(page) + object_list = paginator.get_page(page - 1) + except (InvalidPage, ValueError): + if page == 1 and allow_empty: + object_list = [] + else: + raise Http404 + c = RequestContext(request, { + '%s_list' % template_object_name: object_list, + 'is_paginated': paginator.pages > 1, + 'results_per_page': paginate_by, + 'has_next': paginator.has_next_page(page - 1), + 'has_previous': paginator.has_previous_page(page - 1), + 'page': page, + 'next': page + 1, + 'previous': page - 1, + 'last_on_page': paginator.last_on_page(page - 1), + 'first_on_page': paginator.first_on_page(page - 1), + 'pages': paginator.pages, + 'hits' : paginator.hits, + }, context_processors) + else: + c = RequestContext(request, { + '%s_list' % template_object_name: queryset, + 'is_paginated': False + }, context_processors) + if not allow_empty and len(queryset) == 0: + raise Http404 + for key, value in extra_context.items(): + if callable(value): + c[key] = value() + else: + c[key] = value + if not template_name: + model = queryset.model + template_name = "%s/%s_list.html" % (model._meta.app_label, model._meta.object_name.lower()) + t = template_loader.get_template(template_name) + return HttpResponse(t.render(c), mimetype=mimetype) + +def object_detail(request, queryset, object_id=None, slug=None, + slug_field=None, template_name=None, template_name_field=None, + template_loader=loader, extra_context=None, + context_processors=None, template_object_name='object', + mimetype=None): + """ + Generic detail of an object. + + Templates: ``<app_label>/<model_name>_detail.html`` + Context: + object + the object + """ + if extra_context is None: extra_context = {} + model = queryset.model + if object_id: + queryset = queryset.filter(pk=object_id) + elif slug and slug_field: + queryset = queryset.filter(**{slug_field: slug}) + else: + raise AttributeError, "Generic detail view must be called with either an object_id or a slug/slug_field." + try: + obj = queryset.get() + except ObjectDoesNotExist: + raise Http404, "No %s found matching the query" % (model._meta.verbose_name) + if not template_name: + template_name = "%s/%s_detail.html" % (model._meta.app_label, model._meta.object_name.lower()) + if template_name_field: + 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 = RequestContext(request, { + template_object_name: obj, + }, context_processors) + for key, value in extra_context.items(): + if callable(value): + c[key] = value() + else: + c[key] = value + response = HttpResponse(t.render(c), mimetype=mimetype) + populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name)) + return response |