Files
kontor/kontor-scripts/sync.py
T
Thomas Peetz 8d684908e6
Gitea Actions Demo / Explore-Gitea-Actions (push) Successful in 2s
update cli scripts to use REST API
2026-05-21 16:51:38 +02:00

68 lines
2.5 KiB
Python

import json
from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser
from typing import List
from api import (
MAPPING,
EndPointNotAvailableException,
Option,
OptionType,
Server,
get_api_config,
get_logger,
)
parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument("--verbose", "-v", action="count", default=0)
parser.add_argument("--config", "-c", default="kontor-api")
parser.add_argument("--dry-run", "-m", action="store_true")
parser.add_argument("--to-file", "-f", action="store_true")
parser.add_argument("--server", "-s")
parser.add_argument("--cleanup", "-d", action="store_true")
args = parser.parse_args()
if __name__ == "__main__":
logger = get_logger(args.verbose, "kontor")
logger.info("kontor.sync started")
apiConfig = get_api_config(logger, args.config)
server_list: List[Server] = []
if args.server:
server = apiConfig.get_server(args.server)
if server:
server_list.append(server)
else:
server_list.extend(apiConfig.server)
export_data = {}
for server in server_list:
export_data[server.name] = {}
for table, path in MAPPING.items():
try:
data = server.request(logger, table=table)
logger.info("%s: %s", table, len(data))
export_data[server.name][table] = data
logger.info("%s: %s exported", table, len(data))
except EndPointNotAvailableException:
logger.info("Endpoint not implemented")
if args.to_file:
try:
json_dump = json.dumps(export_data[server.name], indent=4)
file_name = f"{server.name}-data.json"
with open(file_name, "w") as dump_file:
dump_file.write(json_dump)
except TypeError as error:
logger.info(f"{error}")
for server in server_list:
logger.info(f"{server.name}: {len(export_data[server.name])} tables exported")
if len(server_list) > 1:
for table, path in MAPPING.items():
for item in export_data[server_list[0].name][table]:
item_data = server_list[1].request(
logger, table=table, param=Option(OptionType.ID, item["id"])
)
if item != item_data:
logger.debug("diff: %s\n%s", item, item_data)
else:
logger.debug("no changes for: %s(%s)", table, item["id"])
logger.info("kontor.sync finished")