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