|
- from Config.RouteProvider import RouteProvider
- from flask import jsonify
- from flask_jwt_extended import jwt_required
- from datetime import datetime
-
- class UsersCRUD(RouteProvider):
- def __init__(self):
- super().__init__()
-
- @jwt_required()
- @RouteProvider.access_controller(access_level=["Administrator", "System Administrator"])
- def create(self, request):
- data = request.form
- files = request.files
- required_keys = ["email", "password", "name", "address"]
- required_files = ["profile_picture"]
-
- if not self.validate(required_keys, data):
- return self._abort(400, "Incorrectly formatted request. Please make sure that all the required fields are entered.")
-
- if not self.validate(required_files, files):
- return self._abort(400, "Incorrectly formatted request. Please make sure that all the required files are attached.")
-
- constraint = self.check_constraint(data, self.tables.Users)
- if self.check_constraint(data, self.tables.Users) is not True:
- return self._abort(409, constraint)
-
- user = self.tables.Users()
- [setattr(user, key, data[key]) for key in required_keys]
- user.profile_picture_path = self.save_file(files, "profile_picture", "/users/")
- user.sign_up_date = datetime.utcnow()
- self.db.session.add(user)
- self.db.session.commit()
-
- user = self.tables.Users.query.filter_by(email = data["email"]).first()
- return jsonify({ "user" : self.schemas.User.dump(user) })
-
- @jwt_required()
- @RouteProvider.access_controller(access_level=["*"])
- def read(self, request):
- params = self.build_params(self.tables.Users.__struct__, request.args)
- query_result = self.tables.Users.query.filter_by(**params).all()
- return jsonify({ "users" : self.schemas.Users.dump(query_result), "args" : params })
-
- @jwt_required()
- @RouteProvider.access_controller(access_level=["*"])
- def update(self, request):
- data = request.form
- files = request.files
-
- required_keys = ["id"]
- updatable_keys = []
- [updatable_keys.append(key) for key in self.tables.Users.__struct__ if key not in ["sign_up_date", "id"]]
- required_files = ["profile_picture"]
-
- if not self.validate(required_keys, data):
- return self._abort(400, "Incorrectly formatted request. Please make sure that all the required fields are entered.")
-
- user = self.tables.Users.query.filter_by(id = data["id"]).first()
- if user is None:
- return self._abort(404, "User not found")
-
- constraint = self.check_constraint(data, self.tables.Users)
- if constraint is not True:
- return self._abort(409, constraint)
-
-
- [setattr(user, key, data[key]) for key in updatable_keys if key in data]
- if "profile_picture" in files:
- profile_picture_path = self.save_file(files, "profile_picture", "/users/")
- user.profile_picture_path = profile_picture_path
-
- if data["admin_id"] == 'null':
- user.admin_id = None
-
- self.db.session.commit()
- user = self.tables.Users.query.filter_by(id = data["id"]).first()
- return jsonify({ "user" : self.schemas.User.dump(user) })
-
- @jwt_required()
- @RouteProvider.access_controller(access_level=["Administrator", "System Administrator"])
- def delete(self, request):
- params = self.build_params(self.tables.Users.__struct__, request.args)
- if "id" not in params:
- return self._abort(400, "Missing params info: 'id'")
-
- user = self.tables.Users.query.filter_by(id = params["id"]).first()
- if user is None:
- return self._abort(404, f'User with ID \'{params["id"]}\' is not found')
-
- user.archived = 1 if user.archived == 0 else 0
- user = self.tables.Users.query.filter_by(**params).first()
-
- return jsonify({ "user" : self.schemas.User.dump(user) })
-
- users_crud = UsersCRUD()
|