Exemple #1
0
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
    })
Exemple #2
0
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)
Exemple #3
0
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'
)
Exemple #5
0
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
Exemple #6
0
        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',
)
Exemple #7
0
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
Exemple #9
0
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):
Exemple #10
0
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:
Exemple #11
0
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