ApplicantPortal/app/network_admin/api.py
2025-03-12 20:43:26 -06:00

109 lines
4.5 KiB
Python

from app.auth import role_required, NO_USER_FOUND_MESSAGE
from app import model
from app_common.const import BAD_USER_ROLES
from app_common.parser import QuarterRequestParser
from app.auth.request_parsers import edit_user_parser, admin_crate_user_parser, roles
from flask_restx import Namespace, Resource, abort, inputs
from flask import jsonify, make_response
namespace = Namespace('network_admin', description='API endpoints available for network admins', decorators=[role_required([model.Roles.ADMIN, model.Roles.NETWORK_ADMIN])])
@namespace.route('/ajax/user/<user_id>')
@namespace.response(404, NO_USER_FOUND_MESSAGE)
class User(Resource):
@namespace.doc(description='Gets the data for a user.')
def get(self, user_id):
user = model.User.objects(user_id=user_id).first_or_404()
return make_response(jsonify(user.to_dict()))
@namespace.expect(admin_crate_user_parser)
@namespace.doc(description='Crates a new user.')
def put(self, user_id):
args = admin_crate_user_parser.parse_args()
args.user_id = user_id
model.User.from_request_args(**dict(args))
@namespace.expect(edit_user_parser)
@namespace.doc(description='Update the data for a user.')
def post(self, user_id):
args = edit_user_parser.parse_args()
args.user_id = user_id
user = model.User.objects(user_id=args.user_id).first_or_404()
# try to update the user
for key in dict(args):
value = getattr(args, key)
if value:
setattr(user, key, value)
user.save()
@namespace.doc(description='Deletes a user.')
def delete(self, user_id):
user = model.User.objects(user_id=user_id).first_or_404()
user.delete()
# see if there is an application to delete as well...
application = model.Application.objects(user_id=user_id).first()
if application:
application.delete()
get_users_parser = QuarterRequestParser()
get_users_parser.add_argument('roles', required=False, type=roles, help='A comma separated list of user roles to return.', default=None)
@namespace.route('/users')
class GetUsers(Resource):
@namespace.expect(get_users_parser)
def get(self):
args = get_users_parser.parse_args()
if args.roles:
users = model.User.objects(roles__in=args.roles).all()
else:
users = model.User.objects()
return jsonify([u.to_dict() for u in users])
@namespace.route('/ajax/user/<user_id>/application')
class UserApplication(Resource):
@namespace.response(404, 'No user was found or no application was found for the given user')
def get(self, user_id):
user = model.User.objects(user_id=user_id).first_or_404(message='No user found')
application = model.Application.objects(applicants__match={'email': user.email}).first_or_404(message='No application found for user.')
return make_response(jsonify(user=user.to_dict(), application=application.to_dict()))
user_roles_parser = QuarterRequestParser()
user_roles_parser.add_argument('roles', required=True, default='', type=roles, help='A comma separated list of roles to assign to/delete from a user')
user_roles_parser.add_argument('force_match', required=False, default=False, type=inputs.boolean, help='Weather or not to force a users roles to exactly match what is given.')
@namespace.route('/ajax/user/<user_id>/roles')
class UserRoles(Resource):
@namespace.response(404, 'No user found with the given ID')
def get(self, user_id):
user = model.User.objects(user_id=user_id).first_or_404(message='No user found')
return jsonify(user.roles)
@namespace.expect(user_roles_parser)
@namespace.response(404, 'No user found with the given ID')
def post(self, user_id):
args = user_roles_parser.parse_args()
user = model.User.objects(user_id=user_id).first_or_404(message='No user found')
# if we are supposed to force the user roles to match what is given, clear out the existing roles
if args.force_match:
user.roles = []
# add the new roles
user.roles.extend(args.roles)
user.save()
@namespace.expect(user_roles_parser)
@namespace.response(404, 'No user found with the given ID')
def delete(self, user_id):
args = user_roles_parser.parse_args()
user = model.User.objects(user_id=user_id).first_or_404(message='No user found')
user.roles = [r for r in user.roles if r not in args.roles]
user.save()