import datetime from flask import request, render_template, jsonify from . import main from .helpers import worklog_headers from .. import db from ..models import WorkLog, User, Inventory from ..utils.load import eager_load_worklog_relationships, eager_load_user_relationships, eager_load_inventory_relationships @main.route("/worklog") def list_worklog(page=1): page = request.args.get('page', default=1, type=int) query = eager_load_worklog_relationships(db.session.query(WorkLog)) return render_template( 'table.html', header=worklog_headers, rows=[{"id": log.id, "cells": [fn(log) for fn in worklog_headers.values()]} for log in query.all()], title="Work Log", entry_route='worklog_entry' ) @main.route("/worklog/") def worklog_entry(id): try: id = int(id) except ValueError: return render_template('error.html', title='Bad ID', message='ID must be an integer.', endpoint='worklog_entry', endpoint_args={'id': -1}) log = eager_load_worklog_relationships(db.session.query(WorkLog)).filter(WorkLog.id == id).first() user_query = db.session.query(User).order_by(User.first_name) users = eager_load_user_relationships(user_query).all() item_query = db.session.query(Inventory) items = eager_load_inventory_relationships(item_query).all() items = sorted(items, key=lambda i: i.identifier) if log: title = f'Work Log - Entry #{id}' else: title = "Work Log - Entry Not Found" return render_template( 'error.html', title=title, message=f"The work log with ID {id} is not found!" ) return render_template( "worklog.html", title=title, log=log, users=users, items=items ) @main.route("/worklog_entry/new", methods=["GET"]) def new_worklog(): items = eager_load_inventory_relationships(db.session.query(Inventory)).all() users = eager_load_user_relationships(db.session.query(User)).all() log = WorkLog( start_time=datetime.datetime.now(), followup=True ) return render_template( "worklog.html", title="New Entry", log=log, users=users, items=items ) @main.route("/api/worklog", methods=["POST"]) def create_worklog(): try: data = request.get_json(force=True) new_worklog = WorkLog.from_dict(data) db.session.add(new_worklog) db.session.commit() return jsonify({"success": True, "id": new_worklog.id}), 201 except Exception as e: db.session.rollback() return jsonify({"success": False, "error": str(e)}), 400 @main.route("/api/worklog/", methods=["PUT"]) def update_worklog(id): try: data = request.get_json(force=True) print(data) log = db.session.query(WorkLog).get(id) if not log: return jsonify({"success": False, "error": f"Work Log with ID {id} not found."}), 404 log.start_time = datetime.datetime.fromisoformat(data.get("start_time")) if data.get("start_time") else log.start_time log.end_time = datetime.datetime.fromisoformat(data.get("end_time")) if data.get("end_time") else log.end_time log.notes = data.get("notes", log.notes) log.complete = bool(data.get("complete", log.complete)) log.followup = bool(data.get("followup", log.followup)) log.analysis = bool(data.get("analysis", log.analysis)) log.contact_id = data.get("contact_id", log.contact_id) log.work_item_id = data.get("work_item_id", log.work_item_id) db.session.commit() return jsonify({"success": True, "id": log.id}), 200 except Exception as e: db.session.rollback() return jsonify({"success": False, "error": str(e)}), 400 @main.route("/api/worklog/", methods=["DELETE"]) def delete_worklog(id): try: log = db.session.query(WorkLog).get(id) if not log: return jsonify({"success": False, "errpr": f"Item with ID {id} not found!"}), 404 db.session.delete(log) db.session.commit() return jsonify({"success": True}), 200 except Exception as e: db.session.rollback() return jsonify({"success": False, "error": str(e)}), 400