Skip to content

Commit 82c8bad

Browse files
committed
Для модуля Партнёрских программ добавлены документация и тесты
1 parent 69e4e80 commit 82c8bad

12 files changed

Lines changed: 1354 additions & 551 deletions

docs/modules/partner-programs.md

Lines changed: 202 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,204 @@
11
# Partner Programs
22

3-
TODO
3+
## Назначение
4+
5+
Модуль `partner_programs` отвечает за партнерские программы: регистрацию
6+
участников, привязку проектов к программе, дополнительные поля заявки,
7+
сдачу проектов на проверку, фильтрацию и выгрузки проектов программы.
8+
9+
Программа объединяет пользователей, проекты, новости, курсы и оценки проектов.
10+
11+
## Статус модуля
12+
13+
Модуль рабочий и используется продуктом, но пока остается архитектурно тяжелым:
14+
значительная часть бизнес-логики находится во `views.py`, а тесты только
15+
начинают приводиться к структуре, принятой для свежих модулей.
16+
17+
## Основные возможности
18+
19+
- список и детальная карточка партнерских программ;
20+
- регистрация пользователя в программе;
21+
- регистрация нового пользователя через внешнюю форму;
22+
- просмотр материалов и связанных курсов программы;
23+
- подача проекта в программу;
24+
- заполнение дополнительных полей проекта в программе;
25+
- сдача конкурсного проекта на проверку;
26+
- список и фильтрация проектов программы для менеджеров;
27+
- экспорт проектов и оценок;
28+
- публикация проектов после окончания программы;
29+
- новости программы через общий модуль `news`.
30+
31+
## Архитектура
32+
33+
- `partner_programs/models.py` - модели программ, участников, материалов,
34+
проектов программы и дополнительных полей.
35+
- `partner_programs/views.py` - API программы, регистрации, подачи проектов,
36+
фильтров и экспортов.
37+
- `partner_programs/serializers/` - request/response serializers и validation
38+
дополнительных полей.
39+
- `partner_programs/services.py` - сервисы публикации проектов и подготовки
40+
данных для Excel-выгрузок.
41+
- `partner_programs/selectors.py` - выборки участников для аналитики и
42+
напоминаний.
43+
- `partner_programs/permissions.py` - проверки менеджера программы, админа и
44+
лидера проекта.
45+
- `partner_programs/tasks.py` - celery-задача публикации проектов после
46+
завершения программы.
47+
- `partner_programs/tests/` - regression-тесты API, serializers и сервисов.
48+
49+
## Ключевые сущности
50+
51+
- `PartnerProgram` - сама программа, даты регистрации, подачи и завершения,
52+
настройки конкурсности и публикации проектов.
53+
- `PartnerProgramUserProfile` - участие пользователя в программе и данные
54+
регистрационной формы.
55+
- `PartnerProgramProject` - связь проекта с программой, статус сдачи проекта и
56+
дата сдачи.
57+
- `PartnerProgramField` - дополнительное поле программы.
58+
- `PartnerProgramFieldValue` - значение дополнительного поля для проекта в
59+
программе.
60+
- `PartnerProgramMaterial` - материал программы: ссылка или файл.
61+
62+
## API
63+
64+
- `GET /programs/` - список опубликованных программ.
65+
- `GET /programs/?participating=1` - активные программы текущего участника.
66+
- `GET /programs/<id>/` - детальная карточка программы.
67+
- `GET /programs/<id>/schema/` - схема регистрационных данных программы.
68+
- `POST /programs/<id>/register/` - регистрация текущего пользователя в
69+
программе.
70+
- `POST /programs/<id>/register_new/` - регистрация нового пользователя через
71+
внешнюю форму.
72+
- `POST /programs/<id>/set_liked/` - лайк программы.
73+
- `POST /programs/<id>/set_viewed/` - просмотр программы.
74+
- `GET /programs/<id>/news/` - новости программы.
75+
- `POST /programs/<id>/news/` - создание новости программы менеджером.
76+
- `GET /programs/<id>/projects/apply/` - данные формы подачи проекта.
77+
- `POST /programs/<id>/projects/apply/` - подача проекта в программу.
78+
- `POST /programs/partner-program-projects/<link_id>/submit/` - сдача проекта
79+
на проверку.
80+
- `PUT /projects/<project_id>/program-fields/` - обновление дополнительных
81+
полей проекта в программе.
82+
- `GET /programs/<id>/filters/` - доступные фильтры проектов программы.
83+
- `POST /programs/<id>/projects/filter/` - фильтрация проектов по
84+
дополнительным полям.
85+
- `GET /programs/<id>/projects/` - список проектов программы.
86+
- `GET /programs/<id>/export-projects/` - Excel-выгрузка проектов.
87+
- `GET /programs/<id>/export-rates/` - Excel-выгрузка оценок.
88+
89+
## Основные сценарии
90+
91+
### 1. Пользователь смотрит список программ
92+
93+
Список `/programs/` показывает только программы с `draft = False`.
94+
Для авторизованного пользователя response дополнительно показывает признак
95+
`is_user_member`.
96+
97+
Фильтр `participating=1` возвращает только активные программы, в которых
98+
текущий пользователь является участником.
99+
100+
### 2. Пользователь открывает программу
101+
102+
Детальная карточка возвращает разные поля для участника и не-участника.
103+
Если пользователь авторизован, просмотр программы фиксируется через общий
104+
механизм просмотров.
105+
106+
Связанные курсы программы возвращаются в поле `courses`; для каждого курса
107+
указывается `is_available`.
108+
109+
### 3. Пользователь регистрируется в программе
110+
111+
`POST /programs/<id>/register/` создает `PartnerProgramUserProfile` для текущего
112+
пользователя и сохраняет переданные данные формы в `partner_program_data`.
113+
114+
Если срок регистрации завершен или пользователь уже зарегистрирован, API
115+
возвращает ошибку.
116+
117+
### 4. Пользователь подает проект в программу
118+
119+
Участник программы открывает форму `/programs/<id>/projects/apply/`, получает
120+
список дополнительных полей и отправляет проект.
121+
122+
При успешной подаче создаются:
123+
124+
- черновой непубличный `Project`;
125+
- связь `PartnerProgramProject`;
126+
- значения `PartnerProgramFieldValue`;
127+
- связь `PartnerProgramUserProfile.project` с новым проектом.
128+
129+
Подача запрещена не-участнику, после дедлайна, при повторной подаче проекта и
130+
при некорректных дополнительных полях.
131+
132+
### 5. Лидер обновляет поля проекта в программе
133+
134+
`PUT /projects/<project_id>/program-fields/` обновляет значения дополнительных
135+
полей проекта.
136+
137+
Изменять значения может только лидер проекта. Для конкурсной программы после
138+
сдачи проекта на проверку редактирование блокируется.
139+
140+
### 6. Лидер сдает проект на проверку
141+
142+
`POST /programs/partner-program-projects/<link_id>/submit/` переводит связь
143+
проекта с программой в `submitted = True` и заполняет `datetime_submitted`.
144+
145+
Сдача доступна только лидеру проекта, только для конкурсных программ и только
146+
до дедлайна подачи проектов.
147+
148+
### 7. Менеджер работает с проектами программы
149+
150+
Менеджер или администратор программы может:
151+
152+
- смотреть список проектов программы;
153+
- получать список доступных фильтров;
154+
- фильтровать проекты по значениям дополнительных полей;
155+
- выгружать проекты и оценки в Excel.
156+
157+
## Связи с другими модулями
158+
159+
- `projects` - проекты подаются в программу и связываются через
160+
`PartnerProgramProject`.
161+
- `users` - участники и менеджеры программы.
162+
- `news` - новости программы создаются и читаются через общий news API.
163+
- `feed` - текстовые новости программы могут попадать в общую ленту как
164+
`type_model = "news"`.
165+
- `courses` - курс может быть связан с программой и доступен участникам
166+
программы.
167+
- `project_rates` - оценки проектов используются в выгрузке результатов.
168+
- `mailing` / `vacancy.tasks.send_email` - уведомления после регистрации в
169+
программе.
170+
- `files` - материалы программы могут ссылаться на `UserFile`.
171+
172+
## Ограничения и правила
173+
174+
- Дополнительные поля программы задаются через `PartnerProgramField`.
175+
- Значения дополнительных полей хранятся в `PartnerProgramFieldValue`.
176+
- После сдачи проекта в конкурсной программе значения полей редактировать
177+
нельзя.
178+
- Служебные feed-карточки программ пока не поддерживаются; новости программ в
179+
feed отображаются как обычные новости.
180+
- Основной API-код пока сосредоточен во `views.py`; перед крупным рефакторингом
181+
нужно зафиксировать больше regression-тестов.
182+
183+
## Тесты
184+
185+
Текущие regression-тесты проверяют:
186+
187+
- validation дополнительных полей: `text`, `textarea`, `checkbox`, `select`,
188+
`radio`, `file`;
189+
- список программ и фильтр `participating`;
190+
- регистрацию текущего пользователя в программе;
191+
- регистрацию нового пользователя через внешнюю форму;
192+
- запрет повторной регистрации и регистрации после дедлайна;
193+
- detail программы с курсами для участника и не-участника;
194+
- подачу проекта участником программы;
195+
- запрет подачи проекта не-участником, после дедлайна, с дублями полей,
196+
незаполненными обязательными полями и полями другой программы;
197+
- обновление дополнительных полей проекта лидером;
198+
- запрет обновления полей не-лидером и после сдачи конкурсного проекта;
199+
- сдачу проекта на проверку;
200+
- запрет сдачи проекта не-лидером, после дедлайна и для неконкурсной программы;
201+
- список фильтров программы;
202+
- фильтрацию проектов программы по дополнительным полям;
203+
- список проектов программы для менеджера;
204+
- публикацию проектов после завершения программы.

0 commit comments

Comments
 (0)