utils.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. from datetime import timedelta
  2. from unidecode import unidecode
  3. from django.http import Http404
  4. from django.core.urlresolvers import resolve, reverse
  5. from django.template.defaultfilters import (slugify as django_slugify,
  6. date as dj_date_format)
  7. from django.utils import timezone
  8. from django.utils.translation import ugettext_lazy as _, ungettext_lazy
  9. def slugify(string):
  10. string = unicode(string)
  11. string = unidecode(string)
  12. return django_slugify(string.replace('_', ' ').strip())
  13. """
  14. Return path utility
  15. """
  16. def clean_return_path(request):
  17. if request.method == 'POST' and 'return_path' in request.POST:
  18. return _get_return_path_from_post(request)
  19. else:
  20. return _get_return_path_from_referer(request)
  21. def _get_return_path_from_post(request):
  22. return_path = request.POST.get('return_path')
  23. try:
  24. if not return_path:
  25. raise ValueError()
  26. if not return_path.startswith('/'):
  27. raise ValueError()
  28. resolve(return_path)
  29. return return_path
  30. except (Http404, ValueError):
  31. return None
  32. def _get_return_path_from_referer(request):
  33. referer = request.META.get('HTTP_REFERER')
  34. try:
  35. if not referer:
  36. raise ValueError()
  37. if not referer.startswith(request.scheme):
  38. raise ValueError()
  39. referer = referer[len(request.scheme) + 3:]
  40. if not referer.startswith(request.META['HTTP_HOST']):
  41. raise ValueError()
  42. referer = referer[len(request.META['HTTP_HOST'].rstrip('/')):]
  43. if not referer.startswith('/'):
  44. raise ValueError()
  45. resolve(referer)
  46. return referer
  47. except (Http404, KeyError, ValueError):
  48. return None
  49. """
  50. Utils for resolving requests destination
  51. """
  52. def _is_request_path_under_misago(request):
  53. # We are assuming that forum_index link is root of all Misago links
  54. forum_index = reverse('misago:index')
  55. path_info = request.path_info
  56. if len(forum_index) > len(path_info):
  57. return False
  58. return path_info[:len(forum_index)] == forum_index
  59. def is_request_to_misago(request):
  60. try:
  61. return request._request_to_misago
  62. except AttributeError:
  63. request._request_to_misago = _is_request_path_under_misago(request)
  64. return request._request_to_misago
  65. def is_referer_local(request):
  66. referer = request.META.get('HTTP_REFERER')
  67. if not referer:
  68. return False
  69. if not referer.startswith(request.scheme):
  70. return False
  71. referer = referer[len(request.scheme) + 3:]
  72. if not referer.startswith(request.META['HTTP_HOST']):
  73. return False
  74. referer = referer[len(request.META['HTTP_HOST'].rstrip('/')):]
  75. if not referer.startswith('/'):
  76. return False
  77. return True
  78. """
  79. Utility that humanizes time amount.
  80. Expects number of seconds as first argument
  81. """
  82. def time_amount(value):
  83. delta = timedelta(seconds=value)
  84. units_dict = {
  85. 'd': delta.days,
  86. 'h': 0,
  87. 'm': 0,
  88. 's': delta.seconds,
  89. }
  90. if units_dict['s'] >= 3600:
  91. units_dict['h'] = units_dict['s'] / 3600
  92. units_dict['s'] -= units_dict['h'] * 3600
  93. if units_dict['s'] >= 60:
  94. units_dict['m'] = units_dict['s'] / 60
  95. units_dict['s'] -= units_dict['m'] * 60
  96. precisions = []
  97. if units_dict['d']:
  98. string = ungettext_lazy(
  99. '%(days)s day', '%(days)s days', units_dict['d'])
  100. precisions.append(string % {'days': units_dict['d']})
  101. if units_dict['h']:
  102. string = ungettext_lazy(
  103. '%(hours)s hour', '%(hours)s hours', units_dict['h'])
  104. precisions.append(string % {'hours': units_dict['h']})
  105. if units_dict['m']:
  106. string = ungettext_lazy(
  107. '%(minutes)s minute', '%(minutes)s minutes', units_dict['m'])
  108. precisions.append(string % {'minutes': units_dict['m']})
  109. if units_dict['s']:
  110. string = ungettext_lazy(
  111. '%(seconds)s second', '%(seconds)s seconds', units_dict['s'])
  112. precisions.append(string % {'seconds': units_dict['s']})
  113. if not precisions:
  114. precisions.append(_("0 seconds"))
  115. if len(precisions) == 1:
  116. return precisions[0]
  117. else:
  118. formats = {
  119. 'first_part': ', '.join(precisions[:-1]),
  120. 'and_part': precisions[-1],
  121. }
  122. return _("%(first_part)s and %(and_part)s") % formats
  123. def date_format(date, format=None):
  124. return dj_date_format(timezone.template_localtime(date), format)
  125. """
  126. MD subset for use for enchancing items descriptions
  127. """
  128. MD_SUBSET_FORBID_SYNTAX = (
  129. # References are evil
  130. 'reference', 'reference', 'image_reference', 'short_reference',
  131. # Blocks are evil too
  132. 'hashheader', 'setextheader', 'code', 'quote', 'hr', 'olist', 'ulist',
  133. )