101 lines
4.2 KiB
Python
101 lines
4.2 KiB
Python
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
from flask import Blueprint, flash, redirect, render_template, request, url_for
|
||
|
|
from flask_login import login_required
|
||
|
|
|
||
|
|
from app_new.extensions import db
|
||
|
|
from app_new.core.models.college import Building, HousingUnit, Room, RoomType, Site, Zone
|
||
|
|
|
||
|
|
|
||
|
|
housing_bp = Blueprint("housing", __name__, template_folder="templates")
|
||
|
|
|
||
|
|
|
||
|
|
def _date(value):
|
||
|
|
return datetime.strptime(value, "%Y-%m-%d").date() if value else None
|
||
|
|
|
||
|
|
|
||
|
|
@housing_bp.route("/")
|
||
|
|
@login_required
|
||
|
|
def index():
|
||
|
|
units = HousingUnit.query.join(Building).order_by(Building.name, HousingUnit.name).all()
|
||
|
|
return render_template("housing/index.html", units=units)
|
||
|
|
|
||
|
|
|
||
|
|
@housing_bp.route("/new", methods=["GET", "POST"])
|
||
|
|
@login_required
|
||
|
|
def create():
|
||
|
|
housing_sites = Site.query.filter_by(site_type="logements", is_active=True).order_by(Site.name).all()
|
||
|
|
buildings = Building.query.order_by(Building.name).all()
|
||
|
|
if request.method == "POST":
|
||
|
|
name = (request.form.get("name") or "").strip()
|
||
|
|
building_id = request.form.get("building_id", type=int)
|
||
|
|
if not name or not building_id:
|
||
|
|
flash("Le nom et le bâtiment sont obligatoires.", "danger")
|
||
|
|
return render_template("housing/form.html", unit=None, buildings=buildings, housing_sites=housing_sites), 400
|
||
|
|
unit = HousingUnit(name=name, building_id=building_id)
|
||
|
|
_apply_form(unit)
|
||
|
|
db.session.add(unit)
|
||
|
|
db.session.commit()
|
||
|
|
flash(f"Logement « {unit.name} » créé.", "success")
|
||
|
|
return redirect(url_for("housing.detail", unit_id=unit.id))
|
||
|
|
return render_template("housing/form.html", unit=None, buildings=buildings, housing_sites=housing_sites)
|
||
|
|
|
||
|
|
|
||
|
|
@housing_bp.route("/<int:unit_id>")
|
||
|
|
@login_required
|
||
|
|
def detail(unit_id):
|
||
|
|
unit = HousingUnit.query.get_or_404(unit_id)
|
||
|
|
equipments = [equipment for room in unit.rooms for equipment in room.equipments if not equipment.is_deleted]
|
||
|
|
return render_template("housing/detail.html", unit=unit, equipments=equipments)
|
||
|
|
|
||
|
|
|
||
|
|
@housing_bp.route("/<int:unit_id>/edit", methods=["GET", "POST"])
|
||
|
|
@login_required
|
||
|
|
def edit(unit_id):
|
||
|
|
unit = HousingUnit.query.get_or_404(unit_id)
|
||
|
|
buildings = Building.query.order_by(Building.name).all()
|
||
|
|
if request.method == "POST":
|
||
|
|
_apply_form(unit)
|
||
|
|
unit.name = (request.form.get("name") or "").strip()
|
||
|
|
unit.building_id = request.form.get("building_id", type=int)
|
||
|
|
db.session.commit()
|
||
|
|
flash("Logement mis à jour.", "success")
|
||
|
|
return redirect(url_for("housing.detail", unit_id=unit.id))
|
||
|
|
return render_template("housing/form.html", unit=unit, buildings=buildings, housing_sites=[])
|
||
|
|
|
||
|
|
|
||
|
|
@housing_bp.route("/<int:unit_id>/rooms", methods=["POST"])
|
||
|
|
@login_required
|
||
|
|
def add_room(unit_id):
|
||
|
|
unit = HousingUnit.query.get_or_404(unit_id)
|
||
|
|
name = (request.form.get("name") or "").strip()
|
||
|
|
if not name:
|
||
|
|
flash("Le nom de la pièce est obligatoire.", "danger")
|
||
|
|
return redirect(url_for("housing.detail", unit_id=unit.id))
|
||
|
|
zone = Zone.query.filter_by(building_id=unit.building_id, name="Logements").first()
|
||
|
|
if zone is None:
|
||
|
|
zone = Zone(name="Logements", building_id=unit.building_id)
|
||
|
|
db.session.add(zone)
|
||
|
|
db.session.flush()
|
||
|
|
room_type = RoomType.query.filter_by(name=request.form.get("room_type_name", "Logement")).first()
|
||
|
|
room = Room(
|
||
|
|
name=name, code=(request.form.get("code") or "").strip() or None,
|
||
|
|
building_id=unit.building_id, zone_id=zone.id,
|
||
|
|
room_type_id=room_type.id if room_type else None, housing_unit_id=unit.id,
|
||
|
|
)
|
||
|
|
db.session.add(room)
|
||
|
|
db.session.commit()
|
||
|
|
flash(f"Pièce « {room.name} » ajoutée.", "success")
|
||
|
|
return redirect(url_for("housing.detail", unit_id=unit.id))
|
||
|
|
|
||
|
|
|
||
|
|
def _apply_form(unit):
|
||
|
|
unit.code = (request.form.get("code") or "").strip() or None
|
||
|
|
unit.housing_type = request.form.get("housing_type", "fonction")
|
||
|
|
unit.occupancy_status = request.form.get("occupancy_status", "vacant")
|
||
|
|
unit.occupant_name = (request.form.get("occupant_name") or "").strip() or None
|
||
|
|
unit.occupant_contact = (request.form.get("occupant_contact") or "").strip() or None
|
||
|
|
unit.occupancy_start = _date(request.form.get("occupancy_start"))
|
||
|
|
unit.occupancy_end = _date(request.form.get("occupancy_end"))
|
||
|
|
unit.notes = (request.form.get("notes") or "").strip() or None
|