Skip to content

Commit 2561e72

Browse files
authored
Merge pull request #278 from PROCOLLAB-github/flexivanov237-pro-170
Flexivanov237 pro 170
2 parents 99c5eed + 6a70527 commit 2561e72

3 files changed

Lines changed: 30 additions & 42 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 & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,25 @@
33

44
from feed import constants
55
from feed.serializers import FeedItemSerializer
6-
from news.models import News
76
from projects.models import Project
8-
from vacancy.models import Vacancy
97

108

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)
9+
def collect_feed(models_list: typing.List, num) -> list[dict]:
10+
get_model_data = {
11+
model.__name__: collect_querysets(model, num) for model in models_list
12+
}
13+
result = []
14+
for model in get_model_data:
15+
result.extend(to_feed_items(model, get_model_data[model]))
16+
random.shuffle(result)
17+
return result
1718

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-
)
2619

27-
random.shuffle(feed)
28-
return feed
20+
def collect_querysets(model, num):
21+
if model.__name__ == Project.__class__.__name__:
22+
return set(get_n_random_projects(num) + get_n_latest_created_projects(num))
23+
else:
24+
return list(model.objects.order_by("-datetime_created")[:num])
2925

3026

3127
def to_feed_items(type_: constants.FeedItemType, items: typing.Iterable) -> list[dict]:
@@ -38,32 +34,13 @@ def to_feed_items(type_: constants.FeedItemType, items: typing.Iterable) -> list
3834

3935

4036
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)
37+
return list(Project.objects.filter(draft=False).order_by("?").distinct()[:num])
5238

5339

5440
def get_n_latest_created_projects(num: int) -> list[Project]:
5541
return list(Project.objects.filter(draft=False).order_by("-datetime_created")[:num])
5642

5743

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-
6644
def to_feed_item(type_: constants.FeedItemType, data):
6745
serializer = constants.FEED_SERIALIZER_MAPPING[type_](data)
68-
6946
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)