""" Point d'entrée principal de l'application Ospow. Chaque route = une page du site. Pour ajouter une page : créer templates/ma_page.html et ajouter une route ici. """ from flask import Flask, render_template, request, flash, redirect, url_for, Response from flask_mail import Mail, Message from datetime import date import os from dotenv import load_dotenv load_dotenv() app = Flask(__name__) app.secret_key = os.environ.get("SECRET_KEY", "changez-moi-en-production") # --- Configuration de l'envoi d'emails --- app.config["MAIL_SERVER"] = os.environ.get("MAIL_SERVER", "smtp.gmail.com") app.config["MAIL_PORT"] = int(os.environ.get("MAIL_PORT", 587)) app.config["MAIL_USE_TLS"] = True app.config["MAIL_USERNAME"] = os.environ.get("MAIL_USERNAME", "") app.config["MAIL_PASSWORD"] = os.environ.get("MAIL_PASSWORD", "") app.config["MAIL_DEFAULT_SENDER"] = os.environ.get("MAIL_USERNAME", "") mail = Mail(app) CONTACT_EMAIL = os.environ.get("CONTACT_EMAIL", "contact@ospow.fr") # ─── Context global (disponible dans tous les templates) ────────────────────── @app.context_processor def inject_globals(): return {"current_year": date.today().year} # ─── Pages ──────────────────────────────────────────────────────────────────── @app.route("/") def index(): return render_template("index.html") @app.route("/surveillance") def surveillance(): return render_template("surveillance.html") @app.route("/cloud") def cloud(): return render_template("cloud.html") @app.route("/opensource") def opensource(): return render_template("opensource.html") @app.route("/equipe") def equipe(): return render_template("equipe.html") @app.route("/contact", methods=["GET", "POST"]) def contact(): if request.method == "POST": nom = request.form.get("nom", "").strip() email = request.form.get("email", "").strip() sujet = request.form.get("sujet", "").strip() message = request.form.get("message", "").strip() # Validation basique errors = [] if not nom: errors.append("Le nom est obligatoire.") if not email or "@" not in email: errors.append("Adresse email invalide.") if not message: errors.append("Le message ne peut pas être vide.") if errors: for e in errors: flash(e, "error") return render_template("contact.html", form_data=request.form) # Envoi de l'email try: msg = Message( subject=f"[Ospow Contact] {sujet or 'Nouveau message'}", recipients=[CONTACT_EMAIL], body=f"De : {nom} <{email}>\n\n{message}", reply_to=email, ) mail.send(msg) flash("Votre message a bien été envoyé. Nous vous répondrons rapidement !", "success") return redirect(url_for("contact")) except Exception as exc: app.logger.error("Erreur envoi mail : %s", exc) flash("Une erreur est survenue lors de l'envoi. Réessayez plus tard.", "error") return render_template("contact.html", form_data={}) # ─── SEO : sitemap & robots ─────────────────────────────────────────────────── @app.route("/sitemap.xml") def sitemap(): pages = [ (url_for("index", _external=True), "weekly", "1.0"), (url_for("surveillance",_external=True), "monthly", "0.9"), (url_for("cloud", _external=True), "monthly", "0.9"), (url_for("opensource", _external=True), "monthly", "0.9"), (url_for("equipe", _external=True), "monthly", "0.7"), (url_for("contact", _external=True), "monthly", "0.6"), ] today = date.today().isoformat() lines = ['', ''] for loc, freq, priority in pages: lines.append( f" {loc}" f"{today}" f"{freq}" f"{priority}" ) lines.append("") return Response("\n".join(lines), mimetype="application/xml") @app.route("/robots.txt") def robots(): txt = ( "User-agent: *\n" "Allow: /\n" f"Sitemap: {url_for('sitemap', _external=True)}\n" ) return Response(txt, mimetype="text/plain") # ─── Lancement ──────────────────────────────────────────────────────────────── if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)