Blame view

app/main/routes.py 9.02 KB
3c53ad45   hitier   Project edit work...
1
2
from pprint import pprint

ca0797d6   hitier   New agent edit form
3
from flask import render_template, make_response, current_app, redirect, url_for, request, flash
3b0d5feb   hitier   New Site_Login ca...
4
from flask_login import login_required, current_user
8bd0f3cb   hitier   Fix #25: Flask Bl...
5
6
7

from . import bp

12de0b1d   hitier   Now charge add ro...
8
from app.models import Agent, Project, Service, Capacity, Period, db, Company, AgentGrade, AgentStatus, AgentBap, Charge
dcafa5d0   hitier   Protect routes by...
9
10
from app import db_mgr
from app.auth.routes import role_required
d6836d5e   hitier   Agents list
11

8bd0f3cb   hitier   Fix #25: Flask Bl...
12

3b0d5feb   hitier   New Site_Login ca...
13
14
15
16
17
18
19
20
21
22
@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

1b604951   hitier   Rearrange code
23

3b0d5feb   hitier   New Site_Login ca...
24
25
@bp.before_request
def catch_all_route():
1b604951   hitier   Rearrange code
26
    current_app.logger.debug(f"{request.method} {request.path}")
3b0d5feb   hitier   New Site_Login ca...
27
28


8bd0f3cb   hitier   Fix #25: Flask Bl...
29
30
@bp.route('/')
def index():
a7e64a99   hitier   Services list
31
32
33
34
    return render_template('index.html', subtitle="Page d'accueil")


@bp.route('/services')
dcafa5d0   hitier   Protect routes by...
35
@role_required('service')
a7e64a99   hitier   Services list
36
37
38
39
40
def services():
    # get services list
    all_services = Service.query.order_by(Service.name).all()
    num_services = len(all_services)
    # pass to template
6cbf4b75   hitier   Periods list
41
    return render_template('services.html', subtitle="Liste des services ({})".format(num_services),
a7e64a99   hitier   Services list
42
                           services=all_services)
d6836d5e   hitier   Agents list
43
44


3dae0d18   hitier   Projects list
45
@bp.route('/projects')
dcafa5d0   hitier   Protect routes by...
46
@role_required('project')
3dae0d18   hitier   Projects list
47
48
def projects():
    # get projects list
f8e1465a   hitier   New projects list...
49
    all_projects = db_mgr.projects()
3dae0d18   hitier   Projects list
50
51
    num_projects = len(all_projects)
    # pass to template
a7e64a99   hitier   Services list
52
    return render_template('projects.html', subtitle="Liste des projets ({})".format(num_projects),
3dae0d18   hitier   Projects list
53
54
                           projects=all_projects)

a7e64a99   hitier   Services list
55

d6836d5e   hitier   Agents list
56
@bp.route('/agents')
dcafa5d0   hitier   Protect routes by...
57
@role_required('project')
d6836d5e   hitier   Agents list
58
def agents():
d6836d5e   hitier   Agents list
59
    # get agents list
2cb0a345   hitier   Add 2 columns in ...
60
    all_agents = db_mgr.agents()
d6836d5e   hitier   Agents list
61
62
    num_agents = len(all_agents)
    # pass to template
a7e64a99   hitier   Services list
63
    return render_template('agents.html', subtitle="Liste des agents ({})".format(num_agents),
d6836d5e   hitier   Agents list
64
                           agents=all_agents)
980708a2   hitier   Capacities list
65

8b3ab81d   hitier   All charges now i...
66

980708a2   hitier   Capacities list
67
@bp.route('/capacities')
dcafa5d0   hitier   Protect routes by...
68
@login_required
980708a2   hitier   Capacities list
69
70
71
72
73
74
75
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)
6cbf4b75   hitier   Periods list
76

8b3ab81d   hitier   All charges now i...
77

6cbf4b75   hitier   Periods list
78
@bp.route('/periods')
dcafa5d0   hitier   Protect routes by...
79
@login_required
6cbf4b75   hitier   Periods list
80
81
82
83
84
85
86
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)
412b041b   hitier   Add charge
87

8b3ab81d   hitier   All charges now i...
88

d7a4e41b   hitier   New project page:...
89
90
91
92
93
@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))
0d6506cb   hitier   New project_charg...
94
    charges_table = db_mgr.charges_by_project(project_id)
d7a4e41b   hitier   New project page:...
95
    return render_template('project.html',
40126f91   hitier   Update project ro...
96
                           project=this_project.to_struct(),
0d6506cb   hitier   New project_charg...
97
                           charges=charges_table,
d7a4e41b   hitier   New project page:...
98
99
                           subtitle="{}".format(this_project.name))

c8b7caf5   hitier   Agent now uses co...
100

d9f5cfc9   hitier   New agent page dy...
101
@bp.route('/agent/<agent_id>')
dcafa5d0   hitier   Protect routes by...
102
@role_required('agent')
d9f5cfc9   hitier   New agent page dy...
103
def agent(agent_id):
dcafa5d0   hitier   Protect routes by...
104
105
    # TODO: am i the agent, the service or project manager , or the admin ?
    this_agent = Agent.query.get(int(agent_id))
c8b7caf5   hitier   Agent now uses co...
106
    charges_table = db_mgr.charges_by_agent_tabled(agent_id)
d9f5cfc9   hitier   New agent page dy...
107
    return render_template('agent.html',
dcafa5d0   hitier   Protect routes by...
108
                           agent=this_agent,
70da5dd5   hitier   Insert charges ta...
109
                           charges=charges_table,
ca0797d6   hitier   New agent edit form
110
111
112
                           subtitle=f"{this_agent.fullname}")


12de0b1d   hitier   Now charge add ro...
113
114
# - - - - - - - - - - - - - - - - - - - -  FORMS  - - - - - - - - - - - - - - - - - - - - #

a540c9b1   hitier   New project form ...
115
116
117
118
@bp.route('/project/create', methods=('POST', 'GET'))
@bp.route('/project/<project_id>/edit', methods=('POST', 'GET'))
@role_required('service')
def project_edit(project_id=None):
3c53ad45   hitier   Project edit work...
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
    if request.method == 'GET':
        if project_id:
            this_project = Project.query.get(int(project_id))
        else:
            this_project = Project()
        project_struct = this_project.to_struct()
        categories = db_mgr.category_labels()
        return render_template('project_form.html', project=project_struct,
                               categories=categories)
    elif request.method == 'POST':
        try:
            project_id = request.form['project_id']
        except KeyError:
            project_id = None
        if project_id:
            # then update existing
            this_project = Project.query.get(int(project_id))
            done_string = "mis à jour."
        else:
            # or create from scratch
            this_project = Project()
            done_string = "ajouté."
        # fill orm with form and write to db
        this_project.from_request(request)
        db.session.add(this_project)
        db.session.commit()
        # we're done
        flash(f"Project {this_project.name} (#{this_project.id}) " + done_string)
        return redirect(url_for('main.project', project_id=this_project.id))
a540c9b1   hitier   New project form ...
148
149


ca0797d6   hitier   New agent edit form
150
151
152
153
154
155
156
@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':
ac2fa9fd   hitier   Use select_option...
157
158
159
160
        companies = Company.query.all()
        grades = AgentGrade.query.all()
        statuses = AgentStatus.query.all()
        baps = AgentBap.query.all()
ca0797d6   hitier   New agent edit form
161
162
163
164
165
166
        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()
e6499574   hitier   Rename form templ...
167
        return render_template('agent_form.html', agent=agent_struct,
ac2fa9fd   hitier   Use select_option...
168
169
170
171
                               companies=companies,
                               statuses=statuses,
                               baps=baps,
                               grades=grades)
ca0797d6   hitier   New agent edit form
172
173
174
    # Or submit for db writing
    #
    elif request.method == 'POST':
e20cd5d4   hitier   Now import/export...
175
176
177
178
        try:
            agent_id = request.form['agent_id']
        except KeyError:
            agent_id = None
ca0797d6   hitier   New agent edit form
179
180
181
182
183
184
185
186
187
188
189
190
191
        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
142e2e9d   hitier   New Formable clas...
192
        flash(f"Agent {this_agent.fullname} (#{this_agent.id}) " + done_string)
ca0797d6   hitier   New agent edit form
193
        return redirect(url_for('main.agent', agent_id=this_agent.id))
12de0b1d   hitier   Now charge add ro...
194
195
196
197
198
199


@bp.route('/charge/add', methods=('POST', 'GET'))
@role_required('service')
def charge_add():
    if request.method == 'GET':
09551925   hitier   New charge add pa...
200
201
202
203
204
205
206
207
        try:
            this_agent = Agent.query.get(int(request.args['agent_id']))
        except KeyError:
            this_agent = None
        try:
            this_project = Project.query.get(int(request.args['project_id']))
        except KeyError:
            this_project = None
12de0b1d   hitier   Now charge add ro...
208
209
210
211
212
        this_agents = Agent.query.order_by(Agent.firstname).all()
        this_projects = Project.query.order_by(Project.name).all()
        this_services = Service.query.order_by(Service.name).all()
        this_periods = Period.query.order_by(Period.id).all()
        this_capacities = Capacity.query.order_by(Capacity.name).all()
e6499574   hitier   Rename form templ...
213
        return render_template('charge_form.html', subtitle="Affecter un agent",
09551925   hitier   New charge add pa...
214
215
                               agent=this_agent,
                               project=this_project,
12de0b1d   hitier   Now charge add ro...
216
217
218
219
220
221
222
223
224
225
226
227
228
                               projects=this_projects,
                               services=this_services,
                               periods=this_periods,
                               capacities=this_capacities,
                               agents=this_agents)
    elif request.method == 'POST':
        this_agent = Agent.query.get(request.form.get('agent_id'))
        this_charge = Charge()
        this_charge.from_request(request)
        db.session.add(this_charge)
        db.session.commit()
        flash(f"Nouvelle charge pour l'agent {this_agent.fullname}")
        return redirect(url_for('main.agent', agent_id=this_agent.id))
1b604951   hitier   Rearrange code
229
230


64515ad9   hitier   New agent charges...
231
# - - - - - - - - - - - - - - - - - - - -  REST API - - - - - - - - - - - - - - - - - - - -
1b604951   hitier   Rearrange code
232

f25c2405   hitier   Add corresponding...
233
234
235
236
237
238
239
240
241
242
243
244
@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

c8b7caf5   hitier   Agent now uses co...
245
246

@bp.route('/charge/agent/<agent_id>')
1b604951   hitier   Rearrange code
247
@role_required('service')
64515ad9   hitier   New agent charges...
248
249
def charge_agent_csv(agent_id):
    csv_table = []
c8b7caf5   hitier   Agent now uses co...
250
    for line in db_mgr.charges_by_agent_stacked(agent_id):
64515ad9   hitier   New agent charges...
251
252
253
254
        line = [cell.replace(",", "-") for cell in line]
        line_string = ",".join(line)
        csv_table.append(line_string)
    resp = make_response("\n".join(csv_table))
17b05589   hitier   Change agent csv ...
255
    resp.headers['Content-Type'] = 'text/plain;charset=utf8'
64515ad9   hitier   New agent charges...
256
    return resp