diff options
Diffstat (limited to 'django/views')
| -rw-r--r-- | django/views/auth/__init__.py | 0 | ||||
| -rw-r--r-- | django/views/auth/login.py | 49 | ||||
| -rw-r--r-- | django/views/debug.py | 10 | ||||
| -rw-r--r-- | django/views/decorators/auth.py | 23 | ||||
| -rw-r--r-- | django/views/decorators/cache.py | 12 | ||||
| -rw-r--r-- | django/views/decorators/http.py | 2 | ||||
| -rw-r--r-- | django/views/defaults.py | 82 | ||||
| -rw-r--r-- | django/views/generic/create_update.py | 81 | ||||
| -rw-r--r-- | django/views/generic/date_based.py | 168 | ||||
| -rw-r--r-- | django/views/generic/list_detail.py | 61 | ||||
| -rw-r--r-- | django/views/generic/simple.py | 7 | ||||
| -rw-r--r-- | django/views/i18n.py | 6 | ||||
| -rw-r--r-- | django/views/registration/__init__.py | 0 | ||||
| -rw-r--r-- | django/views/registration/passwords.py | 100 | ||||
| -rw-r--r-- | django/views/static.py | 15 |
15 files changed, 253 insertions, 363 deletions
diff --git a/django/views/auth/__init__.py b/django/views/auth/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 --- a/django/views/auth/__init__.py +++ /dev/null diff --git a/django/views/auth/login.py b/django/views/auth/login.py deleted file mode 100644 index 3f2bd43015..0000000000 --- a/django/views/auth/login.py +++ /dev/null @@ -1,49 +0,0 @@ -from django.parts.auth.formfields import AuthenticationForm -from django.core import formfields -from django.core.extensions import DjangoContext, render_to_response -from django.models.auth import users -from django.models.core import sites -from django.utils.httpwrappers import HttpResponse, HttpResponseRedirect - -REDIRECT_FIELD_NAME = 'next' -LOGIN_URL = '/accounts/login/' - -def login(request): - "Displays the login form and handles the login action." - manipulator = AuthenticationForm(request) - redirect_to = request.REQUEST.get(REDIRECT_FIELD_NAME, '') - if request.POST: - errors = manipulator.get_validation_errors(request.POST) - if not errors: - # Light security check -- make sure redirect_to isn't garbage. - if not redirect_to or '://' in redirect_to or ' ' in redirect_to: - redirect_to = '/accounts/profile/' - request.session[users.SESSION_KEY] = manipulator.get_user_id() - request.session.delete_test_cookie() - return HttpResponseRedirect(redirect_to) - else: - errors = {} - request.session.set_test_cookie() - return render_to_response('registration/login', { - 'form': formfields.FormWrapper(manipulator, request.POST, errors), - REDIRECT_FIELD_NAME: redirect_to, - 'site_name': sites.get_current().name, - }, context_instance=DjangoContext(request)) - -def logout(request, next_page=None): - "Logs out the user and displays 'You are logged out' message." - try: - del request.session[users.SESSION_KEY] - except KeyError: - return render_to_response('registration/logged_out', context_instance=DjangoContext(request)) - else: - # Redirect to this page until the session has been cleared. - return HttpResponseRedirect(next_page or request.path) - -def logout_then_login(request, login_url=LOGIN_URL): - "Logs out the user if he is logged in. Then redirects to the log-in page." - return logout(request, login_url) - -def redirect_to_login(next, login_url=LOGIN_URL): - "Redirects the user to the login page, passing the given 'next' page" - return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, next)) diff --git a/django/views/debug.py b/django/views/debug.py index b08a56a524..aa0a93b863 100644 --- a/django/views/debug.py +++ b/django/views/debug.py @@ -1,7 +1,7 @@ from django.conf import settings -from django.core.template import Template, Context, TemplateDoesNotExist +from django.template import Template, Context, TemplateDoesNotExist from django.utils.html import escape -from django.utils.httpwrappers import HttpResponseServerError, HttpResponseNotFound +from django.http import HttpResponseServerError, HttpResponseNotFound import os, re from itertools import count, izip from os.path import dirname, join as pathjoin @@ -72,7 +72,7 @@ def technical_500_response(request, exc_type, exc_value, tb): template_does_not_exist = False loader_debug_info = None if issubclass(exc_type, TemplateDoesNotExist): - from django.core.template.loader import template_source_loaders + from django.template.loader import template_source_loaders template_does_not_exist = True loader_debug_info = [] for loader in template_source_loaders: @@ -641,8 +641,8 @@ EMPTY_URLCONF_TEMPLATE = """ <div id="instructions"> <p>Of course, you haven't actually done any work yet. Here's what to do next:</p> <ul> - <li>Edit the <code>DATABASE_*</code> settings in <code>{{ project_name }}/settings.py</code>.</li> - <li>Start your first app by running <code>{{ project_name }}/manage.py startapp [appname]</code>.</li> + <li>If you plan to use a database, edit the <code>DATABASE_*</code> settings in <code>{{ project_name }}/settings.py</code>.</li> + <li>Start your first app by running <code>python {{ project_name }}/manage.py startapp [appname]</code>.</li> </ul> </div> diff --git a/django/views/decorators/auth.py b/django/views/decorators/auth.py deleted file mode 100644 index 478f0ac84d..0000000000 --- a/django/views/decorators/auth.py +++ /dev/null @@ -1,23 +0,0 @@ -from django.views.auth import login - -def user_passes_test(test_func, login_url=login.LOGIN_URL): - """ - Decorator for views that checks that the user passes the given test, - redirecting to the log-in page if necessary. The test should be a callable - that takes the user object and returns True if the user passes. - """ - def _dec(view_func): - def _checklogin(request, *args, **kwargs): - if test_func(request.user): - return view_func(request, *args, **kwargs) - return login.redirect_to_login(request.path, login_url) - return _checklogin - return _dec - -login_required = user_passes_test(lambda u: not u.is_anonymous()) -login_required.__doc__ = ( - """ - Decorator for views that checks that the user is logged in, redirecting - to the log-in page if necessary. - """ - ) diff --git a/django/views/decorators/cache.py b/django/views/decorators/cache.py index f86372cf4e..5467ff501e 100644 --- a/django/views/decorators/cache.py +++ b/django/views/decorators/cache.py @@ -13,7 +13,7 @@ account on caching -- just like the middleware does. import re from django.utils.decorators import decorator_from_middleware -from django.utils.cache import patch_cache_control +from django.utils.cache import patch_cache_control, add_never_cache_headers from django.middleware.cache import CacheMiddleware cache_page = decorator_from_middleware(CacheMiddleware) @@ -31,3 +31,13 @@ def cache_control(**kwargs): return _cache_controller +def never_cache(view_func): + """ + Decorator that adds headers to a response so that it will + never be cached. + """ + def _wrapped_view_func(request, *args, **kwargs): + response = view_func(request, *args, **kwargs) + add_never_cache_headers(response) + return response + return _wrapped_view_func diff --git a/django/views/decorators/http.py b/django/views/decorators/http.py index b9b6bac757..a15e82fcc7 100644 --- a/django/views/decorators/http.py +++ b/django/views/decorators/http.py @@ -4,7 +4,7 @@ Decorators for views based on HTTP headers. from django.utils.decorators import decorator_from_middleware from django.middleware.http import ConditionalGetMiddleware -from django.utils.httpwrappers import HttpResponseForbidden +from django.http import HttpResponseForbidden conditional_page = decorator_from_middleware(ConditionalGetMiddleware) diff --git a/django/views/defaults.py b/django/views/defaults.py index 95c18b4263..d5460a7495 100644 --- a/django/views/defaults.py +++ b/django/views/defaults.py @@ -1,69 +1,89 @@ -from django.core.exceptions import Http404, ObjectDoesNotExist -from django.core.template import Context, loader -from django.models.core import sites, contenttypes -from django.utils import httpwrappers +from django.core.exceptions import ObjectDoesNotExist +from django.template import Context, loader +from django.contrib.contenttypes.models import ContentType +from django.contrib.sites.models import Site +from django import http def shortcut(request, content_type_id, object_id): "Redirect to an object's page based on a content-type ID and an object ID." # Look up the object, making sure it's got a get_absolute_url() function. try: - content_type = contenttypes.get_object(pk=content_type_id) + content_type = ContentType.objects.get(pk=content_type_id) obj = content_type.get_object_for_this_type(pk=object_id) except ObjectDoesNotExist: - raise Http404, "Content type %s object %s doesn't exist" % (content_type_id, object_id) + raise http.Http404, "Content type %s object %s doesn't exist" % (content_type_id, object_id) try: absurl = obj.get_absolute_url() except AttributeError: - raise Http404, "%s objects don't have get_absolute_url() methods" % content_type.name + raise http.Http404, "%s objects don't have get_absolute_url() methods" % content_type.name # Try to figure out the object's domain, so we can do a cross-site redirect # if necessary. # If the object actually defines a domain, we're done. if absurl.startswith('http://'): - return httpwrappers.HttpResponseRedirect(absurl) + return http.HttpResponseRedirect(absurl) object_domain = None - # Next, look for an many-to-many relationship to sites - if hasattr(obj, 'get_site_list'): - site_list = obj.get_site_list() - if site_list: - object_domain = site_list[0].domain + # Otherwise, we need to introspect the object's relationships for a + # relation to the Site object + opts = obj._meta - # Next, look for a many-to-one relationship to sites - elif hasattr(obj, 'get_site'): + # First, look for an many-to-many relationship to sites + for field in opts.many_to_many: + if field.rel.to is Site: + try: + object_domain = getattr(obj, field.name).all()[0].domain + except Site.DoesNotExist: + pass + if object_domain is not None: + break + + # Next look for a many-to-one relationship to site + if object_domain is None: + for field in obj._meta.fields: + if field.rel and field.rel.to is Site: + try: + object_domain = getattr(obj, field.name).domain + except Site.DoesNotExist: + pass + if object_domain is not None: + break + + # Fall back to the current site (if possible) + if object_domain is None: try: - object_domain = obj.get_site().domain - except sites.SiteDoesNotExist: + object_domain = Site.objects.get_current().domain + except Site.DoesNotExist: pass - # Then, fall back to the current site (if possible) + # If all that malarkey found an object domain, use it; otherwise fall back + # to whatever get_absolute_url() returned. + if object_domain is not None: + return http.HttpResponseRedirect('http://%s%s' % (object_domain, absurl)) else: - try: - object_domain = sites.get_current().domain - except sites.SiteDoesNotExist: - # Finally, give up and use a URL without the domain name - return httpwrappers.HttpResponseRedirect(obj.get_absolute_url()) - return httpwrappers.HttpResponseRedirect('http://%s%s' % (object_domain, obj.get_absolute_url())) + return http.HttpResponseRedirect(absurl) -def page_not_found(request, template_name='404'): +def page_not_found(request, template_name='404.html'): """ Default 404 handler, which looks for the requested URL in the redirects table, redirects if found, and displays 404 page if not redirected. - Templates: `404` - Context: None + Templates: `404.html` + Context: + request_path + The path of the requested URL (e.g., '/app/pages/bad_page/') """ t = loader.get_template(template_name) - return httpwrappers.HttpResponseNotFound(t.render(Context())) + return http.HttpResponseNotFound(t.render(Context({'request_path': request.path}))) -def server_error(request, template_name='500'): +def server_error(request, template_name='500.html'): """ 500 error handler. - Templates: `500` + Templates: `500.html` Context: None """ t = loader.get_template(template_name) - return httpwrappers.HttpResponseServerError(t.render(Context())) + return http.HttpResponseServerError(t.render(Context())) diff --git a/django/views/generic/create_update.py b/django/views/generic/create_update.py index e9b552df3b..0605744e3d 100644 --- a/django/views/generic/create_update.py +++ b/django/views/generic/create_update.py @@ -1,20 +1,20 @@ -from django import models from django.core.xheaders import populate_xheaders -from django.core.template import loader -from django.core import formfields, meta -from django.views.auth.login import redirect_to_login -from django.core.extensions import DjangoContext +from django.template import loader +from django import forms +from django.db.models import FileField +from django.contrib.auth.views import redirect_to_login +from django.template import RequestContext from django.core.paginator import ObjectPaginator, InvalidPage -from django.utils.httpwrappers import HttpResponse, HttpResponseRedirect -from django.core.exceptions import Http404, ObjectDoesNotExist, ImproperlyConfigured +from django.http import Http404, HttpResponse, HttpResponseRedirect +from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured -def create_object(request, app_label, module_name, template_name=None, +def create_object(request, model, template_name=None, template_loader=loader, extra_context={}, post_save_redirect=None, login_required=False, follow=None, context_processors=None): """ Generic object-creation function. - Templates: ``<app_label>/<module_name>_form`` + Templates: ``<app_label>/<model_name>_form.html`` Context: form the form wrapper for the object @@ -22,13 +22,12 @@ def create_object(request, app_label, module_name, template_name=None, if login_required and request.user.is_anonymous(): return redirect_to_login(request.path) - mod = models.get_module(app_label, module_name) - manipulator = mod.AddManipulator(follow=follow) + manipulator = model.AddManipulator(follow=follow) if request.POST: # If data was POSTed, we're trying to create a new object new_data = request.POST.copy() - if mod.Klass._meta.has_field_type(meta.FileField): + if model._meta.has_field_type(FileField): new_data.update(request.FILES) # Check for errors @@ -40,7 +39,7 @@ def create_object(request, app_label, module_name, template_name=None, new_object = manipulator.save(new_data) if not request.user.is_anonymous(): - request.user.add_message("The %s was created successfully." % mod.Klass._meta.verbose_name) + request.user.message_set.create(message="The %s was created successfully." % model._meta.verbose_name) # Redirect to the new object: first by trying post_save_redirect, # then by obj.get_absolute_url; fail if neither works. @@ -56,11 +55,11 @@ def create_object(request, app_label, module_name, template_name=None, new_data = manipulator.flatten_data() # Create the FormWrapper, template, context, response - form = formfields.FormWrapper(manipulator, new_data, errors) + form = forms.FormWrapper(manipulator, new_data, errors) if not template_name: - template_name = "%s/%s_form" % (app_label, module_name) + template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower()) t = template_loader.get_template(template_name) - c = DjangoContext(request, { + c = RequestContext(request, { 'form': form, }, context_processors) for key, value in extra_context.items(): @@ -70,15 +69,15 @@ def create_object(request, app_label, module_name, template_name=None, c[key] = value return HttpResponse(t.render(c)) -def update_object(request, app_label, module_name, object_id=None, slug=None, +def update_object(request, model, object_id=None, slug=None, slug_field=None, template_name=None, template_loader=loader, - extra_lookup_kwargs={}, extra_context={}, post_save_redirect=None, + extra_context={}, post_save_redirect=None, login_required=False, follow=None, context_processors=None, template_object_name='object'): """ Generic object-update function. - Templates: ``<app_label>/<module_name>_form`` + Templates: ``<app_label>/<model_name>_form.html`` Context: form the form wrapper for the object @@ -88,23 +87,20 @@ def update_object(request, app_label, module_name, object_id=None, slug=None, if login_required and request.user.is_anonymous(): return redirect_to_login(request.path) - mod = models.get_module(app_label, module_name) - # Look up the object to be edited lookup_kwargs = {} 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 edit view must be called with either an object_id or a slug/slug_field") - lookup_kwargs.update(extra_lookup_kwargs) try: - object = mod.get_object(**lookup_kwargs) + object = model.objects.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 %s" % (model._meta.verbose_name, lookup_kwargs) - manipulator = mod.ChangeManipulator(object.id, follow=follow) + manipulator = model.ChangeManipulator(getattr(object, object._meta.pk.name), follow=follow) if request.POST: new_data = request.POST.copy() @@ -114,7 +110,7 @@ def update_object(request, app_label, module_name, object_id=None, slug=None, manipulator.save(new_data) if not request.user.is_anonymous(): - request.user.add_message("The %s was updated successfully." % mod.Klass._meta.verbose_name) + request.user.message_set.create(message="The %s was updated successfully." % model._meta.verbose_name) # Do a post-after-redirect so that reload works, etc. if post_save_redirect: @@ -128,11 +124,11 @@ def update_object(request, app_label, module_name, object_id=None, slug=None, # This makes sure the form acurate represents the fields of the place. new_data = manipulator.flatten_data() - form = formfields.FormWrapper(manipulator, new_data, errors) + form = forms.FormWrapper(manipulator, new_data, errors) if not template_name: - template_name = "%s/%s_form" % (app_label, module_name) + template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower()) t = template_loader.get_template(template_name) - c = DjangoContext(request, { + c = RequestContext(request, { 'form': form, template_object_name: object, }, context_processors) @@ -142,12 +138,12 @@ def update_object(request, app_label, module_name, object_id=None, slug=None, 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(object, object._meta.pk.name)) return response -def delete_object(request, app_label, module_name, post_delete_redirect, +def delete_object(request, model, post_delete_redirect, object_id=None, slug=None, slug_field=None, template_name=None, - template_loader=loader, extra_lookup_kwargs={}, extra_context={}, + template_loader=loader, extra_context={}, login_required=False, context_processors=None, template_object_name='object'): """ Generic object-delete function. @@ -156,7 +152,7 @@ def delete_object(request, app_label, module_name, post_delete_redirect, fetched using GET; for safty, deletion will only be performed if this view is POSTed. - Templates: ``<app_label>/<module_name>_confirm_delete`` + Templates: ``<app_label>/<model_name>_confirm_delete.html`` Context: object the original object being deleted @@ -164,32 +160,29 @@ def delete_object(request, app_label, module_name, post_delete_redirect, if login_required and request.user.is_anonymous(): return redirect_to_login(request.path) - mod = models.get_module(app_label, module_name) - # Look up the object to be edited lookup_kwargs = {} 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 delete view must be called with either an object_id or a slug/slug_field") - lookup_kwargs.update(extra_lookup_kwargs) try: - object = mod.get_object(**lookup_kwargs) + object = model._default_manager.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 %s" % (model._meta.app_label, lookup_kwargs) if request.META['REQUEST_METHOD'] == 'POST': object.delete() if not request.user.is_anonymous(): - request.user.add_message("The %s was deleted." % mod.Klass._meta.verbose_name) + request.user.message_set.create(message="The %s was deleted." % model._meta.verbose_name) return HttpResponseRedirect(post_delete_redirect) else: if not template_name: - template_name = "%s/%s_confirm_delete" % (app_label, module_name) + template_name = "%s/%s_confirm_delete.html" % (model._meta.app_label, model._meta.object_name.lower()) t = template_loader.get_template(template_name) - c = DjangoContext(request, { + c = RequestContext(request, { template_object_name: object, }, context_processors) for key, value in extra_context.items(): @@ -198,5 +191,5 @@ def delete_object(request, app_label, module_name, post_delete_redirect, 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(object, object._meta.pk.name)) return response 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 diff --git a/django/views/generic/list_detail.py b/django/views/generic/list_detail.py index 5cc496f5ed..68a1e73b07 100644 --- a/django/views/generic/list_detail.py +++ b/django/views/generic/list_detail.py @@ -1,18 +1,16 @@ -from django import models -from django.core.template import loader -from django.utils.httpwrappers import HttpResponse +from django.template import loader, RequestContext +from django.http import Http404, HttpResponse from django.core.xheaders import populate_xheaders -from django.core.extensions import DjangoContext from django.core.paginator import ObjectPaginator, InvalidPage -from django.core.exceptions import Http404, ObjectDoesNotExist +from django.core.exceptions import ObjectDoesNotExist -def object_list(request, app_label, module_name, paginate_by=None, allow_empty=False, - template_name=None, template_loader=loader, extra_lookup_kwargs={}, +def object_list(request, queryset, paginate_by=None, allow_empty=False, + template_name=None, template_loader=loader, extra_context={}, context_processors=None, template_object_name='object'): """ Generic list of objects. - Templates: ``<app_label>/<module_name>_list`` + Templates: ``<app_label>/<model_name>_list.html`` Context: object_list list of objects @@ -35,10 +33,10 @@ def object_list(request, app_label, module_name, paginate_by=None, allow_empty=F hits number of objects, total """ - mod = models.get_module(app_label, module_name) - lookup_kwargs = extra_lookup_kwargs.copy() + queryset = queryset._clone() + model = queryset.model if paginate_by: - paginator = ObjectPaginator(mod, lookup_kwargs, paginate_by) + paginator = ObjectPaginator(queryset, paginate_by) page = request.GET.get('page', 1) try: page = int(page) @@ -48,7 +46,7 @@ def object_list(request, app_label, module_name, paginate_by=None, allow_empty=F object_list = [] else: raise Http404 - c = DjangoContext(request, { + c = RequestContext(request, { '%s_list' % template_object_name: object_list, 'is_paginated': paginator.pages > 1, 'results_per_page': paginate_by, @@ -61,12 +59,11 @@ def object_list(request, app_label, module_name, paginate_by=None, allow_empty=F 'hits' : paginator.hits, }, context_processors) else: - object_list = mod.get_list(**lookup_kwargs) - c = DjangoContext(request, { - '%s_list' % template_object_name: object_list, + c = RequestContext(request, { + '%s_list' % template_object_name: queryset, 'is_paginated': False }, context_processors) - if len(object_list) == 0 and not allow_empty: + if not allow_empty and len(queryset) == 0: raise Http404 for key, value in extra_context.items(): if callable(value): @@ -74,44 +71,42 @@ def object_list(request, app_label, module_name, paginate_by=None, allow_empty=F else: c[key] = value if not template_name: - template_name = "%s/%s_list" % (app_label, module_name) + 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)) -def object_detail(request, app_label, module_name, object_id=None, slug=None, +def object_detail(request, queryset, object_id=None, slug=None, slug_field=None, template_name=None, template_name_field=None, - template_loader=loader, extra_lookup_kwargs={}, extra_context={}, + template_loader=loader, extra_context={}, context_processors=None, template_object_name='object'): """ Generic list of objects. - Templates: ``<app_label>/<module_name>_detail`` + Templates: ``<app_label>/<model_name>_detail.html`` Context: object the object """ - mod = models.get_module(app_label, module_name) - lookup_kwargs = {} + model = queryset.model if object_id: - lookup_kwargs['pk'] = object_id + queryset = queryset.filter(pk=object_id) elif slug and slug_field: - lookup_kwargs['%s__exact' % slug_field] = slug + 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") - lookup_kwargs.update(extra_lookup_kwargs) + raise AttributeError, "Generic detail view must be called with either an object_id or a slug/slug_field." try: - object = mod.get_object(**lookup_kwargs) + obj = queryset.get() except ObjectDoesNotExist: - raise Http404("%s.%s does not exist for %s" % (app_label, module_name, lookup_kwargs)) + raise Http404, "No %s found matching the query" % (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): @@ -119,5 +114,5 @@ def object_detail(request, app_label, module_name, object_id=None, slug=None, 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 diff --git a/django/views/generic/simple.py b/django/views/generic/simple.py index 086ed42805..4571ef8605 100644 --- a/django/views/generic/simple.py +++ b/django/views/generic/simple.py @@ -1,12 +1,13 @@ -from django.core.extensions import DjangoContext, render_to_response -from django.utils.httpwrappers import HttpResponse, HttpResponsePermanentRedirect, HttpResponseGone +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.http import HttpResponse, HttpResponsePermanentRedirect, HttpResponseGone def direct_to_template(request, template, **kwargs): """ Render a given template with any extra URL parameters in the context as ``{{ params }}``. """ - return render_to_response(template, {'params' : kwargs}, context_instance=DjangoContext(request)) + return render_to_response(template, {'params' : kwargs}, context_instance=RequestContext(request)) def redirect_to(request, url, **kwargs): """ diff --git a/django/views/i18n.py b/django/views/i18n.py index 2f3b2b2d31..a2bc54c9ed 100644 --- a/django/views/i18n.py +++ b/django/views/i18n.py @@ -1,4 +1,4 @@ -from django.utils import httpwrappers +from django import http from django.utils.translation import check_for_language, activate, to_locale, get_language from django.utils.text import javascript_quote from django.conf import settings @@ -17,7 +17,7 @@ def set_language(request): next = request.META.get('HTTP_REFERER', None) if not next: next = '/' - response = httpwrappers.HttpResponseRedirect(next) + response = http.HttpResponseRedirect(next) if check_for_language(lang_code): if hasattr(request, 'session'): request.session['django_language'] = lang_code @@ -190,5 +190,5 @@ def javascript_catalog(request, domain='djangojs', packages=None): src.append(LibFoot) src.append(InterPolate) src = ''.join(src) - return httpwrappers.HttpResponse(src, 'text/javascript') + return http.HttpResponse(src, 'text/javascript') diff --git a/django/views/registration/__init__.py b/django/views/registration/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 --- a/django/views/registration/__init__.py +++ /dev/null diff --git a/django/views/registration/passwords.py b/django/views/registration/passwords.py deleted file mode 100644 index 65bacafd98..0000000000 --- a/django/views/registration/passwords.py +++ /dev/null @@ -1,100 +0,0 @@ -from django.core import formfields, validators -from django.core.extensions import DjangoContext, render_to_response -from django.core.template import Context, loader -from django.models.auth import users -from django.views.decorators.auth import login_required -from django.utils.httpwrappers import HttpResponseRedirect - -class PasswordResetForm(formfields.Manipulator): - "A form that lets a user request a password reset" - def __init__(self): - self.fields = ( - formfields.EmailField(field_name="email", length=40, is_required=True, - validator_list=[self.isValidUserEmail]), - ) - - def isValidUserEmail(self, new_data, all_data): - "Validates that a user exists with the given e-mail address" - try: - self.user_cache = users.get_object(email__iexact=new_data) - except users.UserDoesNotExist: - raise validators.ValidationError, "That e-mail address doesn't have an associated user acount. Are you sure you've registered?" - - def save(self, domain_override=None): - "Calculates a new password randomly and sends it to the user" - from django.core.mail import send_mail - from django.models.core import sites - new_pass = users.make_random_password() - self.user_cache.set_password(new_pass) - self.user_cache.save() - if not domain_override: - current_site = sites.get_current() - site_name = current_site.name - domain = current_site.domain - else: - site_name = domain = domain_override - t = loader.get_template('registration/password_reset_email') - c = { - 'new_password': new_pass, - 'email': self.user_cache.email, - 'domain': domain, - 'site_name': site_name, - 'user': self.user_cache, - } - send_mail('Password reset on %s' % site_name, t.render(Context(c)), None, [self.user_cache.email]) - -class PasswordChangeForm(formfields.Manipulator): - "A form that lets a user change his password." - def __init__(self, user): - self.user = user - self.fields = ( - formfields.PasswordField(field_name="old_password", length=30, maxlength=30, is_required=True, - validator_list=[self.isValidOldPassword]), - formfields.PasswordField(field_name="new_password1", length=30, maxlength=30, is_required=True, - validator_list=[validators.AlwaysMatchesOtherField('new_password2', "The two 'new password' fields didn't match.")]), - formfields.PasswordField(field_name="new_password2", length=30, maxlength=30, is_required=True), - ) - - def isValidOldPassword(self, new_data, all_data): - "Validates that the old_password field is correct." - if not self.user.check_password(new_data): - raise validators.ValidationError, "Your old password was entered incorrectly. Please enter it again." - - def save(self, new_data): - "Saves the new password." - self.user.set_password(new_data['new_password1']) - self.user.save() - -def password_reset(request, is_admin_site=False): - new_data, errors = {}, {} - form = PasswordResetForm() - if request.POST: - new_data = request.POST.copy() - errors = form.get_validation_errors(new_data) - if not errors: - if is_admin_site: - form.save(request.META['HTTP_HOST']) - else: - form.save() - return HttpResponseRedirect('%sdone/' % request.path) - return render_to_response('registration/password_reset_form', {'form': formfields.FormWrapper(form, new_data, errors)}, - context_instance=DjangoContext(request)) - -def password_reset_done(request): - return render_to_response('registration/password_reset_done', context_instance=DjangoContext(request)) - -def password_change(request): - new_data, errors = {}, {} - form = PasswordChangeForm(request.user) - if request.POST: - new_data = request.POST.copy() - errors = form.get_validation_errors(new_data) - if not errors: - form.save(new_data) - return HttpResponseRedirect('%sdone/' % request.path) - return render_to_response('registration/password_change_form', {'form': formfields.FormWrapper(form, new_data, errors)}, - context_instance=DjangoContext(request)) -password_change = login_required(password_change) - -def password_change_done(request): - return render_to_response('registration/password_change_done', context_instance=DjangoContext(request)) diff --git a/django/views/static.py b/django/views/static.py index 1499dd4847..072a01671e 100644 --- a/django/views/static.py +++ b/django/views/static.py @@ -1,15 +1,14 @@ +from django.template import loader +from django.core.exceptions import ImproperlyConfigured +from django.http import Http404, HttpResponse, HttpResponseRedirect, HttpResponseNotModified +from django.template import Template, Context, TemplateDoesNotExist +import mimetypes import os -import urllib import posixpath -import mimetypes import re import rfc822 import stat -from django.core import template_loader -from django.core.exceptions import Http404, ImproperlyConfigured -from django.utils.httpwrappers import HttpResponse, HttpResponseRedirect, \ - HttpResponseNotModified -from django.core.template import Template, Context, TemplateDoesNotExist +import urllib def serve(request, path, document_root=None, show_indexes=False): """ @@ -81,7 +80,7 @@ DEFAULT_DIRECTORY_INDEX_TEMPLATE = """ def directory_index(path, fullpath): try: - t = template_loader.get_template('static/directory_index') + t = loader.get_template('static/directory_index') except TemplateDoesNotExist: t = Template(DEFAULT_DIRECTORY_INDEX_TEMPLATE) files = [] |
