Учёт DEPO в мастере: четыре вопроса по порядку, скрипт собирается сам из ответов

СУБД → сервер, порт и имя базы → где запускать обработку обмена → логин
администратора или скрипт. Выбор плитками, под ним — поля выбранного способа
и своя кнопка. Скрипт показывается сразу и пересобирается при любой правке
выше (без кнопки «Обновить»), собирается и до адреса сервера (без адреса не
сохраняется).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-10-06 14:53:12 +03:00
parent 879cf4f09e
commit e191817a14
3 changed files with 160 additions and 64 deletions
+12 -9
View File
@@ -236,7 +236,8 @@ func (h *setupHandlers) wizardDepoRecheck(w http.ResponseWriter, r *http.Request
wizDepoGo(w, r, "done", "всё перепроверено", true)
}
// depoSetupForm — сервер DEPO и способ обработки из формы экрана «Подготовка базы» (логин bj не трогается).
// depoSetupForm — сервер DEPO и способ обработки из формы экрана «Подготовка базы» (логин bj не трогается;
// пустой адрес сервера не ошибка — скрипту он не нужен, подключению проверяют вызывающие).
func (h *setupHandlers) depoSetupForm(r *http.Request) (FancyMSSQLSettings, string, bool, string) {
s := h.rc.Snapshot().Fancy
dbType := "mssql"
@@ -271,9 +272,6 @@ func (h *setupHandlers) depoSetupForm(r *http.Request) (FancyMSSQLSettings, stri
if dbType == "postgres" && db == "" {
return s, "", agent, "для PostgreSQL укажите имя базы DEPO"
}
if server == "" {
return s, db, agent, "укажите адрес сервера DEPO"
}
return s, db, agent, ""
}
@@ -307,7 +305,7 @@ func depoScriptCreds(r *http.Request, s *FancyMSSQLSettings) string {
}
// wizardDepoScript — POST /admin/setup/wizard-depo/script.sql: один скрипт подготовки базы файлом
// (view=1 — текстом для показа на странице).
// (view=1 — текстом для показа на странице: экран пересобирает его при каждой правке ответов).
func (h *setupHandlers) wizardDepoScript(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost || !requireDepo(w, r) {
return
@@ -330,9 +328,11 @@ func (h *setupHandlers) wizardDepoScript(w http.ResponseWriter, r *http.Request)
}
depoEnsureLogin(&s)
s.DepoTablesMode = "script"
if err := h.rc.UpdateFancy(s); err != nil {
fail("не сохранилось: " + err.Error())
return
if s.Server != "" { // скрипт собирается и до адреса сервера (экран обновляет его на ходу) — без адреса не сохраняем
if err := h.rc.UpdateFancy(s); err != nil {
fail("не сохранилось: " + err.Error())
return
}
}
body := depoSetupScript(s, db, s.User, s.Password, agent)
w.Header().Set("Cache-Control", "no-store")
@@ -356,6 +356,9 @@ func (h *setupHandlers) wizardDepoSetup(w http.ResponseWriter, r *http.Request)
return
}
s, db, agent, bad := h.depoSetupForm(r)
if bad == "" && s.Server == "" {
bad = "укажите адрес сервера DEPO"
}
if bad != "" {
wizDepoGo(w, r, "setup", bad, false)
return
@@ -417,7 +420,7 @@ func (h *setupHandlers) wizardDepoSetup(w http.ResponseWriter, r *http.Request)
found, err := depoDiscover(ctx, s)
switch {
case err != nil || len(found) == 0:
wizDepoGo(w, r, "setup", "логину "+s.User+" не видна ни одна база DEPO — выполнен ли скрипт? Можно указать базу вручную («Дополнительно»)", false)
wizDepoGo(w, r, "setup", "логину "+s.User+" не видна ни одна база DEPO — выполнен ли скрипт? Можно вписать имя базы в поле «Имя базы»", false)
return
case len(found) > 1:
http.Redirect(w, r, "/admin/wizard?step=3&sub=setup&cands="+url.QueryEscape(strings.Join(found, ","))+