Skip to content

Commit cad8bf7

Browse files
committed
Усилена фильтрация вакансий в Feed
1 parent 56e25cb commit cad8bf7

3 files changed

Lines changed: 44 additions & 1 deletion

File tree

docs/modules/feed.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ handlers для служебных записей.
2121
- отображение проектных новостей;
2222
- отображение служебных записей для проектов и вакансий;
2323
- исключение записей непубличных или черновых проектов;
24+
- исключение записей закрытых вакансий и вакансий из недоступных проектов;
2425
- передача признака лайка текущим пользователем.
2526

2627
## Архитектура
@@ -67,6 +68,11 @@ View выбирает подходящие `news.News`, сериализует
6768
Если проект черновой или непубличный, связанные с ним записи не возвращаются в
6869
`/feed/`.
6970

71+
### 5. Вакансия становится недоступной для публичной ленты
72+
73+
Если вакансия закрыта, находится в черновом проекте или относится к непубличному
74+
проекту, связанная с ней служебная feed-запись не возвращается в `/feed/`.
75+
7076
## API
7177

7278
- `GET /feed/?type=news` - новости пользователей.
@@ -96,6 +102,9 @@ View выбирает подходящие `news.News`, сериализует
96102
`type_model = "vacancy"`;
97103
- новости непубличных проектов не попадают в feed;
98104
- новости черновых проектов не попадают в feed;
105+
- служебные записи закрытых вакансий не попадают в feed;
106+
- служебные записи вакансий из черновых и непубличных проектов не попадают в
107+
feed;
99108
- liked flag выставляется для новостей, лайкнутых текущим пользователем;
100109
- `get_liked_news()` возвращает лайкнутые текущим пользователем записи;
101110
- `create_news_for_model()` создает одну служебную feed-запись без дублей;

feed/tests/test_feed_api.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,36 @@ def test_feed_returns_vacancy_feed_record_as_vacancy_content(self):
5858
self.assertEqual(item["content"]["id"], vacancy.id)
5959
self.assertEqual(item["content"]["role"], "Backend developer")
6060

61+
def test_feed_excludes_feed_record_for_inactive_vacancy(self):
62+
vacancy = create_vacancy(role="Inactive vacancy", is_active=False)
63+
create_news_for_model(vacancy)
64+
65+
response = self.client.get("/feed/?type=vacancy")
66+
67+
self.assertEqual(response.status_code, 200)
68+
self.assertEqual(response.data["results"], [])
69+
70+
def test_feed_excludes_vacancy_feed_record_for_draft_project(self):
71+
draft_project = create_project(name="Draft vacancy project", draft=True)
72+
create_vacancy(project=draft_project, role="Draft project vacancy")
73+
74+
response = self.client.get("/feed/?type=vacancy")
75+
76+
self.assertEqual(response.status_code, 200)
77+
self.assertEqual(response.data["results"], [])
78+
79+
def test_feed_excludes_vacancy_feed_record_for_private_project(self):
80+
private_project = create_project(
81+
name="Private vacancy project",
82+
is_public=False,
83+
)
84+
create_vacancy(project=private_project, role="Private project vacancy")
85+
86+
response = self.client.get("/feed/?type=vacancy")
87+
88+
self.assertEqual(response.status_code, 200)
89+
self.assertEqual(response.data["results"], [])
90+
6191
def test_feed_marks_news_liked_by_current_user(self):
6292
news = create_news_for(self.user, text="Liked user feed news")
6393
set_like(news, self.user, True)

feed/views.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@ def get_queryset(self) -> QuerySet[News]:
3737
"project": Project.objects.filter(draft=False, is_public=True).values_list(
3838
"id", flat=True
3939
),
40-
"vacancy": Vacancy.objects.values_list("id", flat=True),
40+
"vacancy": Vacancy.objects.filter(
41+
is_active=True,
42+
project__draft=False,
43+
project__is_public=True,
44+
).values_list("id", flat=True),
4145
}
4246
for model_name, ids_queryset in existing_object_filters.items():
4347
queryset = queryset.exclude(

0 commit comments

Comments
 (0)