admin import/validate
This commit is contained in:
@@ -160,15 +160,90 @@ def cmd_users(args: argparse.Namespace) -> None:
|
||||
def cmd_import(args: argparse.Namespace) -> None:
|
||||
configs = load_config_variables()
|
||||
with db.connect(configs) as conn:
|
||||
imported_paths = []
|
||||
for entry in configs["users"]:
|
||||
user = entry["name"]
|
||||
lists_dir = Path(configs["global"]["lists-dir"]) / user
|
||||
master = lists_dir / "watch.txt"
|
||||
result = db.import_master_list(conn, user, master)
|
||||
if result["status"] == "ok":
|
||||
imported_paths.append(str(master))
|
||||
print(f"{user}: {result}")
|
||||
if result.get("duplicates"):
|
||||
print(f"{user} duplicates:")
|
||||
for dup in result["duplicates"]:
|
||||
print(f" {dup}")
|
||||
if imported_paths:
|
||||
print("Imported lists:")
|
||||
for path in imported_paths:
|
||||
print(f" {path}")
|
||||
conn.commit()
|
||||
|
||||
|
||||
def parse_list_file(path: Path) -> dict:
|
||||
enabled: set[str] = set()
|
||||
disabled: set[str] = set()
|
||||
if not path.is_file():
|
||||
return {"enabled": enabled, "disabled": disabled}
|
||||
with open(path, "r", encoding="utf-8") as r_file:
|
||||
for raw in r_file:
|
||||
line = raw.strip()
|
||||
if not line:
|
||||
continue
|
||||
if line.startswith("#"):
|
||||
url = line.lstrip("#").strip()
|
||||
if url:
|
||||
disabled.add(db.normalize_url(url))
|
||||
else:
|
||||
enabled.add(db.normalize_url(line))
|
||||
return {"enabled": enabled, "disabled": disabled}
|
||||
|
||||
|
||||
def cmd_validate_import(args: argparse.Namespace) -> None:
|
||||
configs = load_config_variables()
|
||||
with db.connect(configs) as conn:
|
||||
for entry in configs["users"]:
|
||||
user = entry["name"]
|
||||
lists_dir = Path(configs["global"]["lists-dir"]) / user
|
||||
master = lists_dir / "watch.txt"
|
||||
list_sets = parse_list_file(master)
|
||||
|
||||
rows = db.get_links_by_user(conn, user)
|
||||
db_enabled = set()
|
||||
db_disabled = set()
|
||||
for row in rows:
|
||||
norm = db.normalize_url(row["url_original"])
|
||||
if row["enabled"] and not row["banned_at"]:
|
||||
db_enabled.add(norm)
|
||||
else:
|
||||
db_disabled.add(norm)
|
||||
|
||||
missing_enabled = list_sets["enabled"] - db_enabled
|
||||
missing_disabled = list_sets["disabled"] - db_disabled
|
||||
extra_enabled = db_enabled - list_sets["enabled"]
|
||||
extra_disabled = db_disabled - list_sets["disabled"]
|
||||
|
||||
print(f"{user}:")
|
||||
if missing_enabled:
|
||||
print(" Missing enabled in DB:")
|
||||
for url in sorted(missing_enabled):
|
||||
print(f" {url}")
|
||||
if missing_disabled:
|
||||
print(" Missing disabled in DB:")
|
||||
for url in sorted(missing_disabled):
|
||||
print(f" {url}")
|
||||
if extra_enabled:
|
||||
print(" Extra enabled in DB:")
|
||||
for url in sorted(extra_enabled):
|
||||
print(f" {url}")
|
||||
if extra_disabled:
|
||||
print(" Extra disabled in DB:")
|
||||
for url in sorted(extra_disabled):
|
||||
print(f" {url}")
|
||||
if not any([missing_enabled, missing_disabled, extra_enabled, extra_disabled]):
|
||||
print(" OK")
|
||||
|
||||
|
||||
def cmd_user_rename(args: argparse.Namespace) -> None:
|
||||
configs = load_config_variables()
|
||||
with db.connect(configs) as conn:
|
||||
@@ -245,6 +320,9 @@ def build_parser() -> argparse.ArgumentParser:
|
||||
p_user_rename.add_argument("new")
|
||||
p_user_rename.set_defaults(func=cmd_user_rename)
|
||||
|
||||
p_validate = sub.add_parser("validate-import")
|
||||
p_validate.set_defaults(func=cmd_validate_import)
|
||||
|
||||
return parser
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user