views.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from hashlib import md5
  2. from django.core.urlresolvers import reverse
  3. from django.http import Http404
  4. from django.shortcuts import redirect, render
  5. from django.utils.translation import gettext as _
  6. from rest_framework.decorators import api_view
  7. from rest_framework.response import Response
  8. from misago.conf import settings
  9. from misago.core.cache import cache
  10. from misago.markup import common_flavour
  11. def get_parsed_content(request, setting_name):
  12. cache_name = 'misago_legal_%s' % setting_name
  13. cached_content = cache.get(cache_name)
  14. unparsed_content = settings.get_lazy_setting(setting_name)
  15. checksum_source = '%s:%s' % (unparsed_content, settings.SECRET_KEY)
  16. unparsed_checksum = md5(checksum_source).hexdigest()
  17. if cached_content and cached_content.get('checksum') == unparsed_checksum:
  18. return cached_content['parsed']
  19. else:
  20. parsed = common_flavour(request, None, unparsed_content)['parsed_text']
  21. cached_content = {
  22. 'checksum': unparsed_checksum,
  23. 'parsed': parsed,
  24. }
  25. cache.set(cache_name, cached_content)
  26. return cached_content['parsed']
  27. def terms_of_service(request, return_dict=False):
  28. if not (settings.terms_of_service or settings.terms_of_service_link):
  29. raise Http404()
  30. if not return_dict and settings.terms_of_service_link:
  31. return redirect(settings.terms_of_service_link)
  32. parsed_content = get_parsed_content(request, 'terms_of_service')
  33. response_dict = {
  34. 'id': 'terms-of-service',
  35. 'title': settings.terms_of_service_title or _("Terms of service"),
  36. 'link': settings.terms_of_service_link,
  37. 'body': parsed_content,
  38. }
  39. if return_dict:
  40. return response_dict
  41. else:
  42. api_url = reverse('misago:api:legal_page',
  43. kwargs={'page': response_dict['id']})
  44. request.frontend_context[api_url] = response_dict
  45. return render(request, 'misago/terms_of_service.html', response_dict)
  46. def privacy_policy(request, return_dict=False):
  47. if not (settings.privacy_policy or settings.privacy_policy_link):
  48. raise Http404()
  49. if not return_dict and settings.privacy_policy_link:
  50. return redirect(settings.privacy_policy_link)
  51. parsed_content = get_parsed_content(request, 'privacy_policy')
  52. response_dict = {
  53. 'id': 'privacy-policy',
  54. 'title': settings.privacy_policy_title or _("Privacy policy"),
  55. 'link': settings.privacy_policy_link,
  56. 'body': parsed_content,
  57. }
  58. if return_dict:
  59. return response_dict
  60. else:
  61. api_url = reverse('misago:api:legal_page',
  62. kwargs={'page': response_dict['id']})
  63. request.frontend_context[api_url] = response_dict
  64. return render(request, 'misago/privacy_policy.html', response_dict)
  65. API_PAGES = {
  66. 'terms-of-service': terms_of_service,
  67. 'privacy-policy': privacy_policy,
  68. }
  69. @api_view(['GET'])
  70. def legal_page(request, page):
  71. if page not in API_PAGES:
  72. raise Http404()
  73. page_dict = API_PAGES.get(page)(request, True)
  74. return Response(page_dict)