utils.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. from django.urls import resolve
  2. from django.utils import six
  3. from django.utils.six.moves.urllib.parse import urlparse
  4. from .models import PostLike
  5. def add_categories_to_items(root_category, categories, items):
  6. categories_dict = {}
  7. for category in categories:
  8. categories_dict[category.pk] = category
  9. for item in items:
  10. item.category = categories_dict[item.category_id]
  11. def add_likes_to_posts(user, posts):
  12. if user.is_anonymous:
  13. return
  14. posts_map = {}
  15. for post in posts:
  16. posts_map[post.id] = post
  17. post.is_liked = False
  18. queryset = PostLike.objects.filter(liker=user, post_id__in=posts_map.keys())
  19. for like in queryset.values('post_id'):
  20. posts_map[like['post_id']].is_liked = True
  21. SUPPORTED_THREAD_ROUTES = {
  22. 'misago:thread': 'pk',
  23. 'misago:thread-post': 'pk',
  24. 'misago:thread-last': 'pk',
  25. 'misago:thread-new': 'pk',
  26. 'misago:thread-unapproved': 'pk',
  27. }
  28. def get_thread_id_from_url(request, url):
  29. try:
  30. clean_url = six.text_type(url).strip()
  31. bits = urlparse(clean_url)
  32. except:
  33. return None
  34. if bits.netloc and bits.netloc != request.get_host():
  35. return None
  36. if bits.path.startswith(request.get_host()):
  37. clean_path = bits.path.lstrip(request.get_host())
  38. else:
  39. clean_path = bits.path
  40. try:
  41. wsgi_alias = request.path[:len(request.path_info) * -1]
  42. resolution = resolve(clean_path[len(wsgi_alias):])
  43. except:
  44. return None
  45. if not resolution.namespaces:
  46. return None
  47. url_name = '{}:{}'.format(':'.join(resolution.namespaces), resolution.url_name)
  48. kwargname = SUPPORTED_THREAD_ROUTES.get(url_name)
  49. if not kwargname:
  50. return None
  51. try:
  52. return int(resolution.kwargs.get(kwargname))
  53. except (TypeError, ValueError):
  54. return None