from typing import Dict, List, Optional from rest_framework import serializers from django.utils.timezone import localtime from apps.archive.models import PostModel class PostPreviewSerializer(serializers.ModelSerializer): description = serializers.SerializerMethodField() date = serializers.SerializerMethodField() media = serializers.SerializerMethodField() source_site = serializers.SerializerMethodField() category = serializers.SerializerMethodField() creator = serializers.SerializerMethodField() tags = serializers.SerializerMethodField() class Meta: model = PostModel fields = [ "post_id", "mature", "title", "description", "source_site", "category", "creator", "date", "media", "tags", ] def get_description(self, obj: PostModel) -> Optional[str]: return obj.description.first().content if obj.description.exists() else None def get_source_site(self, obj: PostModel) -> Dict[str, str]: return { "slug": obj.source_site.slug, "name": obj.source_site.name, } def get_category(self, obj: PostModel) -> List[Dict[str, str]]: return [{"slug": i.slug, "name": i.name} for i in obj.category.all()] def get_creator(self, obj: PostModel) -> Dict[str, Optional[str]]: avatar_url = obj.creator.avatar.file.url if obj.creator.avatar else None return { "slug": obj.creator.slug, "name": obj.creator.name, "avatar": avatar_url, } def get_date(self, obj: PostModel) -> Dict[str, str]: return { "created": localtime(obj.date_created).isoformat(), "imported": localtime(obj.date_imported).isoformat(), "last_import": localtime(obj.date_last_import).isoformat(), } def get_media(self, obj: PostModel) -> List[Dict[str, str]]: data = [] for i in obj.files.all(): if i.mimetype.startswith("video/"): f_type = "video" elif i.mimetype.startswith("image/gif"): f_type = "gif" elif i.mimetype.startswith("image/"): f_type = "image" else: f_type = "other" data.append({"type": f_type, "mimetype": i.mimetype, "src": i.file.url}) return data def get_tags(self, obj: PostModel) -> List[str]: return [tag.slug for tag in obj.tags.all()] class PostSerializer(serializers.ModelSerializer): source_site = serializers.SerializerMethodField() description = serializers.SerializerMethodField() creator = serializers.SerializerMethodField() tags = serializers.SerializerMethodField() date = serializers.SerializerMethodField() media = serializers.SerializerMethodField() class Meta: model = PostModel fields = [ "post_id", "title", "description", "source_site", "creator", "date", "mature", "media", "tags", ] def get_source_site(self, obj) -> Dict[str, str]: return { "slug": obj.source_site.slug, "name": obj.source_site.name, } def get_description(self, obj) -> Dict[str, str]: desc = obj.description.first().content if desc == "": count = 0 else: count = obj.description.count() return { "count": count, "content": desc, } def get_creator(self, obj) -> Dict[str, str]: return { "slug": obj.creator.slug, "name": obj.creator.name, } def get_tags(self, obj) -> List[str]: return [tag.slug for tag in obj.tags.all()] def get_date(self, obj) -> Dict[str, str]: return { "created": localtime(obj.date_created).isoformat(), "imported": localtime(obj.date_imported).isoformat(), "last_import": localtime(obj.date_last_import).isoformat(), } def get_media(self, obj) -> List[Dict[str, str]]: data = [] for i in obj.files.all(): data.append({"type": i.mimetype, "url": i.file.url}) return data