routes.py 5.69 KB
from flask import render_template, make_response, current_app, redirect, url_for, request, flash
from flask_login import login_required, current_user

from . import bp

from app.models import Agent, Project, Service, Capacity, Period, db
from app import db_mgr
from app.auth.routes import role_required


@bp.before_request
def site_login():
    try:
        if current_app.config['SITE_LOGIN'] \
                and not current_user.is_authenticated:
            return redirect(url_for('auth.login'))
    except KeyError:
        # no such config, juste ignore
        pass


@bp.before_request
def catch_all_route():
    current_app.logger.debug(f"{request.method} {request.path}")


@bp.route('/')
def index():
    return render_template('index.html', subtitle="Page d'accueil")


@bp.route('/services')
@role_required('service')
def services():
    # get services list
    all_services = Service.query.order_by(Service.name).all()
    num_services = len(all_services)
    # pass to template
    return render_template('services.html', subtitle="Liste des services ({})".format(num_services),
                           services=all_services)


@bp.route('/projects')
@role_required('project')
def projects():
    # get projects list
    all_projects = db_mgr.projects()
    num_projects = len(all_projects)
    # pass to template
    return render_template('projects.html', subtitle="Liste des projets ({})".format(num_projects),
                           projects=all_projects)


@bp.route('/agents')
@role_required('project')
def agents():
    # get agents list
    all_agents = db_mgr.agents()
    num_agents = len(all_agents)
    # pass to template
    return render_template('agents.html', subtitle="Liste des agents ({})".format(num_agents),
                           agents=all_agents)


@bp.route('/capacities')
@login_required
def capacities():
    # get capacities list
    all_capacities = Capacity.query.order_by(Capacity.name).all()
    num_capacities = len(all_capacities)
    # pass to template
    return render_template('capacities.html', subtitle="Liste des fonctions ({})".format(num_capacities),
                           capacities=all_capacities)


@bp.route('/periods')
@login_required
def periods():
    # get capacities list
    all_periods = Period.query.order_by(Period.name).all()
    num_periods = len(all_periods)
    # pass to template
    return render_template('periods.html', subtitle="Liste des périodes ({})".format(num_periods),
                           periods=all_periods)


@bp.route('/charge/add')
@role_required('service')
def charge_add():
    return render_template('charge.html', subtitle="Affecter un agent")


@bp.route('/project/<project_id>')
@role_required('project')
def project(project_id):
    # TODO: am i the project manager ?
    this_project = Project.query.get(int(project_id))
    charges_table = db_mgr.charges_by_project(project_id)
    return render_template('project.html',
                           project=this_project,
                           charges=charges_table,
                           subtitle="{}".format(this_project.name))


@bp.route('/agent/<agent_id>')
@role_required('agent')
def agent(agent_id):
    # TODO: am i the agent, the service or project manager , or the admin ?
    this_agent = Agent.query.get(int(agent_id))
    charges_table = db_mgr.charges_by_agent_tabled(agent_id)
    return render_template('agent.html',
                           agent=this_agent,
                           charges=charges_table,
                           subtitle=f"{this_agent.fullname}")


@bp.route('/agent/create', methods=('POST', 'GET'))
@bp.route('/agent/<agent_id>/edit', methods=('POST', 'GET'))
@role_required('service')
def agent_edit(agent_id=None):
    # Make the form, filled with existing agent if updating
    #
    if request.method == 'GET':
        if agent_id:
            this_agent = Agent.query.get(int(agent_id))
        else:
            this_agent = Agent()
        # export to structure for jinja display
        agent_struct = this_agent.to_struct()
        return render_template('agent_edit.html', agent=agent_struct)
    # Or submit for db writing
    #
    elif request.method == 'POST':
        agent_id = request.form['agent_id']
        if agent_id:
            # then update existing
            this_agent = Agent.query.get(int(agent_id))
            done_string = "mis à jour."
        else:
            # or create from scratch
            this_agent = Agent()
            done_string = "ajouté."
        # fill orm with form and write to db
        this_agent.from_request(request)
        db.session.add(this_agent)
        db.session.commit()
        # we're done
        flash(f"Agent {this_agent.fullname} "+done_string)
        return redirect(url_for('main.agent', agent_id=this_agent.id))


# - - - - - - - - - - - - - - - - - - - -  REST API - - - - - - - - - - - - - - - - - - - -

@bp.route('/charge/project/<project_id>/<category>')
@role_required('project')
def charge_project_csv(project_id, category):
    csv_table = []
    for line in db_mgr.charges_by_project_stacked(project_id, category):
        line = [cell.replace(",", "-") for cell in line]
        line_string = ",".join(line)
        csv_table.append(line_string)
    resp = make_response("\n".join(csv_table))
    resp.headers['Content-Type'] = 'text/plain;charset=utf8'
    return resp


@bp.route('/charge/agent/<agent_id>')
@role_required('service')
def charge_agent_csv(agent_id):
    csv_table = []
    for line in db_mgr.charges_by_agent_stacked(agent_id):
        line = [cell.replace(",", "-") for cell in line]
        line_string = ",".join(line)
        csv_table.append(line_string)
    resp = make_response("\n".join(csv_table))
    resp.headers['Content-Type'] = 'text/plain;charset=utf8'
    return resp