Skip to content

Commit f175b9e

Browse files
authored
Merge pull request #644 from PROCOLLAB-github/refactor/modules
Refactor/modules
2 parents 0900d34 + 2a29fa3 commit f175b9e

29 files changed

Lines changed: 2406 additions & 614 deletions

docs/modules/project-rates.md

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

0 commit comments

Comments
 (0)