Модуль project_rates отвечает за экспертную оценку проектов внутри
партнерских программ.
Он используется, когда проект уже привязан к программе и эксперты должны выставить оценки по критериям программы. Результаты оценок затем используются в интерфейсе оценки и в Excel-выгрузках партнерской программы.
Модуль рабочий и используется вместе с partner_programs. Базовые сценарии
зафиксированы regression-тестами, бизнес-логика оценки вынесена в service
layer. При дальнейших изменениях важно сохранять текущий API-контракт и правила
доступа экспертов.
- хранение критериев оценки программы;
- выставление и обновление оценок проекта экспертом;
- проверка типов и диапазонов значений;
- ограничение количества экспертов, которые могут оценить один проект;
- режим распределенной оценки, когда эксперт видит и оценивает только назначенные ему проекты;
- назначение проектов экспертам через Django admin;
- список проектов программы для оценки;
- фильтрация списка проектов по дополнительным полям программы;
- передача оценок в выгрузку результатов программы.
project_rates/models.py- критерии, оценки и назначения проектов экспертам.project_rates/views.py- API оценки проекта и списка проектов для оценки.project_rates/services.py- бизнес-логика выставления оценок, фильтрации проектов для оценки и проверки лимитов.project_rates/serializers.py- request serializer оценки и response serializer списка проектов.project_rates/validators.py- проверка типа значения и числовых границ оценки.project_rates/signals.py- создание дефолтного критерияКомментарийдля новой программы.project_rates/admin.py- управление критериями, оценками и bulk-назначением проектов экспертам.project_rates/tests/- regression-тесты API, модели назначений, сериализации и критических правил.
Criteria- критерий оценки проекта. Принадлежит конкретной партнерской программе, имеет типstr,int,floatилиbool, а для числовых типов может иметьmin_valueиmax_value.ProjectScore- оценка проекта конкретным экспертом по конкретному критерию. Уникальна по связкеcriteria,user,project.ProjectExpertAssignment- назначение проекта эксперту в программе. Нужно для режима распределенной оценки.
GET /rate-project/<program_id>- список проектов программы для оценки.POST /rate-project/<program_id>- список проектов программы с фильтрами в JSON body.POST /rate-project/rate/<project_id>- выставление или обновление оценок проекта.
Эксперт запрашивает GET /rate-project/<program_id>.
API возвращает только проекты, привязанные к программе через
PartnerProgramProject и не находящиеся в черновике.
Если у проекта уже есть оценки текущего эксперта, поле criterias возвращает
выставленные значения. Если текущий эксперт еще не оценивал проект, поле
criterias возвращает список критериев программы.
Эксперт может отправить POST /rate-project/<program_id> с телом:
{
"filters": {
"track": ["FinTech"]
}
}Фильтры применяются к дополнительным полям программы, которые хранятся в
PartnerProgramFieldValue.
Эксперт отправляет POST /rate-project/rate/<project_id> со списком значений:
[
{
"criterion_id": 1,
"value": "8"
}
]API проверяет, что:
- пользователь является экспертом;
- эксперт состоит в программе, к которой относятся критерии;
- все критерии в запросе относятся к одной программе;
- проект привязан к этой программе;
- значение соответствует типу критерия и числовым ограничениям;
- лимит
max_project_ratesне превышен.
При повторной отправке оценки того же эксперта по тому же критерию значение обновляется.
Если у программы включено is_distributed_evaluation, эксперт видит и может
оценивать только проекты, назначенные ему через ProjectExpertAssignment.
Назначение валидируется при сохранении:
- эксперт должен состоять в программе;
- проект должен быть привязан к программе;
- количество назначений по проекту не должно превышать
max_project_rates.
Назначение нельзя удалить, если эксперт уже выставил оценку по этому проекту.
Модуль partner_programs использует Criteria и ProjectScore для подготовки
Excel-выгрузки оценок программы через /programs/<id>/export-rates/.
partner_programs- программа, связь проекта с программой, дополнительные поля и выгрузка результатов.projects- оцениваемые проекты.users- эксперты программы и лидеры проектов.vacancy.tasks.send_email- уведомление лидера проекта после оценки.
- Значения оценок хранятся строкой, а тип проверяется через критерий.
ProjectScore.objects.bulk_create(..., update_conflicts=True)обновляет существующую оценку без создания дубля.max_project_ratesограничивает число разных экспертов, которые могут оценить один проект в программе; текущий эксперт может обновить свою оценку.- Дефолтный критерий
Комментарийсоздается сигналом при создании программы. - Основная бизнес-логика оценки вынесена в
project_rates/services.py; views отвечают за HTTP-контракт и преобразование ошибок в response.
Текущие regression-тесты проверяют:
- обычную оценку проекта экспертом программы;
- обновление существующей оценки без дублей;
- запрет оценки экспертом, который не состоит в программе;
- запрет оценки проекта, который не привязан к программе;
- запрет оценки критериями из разных программ;
- ограничение
max_project_rates; - валидацию числовых границ и boolean-значений;
- список проектов программы без распределенной оценки;
- список проектов программы при распределенной оценке;
- фильтрацию проектов по дополнительным полям программы;
- response-поля
scored,rated_experts,rated_count,max_rates; - создание дефолтного критерия
Комментарий; - валидацию
ProjectExpertAssignment; - запрет удаления назначения после выставленной оценки.