def rank(request, slug, page=0): rank = get_object_or_404(Rank.objects.filter(is_tab=True), slug=slug) queryset = rank.user_set.select_related('rank').order_by('slug') if not request.user.is_staff: queryset = queryset.filter(is_active=True) page = paginate(queryset, page, settings.MISAGO_USERS_PER_PAGE, 4) data = pagination_dict(page) data.update({'results': UserSerializer(page.object_list, many=True).data}) request.frontend_context['USERS'] = data if rank.description: description = { 'plain': rank.description, 'html': format_plaintext_for_html(rank.description) } else: description = None template = "misago/userslists/rank.html" return render(request, template, { 'rank': rank, 'users': page.object_list, 'paginator': data })
def generic(request): queryset = get_user_model().objects if request.query_params.get('followers'): user_pk = get_int_or_404(request.query_params.get('followers')) queryset = get_object_or_404(queryset, pk=user_pk).followed_by elif request.query_params.get('follows'): user_pk = get_int_or_404(request.query_params.get('follows')) queryset = get_object_or_404(queryset, pk=user_pk).follows if request.query_params.get('rank'): rank_pk = get_int_or_404(request.query_params.get('rank')) rank = get_object_or_404(Rank.objects, pk=rank_pk, is_tab=True) queryset = queryset.filter(rank=rank) if request.query_params.get('name'): name_starts_with = request.query_params.get('name').strip().lower() if name_starts_with: queryset = queryset.filter(slug__startswith=name_starts_with) else: raise Http404() queryset = queryset.select_related('rank', 'ban_cache', 'online_tracker') paginator = Paginator() users = paginator.paginate_queryset(queryset.order_by('slug'), request) make_users_status_aware(users, request.user.acl) return paginator.get_paginated_response( UserSerializer(users, many=True).data)
def followers(request, profile): queryset = profile.followed_by.select_related('rank').order_by('slug') page = paginate(queryset, None, 12, 4) paginator = pagination_dict(page) request.frontend_context['PROFILE_FOLLOWERS'] = dict( results=UserSerializer(page.object_list, many=True).data, **paginator) return render( request, 'misago/profile/followers.html', { 'profile': profile, 'followers': page.object_list, 'count': paginator['count'], })
data = pagination_dict(page) data.update({'results': UsernameChangeSerializer(page.object_list, many=True).data}) request.frontend_context['PROFILE_NAME_HISTORY'] = data return { 'history': page.object_list, 'count': data['count'], } class UserBanView(ProfileView): template_name = 'misago/profile/ban_details.html' def get_context_data(self, request, profile): ban = get_user_ban(profile) request.frontend_context['PROFILE_BAN'] = BanDetailsSerializer(ban).data return { 'ban': ban, } UserProfileSerializer = UserSerializer.subset_fields( 'id', 'username', 'slug', 'email', 'joined_on', 'rank', 'title', 'avatars', 'is_avatar_locked', 'signature', 'is_signature_locked', 'followers', 'following', 'threads', 'posts', 'acl', 'is_followed', 'is_blocked', 'status', 'api', 'url' )
class PostSerializer(serializers.ModelSerializer): poster = UserSerializer(many=False, read_only=True) poster_ip = serializers.SerializerMethodField() content = serializers.SerializerMethodField() attachments = serializers.SerializerMethodField() last_editor = serializers.PrimaryKeyRelatedField(read_only=True) hidden_by = serializers.PrimaryKeyRelatedField(read_only=True) acl = serializers.SerializerMethodField() is_read = serializers.SerializerMethodField() is_new = serializers.SerializerMethodField() is_liked = serializers.SerializerMethodField() last_likes = serializers.SerializerMethodField() likes = serializers.SerializerMethodField() api = serializers.SerializerMethodField() url = serializers.SerializerMethodField() class Meta: model = Post fields = [ 'id', 'poster', 'poster_name', 'poster_ip', 'content', 'attachments', 'posted_on', 'updated_on', 'hidden_on', 'edits', 'last_editor', 'last_editor_name', 'last_editor_slug', 'hidden_by', 'hidden_by_name', 'hidden_by_slug', 'is_unapproved', 'is_hidden', 'is_protected', 'is_event', 'event_type', 'event_context', 'acl', 'is_liked', 'is_new', 'is_read', 'last_likes', 'likes', 'api', 'url', ] def get_poster_ip(self, obj): if self.context['user'].acl['can_see_users_ips']: return obj.poster_ip else: return None def get_content(self, obj): if obj.is_valid and not obj.is_event and (not obj.is_hidden or obj.acl['can_see_hidden']): return obj.content else: return None def get_attachments(self, obj): return obj.attachments_cache def get_acl(self, obj): try: return obj.acl except AttributeError: return None def get_is_liked(self, obj): try: return obj.is_liked except AttributeError: return None def get_is_new(self, obj): try: return obj.is_new except AttributeError: return None def get_is_read(self, obj): try: return obj.is_read except AttributeError: return None def get_last_likes(self, obj): if obj.is_event: return None try: if obj.acl['can_see_likes']: return obj.last_likes except AttributeError: return None def get_likes(self, obj): if obj.is_event: return None try: if obj.acl['can_see_likes']: return obj.likes except AttributeError: return None def get_api(self, obj): api_links = { 'index': obj.get_api_url(), 'likes': obj.get_likes_api_url(), 'editor': obj.get_editor_api_url(), 'edits': obj.get_edits_api_url(), 'read': obj.get_read_api_url(), } if obj.is_event: del api_links['likes'] return api_links def get_url(self, obj): return { 'index': obj.get_absolute_url(), 'last_editor': self.get_last_editor_url(obj), 'hidden_by': self.get_hidden_by_url(obj), } def get_last_editor_url(self, obj): if obj.last_editor_id: return reverse('misago:user', kwargs={ 'pk': obj.last_editor_id, 'slug': obj.last_editor_slug }) else: return None def get_hidden_by_url(self, obj): if obj.hidden_by_id: return reverse('misago:user', kwargs={ 'pk': obj.hidden_by_id, 'slug': obj.hidden_by_slug }) else: return None
page = get_int_or_404(request.query_params.get('page', 0)) if page == 1: page = 0 # api allows explicit first page feed = UserPosts(request, profile, page) return Response(feed.get_frontend_context()) UserProfileSerializer = UserSerializer.subset_fields( 'id', 'username', 'slug', 'email', 'joined_on', 'rank', 'title', 'avatars', 'is_avatar_locked', 'signature', 'is_signature_locked', 'followers', 'following', 'threads', 'posts', 'is_followed', 'is_blocked', 'status', )
from django.urls import reverse from misago.core.serializers import MutableFields from misago.threads.models import Post from misago.users.serializers import UserSerializer as BaseUserSerializer __all__ = ['PostSerializer'] UserSerializer = BaseUserSerializer.subset_fields( 'id', 'username', 'rank', 'avatars', 'signature', 'title', 'status', 'posts', 'url', ) class PostSerializer(serializers.ModelSerializer, MutableFields): poster = UserSerializer(many=False, read_only=True) poster_ip = serializers.SerializerMethodField() content = serializers.SerializerMethodField() attachments = serializers.SerializerMethodField() last_editor = serializers.PrimaryKeyRelatedField(read_only=True) hidden_by = serializers.PrimaryKeyRelatedField(read_only=True)
from misago.categories.serializers import CategorySerializer from misago.core.serializers import MutableFields from misago.threads.models import Post from misago.users.serializers import UserSerializer from .post import PostSerializer __all__ = [ 'FeedSerializer', ] FeedUserSerializer = UserSerializer.subset_fields( 'id', 'username', 'avatars', 'url', 'title', 'rank', ) FeedCategorySerializer = CategorySerializer.subset_fields('name', 'css_class', 'url') class FeedSerializer(PostSerializer, MutableFields): poster = FeedUserSerializer(many=False, read_only=True) category = FeedCategorySerializer(many=False, read_only=True) thread = serializers.SerializerMethodField() class Meta: model = Post
from rest_framework import serializers from misago.categories.serializers import CategorySerializer from misago.core.serializers import MutableFields from misago.threads.models import Post from misago.users.serializers import UserSerializer from .post import PostSerializer __all__ = [ 'FeedSerializer', ] FeedUserSerializer = UserSerializer.subset_fields('id', 'username', 'avatars', 'absolute_url') FeedCategorySerializer = CategorySerializer.subset_fields('name', 'css_class', 'absolute_url') class FeedSerializer(PostSerializer, MutableFields): poster = FeedUserSerializer(many=False, read_only=True) category = FeedCategorySerializer(many=False, read_only=True) thread = serializers.SerializerMethodField() top_category = serializers.SerializerMethodField() class Meta: model = Post fields = PostSerializer.Meta.fields + ['category', 'thread', 'top_category'] def get_thread(self, obj):
from misago.api.serializers import MutableFields from misago.categories.serializers import CategorySerializer from misago.threads.models import Post from misago.users.serializers import UserSerializer from .post import PostSerializer __all__ = [ 'FeedSerializer', ] FeedUserSerializer = UserSerializer.subset_fields( 'id', 'username', 'avatars', 'url', 'title', 'rank', ) FeedCategorySerializer = CategorySerializer.subset_fields( 'name', 'css_class', 'url') class FeedSerializer(PostSerializer, MutableFields): poster = FeedUserSerializer(many=False, read_only=True) category = FeedCategorySerializer(many=False, read_only=True) thread = serializers.SerializerMethodField() class Meta:
class PostSerializer(serializers.ModelSerializer): poster = UserSerializer(many=False, read_only=True) parsed = serializers.SerializerMethodField() attachments_cache = serializers.SerializerMethodField() last_editor = serializers.PrimaryKeyRelatedField(read_only=True) hidden_by = serializers.PrimaryKeyRelatedField(read_only=True) acl = serializers.SerializerMethodField() is_read = serializers.SerializerMethodField() is_new = serializers.SerializerMethodField() api = serializers.SerializerMethodField() url = serializers.SerializerMethodField() class Meta: model = Post fields = ( 'id', 'poster', 'poster_name', 'poster_ip', 'parsed', 'has_attachments', 'attachments_cache', 'posted_on', 'updated_on', 'hidden_on', 'edits', 'last_editor', 'last_editor_name', 'last_editor_slug', 'hidden_by', 'hidden_by_name', 'hidden_by_slug', 'is_unapproved', 'is_hidden', 'is_protected', 'is_event', 'event_type', 'event_context', 'acl', 'is_new', 'is_read', 'api', 'url', ) def get_parsed(self, obj): if obj.is_valid and not obj.is_event and (not obj.is_hidden or obj.acl['can_see_hidden']): return obj.parsed else: return None def get_attachments_cache(self, obj): # TODO: check if user can download attachments before we'll expose them here return None def get_acl(self, obj): try: return obj.acl except AttributeError: return None def get_is_new(self, obj): try: return obj.is_new except AttributeError: return None def get_is_read(self, obj): try: return obj.is_read except AttributeError: return None def get_api(self, obj): return { 'index': obj.get_api_url(), 'editor': reverse('misago:api:thread-post-editor', kwargs={ 'thread_pk': obj.thread_id, 'pk': obj.pk }), } def get_url(self, obj): return { 'index': obj.get_absolute_url(), 'last_editor': self.get_last_editor_url(obj), 'hidden_by': self.get_hidden_by_url(obj), } def get_last_editor_url(self, obj): if obj.last_editor_id: return reverse('misago:user', kwargs={ 'pk': obj.last_editor_id, 'slug': obj.last_editor_slug }) else: return None def get_hidden_by_url(self, obj): if obj.hidden_by_id: return reverse('misago:user', kwargs={ 'pk': obj.hidden_by_id, 'slug': obj.hidden_by_slug }) else: return None