123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- from pathlib import Path
- from flask import request, current_app as app
- from flask_json import as_json
- from flexmeasures.api.common.responses import (
- no_backup,
- request_processed,
- unrecognized_backup,
- )
- from flexmeasures.data import db
- from flexmeasures.data.scripts.data_gen import (
- depopulate_measurements,
- depopulate_prognoses,
- depopulate_structure,
- get_affected_classes,
- load_tables,
- )
- @as_json
- def restore_data_response():
- delete_structure = True
- delete_data = True
- restore_structure = True
- restore_data = True
- try:
- backup_name = request.args.get("backup", request.json["backup"])
- except KeyError:
- return no_backup()
- # Make sure backup folder and files exist before restoring
- backup_path = app.config.get("FLEXMEASURES_DB_BACKUP_PATH")
- if (
- not Path("%s/%s" % (backup_path, backup_name)).exists()
- or not Path("%s/%s" % (backup_path, backup_name)).is_dir()
- ):
- return unrecognized_backup()
- affected_classes = get_affected_classes(
- structure=restore_structure, data=restore_data
- )
- for c in affected_classes:
- file_path = "%s/%s/%s.obj" % (backup_path, backup_name, c.__tablename__)
- if not Path(file_path).exists():
- return unrecognized_backup(
- "Can't load table, because filename %s does not exist."
- % c.__tablename__
- )
- # Reset in play mode only (this endpoint should not have been registered otherwise)
- assert app.config.get("FLEXMEASURES_MODE", "") == "play"
- if delete_data:
- depopulate_prognoses(db)
- depopulate_measurements(db)
- if delete_structure:
- depopulate_structure(db)
- # Load backup
- load_tables(
- db,
- backup_name,
- structure=restore_structure,
- data=restore_data,
- backup_path=backup_path,
- )
- return request_processed("Database restored to %s." % backup_name)
|