users migrace má nové sloupce gitea_user_id, gitea_sync_status, gitea_sync_error, gitea_synced_at.
Přidal jsem gitea_provisioning.py, který přes Gitea API vytváří, aktivuje, deaktivuje a synchronizuje účty.
Role viewer Gitea účet nemá; developer a admin účet mají.
Změny role a enable/disable v administraci spouští sync do Gitea.
Admin UI v routes/users.py zobrazuje stav Gitea synchronizace a má ruční Sync Gitea.
Google login po přihlášení dorovnává Gitea stav podle portálového uživatele.
Gitea OAuth login je v portálu vypnutý; endpointy zůstaly, ale vrací hlášku, že se má použít Google.
Lokální login se zobrazuje/povolí jen při explicitním AUTH_MODE=local.
Gitea API token se čte z GITEA_ADMIN_TOKEN, případně fallback GITEA_API_TOKEN nebo GITEA_TOKEN. Podřízené Gitea username je deterministicky portal-{user_id}, portálová tabulka zůstává zdroj pravdy.
Ověření: python -m py_compile prošel pro všechny upravené Python soubory.
This commit is contained in:
JiriUhlir
2026-06-10 09:34:56 +02:00
parent 38edf07ff3
commit b1263edac6
7 changed files with 334 additions and 24 deletions
+57 -2
View File
@@ -19,6 +19,10 @@ def list_users() -> list[dict[str, Any]]:
auth_provider_select = "auth_provider" if "auth_provider" in columns else "NULL AS auth_provider"
provider_subject_select = "provider_subject" if "provider_subject" in columns else "NULL AS provider_subject"
avatar_url_select = "avatar_url" if "avatar_url" in columns else "NULL AS avatar_url"
gitea_user_id_select = "gitea_user_id" if "gitea_user_id" in columns else "NULL AS gitea_user_id"
gitea_sync_status_select = "gitea_sync_status" if "gitea_sync_status" in columns else "'not_required' AS gitea_sync_status"
gitea_sync_error_select = "gitea_sync_error" if "gitea_sync_error" in columns else "NULL AS gitea_sync_error"
gitea_synced_at_select = "gitea_synced_at" if "gitea_synced_at" in columns else "NULL AS gitea_synced_at"
rows = con.execute(
f"""
@@ -34,7 +38,11 @@ def list_users() -> list[dict[str, Any]]:
{last_login_select},
{auth_provider_select},
{provider_subject_select},
{avatar_url_select}
{avatar_url_select},
{gitea_user_id_select},
{gitea_sync_status_select},
{gitea_sync_error_select},
{gitea_synced_at_select}
FROM users
ORDER BY id
"""
@@ -52,6 +60,10 @@ def get_user(user_id: int) -> dict[str, Any] | None:
auth_provider_select = "auth_provider" if "auth_provider" in columns else "NULL AS auth_provider"
provider_subject_select = "provider_subject" if "provider_subject" in columns else "NULL AS provider_subject"
avatar_url_select = "avatar_url" if "avatar_url" in columns else "NULL AS avatar_url"
gitea_user_id_select = "gitea_user_id" if "gitea_user_id" in columns else "NULL AS gitea_user_id"
gitea_sync_status_select = "gitea_sync_status" if "gitea_sync_status" in columns else "'not_required' AS gitea_sync_status"
gitea_sync_error_select = "gitea_sync_error" if "gitea_sync_error" in columns else "NULL AS gitea_sync_error"
gitea_synced_at_select = "gitea_synced_at" if "gitea_synced_at" in columns else "NULL AS gitea_synced_at"
row = con.execute(
f"""
@@ -67,7 +79,11 @@ def get_user(user_id: int) -> dict[str, Any] | None:
{last_login_select},
{auth_provider_select},
{provider_subject_select},
{avatar_url_select}
{avatar_url_select},
{gitea_user_id_select},
{gitea_sync_status_select},
{gitea_sync_error_select},
{gitea_synced_at_select}
FROM users
WHERE id = ?
""",
@@ -136,3 +152,42 @@ def set_user_enabled(user_id: int, enabled: bool) -> None:
)
con.commit()
con.close()
def update_gitea_sync_state(
user_id: int,
status: str,
*,
gitea_user_id: int | None = None,
error: str = "",
synced: bool = False,
) -> None:
run_migrations()
con = get_connection()
if gitea_user_id is None:
con.execute(
"""
UPDATE users
SET gitea_sync_status = ?,
gitea_sync_error = ?,
gitea_synced_at = CASE WHEN ? THEN CURRENT_TIMESTAMP ELSE gitea_synced_at END,
updated_at = CURRENT_TIMESTAMP
WHERE id = ?
""",
(status, error, 1 if synced else 0, user_id),
)
else:
con.execute(
"""
UPDATE users
SET gitea_user_id = ?,
gitea_sync_status = ?,
gitea_sync_error = ?,
gitea_synced_at = CASE WHEN ? THEN CURRENT_TIMESTAMP ELSE gitea_synced_at END,
updated_at = CURRENT_TIMESTAMP
WHERE id = ?
""",
(gitea_user_id, status, error, 1 if synced else 0, user_id),
)
con.commit()
con.close()