1+ import random
2+ import typing
3+
4+ from feed import constants
5+ from feed .serializers import FeedItemSerializer
6+ from news .models import News
17from 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
440def get_n_random_projects (num : int ) -> list [Project ]:
@@ -17,3 +53,17 @@ def get_n_random_projects(num: int) -> list[Project]:
1753
1854def 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 })
0 commit comments