создан механизм для создания меню для разных сравнений через drap-and-drop

This commit is contained in:
2026-08-20 12:29:07 +03:00
parent 3f2d5caa4a
commit 81fd030846
6 changed files with 727 additions and 22 deletions

View File

@@ -544,16 +544,42 @@ class MappingDataService:
control = session.scalar(select(GameControlState).where(GameControlState.game_external_id == resolved_game_id))
if control is not None:
runtime_values = HockeyDataService._runtime_values_from_row(control)
player_panel_labels: dict[str, str] = {}
for meta_key, meta_value in runtime_values.items():
meta_match = re.match(r"^player_select\.([A-Za-z0-9_]+)\._label$", str(meta_key))
if meta_match:
player_panel_labels[meta_match.group(1)] = str(meta_value or meta_match.group(1))
for raw_key, raw_value in runtime_values.items():
sql_key = re.sub(r"[^A-Za-z0-9_]+", "_", str(raw_key)).strip("_")[:120]
raw_key_text = str(raw_key)
player_match = re.match(r"^player_select\.([A-Za-z0-9_]+)\.(.+)$", raw_key_text)
if player_match and player_match.group(2).startswith("_"):
continue
sql_key = re.sub(r"[^A-Za-z0-9_]+", "_", raw_key_text).strip("_")[:120]
if not sql_key or not re.match(r"^[A-Za-z]", sql_key):
sql_key = f"panel_{sql_key}"[:120]
context.setdefault(sql_key, str(raw_value))
if player_match:
panel_id, field_key = player_match.groups()
slot_match = re.match(r"player(\d+)_(id|db_id|team_id|side|number|name)$", field_key)
field_labels = {
"id": "external ID", "db_id": "DB ID", "team_id": "ID команды",
"side": "сторона", "number": "номер", "name": "имя",
}
label = field_key
if slot_match:
slot_no, field_name = slot_match.groups()
label = f"Игрок {slot_no}{field_labels.get(field_name, field_name)}"
category = f"Игровые выборки · {player_panel_labels.get(panel_id, panel_id)}"
description = f"Игрок, перетащенный оператором в блок {player_panel_labels.get(panel_id, panel_id)}."
else:
label = raw_key_text
category = "Нижняя панель"
description = f"Runtime-параметр нижней панели: {raw_key_text}"
runtime_variable_payloads.append({
"key": sql_key,
"label": str(raw_key),
"category": "Нижняя панель",
"description": f"Runtime-параметр нижней панели: {raw_key}",
"label": label,
"category": category,
"description": description,
"scope": "match",
"source_type": "system",
"is_system": True,
@@ -800,6 +826,11 @@ class MappingDataService:
"description": "Текущее состояние операторской кнопки матча.",
})
runtime_values = HockeyDataService._runtime_values_from_row(control) if control is not None else {}
player_panel_labels: dict[str, str] = {}
for meta_key, meta_value in runtime_values.items():
meta_match = re.match(r"^player_select\.([A-Za-z0-9_]+)\._label$", str(meta_key))
if meta_match:
player_panel_labels[meta_match.group(1)] = str(meta_value or meta_match.group(1))
for key, value in runtime_values.items():
mapping_key = str(key)
if mapping_key.startswith("panel."):
@@ -812,6 +843,32 @@ class MappingDataService:
"source_code": "live_control",
"description": "Выбранное значение параметризованной кнопки нижней панели.",
})
continue
player_match = re.match(r"^player_select\.([A-Za-z0-9_]+)\.(.+)$", mapping_key)
if not player_match:
continue
panel_id, field_key = player_match.groups()
if field_key.startswith("_"):
continue
slot_match = re.match(r"player(\d+)_(id|db_id|team_id|side|number|name)$", field_key)
field_labels = {
"id": "external ID", "db_id": "DB ID", "team_id": "ID команды",
"side": "сторона", "number": "номер", "name": "имя",
}
label = field_key
if slot_match:
slot_no, field_name = slot_match.groups()
label = f"Игрок {slot_no}{field_labels.get(field_name, field_name)}"
panel_label = player_panel_labels.get(panel_id, panel_id)
result.append({
"key": mapping_key,
"label": label,
"category": f"Игровые выборки · {panel_label}",
"value": value,
"kind": "text",
"source_code": "live_control",
"description": f"Значение слота блока игроков «{panel_label}».",
})
return result
def data_catalog(