12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- from urllib.parse import urlparse
- from django.urls import Resolver404, resolve
- from .models import PostLike
- def add_categories_to_items(root_category, categories, items):
- categories_dict = {}
- for category in categories:
- categories_dict[category.pk] = category
- if category.parent_id:
- category.parent = categories_dict[category.parent_id]
- for item in items:
- item.category = categories_dict[item.category_id]
- def add_likes_to_posts(user, posts):
- if user.is_anonymous:
- return
- posts_map = {}
- for post in posts:
- posts_map[post.id] = post
- post.is_liked = False
- queryset = PostLike.objects.filter(liker=user, post_id__in=posts_map.keys())
- for like in queryset.values("post_id"):
- posts_map[like["post_id"]].is_liked = True
- SUPPORTED_THREAD_ROUTES = {
- "misago:thread": "pk",
- "misago:thread-post": "pk",
- "misago:thread-last": "pk",
- "misago:thread-new": "pk",
- "misago:thread-unapproved": "pk",
- }
- def get_thread_id_from_url(request, url): # pylint: disable=too-many-return-statements
- clean_url = str(url).strip()
- url_bits = urlparse(clean_url)
- if url_bits.netloc and url_bits.netloc != request.get_host():
- return None
- if url_bits.path.startswith(request.get_host()):
- clean_path = url_bits.path.lstrip(request.get_host())
- else:
- clean_path = url_bits.path
- wsgi_alias = request.path[: len(request.path_info) * -1]
- if wsgi_alias and not clean_path.startswith(wsgi_alias):
- return None
- try:
- resolution = resolve(clean_path[len(wsgi_alias) :])
- except Resolver404:
- return None
- if not resolution.namespaces:
- return None
- url_name = "%s:%s" % (":".join(resolution.namespaces), resolution.url_name)
- kwargname = SUPPORTED_THREAD_ROUTES.get(url_name)
- if not kwargname:
- return None
- try:
- return int(resolution.kwargs.get(kwargname))
- except (TypeError, ValueError):
- return None
|