Změny:
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:
+57
-2
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user