Skip to content

Commit 9ed1c89

Browse files
committed
Написана документация и расширены тесты для модуля project_rates
1 parent be1cbab commit 9ed1c89

9 files changed

Lines changed: 816 additions & 302 deletions

File tree

docs/modules/project-rates.md

Lines changed: 169 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,171 @@
11
# Project Rates
22

3-
TODO
3+
## Назначение
4+
5+
Модуль `project_rates` отвечает за экспертную оценку проектов внутри
6+
партнерских программ.
7+
8+
Он используется, когда проект уже привязан к программе и эксперты должны
9+
выставить оценки по критериям программы. Результаты оценок затем используются в
10+
интерфейсе оценки и в Excel-выгрузках партнерской программы.
11+
12+
## Статус модуля
13+
14+
Модуль рабочий и используется вместе с `partner_programs`. Базовые сценарии
15+
зафиксированы regression-тестами, но бизнес-логика оценки пока находится во
16+
`views.py`. Перед крупным рефакторингом важно сохранять текущий API-контракт и
17+
правила доступа экспертов.
18+
19+
## Основные возможности
20+
21+
- хранение критериев оценки программы;
22+
- выставление и обновление оценок проекта экспертом;
23+
- проверка типов и диапазонов значений;
24+
- ограничение количества экспертов, которые могут оценить один проект;
25+
- режим распределенной оценки, когда эксперт видит и оценивает только
26+
назначенные ему проекты;
27+
- назначение проектов экспертам через Django admin;
28+
- список проектов программы для оценки;
29+
- фильтрация списка проектов по дополнительным полям программы;
30+
- передача оценок в выгрузку результатов программы.
31+
32+
## Архитектура
33+
34+
- `project_rates/models.py` - критерии, оценки и назначения проектов экспертам.
35+
- `project_rates/views.py` - API оценки проекта и списка проектов для оценки.
36+
- `project_rates/serializers.py` - request serializer оценки и response
37+
serializer списка проектов.
38+
- `project_rates/validators.py` - проверка типа значения и числовых границ
39+
оценки.
40+
- `project_rates/signals.py` - создание дефолтного критерия `Комментарий` для
41+
новой программы.
42+
- `project_rates/admin.py` - управление критериями, оценками и bulk-назначением
43+
проектов экспертам.
44+
- `project_rates/tests/` - regression-тесты API, модели назначений,
45+
сериализации и критических правил.
46+
47+
## Ключевые сущности
48+
49+
- `Criteria` - критерий оценки проекта. Принадлежит конкретной партнерской
50+
программе, имеет тип `str`, `int`, `float` или `bool`, а для числовых типов
51+
может иметь `min_value` и `max_value`.
52+
- `ProjectScore` - оценка проекта конкретным экспертом по конкретному критерию.
53+
Уникальна по связке `criteria`, `user`, `project`.
54+
- `ProjectExpertAssignment` - назначение проекта эксперту в программе. Нужно
55+
для режима распределенной оценки.
56+
57+
## API
58+
59+
- `GET /rate-project/<program_id>` - список проектов программы для оценки.
60+
- `POST /rate-project/<program_id>` - список проектов программы с фильтрами в
61+
JSON body.
62+
- `POST /rate-project/rate/<project_id>` - выставление или обновление оценок
63+
проекта.
64+
65+
## Основные сценарии
66+
67+
### 1. Эксперт открывает список проектов для оценки
68+
69+
Эксперт запрашивает `GET /rate-project/<program_id>`.
70+
71+
API возвращает только проекты, привязанные к программе через
72+
`PartnerProgramProject` и не находящиеся в черновике.
73+
74+
Если у проекта уже есть оценки текущего эксперта, поле `criterias` возвращает
75+
выставленные значения. Если текущий эксперт еще не оценивал проект, поле
76+
`criterias` возвращает список критериев программы.
77+
78+
### 2. Эксперт фильтрует проекты программы
79+
80+
Эксперт может отправить `POST /rate-project/<program_id>` с телом:
81+
82+
```json
83+
{
84+
"filters": {
85+
"track": ["FinTech"]
86+
}
87+
}
88+
```
89+
90+
Фильтры применяются к дополнительным полям программы, которые хранятся в
91+
`PartnerProgramFieldValue`.
92+
93+
### 3. Эксперт выставляет оценки
94+
95+
Эксперт отправляет `POST /rate-project/rate/<project_id>` со списком значений:
96+
97+
```json
98+
[
99+
{
100+
"criterion_id": 1,
101+
"value": "8"
102+
}
103+
]
104+
```
105+
106+
API проверяет, что:
107+
108+
- пользователь является экспертом;
109+
- эксперт состоит в программе, к которой относятся критерии;
110+
- все критерии в запросе относятся к одной программе;
111+
- проект привязан к этой программе;
112+
- значение соответствует типу критерия и числовым ограничениям;
113+
- лимит `max_project_rates` не превышен.
114+
115+
При повторной отправке оценки того же эксперта по тому же критерию значение
116+
обновляется.
117+
118+
### 4. Распределенная оценка
119+
120+
Если у программы включено `is_distributed_evaluation`, эксперт видит и может
121+
оценивать только проекты, назначенные ему через `ProjectExpertAssignment`.
122+
123+
Назначение валидируется при сохранении:
124+
125+
- эксперт должен состоять в программе;
126+
- проект должен быть привязан к программе;
127+
- количество назначений по проекту не должно превышать `max_project_rates`.
128+
129+
Назначение нельзя удалить, если эксперт уже выставил оценку по этому проекту.
130+
131+
### 5. Выгрузка результатов
132+
133+
Модуль `partner_programs` использует `Criteria` и `ProjectScore` для подготовки
134+
Excel-выгрузки оценок программы через `/programs/<id>/export-rates/`.
135+
136+
## Связи с другими модулями
137+
138+
- `partner_programs` - программа, связь проекта с программой, дополнительные
139+
поля и выгрузка результатов.
140+
- `projects` - оцениваемые проекты.
141+
- `users` - эксперты программы и лидеры проектов.
142+
- `vacancy.tasks.send_email` - уведомление лидера проекта после оценки.
143+
144+
## Ограничения и правила
145+
146+
- Значения оценок хранятся строкой, а тип проверяется через критерий.
147+
- `ProjectScore.objects.bulk_create(..., update_conflicts=True)` обновляет
148+
существующую оценку без создания дубля.
149+
- `max_project_rates` ограничивает число разных экспертов, которые могут
150+
оценить один проект в программе; текущий эксперт может обновить свою оценку.
151+
- Дефолтный критерий `Комментарий` создается сигналом при создании программы.
152+
- Основная бизнес-логика оценки пока находится во `project_rates/views.py`.
153+
154+
## Тесты
155+
156+
Текущие regression-тесты проверяют:
157+
158+
- обычную оценку проекта экспертом программы;
159+
- обновление существующей оценки без дублей;
160+
- запрет оценки экспертом, который не состоит в программе;
161+
- запрет оценки проекта, который не привязан к программе;
162+
- запрет оценки критериями из разных программ;
163+
- ограничение `max_project_rates`;
164+
- валидацию числовых границ и boolean-значений;
165+
- список проектов программы без распределенной оценки;
166+
- список проектов программы при распределенной оценке;
167+
- фильтрацию проектов по дополнительным полям программы;
168+
- response-поля `scored`, `rated_experts`, `rated_count`, `max_rates`;
169+
- создание дефолтного критерия `Комментарий`;
170+
- валидацию `ProjectExpertAssignment`;
171+
- запрет удаления назначения после выставленной оценки.

0 commit comments

Comments
 (0)