123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- from django.urls import reverse
- from rest_framework import serializers
- from misago.categories.models import Category
- from misago.categories.serializers import BasicCategorySerializer
- from misago.users.serializers import BasicUserSerializer, UserSerializer
- from misago.threads.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):
- poster = BasicUserSerializer(many=False, read_only=True)
- 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
|