file_io.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. from pathlib import Path
  2. from flask import request, Flask
  3. from flask_cors import CORS
  4. from datetime import datetime
  5. import json
  6. import hashlib
  7. import time
  8. from planner_load import PlannerLoad
  9. from config_load import ConfigLoad
  10. app = Flask(__name__)
  11. # cors = CORS(app, resources={r"/*": {"origins": "http://localhost:4200/"}})
  12. CORS(app)
  13. script_dir = Path(__file__).parent
  14. save_dir = script_dir.parent.joinpath('save')
  15. planner_dir = script_dir.parent.joinpath('export')
  16. # save_dir = Path('C:\\Projekte\\Python\\Planung\\save')
  17. @app.route('/list/', methods=['GET'])
  18. def list_json():
  19. return json.dumps(list_dict(), indent=2)
  20. def list_dict():
  21. result = {'list': [], 'tree': {}}
  22. for currentFile in save_dir.iterdir():
  23. if currentFile.is_file() and currentFile.name[-5:] == '.json':
  24. year, version, timestamp = currentFile.name[:-5].split("_")
  25. if year not in result['tree']:
  26. result['tree'][year] = {}
  27. if version not in result['tree'][year]:
  28. result['tree'][year][version] = []
  29. result['tree'][year][version].append(timestamp)
  30. result['list'].append({'year': year, 'version': version, 'timestamp': timestamp})
  31. return result
  32. @app.route('/load/<year>/<version>/<timestamp>', methods=['GET'])
  33. def load(year, version, timestamp):
  34. file = full_filename(year, version, timestamp)
  35. if timestamp == 'new':
  36. return app.response_class(
  37. response=new_file(year),
  38. mimetype='application/json'
  39. )
  40. if timestamp == 'current' or not Path(file).exists():
  41. file_list = list_dict()
  42. timestamp = file_list['tree'][year][version][-1]
  43. file = full_filename(year, version, timestamp)
  44. print(file)
  45. time.sleep(2)
  46. with open(file, 'r') as frh:
  47. return app.response_class(
  48. response=frh.read(),
  49. mimetype='application/json'
  50. )
  51. def full_filename(year, version, timestamp):
  52. return f'{str(save_dir)}/{year}_{version}_{timestamp}.json'
  53. @app.route('/new/<year>', methods=['GET'])
  54. def new_file(year):
  55. p_load = PlannerLoad(planner_dir)
  56. structure = p_load.new_file(year)
  57. return json.dumps(structure)
  58. @app.route('/load/<filename>', methods=['GET'])
  59. def load_file(filename):
  60. full_filename = f'{str(save_dir)}/{filename}.json'
  61. if not Path(full_filename).exists():
  62. file_list = list_dict()
  63. timestamp = file_list[filename][-1]
  64. full_filename = f'{full_filename[:-5]}_{timestamp}.json'
  65. print(full_filename)
  66. return open(full_filename, 'r').read()
  67. @app.route('/save/<filename>', methods=['POST'])
  68. def save(filename):
  69. if request.method != 'POST':
  70. return 'File is missing!'
  71. new_filename = str(save_dir) + '/' + filename + '_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.json'
  72. data = request.get_json()['data']
  73. json.dump(data, open(new_filename, 'w'), indent=2)
  74. print(new_filename)
  75. try:
  76. file_list = list_dict()
  77. timestamp = file_list[filename][-2]
  78. old_filename = str(save_dir) + '/' + filename + "_" + timestamp + '.json'
  79. if old_filename != new_filename and hash(old_filename) == hash(new_filename):
  80. Path(old_filename).unlink()
  81. return 'File saved with no changes!'
  82. except KeyError:
  83. pass
  84. return 'File saved with new data!'
  85. @app.route('/config', methods=['GET'])
  86. def config():
  87. cfg = ConfigLoad(str(planner_dir))
  88. return app.response_class(
  89. response=json.dumps(cfg.load_file('reisacher', '2022')),
  90. mimetype='application/json'
  91. )
  92. @app.route('/accounts/<period>', methods=['GET'])
  93. def accounts(period):
  94. return open(planner_dir.joinpath(f'accounts_{period}.json'), 'r').read()
  95. def hash(filename):
  96. BUF_SIZE = 65536
  97. sha1 = hashlib.sha1()
  98. with open(filename, 'rb') as g:
  99. while True:
  100. hashdata = g.read(BUF_SIZE)
  101. if not hashdata:
  102. break
  103. sha1.update(hashdata)
  104. return sha1.hexdigest()
  105. if __name__ == '__main__':
  106. app.run(host='0.0.0.0', port='8082', debug=True)