from flask import render_template, request, jsonify from . import main from .helpers import ACTIVE_STATUSES, user_headers, inventory_headers, worklog_headers from .. import db from ..utils.load import eager_load_user_relationships, eager_load_room_relationships, eager_load_inventory_relationships, eager_load_worklog_relationships from ..models import User, Room, Inventory, WorkLog @main.route("/users") def list_users(): query = eager_load_user_relationships(db.session.query(User)).order_by(User.last_name, User.first_name) users = query.all() return render_template( 'table.html', header = user_headers, rows = [{"id": user.id, "cells": [fn(user) for fn in user_headers.values()]} for user in users], title = "Users", entry_route = 'user' ) @main.route("/user/") def user(id): try: id = int(id) except ValueError: return render_template('error.html', title='Bad ID', message='ID must be an integer.', endpoint='user', endpoint_args={'id': -1}) users_query = db.session.query(User).order_by(User.first_name, User.last_name) users = eager_load_user_relationships(users_query).all() user = next((u for u in users if u.id == id), None) rooms_query = db.session.query(Room) rooms = eager_load_room_relationships(rooms_query).all() inventory_query = ( eager_load_inventory_relationships(db.session.query(Inventory)) .filter(Inventory.owner_id == id) # type: ignore .filter(Inventory.condition.in_(ACTIVE_STATUSES)) ) inventory = inventory_query.all() filtered_inventory_headers = {k: v for k, v in inventory_headers.items() if k not in ['Date Entered', 'Inventory #', 'Serial #', 'Bar Code #', 'Condition', 'Owner', 'Notes', 'Brand', 'Model', 'Shared?', 'Location']} worklog_query = eager_load_worklog_relationships(db.session.query(WorkLog)).filter(WorkLog.contact_id == id) worklog = worklog_query.order_by(WorkLog.start_time.desc()).all() filtered_worklog_headers = {k: v for k, v in worklog_headers.items() if k not in ['Contact', 'Follow Up?', 'Quick Analysis?']} if user: title = f"User Record - {user.full_name}" if user.active else f"User Record - {user.full_name} (Inactive)" else: title = f"User Record - User Not Found" return render_template( 'error.html', title=title, message=f"User with id {id} not found!" ) return render_template( "user.html", title=title, user=user, users=users, rooms=rooms, assets=inventory, inventory_headers=filtered_inventory_headers, inventory_rows=[{"id": item.id, "cells": [fn(item) for fn in filtered_inventory_headers.values()]} for item in inventory], worklog=worklog, worklog_headers=filtered_worklog_headers, worklog_rows=[{"id": log.id, "cells": [fn(log) for fn in filtered_worklog_headers.values()]} for log in worklog] ) @main.route("/user/new", methods=["GET"]) def new_user(): rooms = eager_load_room_relationships(db.session.query(Room)).all() users = eager_load_user_relationships(db.session.query(User)).all() user = User( active=True ) return render_template( "user.html", title="New User", user=user, users=users, rooms=rooms ) @main.route("/api/user", methods=["POST"]) def create_user(): try: data = request.get_json(force=True) new_user = User.from_dict(data) db.session.add(new_user) db.session.commit() return jsonify({"success": True, "id": new_user.id}), 201 except Exception as e: db.session.rollback() return jsonify({"success": False, "error": str(e)}), 400 @main.route("/api/user/", methods=["PUT"]) def update_user(id): try: data = request.get_json(force=True) user = db.session.query(User).get(id) if not user: return jsonify({"success": False, "error": f"User with ID {id} not found."}), 404 user.staff = bool(data.get("staff", user.staff)) user.active = bool(data.get("active", user.active)) user.last_name = data.get("last_name", user.last_name) user.first_name = data.get("first_name", user.first_name) user.location_id = data.get("location_id", user.location_id) user.supervisor_id = data.get("supervisor_id", user.supervisor_id) db.session.commit() return jsonify({"success": True, "id": user.id}), 200 except Exception as e: db.session.rollback() return jsonify({"success": False, "error": str(e)}), 400