add app's files

This commit is contained in:
Charlyne Wargnier-Potier 2025-04-17 22:42:40 +00:00
parent f43ef7fb09
commit c1bd077eb3
2 changed files with 294 additions and 0 deletions

291
z2/app/app.py Normal file
View File

@ -0,0 +1,291 @@
from flask import Flask, request, render_template_string, redirect, url_for
import os
import psycopg2
app = Flask(__name__)
# Function to make connection to database
def get_db_connection():
conn = psycopg2.connect(
dbname="travel_planner", # Assurez-vous que ce nom correspond à celui dans statefulset.yaml
user="user",
password="password",
host="postgres-db", # Doit correspondre au nom du service
port="5432"
)
return conn
# Init database & create trips table if doesn't exist
def init_db():
conn = get_db_connection()
cur = conn.cursor()
cur.execute("""
CREATE TABLE IF NOT EXISTS travels (
id SERIAL PRIMARY KEY,
traveler_name VARCHAR(255) NOT NULL,
name_travel VARCHAR(255) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL
);
CREATE TABLE IF NOT EXISTS stages (
id SERIAL PRIMARY KEY,
travel_id INT REFERENCES travels(id) ON DELETE CASCADE,
city VARCHAR(255) NOT NULL,
order_index INT NOT NULL,
image_url TEXT
);
""")
conn.commit()
cur.close()
conn.close()
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "POST":
traveler_name = request.form["traveler_name"] # Name traveler
name_travel = request.form["name_travel"] # Travel's name
start_date = request.form["start_date"] # Start date
end_date = request.form["end_date"] # End date
# Ajouter un nouveau voyage à la base de données
conn = get_db_connection()
cur = conn.cursor()
cur.execute("""
INSERT INTO travels (traveler_name, name_travel, start_date, end_date)
VALUES (%s, %s, %s, %s)
""", (traveler_name, name_travel, start_date, end_date))
conn.commit()
cur.close()
conn.close()
# Show all travels
conn = get_db_connection()
cur = conn.cursor()
cur.execute("SELECT * FROM travels ORDER BY traveler_name")
travels = cur.fetchall()
cur.close()
conn.close()
return render_template_string("""
<html>
<head><title>Travel Planner</title></head>
<body>
<h1>Travel Planner</h1>
<form method="POST">
<input type="text" name="traveler_name" placeholder="Traveler's Name" required>
<input type="text" name="name_travel" placeholder="Trip Name" required>
<input type="date" name="start_date" required>
<input type="date" name="end_date" required>
<button type="submit">Add Travel</button>
</form>
<h2>All Travels</h2>
<ul>
{% for travel in travels %}
<li>
<strong>{{ travel[1] }}</strong> - {{ travel[2] }}
<a href="{{ url_for('view_travel', travel_id=travel[0]) }}">View Details</a>
<a href="{{ url_for('change_travel', travel_id=travel[0]) }}">Change Travel</a>
<a href="{{ url_for('remove_travel', travel_id=travel[0]) }}">Remove Travel</a>
</li>
{% endfor %}
</ul>
</body>
</html>
""", travels=travels)
#How can you show all stages for one travel ?
@app.route("/travel/<int:travel_id>")
def view_travel(travel_id):
# travel details
conn = get_db_connection()
cur = conn.cursor()
cur.execute("SELECT * FROM travels WHERE id = %s", (travel_id,))
travel = cur.fetchone()
cur.close()
if travel is None:
return "This travel doesn't exist", 404
# travel stage
conn = get_db_connection()
cur = conn.cursor()
cur.execute("SELECT * FROM stages WHERE travel_id = %s ORDER BY order_index", (travel_id,))
stages = cur.fetchall()
cur.close()
return render_template_string("""
<html>
<head><title>Travel Details</title></head>
<body>
<h1>{{ travel[1] }}</h1>
<p><strong>Traveler:</strong> {{ travel[2] }}</p>
<p><strong>From:</strong> {{ travel[3] }} <strong>To:</strong> {{ travel[4] }}</p>
<h2>Steps</h2>
<ul>
{% for stage in stages %}
<li>
{{ stage[2] }} (Order: {{ stage[3] }})
<a href="{{ url_for('change_stage', travel_id=travel[0]) }}">Edit</a>
<a href="{{ url_for('remove_stage', travel_id=travel[0]) }}">Remove</a>
</li>
{% endfor %}
</ul>
<h3>Add Step</h3>
<form method="POST" action="{{ url_for('add_stage', travel_id=travel[0]) }}">
<input type="text" name="city" placeholder="City" required>
<input type="int" name="order_index" placeholder="Order" required>
<button type="submit">Add Step</button>
</form>
<a href="{{ url_for('index') }}">Back to All Trips</a>
</body>
</html>
""", travel=travel, stages=stages)
# How can you delete one stage in the travel ?
@app.route("/remove/<int:stage_id>")
def remove_stage(stage_id):
conn = get_db_connection()
cur = conn.cursor()
cur.execute("DELETE FROM stages WHERE id = %s", (stage_id,))
conn.commit()
cur.close()
conn.close()
return redirect(url_for('index'))
# How can you delete one trip ?
@app.route("/remove/<int:travel_id>")
def remove_travel(travel_id):
conn = get_db_connection()
cur = conn.cursor()
cur.execute("DELETE FROM travels WHERE id = %s", (travel_id,))
conn.commit()
cur.close()
conn.close()
return redirect(url_for('index'))
#Edit for travel
@app.route("/change/<int:travel_id>", methods=["GET", "POST"])
def change_travel(travel_id):
if request.method == "POST":
traveler_name = request.form["traveler_name"] # Name traveler
name_travel = request.form["name_travel"] # Travel's name
start_date = request.form["start_date"] # Start date
end_date = request.form["end_date"] # End date
conn = get_db_connection()
cur = conn.cursor()
cur.execute("UPDATE travels SET traveler_name = %s, name_travel = %s, start_date = %s, end_date = %s WHERE id = %s;", (traveler_name,name_travel,start_date,end_date,travel_id))
conn.commit()
cur.close()
conn.close()
return redirect(url_for('index'))
# Show edit for travel
conn = get_db_connection()
cur = conn.cursor()
cur.execute("SELECT * FROM travels WHERE id = %s", (travel_id,))
travel = cur.fetchone()
cur.close()
conn.close()
return render_template_string("""
<html>
<head><title>Edit Travel</title></head>
<body>
<h1>Edit Travel</h1>
<form method="POST">
<ul>
<li>
<label for="traveler_name">New Traveler's Name</label>
<input type="traveler_name" name="traveler_name" value="{{ travel[1] }}" required></li>
<li>
<label for="name_travel">New Name</label>
<input type="name_travel" name="name_travel" value="{{ travel[2] }}" required></li>
<li>
<label for="start_date">New Start date</label>
<input type="start_date" name="start_date" value="{{ travel[3] }}" required></li>
<li>
<label for="end_date">New End date</label>
<input type="end_date" name="end_date" value="{{ travel[4] }}" required></li>
<button type="submit">Update Travel</button>
</form>
<a href="{{ url_for('index') }}">Back to Travels</a>
</body>
</html>
""", travel=travel)
#Edit for stages
@app.route("/change/<int:stage_id>", methods=["GET", "POST"])
def change_stage(stage_id):
if request.method == "POST":
city = request.form["city"]
order_index = request.form["order_index"]
image_url = request.form["image_url"]
conn = get_db_connection()
cur = conn.cursor()
cur.execute("UPDATE stages SET city = %s, order_index = %s, image_url = %s WHERE id = %s;", (city,order_index,image_url,stage_id))
conn.commit()
cur.close()
conn.close()
return redirect(url_for('index'))
# Show edit for travel
conn = get_db_connection()
cur = conn.cursor()
cur.execute("SELECT * FROM stages WHERE id = %s", (stage_id,))
stage = cur.fetchone()
cur.close()
conn.close()
return render_template_string("""
<html>
<head><title>Edit Stage</title></head>
<body>
<h1>Edit Stage</h1>
<form method="POST">
<ul>
<li>
<label for="city">New City</label>
<input type="city" name="city" value="{{ stage[2] }}" required></li>
<li>
<label for="order_index">New Order</label>
<input type="order_index" name="order_index" value="{{ stage[3] }}" required></li>
<li>
<label for="image_url">New Image</label>
<input type="image_url" name="image_url" value="{{ stage[4] }}" required></li>
<button type="submit">Update Travel</button>
</form>
<a href="{{ url_for('index') }}">Back to Stages</a>
</body>
</html>
""", stage=stage)
@app.route("/add_stage/<int:travel_id>", methods=["POST"])
def add_stage(travel_id):
city = request.form["city"]
order_index = request.form["order_index"]
conn = get_db_connection()
cur = conn.cursor()
cur.execute("""
INSERT INTO stages (travel_id, city, order_index)
VALUES (%s, %s, %s)
""", (travel_id, city, order_index))
conn.commit()
cur.close()
conn.close()
return redirect(url_for('view_travel', travel_id=travel_id))
if __name__ == "__main__":
init_db() # Init bdd
app.run(host='0.0.0.0', port=5000)

3
z2/app/requirements.txt Normal file
View File

@ -0,0 +1,3 @@
Flask==2.1.2
psycopg2-binary==2.9.3
Werkzeug==2.0.3