add app's files
This commit is contained in:
parent
f43ef7fb09
commit
c1bd077eb3
291
z2/app/app.py
Normal file
291
z2/app/app.py
Normal 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
3
z2/app/requirements.txt
Normal file
@ -0,0 +1,3 @@
|
||||
Flask==2.1.2
|
||||
psycopg2-binary==2.9.3
|
||||
Werkzeug==2.0.3
|
Loading…
Reference in New Issue
Block a user