file_io.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import os
  2. from pathlib import Path
  3. from flask import Blueprint, Response, request
  4. from flask_cors import CORS
  5. from datetime import datetime
  6. import json
  7. import hashlib
  8. import time
  9. from webservice.auth import Auth
  10. from webservice.planner_load import PlannerLoad
  11. from webservice.config_load import ConfigLoad
  12. bp = Blueprint('file_io', __name__)
  13. # cors = CORS(app, resources={r"/*": {"origins": "http://localhost:4200/"}})
  14. CORS(bp)
  15. script_dir = Path(__file__).parent
  16. save_dir = script_dir.parent.joinpath('save')
  17. planner_dir = script_dir.parent.joinpath('export')
  18. config_dir = script_dir.parent.joinpath('config')
  19. # save_dir = Path('C:\\Projekte\\Python\\Planung\\save')
  20. user_info = None
  21. timestamp_keywords = ('accounts', 'plan', 'marketing')
  22. @bp.route('/login/', methods=['POST'])
  23. def login():
  24. user = request.get_json()['data']['user']
  25. password = request.get_json()['data']['password']
  26. user_info = Auth().get_user(user, password)
  27. return Response(
  28. response=json.dumps(user_info),
  29. mimetype='application/json'
  30. )
  31. @bp.route('/list', methods=['GET'])
  32. def list_json():
  33. return json.dumps(list_dict(), indent=2)
  34. def list_dict():
  35. result = {'list': [], 'tree': {}}
  36. for currentFile in save_dir.iterdir():
  37. if currentFile.is_file() and currentFile.name[-5:] == '.json':
  38. year, version, timestamp = currentFile.name[:-5].split("_")
  39. if year not in result['tree']:
  40. result['tree'][year] = {}
  41. if version not in result['tree'][year]:
  42. result['tree'][year][version] = []
  43. result['tree'][year][version].append(timestamp)
  44. result['list'].append({'year': year, 'version': version, 'timestamp': timestamp})
  45. result['list'].sort(key=lambda x: x['timestamp'])
  46. return result
  47. @bp.route('/load/<year>/<version>/<timestamp>', methods=['GET'])
  48. def load(year, version, timestamp):
  49. file = full_filename(year, version, timestamp)
  50. if timestamp == 'new':
  51. return Response(
  52. response=new_file(year),
  53. mimetype='application/json'
  54. )
  55. if timestamp == 'current' or not Path(file).exists():
  56. file_list = list_dict()
  57. timestamp2 = file_list['tree'][year][version][-1]
  58. file = full_filename(year, version, timestamp2)
  59. print(file)
  60. with open(file, 'r') as frh:
  61. structure = json.loads(frh.read())
  62. if 'options' not in structure[0]:
  63. p_load = PlannerLoad(planner_dir)
  64. structure = p_load.convert_file(structure)
  65. elif timestamp in timestamp_keywords:
  66. p_load = PlannerLoad(planner_dir)
  67. p_load.load_values(year)
  68. p_load.set_structure(structure)
  69. structure = p_load.update_values(timestamp)
  70. return Response(
  71. response=json.dumps(structure),
  72. mimetype='application/json'
  73. )
  74. def full_filename(year, version, timestamp):
  75. return f'{str(save_dir)}/{year}_{version}_{timestamp}.json'
  76. @bp.route('/new/<year>', methods=['GET'])
  77. def new_file(year):
  78. p_load = PlannerLoad(planner_dir)
  79. structure = p_load.new_file(year)
  80. return json.dumps(structure)
  81. @bp.route('/load/<filename>', methods=['GET'])
  82. def load_file(filename):
  83. full_filename = f'{str(save_dir)}/{filename}.json'
  84. if not Path(full_filename).exists():
  85. file_list = list_dict()
  86. timestamp = file_list[filename][-1]
  87. full_filename = f'{full_filename[:-5]}_{timestamp}.json'
  88. print(full_filename)
  89. with open(full_filename, 'r') as frh:
  90. return frh.read()
  91. @bp.route('/save/<year>/<version>', methods=['POST'])
  92. def save_version(year, version):
  93. return save(year + '_' + version)
  94. @bp.route('/save/<filename>', methods=['POST'])
  95. def save(filename):
  96. if request.method != 'POST':
  97. return 'File is missing!'
  98. new_filename = str(save_dir) + '/' + filename + '_' + datetime.now().strftime('%Y%m%d%H%M%S') + '.json'
  99. data = request.get_json()['data']
  100. with open(new_filename, 'w') as fwh:
  101. json.dump(data, fwh, indent=2)
  102. print(new_filename)
  103. try:
  104. file_list = list_dict()
  105. timestamp = file_list[filename][-2]
  106. old_filename = str(save_dir) + '/' + filename + "_" + timestamp + '.json'
  107. if old_filename != new_filename and hash(old_filename) == hash(new_filename):
  108. Path(old_filename).unlink()
  109. return 'File saved with no changes!'
  110. except KeyError:
  111. pass
  112. return 'File saved with new data!'
  113. @bp.route('/config', methods=['GET'])
  114. def config():
  115. cfg = ConfigLoad(str(config_dir))
  116. return Response(
  117. response=json.dumps(cfg.load_file('reisacher', '2023')),
  118. mimetype='application/json'
  119. )
  120. @bp.route('/accounts/<period>', methods=['GET'])
  121. def accounts(period):
  122. with open(planner_dir.joinpath(f'accounts_{period}.json'), 'r') as frh:
  123. return frh.read()
  124. def hash(filename):
  125. BUF_SIZE = 65536
  126. sha1 = hashlib.sha1()
  127. with open(filename, 'rb') as g:
  128. while True:
  129. hashdata = g.read(BUF_SIZE)
  130. if not hashdata:
  131. break
  132. sha1.update(hashdata)
  133. return sha1.hexdigest()