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()