88from vacancy .models import Vacancy
99
1010
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 )
11+ def collect_feed (models_list : typing .List , num ) -> list [dict ]:
12+ get_model_data = {
13+ model .__name__ : collect_querysets (model , num ) for model in models_list
14+ }
15+ result = []
16+ for model in get_model_data :
17+ result .extend (to_feed_items (model , get_model_data [model ]))
18+ random .shuffle (result )
19+ return result
1720
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- )
2621
27- random .shuffle (feed )
28- return feed
22+ def collect_querysets (model , num ):
23+ if model .__name__ == Project .__class__ .__name__ :
24+ return set (get_n_random_projects (num ) + get_n_latest_created_projects (num ))
25+ else :
26+ return list (model .objects .order_by ("-datetime_created" )[:num ])
2927
3028
3129def to_feed_items (type_ : constants .FeedItemType , items : typing .Iterable ) -> list [dict ]:
@@ -38,32 +36,13 @@ def to_feed_items(type_: constants.FeedItemType, items: typing.Iterable) -> list
3836
3937
4038def get_n_random_projects (num : int ) -> list [Project ]:
41- tries = 3
42- projects = set ()
43-
44- while len (projects ) < num and tries > 0 :
45- project = Project .objects .filter (draft = False ).order_by ("?" ).first ()
46-
47- if project not in projects :
48- projects .add (project )
49- else :
50- tries -= 1
51- return list (projects )
39+ return list (Project .objects .filter (draft = False ).order_by ("?" ).distinct ()[:num ])
5240
5341
5442def get_n_latest_created_projects (num : int ) -> list [Project ]:
5543 return list (Project .objects .filter (draft = False ).order_by ("-datetime_created" )[:num ])
5644
5745
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-
6646def to_feed_item (type_ : constants .FeedItemType , data ):
6747 serializer = constants .FEED_SERIALIZER_MAPPING [type_ ](data )
68-
6948 return FeedItemSerializer (data = {"type" : type_ , "content" : serializer .data })
0 commit comments