synchronize data between configured servers

This commit is contained in:
2026-05-23 20:32:04 +02:00
parent f9d09d5357
commit 330d414e72
6 changed files with 250 additions and 123 deletions
+68 -15
View File
@@ -1,12 +1,15 @@
"""
Synchronize Kontor data between configured servers.
"""
import json
from argparse import ArgumentDefaultsHelpFormatter, ArgumentParser
from typing import List
from logging import Logger
from typing import Dict, List
from api import (
MAPPING,
EndPointNotAvailableException,
Option,
OptionType,
Server,
get_api_config,
get_logger,
@@ -22,17 +25,43 @@ parser.add_argument("--cleanup", "-d", action="store_true")
args = parser.parse_args()
def create_item_id_mapping(data_list: List[dict]) -> Dict[str, dict]:
"""
create dictionary with id as key and dictionary as value.
"""
item_id_mapping: Dict[str, dict] = {}
for data_item in data_list:
item_id_mapping[data_item["id"]] = data_item
return item_id_mapping
def is_different(log: Logger, first_item, second_item: dict) -> bool:
"""
Check dicts for differences and returns true if values are not equals, except for last_modified_date.
"""
check_result = False
for key, value in first_item.items():
if key in second_item.keys():
if value != second_item[key]:
log.info("%s: %s != %s", key, value, second_item[key])
if key == "last_modified_date":
continue
if not check_result:
check_result = True
return check_result
if __name__ == "__main__":
logger = get_logger(args.verbose, "kontor")
logger.info("kontor.sync started")
apiConfig = get_api_config(logger, args.config)
APICONFIG = get_api_config(logger, args.config)
server_list: List[Server] = []
if args.server:
server = apiConfig.get_server(args.server)
server = APICONFIG.get_server(args.server)
if server:
server_list.append(server)
else:
server_list.extend(apiConfig.server)
server_list.extend(APICONFIG.server)
export_data = {}
for server in server_list:
export_data[server.name] = {}
@@ -48,20 +77,44 @@ if __name__ == "__main__":
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:
with open(file_name, "w", encoding="utf-8") as dump_file:
dump_file.write(json_dump)
except TypeError as error:
logger.info(f"{error}")
logger.info(error)
for server in server_list:
logger.info(f"{server.name}: {len(export_data[server.name])} tables exported")
logger.info(
"%s: %s tables exported", server.name, len(export_data[server.name])
)
if len(server_list) > 1:
for table, path in MAPPING.items():
mapping = create_item_id_mapping(export_data[server_list[1].name][table])
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)
logger.debug("checking %s:%s", table, item["id"])
check_item_id = item["id"]
if check_item_id in mapping:
check_item = mapping[check_item_id]
if is_different(logger, item, check_item):
logger.info(
"checking values for %s != %s", item["id"], check_item["id"]
)
logger.debug("diff: %s\n%s", item, check_item)
result = server_list[1].update(
logger, table, check_item_id, item
)
logger.info("update result: %s", result)
else:
logger.debug(
"no changes for: %s(%s - %s)",
table,
item["id"],
check_item["id"],
)
else:
logger.debug("no changes for: %s(%s)", table, item["id"])
logger.info(
"item %s in %s missing", check_item_id, server_list[1].name
)
logger.info("synchronization of %s finished", table)
logger.info("all tables synchronized")
else:
logger.info("not enough server configured for sync")
logger.info("kontor.sync finished")