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:
+10
-1
@@ -23,7 +23,11 @@ def ensure_user_columns(con) -> None:
|
||||
last_login_at TEXT,
|
||||
auth_provider TEXT,
|
||||
provider_subject TEXT,
|
||||
avatar_url TEXT
|
||||
avatar_url TEXT,
|
||||
gitea_user_id INTEGER,
|
||||
gitea_sync_status TEXT NOT NULL DEFAULT 'not_required',
|
||||
gitea_sync_error TEXT,
|
||||
gitea_synced_at TEXT
|
||||
)
|
||||
"""
|
||||
)
|
||||
@@ -45,6 +49,10 @@ def ensure_user_columns(con) -> None:
|
||||
"auth_provider": "TEXT",
|
||||
"provider_subject": "TEXT",
|
||||
"avatar_url": "TEXT",
|
||||
"gitea_user_id": "INTEGER",
|
||||
"gitea_sync_status": "TEXT NOT NULL DEFAULT 'not_required'",
|
||||
"gitea_sync_error": "TEXT",
|
||||
"gitea_synced_at": "TEXT",
|
||||
}
|
||||
for column, definition in defaults.items():
|
||||
if column not in columns:
|
||||
@@ -54,6 +62,7 @@ def ensure_user_columns(con) -> None:
|
||||
if "is_active" in columns and "is_enabled" in columns:
|
||||
con.execute("UPDATE users SET is_enabled = COALESCE(is_active, 1) WHERE is_enabled IS NULL")
|
||||
con.execute("UPDATE users SET role = 'viewer' WHERE role IS NULL OR role = ''")
|
||||
con.execute("UPDATE users SET gitea_sync_status = 'not_required' WHERE gitea_sync_status IS NULL OR gitea_sync_status = ''")
|
||||
con.execute("UPDATE users SET created_at = CURRENT_TIMESTAMP WHERE created_at IS NULL OR created_at = ''")
|
||||
con.execute("UPDATE users SET updated_at = COALESCE(created_at, CURRENT_TIMESTAMP) WHERE updated_at IS NULL OR updated_at = ''")
|
||||
con.execute("CREATE INDEX IF NOT EXISTS idx_users_email ON users(email)")
|
||||
|
||||
+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