2020-01-18 22:31:49 +00:00
|
|
|
from flask import Blueprint, request, jsonify
|
2020-03-11 17:32:57 +00:00
|
|
|
from datetime import datetime, time
|
2020-01-19 08:07:45 +00:00
|
|
|
import geruecht.controller.userController as uc
|
2020-03-04 20:11:41 +00:00
|
|
|
import geruecht.controller.ldapController as lc
|
2020-01-19 08:07:45 +00:00
|
|
|
from geruecht.decorator import login_required
|
2020-03-04 20:11:41 +00:00
|
|
|
from geruecht.model import MONEY, GASTRO, VORSTAND
|
2020-03-10 08:19:11 +00:00
|
|
|
from geruecht.logger import getDebugLogger, getJobsLogger
|
|
|
|
|
|
|
|
debug = getDebugLogger()
|
|
|
|
jobL = getJobsLogger()
|
2020-01-18 22:31:49 +00:00
|
|
|
|
|
|
|
vorstand = Blueprint("vorstand", __name__)
|
2020-01-19 08:07:45 +00:00
|
|
|
userController = uc.UserController()
|
2020-03-10 10:08:24 +00:00
|
|
|
ldap = lc.LDAPController()
|
|
|
|
|
2020-01-19 08:07:45 +00:00
|
|
|
|
2020-03-03 21:33:47 +00:00
|
|
|
@vorstand.route('/um/setStatus', methods=['POST'])
|
2020-03-04 20:11:41 +00:00
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
2020-03-03 21:33:47 +00:00
|
|
|
def _setStatus(**kwargs):
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.info("/um/setStatus")
|
2020-03-03 21:33:47 +00:00
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
name = data['name']
|
|
|
|
retVal = userController.setStatus(name)
|
2020-03-10 10:08:24 +00:00
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
2020-03-03 21:33:47 +00:00
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.debug("exception", exc_info=True)
|
2020-03-03 21:33:47 +00:00
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
2020-03-10 10:08:24 +00:00
|
|
|
|
2020-03-03 21:33:47 +00:00
|
|
|
@vorstand.route('/um/updateStatus', methods=['POST'])
|
2020-03-04 20:11:41 +00:00
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
2020-03-03 21:33:47 +00:00
|
|
|
def _updateStatus(**kwargs):
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.info("/um/updateStatus")
|
2020-03-03 21:33:47 +00:00
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
retVal = userController.updateStatus(data)
|
2020-03-10 10:08:24 +00:00
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
2020-03-03 21:33:47 +00:00
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.debug("exception", exc_info=True)
|
2020-03-03 21:33:47 +00:00
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
2020-03-10 10:08:24 +00:00
|
|
|
|
2020-03-03 21:33:47 +00:00
|
|
|
@vorstand.route('/um/deleteStatus', methods=['POST'])
|
2020-03-04 20:11:41 +00:00
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
2020-03-03 21:33:47 +00:00
|
|
|
def _deleteStatus(**kwargs):
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.info("/um/deleteStatus")
|
2020-03-03 21:33:47 +00:00
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
userController.deleteStatus(data)
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.debug("return ok")
|
2020-03-03 21:33:47 +00:00
|
|
|
return jsonify({"ok": "ok"})
|
|
|
|
except Exception as err:
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.debug("exception", exc_info=True)
|
2020-03-03 21:33:47 +00:00
|
|
|
return jsonify({"error": str(err)}), 409
|
|
|
|
|
2020-03-10 10:08:24 +00:00
|
|
|
|
2020-03-03 21:33:47 +00:00
|
|
|
@vorstand.route('/um/updateStatusUser', methods=['POST'])
|
2020-03-04 20:11:41 +00:00
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
2020-03-03 21:33:47 +00:00
|
|
|
def _updateStatusUser(**kwargs):
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.info("/um/updateStatusUser")
|
2020-03-03 21:33:47 +00:00
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
username = data['username']
|
|
|
|
status = data['status']
|
|
|
|
retVal = userController.updateStatusOfUser(username, status).toJSON()
|
2020-03-10 10:08:24 +00:00
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
2020-03-03 21:33:47 +00:00
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.debug("exception", exc_info=True)
|
2020-03-03 21:33:47 +00:00
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
2020-03-10 10:08:24 +00:00
|
|
|
|
2020-03-03 21:33:47 +00:00
|
|
|
@vorstand.route('/um/updateVoting', methods=['POST'])
|
2020-03-04 20:11:41 +00:00
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
2020-03-03 21:33:47 +00:00
|
|
|
def _updateVoting(**kwargs):
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.info("/um/updateVoting")
|
2020-03-03 21:33:47 +00:00
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
username = data['username']
|
|
|
|
voting = data['voting']
|
|
|
|
retVal = userController.updateVotingOfUser(username, voting).toJSON()
|
2020-03-10 10:08:24 +00:00
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
2020-03-03 21:33:47 +00:00
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.debug("exception", exc_info=True)
|
2020-03-03 21:33:47 +00:00
|
|
|
return jsonify({"error": str(err)}), 500
|
2020-01-18 22:31:49 +00:00
|
|
|
|
2020-05-17 11:35:33 +00:00
|
|
|
@vorstand.route('/um/updateWorkgroups', methods=['POST'])
|
|
|
|
@login_required(groups=[VORSTAND])
|
|
|
|
def _updateWorkgroups(**kwargs):
|
|
|
|
debug.info("/um/updateWorkgroups")
|
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
retVal = userController.updateWorkgroupsOfUser({"id": data['id']}, data['workgroups'])
|
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
|
|
|
return jsonify(retVal), 200
|
|
|
|
except Exception as err:
|
|
|
|
debug.debug("exception", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
2020-03-10 10:08:24 +00:00
|
|
|
|
2020-01-18 22:31:49 +00:00
|
|
|
@vorstand.route("/sm/addUser", methods=['POST', 'GET'])
|
2020-03-04 20:11:41 +00:00
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
2020-01-19 20:32:58 +00:00
|
|
|
def _addUser(**kwargs):
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.info("/sm/addUser")
|
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
user = data['user']
|
|
|
|
day = data['day']
|
|
|
|
month = data['month']
|
|
|
|
year = data['year']
|
2020-03-10 10:08:24 +00:00
|
|
|
date = datetime(year, month, day, 12)
|
2020-03-10 08:19:11 +00:00
|
|
|
retVal = userController.addWorker(user['username'], date)
|
2020-03-10 10:08:24 +00:00
|
|
|
debug.debug("retrun {{ {} }}".format(retVal))
|
2020-03-10 18:23:52 +00:00
|
|
|
userl = userController.getUser(user['username'])
|
2020-03-10 10:08:24 +00:00
|
|
|
jobL.info("Vorstand {} {} schreibt Mitglied {} {} am {} zum Dienst ein".format(
|
|
|
|
kwargs['accToken'].user.firstname, kwargs['accToken'].user.lastname, userl.firstname, userl.lastname, date.date()))
|
2020-03-10 08:19:11 +00:00
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.debug("exception", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
2020-01-19 20:32:58 +00:00
|
|
|
|
2020-03-10 10:08:24 +00:00
|
|
|
|
2020-03-11 17:32:57 +00:00
|
|
|
@vorstand.route("/sm/getUsers", methods=['POST'])
|
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
|
|
|
def _getUsers(**kwrags):
|
|
|
|
debug.info("/sm/getUsers")
|
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
from_date = data['from_date']
|
|
|
|
to_date = data['to_date']
|
|
|
|
from_date = datetime(
|
|
|
|
from_date['year'], from_date['month'], from_date['day'])
|
|
|
|
to_date = datetime(to_date['year'], to_date['month'], to_date['day'])
|
|
|
|
lockedDays = userController.getLockedDays(from_date, to_date)
|
|
|
|
retVal = []
|
|
|
|
for lockedDay in lockedDays:
|
|
|
|
day = datetime.combine(lockedDay['daydate'], time(12))
|
|
|
|
retDay = {
|
|
|
|
"worker": userController.getWorker(day),
|
|
|
|
"day": {
|
|
|
|
"date": {
|
|
|
|
"year": day.year,
|
|
|
|
"month": day.month,
|
|
|
|
"day": day.day
|
|
|
|
},
|
|
|
|
"locked": lockedDay['locked']
|
|
|
|
}
|
|
|
|
}
|
|
|
|
retVal.append(retDay)
|
|
|
|
|
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.debug("exception", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
|
|
|
|
2020-01-19 20:32:58 +00:00
|
|
|
@vorstand.route("/sm/getUser", methods=['POST'])
|
2020-03-04 20:11:41 +00:00
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
2020-01-19 20:32:58 +00:00
|
|
|
def _getUser(**kwargs):
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.info("/sm/getUser")
|
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
day = data['day']
|
|
|
|
month = data['month']
|
|
|
|
year = data['year']
|
|
|
|
date = datetime(year, month, day, 12)
|
|
|
|
lockedDay = userController.getLockedDay(date)
|
2020-03-11 17:32:57 +00:00
|
|
|
lockedDay = {
|
|
|
|
'date': {
|
|
|
|
'year': year,
|
|
|
|
'month': month,
|
|
|
|
'day': day
|
|
|
|
},
|
|
|
|
'locked': lockedDay['locked']
|
|
|
|
}
|
2020-03-10 08:19:11 +00:00
|
|
|
retVal = {
|
|
|
|
'worker': userController.getWorker(date),
|
|
|
|
'day': lockedDay
|
2020-02-23 21:31:22 +00:00
|
|
|
}
|
2020-03-10 10:08:24 +00:00
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
|
|
|
return jsonify(retVal)
|
2020-03-10 08:19:11 +00:00
|
|
|
except Exception as err:
|
|
|
|
debug.debug("exception", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
2020-01-18 22:31:49 +00:00
|
|
|
|
2020-03-10 10:08:24 +00:00
|
|
|
|
2020-01-19 20:32:58 +00:00
|
|
|
@vorstand.route("/sm/deleteUser", methods=['POST'])
|
2020-03-05 20:24:32 +00:00
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
2020-01-19 20:32:58 +00:00
|
|
|
def _deletUser(**kwargs):
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.info("/sm/deletUser")
|
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
user = data['user']
|
|
|
|
day = data['day']
|
|
|
|
month = data['month']
|
|
|
|
year = data['year']
|
|
|
|
date = datetime(year, month, day, 12)
|
|
|
|
userController.deleteWorker(user['username'], date)
|
|
|
|
debug.debug("return ok")
|
2020-03-10 18:23:52 +00:00
|
|
|
user = userController.getUser(user['username'])
|
2020-03-10 10:08:24 +00:00
|
|
|
jobL.info("Vorstand {} {} entfernt Mitglied {} {} am {} vom Dienst".format(
|
|
|
|
kwargs['accToken'].user.firstname, kwargs['accToken'].user.lastname, user.firstname, user.lastname, date.date()))
|
2020-03-10 08:19:11 +00:00
|
|
|
return jsonify({"ok": "ok"})
|
|
|
|
except Exception as err:
|
|
|
|
debug.debug("exception", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
2020-02-24 11:19:52 +00:00
|
|
|
|
2020-05-16 21:25:44 +00:00
|
|
|
@vorstand.route("/wgm/getAllWorkgroups", methods=['GET'])
|
|
|
|
@login_required(bar=True)
|
|
|
|
def _getAllWorkgroups(**kwargs):
|
|
|
|
try:
|
|
|
|
debug.info("get all workgroups")
|
|
|
|
retVal = userController.getAllWorkgroups()
|
|
|
|
debug.info("return all workgroups {{ {} }}".format(retVal))
|
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.warning("exception in get all workgroups.", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
|
|
|
@vorstand.route("/wgm/getWorkgroup", methods=['POST'])
|
|
|
|
@login_required(bar=True)
|
|
|
|
def _getWorkgroup(**kwargs):
|
|
|
|
try:
|
|
|
|
debug.info("get workgroup")
|
|
|
|
data = request.get_json()
|
|
|
|
name = data['name']
|
|
|
|
debug.info("get workgroup {{ {} }}".format(name))
|
|
|
|
retVal = userController.getWorkgroups(name)
|
|
|
|
debug.info(
|
|
|
|
"return workgroup {{ {} }} : {{ {} }}".format(name, retVal))
|
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.warning("exception in get workgroup.", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
|
|
|
@vorstand.route("/wgm/workgroup", methods=['POST', 'PUT', 'DELETE'])
|
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
|
|
|
def _workgroup(**kwargs):
|
|
|
|
debug.info("/wgm/workgroup")
|
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
if request.method == 'PUT':
|
|
|
|
name = data['name']
|
|
|
|
boss = None
|
|
|
|
if 'boss' in data:
|
|
|
|
boss = data['boss']
|
|
|
|
retVal = userController.setWorkgroup(name, boss)
|
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
|
|
|
if request.method == 'POST':
|
|
|
|
retVal = userController.updateWorkgroup(data)
|
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.debug("exception", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
|
|
|
@vorstand.route("/wgm/deleteWorkgroup", methods=['POST'])
|
|
|
|
@login_required(groups=[VORSTAND])
|
|
|
|
def _deleteWorkgroup(**kwargs):
|
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
debug.info("/wgm/deleteWorkgroup")
|
|
|
|
userController.deleteWorkgroup(data)
|
|
|
|
retVal = {"ok": "ok"}
|
|
|
|
debug.debug("return ok")
|
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.debug("exception", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
2020-05-17 18:21:22 +00:00
|
|
|
@vorstand.route("/sm/getAllJobKinds", methods=['GET'])
|
|
|
|
@login_required(bar=True)
|
|
|
|
def _getAllJobKinds(**kwargs):
|
|
|
|
try:
|
|
|
|
debug.info("get all jobkinds")
|
|
|
|
retVal = userController.getAllJobKinds()
|
|
|
|
debug.info("return all jobkinds {{ {} }}".format(retVal))
|
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.warning("exception in get all workgroups.", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
|
|
|
@vorstand.route("/sm/getJobKind", methods=['POST'])
|
|
|
|
@login_required(bar=True)
|
|
|
|
def _getJobKinds(**kwargs):
|
|
|
|
try:
|
|
|
|
debug.info("get jobkind")
|
|
|
|
data = request.get_json()
|
|
|
|
name = data['name']
|
|
|
|
debug.info("get jobkind {{ {} }}".format(name))
|
|
|
|
retVal = userController.getJobKind(name)
|
|
|
|
debug.info(
|
|
|
|
"return workgroup {{ {} }} : {{ {} }}".format(name, retVal))
|
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.warning("exception in get workgroup.", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
|
|
|
@vorstand.route("/sm/JobKind", methods=['POST', 'PUT', 'DELETE'])
|
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
|
|
|
def _JobKinds(**kwargs):
|
|
|
|
debug.info("/sm/JobKind")
|
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
if request.method == 'PUT':
|
|
|
|
name = data['name']
|
2020-05-17 19:18:56 +00:00
|
|
|
workgroup = None
|
|
|
|
if 'workgroup' in data:
|
|
|
|
workgroup = data['workgroup']
|
|
|
|
retVal = userController.setJobKind(name, workgroup)
|
2020-05-17 18:21:22 +00:00
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
|
|
|
if request.method == 'POST':
|
|
|
|
retVal = userController.updateJobKind(data)
|
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.debug("exception", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
|
|
|
|
|
|
|
@vorstand.route("/sm/deleteJobKind", methods=['POST'])
|
|
|
|
@login_required(groups=[VORSTAND])
|
|
|
|
def _deleteJobKind(**kwargs):
|
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
debug.info("/sm/deleteJobKind")
|
|
|
|
userController.deleteJobKind(data)
|
|
|
|
retVal = {"ok": "ok"}
|
|
|
|
debug.debug("return ok")
|
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.debug("exception", exc_info=True)
|
|
|
|
return jsonify({"error": str(err)}), 500
|
2020-03-10 10:08:24 +00:00
|
|
|
|
2020-02-24 11:19:52 +00:00
|
|
|
@vorstand.route("/sm/lockDay", methods=['POST'])
|
2020-03-04 20:11:41 +00:00
|
|
|
@login_required(groups=[MONEY, GASTRO, VORSTAND])
|
2020-02-24 11:19:52 +00:00
|
|
|
def _lockDay(**kwargs):
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.info("/sm/lockDay")
|
2020-02-24 11:19:52 +00:00
|
|
|
try:
|
|
|
|
data = request.get_json()
|
|
|
|
year = data['year']
|
|
|
|
month = data['month']
|
|
|
|
day = data['day']
|
|
|
|
locked = data['locked']
|
|
|
|
date = datetime(year, month, day, 12)
|
|
|
|
lockedDay = userController.setLockedDay(date, locked, True)
|
|
|
|
if not lockedDay:
|
|
|
|
retVal = {
|
|
|
|
'date': {
|
|
|
|
'year': year,
|
|
|
|
'month': month,
|
|
|
|
'day': day
|
|
|
|
},
|
|
|
|
'locked': False
|
|
|
|
}
|
|
|
|
else:
|
|
|
|
retVal = {
|
|
|
|
'date': {
|
|
|
|
'year': year,
|
|
|
|
'month': month,
|
|
|
|
'day': day
|
|
|
|
},
|
|
|
|
'locked': lockedDay['locked']
|
|
|
|
}
|
2020-03-10 10:08:24 +00:00
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
2020-02-24 11:19:52 +00:00
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.debug("exception", exc_info=True)
|
2020-03-04 20:11:41 +00:00
|
|
|
return jsonify({'error': err}), 409
|
|
|
|
|
2020-03-10 10:08:24 +00:00
|
|
|
|
2020-03-04 20:11:41 +00:00
|
|
|
@vorstand.route("/sm/searchWithExtern", methods=['GET'])
|
|
|
|
@login_required(groups=[VORSTAND])
|
|
|
|
def _search(**kwargs):
|
2020-03-10 08:19:11 +00:00
|
|
|
debug.info("/sm/searchWithExtern")
|
|
|
|
try:
|
|
|
|
retVal = ldap.getAllUser()
|
2020-03-10 10:08:24 +00:00
|
|
|
debug.debug("return {{ {} }}".format(retVal))
|
2020-03-10 08:19:11 +00:00
|
|
|
return jsonify(retVal)
|
|
|
|
except Exception as err:
|
|
|
|
debug.debug("exception", exc_info=True)
|
2020-03-10 10:08:24 +00:00
|
|
|
return jsonify({"error": str(err)}), 500
|