123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- from rest_framework import serializers
- 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",
- "real_name",
- "rank",
- "avatars",
- "signature",
- "title",
- "status",
- "posts",
- "url",
- )
- class PostSerializer(serializers.ModelSerializer, MutableFields):
- poster = UserSerializer(many=False, read_only=True)
- 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",
- "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_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
|