選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

96 行
4.0 KiB

  1. from Config.RouteProvider import RouteProvider
  2. from flask import jsonify
  3. from flask_jwt_extended import jwt_required
  4. from datetime import datetime
  5. class UsersCRUD(RouteProvider):
  6. def __init__(self):
  7. super().__init__()
  8. @jwt_required()
  9. @RouteProvider.access_controller(access_level=["Administrator", "System Administrator"])
  10. def create(self, request):
  11. data = request.form
  12. files = request.files
  13. required_keys = ["email", "password", "name", "address"]
  14. required_files = ["profile_picture"]
  15. if not self.validate(required_keys, data):
  16. return self._abort(400, "Incorrectly formatted request. Please make sure that all the required fields are entered.")
  17. if not self.validate(required_files, files):
  18. return self._abort(400, "Incorrectly formatted request. Please make sure that all the required files are attached.")
  19. constraint = self.check_constraint(data, self.tables.Users)
  20. if self.check_constraint(data, self.tables.Users) is not True:
  21. return self._abort(409, constraint)
  22. user = self.tables.Users()
  23. [setattr(user, key, data[key]) for key in required_keys]
  24. user.profile_picture_path = self.save_file(files, "profile_picture", "/users/")
  25. user.sign_up_date = datetime.utcnow()
  26. self.db.session.add(user)
  27. self.db.session.commit()
  28. user = self.tables.Users.query.filter_by(email = data["email"]).first()
  29. return jsonify({ "user" : self.schemas.User.dump(user) })
  30. @jwt_required()
  31. @RouteProvider.access_controller(access_level=["*"])
  32. def read(self, request):
  33. params = self.build_params(self.tables.Users.__struct__, request.args)
  34. query_result = self.tables.Users.query.filter_by(**params).all()
  35. return jsonify({ "users" : self.schemas.Users.dump(query_result), "args" : params })
  36. @jwt_required()
  37. @RouteProvider.access_controller(access_level=["*"])
  38. def update(self, request):
  39. data = request.form
  40. files = request.files
  41. required_keys = ["id"]
  42. updatable_keys = []
  43. [updatable_keys.append(key) for key in self.tables.Users.__struct__ if key not in ["sign_up_date", "id"]]
  44. required_files = ["profile_picture"]
  45. if not self.validate(required_keys, data):
  46. return self._abort(400, "Incorrectly formatted request. Please make sure that all the required fields are entered.")
  47. user = self.tables.Users.query.filter_by(id = data["id"]).first()
  48. if user is None:
  49. return self._abort(404, "User not found")
  50. constraint = self.check_constraint(data, self.tables.Users)
  51. if constraint is not True:
  52. return self._abort(409, constraint)
  53. [setattr(user, key, data[key]) for key in updatable_keys if key in data]
  54. if "profile_picture" in files:
  55. profile_picture_path = self.save_file(files, "profile_picture", "/users/")
  56. user.profile_picture_path = profile_picture_path
  57. if data["admin_id"] == 'null':
  58. user.admin_id = None
  59. self.db.session.commit()
  60. user = self.tables.Users.query.filter_by(id = data["id"]).first()
  61. return jsonify({ "user" : self.schemas.User.dump(user) })
  62. @jwt_required()
  63. @RouteProvider.access_controller(access_level=["Administrator", "System Administrator"])
  64. def delete(self, request):
  65. params = self.build_params(self.tables.Users.__struct__, request.args)
  66. if "id" not in params:
  67. return self._abort(400, "Missing params info: 'id'")
  68. user = self.tables.Users.query.filter_by(id = params["id"]).first()
  69. if user is None:
  70. return self._abort(404, f'User with ID \'{params["id"]}\' is not found')
  71. user.archived = 1 if user.archived == 0 else 0
  72. user = self.tables.Users.query.filter_by(**params).first()
  73. return jsonify({ "user" : self.schemas.User.dump(user) })
  74. users_crud = UsersCRUD()