/feincms/views/__init__.py

http://github.com/feincms/feincms · Python · 69 lines · 50 code · 10 blank · 9 comment · 10 complexity · 6e34855cd38e4e406c4ef9341782277d MD5 · raw file

  1. from __future__ import absolute_import, unicode_literals
  2. import logging
  3. from django.apps import apps
  4. from django.http import Http404
  5. from django.utils.functional import cached_property
  6. from feincms import settings
  7. from feincms.module.mixins import ContentView
  8. logger = logging.getLogger(__name__)
  9. class Handler(ContentView):
  10. page_model_path = None
  11. context_object_name = "feincms_page"
  12. @cached_property
  13. def page_model(self):
  14. model = self.page_model_path or settings.FEINCMS_DEFAULT_PAGE_MODEL
  15. return apps.get_model(*model.split("."))
  16. def get_object(self):
  17. path = None
  18. if self.args:
  19. path = self.args[0]
  20. return self.page_model._default_manager.for_request(
  21. self.request, raise404=True, best_match=True, path=path
  22. )
  23. def dispatch(self, request, *args, **kwargs):
  24. try:
  25. return super(Handler, self).dispatch(request, *args, **kwargs)
  26. except Http404 as e:
  27. if settings.FEINCMS_CMS_404_PAGE is not None:
  28. logger.info(
  29. "Http404 raised for '%s', attempting redirect to"
  30. " FEINCMS_CMS_404_PAGE",
  31. args[0],
  32. )
  33. try:
  34. # Fudge environment so that we end up resolving the right
  35. # page.
  36. # Note: request.path is used by the page redirect processor
  37. # to determine if the redirect can be taken, must be == to
  38. # page url.
  39. # Also clear out the _feincms_page attribute which caches
  40. # page lookups (and would just re-raise a 404).
  41. request.path = request.path_info = settings.FEINCMS_CMS_404_PAGE
  42. if hasattr(request, "_feincms_page"):
  43. delattr(request, "_feincms_page")
  44. response = super(Handler, self).dispatch(
  45. request, settings.FEINCMS_CMS_404_PAGE, **kwargs
  46. )
  47. # Only set status if we actually have a page. If we get for
  48. # example a redirect, overwriting would yield a blank page
  49. if response.status_code == 200:
  50. response.status_code = 404
  51. return response
  52. except Http404:
  53. logger.error(
  54. "Http404 raised while resolving" " FEINCMS_CMS_404_PAGE=%s",
  55. settings.FEINCMS_CMS_404_PAGE,
  56. )
  57. raise e
  58. else:
  59. raise