Московский city_hint больше не уходит молча в регион 66 #3470

Merged
lekss361 merged 1 commit from feat/msk-suggest-region-inference into main 2026-09-12 10:44:40 +00:00
Owner

Первый из двух PR, открывающих Москву в публичный контур. Этот — бэкенд, обратно совместим и зелёный сам по себе; второй добавит Москву в реестр городов фронта и поправит копи.

Что было

Публичный /suggest (app/api/public/mera.py) звал геокодер вообще без региона, а у кабинетного /api/v1/geocode/suggest регион был обязательным параметром со значением 66 по умолчанию. city_hint="Москва" на это не влиял никак: DaData и Nominatim получали свердловский hard-констрейнт и молча возвращали пусто.

Итог — московский адрес нельзя было ввести ни с сайта, ни из кабинета, хотя всё, что дальше по цепочке, Москву уже поддерживает: проба покрытия знает московские центроиды, оценка отрабатывает (проверено на проде 12.09 — 200 за 1,5 с, 25 аналогов), реестр регионов содержит регион 77 с городами.

Что стало

effective_region_code(region_code, city_hint): явный регион важнее вывода из хинта, вывод идёт через существующий реестр app.services.regions (region_by_city, у 77 в городах есть «москва»), последний рубеж — прежний DEFAULT_REGION_CODE.

Отдельного списка городов не заводим намеренно: два списка, которые обязаны совпадать, рано или поздно разъезжаются.

Поведение сегодняшних клиентов не меняется. Без city_hint и с любым свердловским городом регион по-прежнему 66. Публичная схема теперь принимает region_code на будущее: если фронт начнёт его слать, он будет приоритетнее хинта. Неизвестный регион, как и раньше, отдаёт 422 из геокодера, а не 500.

Тесты

Четыре инварианта на сам хелпер: нет хинта → 66; свердловский город → 66; Москва → 77; явный 66 поверх Москвы → 66. Плюс по одному тесту на каждую ручку — что вниз по потоку уезжает ожидаемый регион.

Прежние тесты region-скоупа геокодера не тронуты (0 удалённых строк в файле). В связанных файлах 189 passed, ruff чистый, pre-commit прогнан вручную и зелёный.

Что этот PR не делает

Не трогает обогащение по региону 77 (его нет, оценка по Москве выходит без тиров — это известное ограничение), регион 50, расписания сбора и реестр городов фронта.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs

Первый из двух PR, открывающих Москву в публичный контур. Этот — бэкенд, обратно совместим и зелёный сам по себе; второй добавит Москву в реестр городов фронта и поправит копи. ## Что было Публичный `/suggest` (`app/api/public/mera.py`) звал геокодер вообще без региона, а у кабинетного `/api/v1/geocode/suggest` регион был обязательным параметром со значением 66 по умолчанию. `city_hint="Москва"` на это не влиял никак: DaData и Nominatim получали свердловский hard-констрейнт и молча возвращали пусто. Итог — московский адрес нельзя было ввести ни с сайта, ни из кабинета, хотя всё, что дальше по цепочке, Москву уже поддерживает: проба покрытия знает московские центроиды, оценка отрабатывает (проверено на проде 12.09 — 200 за 1,5 с, 25 аналогов), реестр регионов содержит регион 77 с городами. ## Что стало `effective_region_code(region_code, city_hint)`: явный регион важнее вывода из хинта, вывод идёт через существующий реестр `app.services.regions` (`region_by_city`, у 77 в городах есть «москва»), последний рубеж — прежний `DEFAULT_REGION_CODE`. Отдельного списка городов не заводим намеренно: два списка, которые обязаны совпадать, рано или поздно разъезжаются. Поведение сегодняшних клиентов не меняется. Без `city_hint` и с любым свердловским городом регион по-прежнему 66. Публичная схема теперь принимает `region_code` на будущее: если фронт начнёт его слать, он будет приоритетнее хинта. Неизвестный регион, как и раньше, отдаёт 422 из геокодера, а не 500. ## Тесты Четыре инварианта на сам хелпер: нет хинта → 66; свердловский город → 66; Москва → 77; явный 66 поверх Москвы → 66. Плюс по одному тесту на каждую ручку — что вниз по потоку уезжает ожидаемый регион. Прежние тесты region-скоупа геокодера не тронуты (0 удалённых строк в файле). В связанных файлах 189 passed, ruff чистый, pre-commit прогнан вручную и зелёный. ## Что этот PR не делает Не трогает обогащение по региону 77 (его нет, оценка по Москве выходит без тиров — это известное ограничение), регион 50, расписания сбора и реестр городов фронта. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01NQb6WeJtagZwZnUsSjDizs
lekss361 added 1 commit 2026-09-12 10:37:46 +00:00
fix(mera): московский city_hint больше не уходит молча в регион 66
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 11s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m31s
ef82a707fc
Публичный `/suggest` и кабинетный `/api/v1/geocode/suggest` всегда звали
геокодер с `region_code=66`: публичная ручка регион не передавала вовсе,
а у кабинетной он был обязательным параметром со значением по умолчанию.
`city_hint="Москва"` на это не влиял — DaData и Nominatim получали
свердловский hard-констрейнт и молча возвращали ПУСТО. С сайта и из
кабинета московский адрес просто нельзя было ввести, хотя оценка,
проба покрытия и реестр регионов Москву уже поддерживают.

Добавлен `effective_region_code()`: явный `region_code` важнее вывода из
`city_hint`, вывод идёт через существующий реестр `app.services.regions`
(`REGIONS[77].cities` содержит «москва»), последний рубеж — прежний
`DEFAULT_REGION_CODE`. Отдельного списка городов не заводим: разъехаться
двум спискам — вопрос времени.

Поведение сегодняшних клиентов не меняется байт-в-байт: без `city_hint`
и с любым свердловским городом регион по-прежнему 66. Публичная схема
принимает `region_code` на будущее — если фронт когда-нибудь начнёт его
слать, он будет приоритетнее хинта; неизвестный регион как и раньше
отдаёт 422 из геокодера, а не 500.

Тесты: четыре инварианта на сам хелпер (нет хинта → 66; свердловский
город → 66; Москва → 77; явный 66 поверх Москвы → 66) и по одному на
каждую ручку — что вниз по потоку уезжает ожидаемый регион. Прежние
тесты region-скоупа геокодера не тронуты.

189 passed в связанных файлах, ruff чистый.
lekss361 merged commit 00e0bddfb4 into main 2026-09-12 10:44:40 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3470
No description provided.