Skip to content

Commit f79d6c2

Browse files
authored
Merge pull request #265 from PROCOLLAB-github/yakser-pro-110
Лента с рандомными новостями
2 parents 22858d6 + 3f517a9 commit f79d6c2

4 files changed

Lines changed: 79 additions & 16 deletions

File tree

feed/constants.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import enum
2+
3+
from rest_framework import serializers
4+
5+
from news.serializers import NewsListSerializer
6+
from projects.serializers import ProjectListSerializer
7+
from vacancy.serializers import VacancyDetailSerializer
8+
9+
10+
class FeedItemType(enum.Enum):
11+
PROJECT = "project"
12+
NEWS = "news"
13+
VACANCY = "vacancy"
14+
15+
16+
FEED_SERIALIZER_MAPPING: dict[FeedItemType, serializers.Serializer] = {
17+
FeedItemType.PROJECT.value: ProjectListSerializer,
18+
FeedItemType.NEWS.value: NewsListSerializer,
19+
FeedItemType.VACANCY.value: VacancyDetailSerializer,
20+
}

feed/helpers.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,40 @@
1+
import random
2+
import typing
3+
4+
from feed import constants
5+
from feed.serializers import FeedItemSerializer
6+
from news.models import News
17
from projects.models import Project
8+
from vacancy.models import Vacancy
9+
10+
11+
def collect_feed() -> list:
12+
# да, это ужасно
13+
n_random_projects = get_n_random_projects(3)
14+
n_latest_created_projects = get_n_latest_created_projects(3)
15+
n_latest_created_news = get_n_latest_created_news(3)
16+
n_latest_created_vacancies = get_n_latest_created_vacancies(3)
17+
18+
feed = [
19+
to_feed_items(
20+
constants.FeedItemType.PROJECT.value,
21+
set(n_random_projects + n_latest_created_projects),
22+
),
23+
to_feed_items(constants.FeedItemType.NEWS.value, n_latest_created_news),
24+
to_feed_items(constants.FeedItemType.VACANCY.value, n_latest_created_vacancies),
25+
]
26+
27+
random.shuffle(feed)
28+
return feed
29+
30+
31+
def to_feed_items(type_: constants.FeedItemType, items: typing.Iterable) -> list[dict]:
32+
feed_items = []
33+
for item in items:
34+
serializer = to_feed_item(type_, item)
35+
serializer.is_valid()
36+
feed_items += [serializer.data]
37+
return feed_items
238

339

440
def get_n_random_projects(num: int) -> list[Project]:
@@ -17,3 +53,17 @@ def get_n_random_projects(num: int) -> list[Project]:
1753

1854
def get_n_latest_created_projects(num: int) -> list[Project]:
1955
return list(Project.objects.filter(draft=False).order_by("-datetime_created")[:num])
56+
57+
58+
def get_n_latest_created_news(num: int) -> list[Project]:
59+
return list(News.objects.order_by("-datetime_created")[:num])
60+
61+
62+
def get_n_latest_created_vacancies(num: int) -> list[Project]:
63+
return list(Vacancy.objects.order_by("-datetime_created")[:num])
64+
65+
66+
def to_feed_item(type_: constants.FeedItemType, data):
67+
serializer = constants.FEED_SERIALIZER_MAPPING[type_](data)
68+
69+
return FeedItemSerializer(data={"type": type_, "content": serializer.data})

feed/serializers.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from rest_framework import serializers
2+
from feed import constants
23

34

4-
class FeedListSerializer(serializers.Serializer):
5-
# todo: add type for feed news item
6-
pass
5+
class FeedItemSerializer(serializers.Serializer):
6+
type = serializers.ChoiceField(choices=constants.FeedItemType, required=True)
7+
content = serializers.JSONField(required=True)

feed/views.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
from rest_framework.response import Response
66
from rest_framework.views import APIView
77

8-
from feed.helpers import get_n_random_projects, get_n_latest_created_projects
9-
from projects.serializers import ProjectListSerializer
8+
from feed.helpers import collect_feed
109

1110

1211
class FeedList(APIView):
@@ -19,21 +18,14 @@ class FeedList(APIView):
1918
items=openapi.Schema(
2019
type=openapi.TYPE_OBJECT,
2120
description="Feed item",
21+
properties={
22+
"type": openapi.TYPE_STRING,
23+
"content": openapi.TYPE_OBJECT,
24+
},
2225
),
2326
),
2427
)
2528
}
2629
)
2730
def get(self, request: Request, *args, **kwargs) -> Response:
2831
return Response(status=status.HTTP_200_OK, data=collect_feed())
29-
30-
31-
def collect_feed() -> list:
32-
n_random_projects = get_n_random_projects(3)
33-
n_latest_created_projects = get_n_latest_created_projects(3)
34-
serializer = ProjectListSerializer(
35-
data=set(n_random_projects + n_latest_created_projects), many=True
36-
)
37-
38-
serializer.is_valid()
39-
return serializer.data

0 commit comments

Comments
 (0)