/mezzanine/pages/admin.py

https://github.com/Tmr/mezzanine
Python | 90 lines | 49 code | 15 blank | 26 comment | 7 complexity | 12c4a837f26fc7e5d2b55deabae0772a MD5 | raw file
  1. from copy import deepcopy
  2. from django.contrib import admin
  3. from django.core.urlresolvers import reverse
  4. from django.http import HttpResponseRedirect
  5. from django.shortcuts import get_object_or_404
  6. from mezzanine.pages.models import Page
  7. from mezzanine.core.admin import DisplayableAdmin
  8. form_fieldsets = deepcopy(DisplayableAdmin.fieldsets)
  9. form_fieldsets[0][1]["fields"] += (("in_navigation", "in_footer"),
  10. "login_required",)
  11. class PageAdmin(DisplayableAdmin):
  12. """
  13. Admin class for the ``Page`` model and all subclasses of ``Page``. Handles
  14. redirections between admin interfaces for the ``Page`` model and its
  15. subclasses.
  16. """
  17. fieldsets = form_fieldsets
  18. def change_view(self, request, object_id, extra_context=None):
  19. """
  20. For the ``Page`` model, check ``page.get_content_model()`` for a
  21. subclass and redirect to its admin change view.
  22. """
  23. if self.model is Page:
  24. page = get_object_or_404(Page, pk=object_id)
  25. content_model = page.get_content_model()
  26. if content_model is not None:
  27. app = content_model.__class__._meta.app_label
  28. name = content_model.__class__.__name__.lower()
  29. change_url = reverse("admin:%s_%s_change" % (app, name),
  30. args=(content_model.id,))
  31. return HttpResponseRedirect(change_url)
  32. return super(PageAdmin, self).change_view(request, object_id,
  33. extra_context=None)
  34. def changelist_view(self, request, extra_context=None):
  35. """
  36. Redirect to the ``Page`` changelist view for ``Page`` subclasses.
  37. """
  38. if self.model is not Page:
  39. return HttpResponseRedirect(reverse("admin:pages_page_changelist"))
  40. return super(PageAdmin, self).changelist_view(request, extra_context)
  41. def save_model(self, request, obj, form, change):
  42. """
  43. Set the ID of the parent page if passed in via querystring.
  44. """
  45. # Force parent to be saved to trigger handling of ordering and slugs.
  46. parent = request.GET.get("parent")
  47. if parent is not None and not change:
  48. obj.parent_id = parent
  49. obj._order = None
  50. obj.slug = None
  51. obj.save()
  52. super(PageAdmin, self).save_model(request, obj, form, change)
  53. def _maintain_parent(self, request, response):
  54. """
  55. Maintain the parent ID in the querystring for response_add and
  56. response_change.
  57. """
  58. location = response._headers["location"][1]
  59. parent = request.GET.get("parent")
  60. if parent is not None and "?" not in location:
  61. location += "?parent=%s" % parent
  62. return HttpResponseRedirect(location)
  63. def response_add(self, request, obj):
  64. """
  65. Maintain the parent ID in the querystring.
  66. """
  67. response = super(PageAdmin, self).response_add(request, obj)
  68. return self._maintain_parent(request, response)
  69. def response_change(self, request, obj):
  70. """
  71. Maintain the parent ID in the querystring.
  72. """
  73. response = super(PageAdmin, self).response_change(request, obj)
  74. return self._maintain_parent(request, response)
  75. admin.site.register(Page, PageAdmin)