From 77e59df7458fb16d190f7ef41b5ac88c0a7c4f26 Mon Sep 17 00:00:00 2001 From: Alexey Kudelko Date: Fri, 16 Feb 2024 13:34:41 +0300 Subject: [PATCH 1/2] filter added, helpers code rewritten --- feed/constants.py | 6 +++--- feed/helpers.py | 51 ++++++++++++++--------------------------------- feed/views.py | 13 +++++++++++- 3 files changed, 30 insertions(+), 40 deletions(-) diff --git a/feed/constants.py b/feed/constants.py index 19cd5f04..6f2bc559 100644 --- a/feed/constants.py +++ b/feed/constants.py @@ -8,9 +8,9 @@ class FeedItemType(enum.Enum): - PROJECT = "project" - NEWS = "news" - VACANCY = "vacancy" + PROJECT = "Project" + NEWS = "News" + VACANCY = "Vacancy" FEED_SERIALIZER_MAPPING: dict[FeedItemType, serializers.Serializer] = { diff --git a/feed/helpers.py b/feed/helpers.py index 8f76dfc0..ef3efffd 100644 --- a/feed/helpers.py +++ b/feed/helpers.py @@ -8,24 +8,22 @@ from vacancy.models import Vacancy -def collect_feed() -> list: - # да, это ужасно - n_random_projects = get_n_random_projects(3) - n_latest_created_projects = get_n_latest_created_projects(3) - n_latest_created_news = get_n_latest_created_news(3) - n_latest_created_vacancies = get_n_latest_created_vacancies(3) +def collect_feed(models_list: typing.List, num) -> list[dict]: + get_model_data = { + model.__name__: collect_querysets(model, num) for model in models_list + } + result = [] + for model in get_model_data: + result.extend(to_feed_items(model, get_model_data[model])) + random.shuffle(result) + return result - feed = ( - to_feed_items( - constants.FeedItemType.PROJECT.value, - set(n_random_projects + n_latest_created_projects), - ) - + to_feed_items(constants.FeedItemType.NEWS.value, n_latest_created_news) - + to_feed_items(constants.FeedItemType.VACANCY.value, n_latest_created_vacancies) - ) - random.shuffle(feed) - return feed +def collect_querysets(model, num): + if model.__name__ == Project.__class__.__name__: + return set(get_n_random_projects(num) + get_n_latest_created_projects(num)) + else: + return list(model.objects.order_by("-datetime_created")[:num]) 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 def get_n_random_projects(num: int) -> list[Project]: - tries = 3 - projects = set() - - while len(projects) < num and tries > 0: - project = Project.objects.filter(draft=False).order_by("?").first() - - if project not in projects: - projects.add(project) - else: - tries -= 1 - return list(projects) + return list(Project.objects.filter(draft=False).order_by("?").distinct()[:num]) def get_n_latest_created_projects(num: int) -> list[Project]: return list(Project.objects.filter(draft=False).order_by("-datetime_created")[:num]) -def get_n_latest_created_news(num: int) -> list[Project]: - return list(News.objects.order_by("-datetime_created")[:num]) - - -def get_n_latest_created_vacancies(num: int) -> list[Project]: - return list(Vacancy.objects.order_by("-datetime_created")[:num]) - - def to_feed_item(type_: constants.FeedItemType, data): serializer = constants.FEED_SERIALIZER_MAPPING[type_](data) - return FeedItemSerializer(data={"type": type_, "content": serializer.data}) diff --git a/feed/views.py b/feed/views.py index 9d698015..39bc7ef6 100644 --- a/feed/views.py +++ b/feed/views.py @@ -6,6 +6,9 @@ from rest_framework.views import APIView from feed.helpers import collect_feed +from news.models import News +from projects.models import Project +from vacancy.models import Vacancy class FeedList(APIView): @@ -28,4 +31,12 @@ class FeedList(APIView): } ) def get(self, request: Request, *args, **kwargs) -> Response: - return Response(status=status.HTTP_200_OK, data=collect_feed()) + models = [] + if request.query_params.get("news") != "false": + models.append(News) + if request.query_params.get("vacancies") != "false": + models.append(Vacancy) + if request.query_params.get("projects") != "false": + models.append(Project) + + return Response(status=status.HTTP_200_OK, data=collect_feed(models, 3)) From 6a705274b90f3bfc27611b5c8c3d99b1ef347ad6 Mon Sep 17 00:00:00 2001 From: Alexey Kudelko Date: Fri, 16 Feb 2024 13:37:00 +0300 Subject: [PATCH 2/2] linter fixed --- feed/helpers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/feed/helpers.py b/feed/helpers.py index ef3efffd..1f65a8cd 100644 --- a/feed/helpers.py +++ b/feed/helpers.py @@ -3,9 +3,7 @@ from feed import constants from feed.serializers import FeedItemSerializer -from news.models import News from projects.models import Project -from vacancy.models import Vacancy def collect_feed(models_list: typing.List, num) -> list[dict]: