from django.core.urlresolvers import reverse from rest_framework import serializers from misago.categories.models import Category from misago.categories.serializers import BasicCategorySerializer from misago.users.serializers import UserSerializer from ..models import Post __all__ = [ 'PostSerializer', 'PostFeedSerializer', ] 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 class CategoryFeedSerializer(BasicCategorySerializer): class Meta: model = Category fields = ( 'name', 'css_class', 'absolute_url', ) class PostFeedSerializer(PostSerializer): category = CategoryFeedSerializer(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): return { 'title': obj.thread.title, 'url': obj.thread.get_absolute_url() } def get_top_category(self, obj): try: return CategoryFeedSerializer(obj.top_category).data except AttributeError: return None