views.py 2.9 KB

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