100 lines
3.1 KiB
Python
100 lines
3.1 KiB
Python
from flask import Blueprint, render_template, request, redirect, url_for, flash
|
|
from datetime import date, time
|
|
import sqlalchemy as sa
|
|
from app import db
|
|
from app.models import WorkEntry, TimeSlot
|
|
from app.config_loader import get_journeys, day_types_without_journey
|
|
|
|
bp = Blueprint("entries", __name__, url_prefix="/entries")
|
|
|
|
DAY_TYPES = [
|
|
("WORK", "Travail"),
|
|
("TT", "Télétravail"),
|
|
("GARDE", "Garde"),
|
|
("ASTREINTE", "Astreinte"),
|
|
("FORMATION", "Formation"),
|
|
("RTT", "RTT"),
|
|
("CONGE", "Congé"),
|
|
("MALADE", "Maladie"),
|
|
("FERIE", "Férié"),
|
|
]
|
|
|
|
|
|
@bp.route("/")
|
|
def list_entries():
|
|
entries = db.session.scalars(
|
|
sa.select(WorkEntry).order_by(WorkEntry.date.desc())
|
|
).all()
|
|
return render_template("entry_list.html", entries=entries)
|
|
|
|
|
|
@bp.route("/new", methods=["GET", "POST"])
|
|
@bp.route("/<int:entry_id>/edit", methods=["GET", "POST"])
|
|
def entry_form(entry_id=None):
|
|
entry = None
|
|
if entry_id:
|
|
entry = db.session.get(WorkEntry, entry_id)
|
|
if not entry:
|
|
flash("Entrée introuvable.", "error")
|
|
return redirect(url_for("entries.list_entries"))
|
|
|
|
if request.method == "POST":
|
|
entry_date = date.fromisoformat(request.form["date"])
|
|
day_type = request.form["day_type"]
|
|
journey_profile_id = request.form.get("journey_profile_id") or None
|
|
comment = request.form.get("comment") or None
|
|
|
|
if day_type in day_types_without_journey():
|
|
journey_profile_id = None
|
|
|
|
if entry is None:
|
|
existing = db.session.scalar(
|
|
sa.select(WorkEntry).where(WorkEntry.date == entry_date)
|
|
)
|
|
if existing:
|
|
flash(f"Une entrée existe déjà pour le {entry_date}.", "error")
|
|
return redirect(url_for("entries.entry_form"))
|
|
entry = WorkEntry(date=entry_date)
|
|
db.session.add(entry)
|
|
|
|
entry.day_type = day_type
|
|
entry.journey_profile_id = journey_profile_id
|
|
entry.comment = comment
|
|
|
|
for slot in list(entry.time_slots):
|
|
db.session.delete(slot)
|
|
|
|
starts = request.form.getlist("start_time")
|
|
ends = request.form.getlist("end_time")
|
|
for s, e in zip(starts, ends):
|
|
if s and e:
|
|
db.session.add(TimeSlot(
|
|
entry=entry,
|
|
start_time=time.fromisoformat(s),
|
|
end_time=time.fromisoformat(e),
|
|
))
|
|
|
|
db.session.commit()
|
|
flash("Entrée enregistrée.", "success")
|
|
return redirect(url_for("dashboard.index"))
|
|
|
|
journeys = get_journeys()
|
|
return render_template(
|
|
"entry_form.html",
|
|
entry=entry,
|
|
day_types=DAY_TYPES,
|
|
journeys=journeys,
|
|
day_types_without_journey=day_types_without_journey(),
|
|
today=date.today().isoformat(),
|
|
)
|
|
|
|
|
|
@bp.route("/<int:entry_id>/delete", methods=["POST"])
|
|
def delete_entry(entry_id):
|
|
entry = db.session.get(WorkEntry, entry_id)
|
|
if entry:
|
|
db.session.delete(entry)
|
|
db.session.commit()
|
|
flash("Entrée supprimée.", "success")
|
|
return redirect(url_for("entries.list_entries"))
|