Skip to content

Commit 77e59df

Browse files
committed
filter added, helpers code rewritten
1 parent b585865 commit 77e59df

3 files changed

Lines changed: 30 additions & 40 deletions

File tree

feed/constants.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88

99

1010
class FeedItemType(enum.Enum):
11-
PROJECT = "project"
12-
NEWS = "news"
13-
VACANCY = "vacancy"
11+
PROJECT = "Project"
12+
NEWS = "News"
13+
VACANCY = "Vacancy"
1414

1515

1616
FEED_SERIALIZER_MAPPING: dict[FeedItemType, serializers.Serializer] = {

feed/helpers.py

Lines changed: 15 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,22 @@
88
from 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

3129
def 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

4038
def 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

5442
def 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-
6646
def 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})

feed/views.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
from rest_framework.views import APIView
77

88
from feed.helpers import collect_feed
9+
from news.models import News
10+
from projects.models import Project
11+
from vacancy.models import Vacancy
912

1013

1114
class FeedList(APIView):
@@ -28,4 +31,12 @@ class FeedList(APIView):
2831
}
2932
)
3033
def get(self, request: Request, *args, **kwargs) -> Response:
31-
return Response(status=status.HTTP_200_OK, data=collect_feed())
34+
models = []
35+
if request.query_params.get("news") != "false":
36+
models.append(News)
37+
if request.query_params.get("vacancies") != "false":
38+
models.append(Vacancy)
39+
if request.query_params.get("projects") != "false":
40+
models.append(Project)
41+
42+
return Response(status=status.HTTP_200_OK, data=collect_feed(models, 3))

0 commit comments

Comments
 (0)