Skip to content

Commit

Permalink
Merge pull request #333 from PROCOLLAB-github/flexivanov237-pro-234
Browse files Browse the repository at this point in the history
Flexivanov237 pro 234
  • Loading branch information
sh1nkey authored Mar 15, 2024
2 parents ff416e4 + 016cef1 commit 9d6a25e
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 71 deletions.
69 changes: 65 additions & 4 deletions feed/serializers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,68 @@
from rest_framework import serializers
from feed import constants

from core.services import get_views_count, get_likes_count
from feed.mapping import CONTENT_OBJECT_MAPPING, CONTENT_OBJECT_SERIALIZER_MAPPING
from files.serializers import UserFileSerializer
from news.mapping import NewsMapping
from news.models import News
from projects.models import Project
from users.models import CustomUser

class FeedItemSerializer(serializers.Serializer):
type_model = serializers.ChoiceField(choices=constants.FeedItemType, required=True)
content = serializers.JSONField(required=True)

class NewsFeedListSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField()
image_address = serializers.SerializerMethodField()
is_user_liked = serializers.SerializerMethodField()
files = UserFileSerializer(many=True)
views_count = serializers.SerializerMethodField()
likes_count = serializers.SerializerMethodField()
content_object = serializers.SerializerMethodField()
type_model = serializers.SerializerMethodField()

def get_type_model(self, obj) -> str:
model_type = CONTENT_OBJECT_MAPPING[obj.content_type.model]
if obj.text != "" and model_type == "project":
return "news"
return model_type

def get_content_object(self, obj) -> dict:
type_model = obj.content_type.model
if obj.text != "" and self.get_type_model(obj) == "project":
type_model = "news"
serializer = CONTENT_OBJECT_SERIALIZER_MAPPING[type_model](obj.content_object)
return serializer.data

def get_views_count(self, obj):
return get_views_count(obj)

def get_likes_count(self, obj):
return get_likes_count(obj)

def get_name(self, obj):
if obj.content_type.model == CustomUser.__name__.lower():
return f"{obj.content_object.first_name} {obj.content_object.last_name}"
elif obj.text != "" and obj.content_type.model == Project.__name__.lower():
return f"{obj.content_object.name}"

def get_image_address(self, obj):
return NewsMapping.get_image_address(obj.content_object)

def get_is_user_liked(self, obj):
return obj.id in self.context.get("liked_news")

class Meta:
model = News
fields = [
"id",
"name",
"image_address",
"text",
"datetime_created",
"views_count",
"likes_count",
"files",
"is_user_liked",
"content_object",
"type_model",
]
read_only_fields = ["views_count", "likes_count", "type_model"]
11 changes: 11 additions & 0 deletions feed/services.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
from django.contrib.contenttypes.models import ContentType

from core.models import Like
from feed.constants import SIGNALS_MODELS
from news.models import News
from users.models import CustomUser


def get_liked_news(user: CustomUser, queryset: list[News]) -> list[int]:
obj_type = ContentType.objects.get_for_model(News)
liked_news = Like.objects.filter(
content_type=obj_type, object_id__in=[news.id for news in queryset], user=user
).values_list("object_id", flat=True)
return liked_news


# signals services
def delete_news_for_model(instance: SIGNALS_MODELS):
content_type = ContentType.objects.get_for_model(instance)
obj = News.objects.filter(
Expand Down
10 changes: 8 additions & 2 deletions feed/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
from rest_framework.views import APIView

from feed.pagination import FeedPagination
from feed.services import get_liked_news

from news.models import News
from news.serializers import NewsFeedListSerializer
from .serializers import NewsFeedListSerializer
from projects.models import Project
from vacancy.models import Vacancy

Expand Down Expand Up @@ -38,7 +39,12 @@ def get(self, *args, **kwargs):
paginator = self.pagination_class()
paginated_data = paginator.paginate_queryset(self.get_queryset(), self.request)
serializer = NewsFeedListSerializer(
paginated_data, context={"user": self.request.user}, many=True
paginated_data,
context={
"user": self.request.user,
"liked_news": get_liked_news(self.request.user, paginated_data),
},
many=True,
)

new_data = []
Expand Down
65 changes: 0 additions & 65 deletions news/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,10 @@
from rest_framework import serializers

from core.services import is_fan, get_likes_count, get_views_count
from feed.mapping import CONTENT_OBJECT_MAPPING, CONTENT_OBJECT_SERIALIZER_MAPPING
from files.serializers import UserFileSerializer
from news.mapping import NewsMapping
from news.models import News

from projects.models import Project
from users.models import CustomUser

User = get_user_model()

Expand Down Expand Up @@ -63,68 +60,6 @@ class Meta:
]


class NewsFeedListSerializer(serializers.ModelSerializer):
name = serializers.SerializerMethodField()
image_address = serializers.SerializerMethodField()
is_user_liked = serializers.SerializerMethodField()
files = UserFileSerializer(many=True)
views_count = serializers.SerializerMethodField()
likes_count = serializers.SerializerMethodField()
content_object = serializers.SerializerMethodField()
type_model = serializers.SerializerMethodField()

def get_type_model(self, obj) -> str:
model_type = CONTENT_OBJECT_MAPPING[obj.content_type.model]
if obj.text != "" and model_type == "project":
return "news"
return model_type

def get_content_object(self, obj) -> dict:
type_model = obj.content_type.model
if obj.text != "" and self.get_type_model(obj) == "project":
type_model = "news"
serializer = CONTENT_OBJECT_SERIALIZER_MAPPING[type_model](obj.content_object)
return serializer.data

def get_views_count(self, obj):
return get_views_count(obj)

def get_likes_count(self, obj):
return get_likes_count(obj)

def get_name(self, obj):
if obj.content_type.model == CustomUser.__name__.lower():
return f"{obj.content_object.first_name} {obj.content_object.last_name}"
elif obj.text != "" and obj.content_type.model == Project.__name__.lower():
return f"{obj.content_object.name}"

def get_image_address(self, obj):
return NewsMapping.get_image_address(obj.content_object)

def get_is_user_liked(self, obj):
user = self.context.get("user")
if user:
return is_fan(obj, user)
return False

class Meta:
model = News
fields = [
"id",
"name",
"image_address",
"text",
"datetime_created",
"views_count",
"likes_count",
"files",
"is_user_liked",
"content_object",
"type_model",
]
read_only_fields = ["views_count", "likes_count", "type_model"]


class NewsDetailSerializer(serializers.ModelSerializer):
views_count = serializers.SerializerMethodField()
likes_count = serializers.SerializerMethodField()
Expand Down

0 comments on commit 9d6a25e

Please sign in to comment.