3.0 KiB
Why
Два бага при работе со списком кандидатов:
-
Пустой список при
?status=rejected. После фиксаcandidates-only-external-newв_fetch_candidatesжёстко добавленоp.status='new'. Когда пользователь явно выбираетstatus=rejected(илиpublished), в WHERE попадают ОБА условия:p.status='new' AND p.status='rejected'→ выборка всегда пустая, страница показывает «Нет кандидатов по фильтру». -
Сброс группировки после действия. Роут
/posts/{id}/rejectредиректит на/candidates?status=rejectedбез сохраненияgroup_by(и direction/own/q). Пользователь был в группировке «дата» → после отклонения его выбрасывает на?status=rejectedс дефолтной группировкой «источник». Аналогично approve/reclassify/rewrite/comment редиректят на?selected={id}без сохранения группировки.
What Changes
-
web/app.py,_fetch_candidates: жёсткоеp.status='new'добавлять только когда параметрstatusпуст (значение по умолчанию = кандидаты new). Еслиstatusзадан явно (new/rejected/published) — применять его как единственный фильтр статуса.p.is_own=0остаётся всегда (свои посты не кандидаты). -
Формы правой панели в
candidates.html(approve, reclassify, rewrite, reject, comment): добавить скрытые поляgroup_by,direction,own,qсо значениями текущей страницы. -
Роуты POST-действий (approve, reclassify, rewrite, reject, comment): читать
group_by/direction/own/qиз формы и строить редирект с этими параметрами, чтобы пользователь остался в той же группировке/фильтре.
Why Not
- Не парсить
Referer: хрупко и небезопасно. - Не возвращать на
/publishedпосле approve без сохранения контекста: пользователь работает в списке кандидатов и хочет остаться в нём. - Не менять SQL-структуру counts: counts считаются по внешним постам и уже корректны.
Impact
- Файлы:
web/app.py,web/templates/candidates.html. - Данные: без миграций БД.
- Сервис:
vesti-web(:8400) — перезапуск. - Rollback: откатить правки, перезапустить.