utils.py 1.9 KB

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