Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
29292d4
Update README.md
Gigique Oct 10, 2025
29887cc
Update README.md
Gigique Oct 10, 2025
46be6e7
Update hello.html
Gigique Oct 10, 2025
2319e25
Update __init__.py
Gigique Oct 10, 2025
d73e132
Update __init__.py
Gigique Oct 10, 2025
4856fb1
Create graphique
Gigique Oct 10, 2025
778edb4
Rename graphique to graphique.html
Gigique Oct 10, 2025
08b58af
Update __init__.py
Gigique Oct 10, 2025
f7bed6c
Update and rename
Gigique Oct 10, 2025
ea8d463
Update graphique.html
Gigique Oct 10, 2025
5f8e1b5
Update graphique.html
Gigique Oct 10, 2025
2b11075
Update graphique.html
Gigique Oct 10, 2025
654eb1f
Update graphique.html
Gigique Oct 10, 2025
6b6b4c5
Update graphique.html
Gigique Oct 10, 2025
6aa2a64
Delete templates/templates directory
Gigique Oct 10, 2025
c76f320
Create graphique.html
Gigique Oct 10, 2025
7755be5
Update graphique.html
Gigique Oct 10, 2025
c554117
Update graphique.html
Gigique Oct 10, 2025
1abcbc0
Update graphique.html
Gigique Oct 10, 2025
3741afb
Update graphique.html
Gigique Oct 10, 2025
4658295
Update graphique.html
Gigique Oct 10, 2025
3ce44b6
Update graphique.html
Gigique Oct 10, 2025
ee44922
Update graphique.html
Gigique Oct 10, 2025
4733a90
Update __init__.py
Gigique Oct 10, 2025
d9f1e77
Create histogramme.html
Gigique Oct 10, 2025
df37643
Update __init__.py
Gigique Oct 10, 2025
5236ad1
Update __init__.py
Gigique Oct 10, 2025
88ae462
Update __init__.py
Gigique Oct 10, 2025
2b2e05c
Create contact.html
Gigique Oct 10, 2025
457eef3
Update contact.html
Gigique Oct 10, 2025
609b35e
Update __init__.py
Gigique Oct 10, 2025
f5ead32
Update contact.html
Gigique Oct 10, 2025
a3cad96
Update contact.html
Gigique Oct 10, 2025
50b4ea3
Create commits.html
Gigique Oct 10, 2025
2c7a62c
Update __init__.py
Gigique Oct 10, 2025
9ae561a
Update __init__.py
Gigique Oct 10, 2025
d7ad880
Update commits.html
Gigique Oct 10, 2025
68db608
Update __init__.py
Gigique Oct 10, 2025
3b36286
Update __init__.py
Gigique Oct 10, 2025
7b872d1
Update commits.html
Gigique Oct 10, 2025
2feb919
Update __init__.py
Gigique Oct 10, 2025
efada29
Update __init__.py
Gigique Oct 10, 2025
f80ca5c
Update __init__.py
Gigique Oct 10, 2025
6449657
Update commits.html
Gigique Oct 10, 2025
9e838c3
Update __init__.py
Gigique Oct 10, 2025
ada9efb
Update __init__.py
Gigique Oct 10, 2025
ac5afec
Update __init__.py
Gigique Oct 10, 2025
f3503a6
Update __init__.py
Gigique Oct 10, 2025
4bce458
Update __init__.py
Gigique Oct 10, 2025
67698a4
Update commits.html
Gigique Oct 10, 2025
c4ad812
Update __init__.py
Gigique Oct 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,3 +100,4 @@ Lors de vos développements, vous serez peut-être confronté à des erreurs sys
Les causes d'erreurs sont quasi illimitées. **Vous devez donc vous tourner vers les logs de votre système pour comprendre d'où vient le problème** :
Voici une vidéo pour accéder aux logs de vos Actions GitHUB : [Vidéo Log GitHUB](https://youtu.be/rhGrDLSFH7Y)
Voici une vidéo pour vous expliquer comment accéder au logs de votre serveur Alwaysdata : [Vidéo Log Alwaysdata](https://youtu.be/URWMWqVMS2U)

69 changes: 66 additions & 3 deletions __init__.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,78 @@
from flask import Flask, render_template_string, render_template, jsonify
from flask import render_template
from flask import Flask, render_template, jsonify
from flask import json
from datetime import datetime
from urllib.request import urlopen
from urllib.request import urlopen, Request
import sqlite3

app = Flask(__name__)

@app.route('/')
def hello_world():
return render_template('hello.html')

@app.route("/contact/")
def MaPremiereAPI():
return render_template("contact.html")

@app.route('/tawarano/')
def meteo():
response = urlopen('https://samples.openweathermap.org/data/2.5/forecast?lat=0&lon=0&appid=xxx')
raw_content = response.read()
json_content = json.loads(raw_content.decode('utf-8'))
results = []
for list_element in json_content.get('list', []):
dt_value = list_element.get('dt')
temp_day_value = list_element.get('main', {}).get('temp') - 273.15 # Conversion de Kelvin en °c
results.append({'Jour': dt_value, 'temp': temp_day_value})
return jsonify(results=results)

@app.route("/histogramme/")
def monhisto():
return render_template("histogramme.html")

@app.route("/rapport/")
def mongraphique():
return render_template("histogramme.html")

@app.route('/extract-minutes/<date_string>')
def extract_minutes(date_string):
date_object = datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%SZ')
minutes = date_object.minute
return jsonify({'minutes': minutes})


@app.route('/commits/data')
def commits_data():
# Repo source de l’énoncé (tu peux remplacer par ton fork : owner/repo)
api_url = f"https://api.github.com/repos/Gigique/5MCSI_Metriques/commits"

req = Request(api_url, headers={"User-Agent": "metrics-app"})
with urlopen(req) as resp:
raw = resp.read()
payload = json.loads(raw.decode("utf-8"))

minute_counts = [0] * 60
for item in payload:
commit_info = item.get('commit', {})
author_info = commit_info.get('author', {})
date_str = author_info.get('date') # ex: "2024-02-11T11:57:27Z"
if not date_str:
continue
try:
d = datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%SZ')
minute_counts[d.minute] += 1
except Exception:
continue

results = [{'minute': i, 'count': minute_counts[i]} for i in range(60)]
return jsonify(results=results)


@app.route('/commits/')
def commits_page():
return render_template('commits.html')



if __name__ == "__main__":
app.run(debug=True)
53 changes: 53 additions & 0 deletions templates/commits.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
<!doctype html>
<html lang="fr">
<head>
<meta charset="UTF-8" />
<title>Commits par minute</title>
<script src="https://www.gstatic.com/charts/loader.js"></script>
<style>
body { font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; margin: 24px; }
#chart { width: 100%; height: 520px; }
.hint { color: #555; margin-bottom: 12px; }
</style>
</head>
<body>
<h2>Répartition des commits par minute (0–59)</h2>
<p class="hint">Source: API GitHub → <code>commit.author.date</code>. Chaque barre = nombre de commits dont la minute correspond.</p>
<div id="chart"></div>

<script>
google.charts.load('current', { packages: ['corechart'] });
google.charts.setOnLoadCallback(draw);

function draw() {
fetch('/commits/data')
.then(r => r.json())
.then(({ results }) => {
// Transforme en DataTable [Minute, Count]
const dataTable = new google.visualization.DataTable();
dataTable.addColumn('string', 'Minute');
dataTable.addColumn('number', 'Commits');

results.forEach(row => {
dataTable.addRow([String(row.minute).padStart(2, '0'), row.count]);
});

const options = {
title: 'Commits par minute (0–59)',
legend: { position: 'none' },
hAxis: { title: 'Minute', slantedText: true },
vAxis: { title: 'Nombre de commits', minValue: 0 },
bar: { groupWidth: '80%' }
};

const chart = new google.visualization.ColumnChart(document.getElementById('chart'));
chart.draw(dataTable, options);
})
.catch(err => {
document.getElementById('chart').innerHTML =
'<p>Erreur de chargement des données : ' + (err?.message || err) + '</p>';
});
}
</script>
</body>
</html>
101 changes: 101 additions & 0 deletions templates/contact.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
<html>
<head>
<meta charset="UTF-8">
<title>Contact</title>
<style>
body {
font-family: "Segoe UI", Roboto, sans-serif;
background-color: #f7f8fa;
color: #333;
display: flex;
flex-direction: column;
align-items: center;
padding: 40px;
}

h1 {
color: #0055aa;
margin-bottom: 20px;
}

form {
background: #fff;
padding: 25px 30px;
border-radius: 10px;
box-shadow: 0 4px 10px rgba(0,0,0,0.1);
width: 320px;
}

label {
font-weight: bold;
color: #222;
}

input, textarea {
width: 100%;
margin: 8px 0 15px;
padding: 8px;
border: 1px solid #ccc;
border-radius: 5px;
font-family: inherit;
font-size: 14px;
}

input:focus, textarea:focus {
border-color: #0055aa;
outline: none;
box-shadow: 0 0 4px #0055aa44;
}

button {
background: #0055aa;
color: white;
font-weight: bold;
padding: 10px 15px;
border: none;
border-radius: 5px;
cursor: pointer;
width: 100%;
transition: background 0.3s;
}

button:hover {
background: #003f80;
}

#status {
margin-top: 15px;
font-weight: bold;
}

#status.ok {
color: green;
}

#status.error {
color: red;
}
</style>
</head>
<body>

<h1>Formulaire de contact</h1>

<form action="/submit" method="post">
<label for="name">Nom :</label><br>
<input type="text" id="name" name="name" required><br><br>

<label for="email">Email :</label><br>
<input type="email" id="email" name="email" required><br><br>

<label for="subject">Sujet :</label><br>
<input type="text" id="subject" name="subject"><br><br>

<label for="message">Message :</label><br>
<textarea id="message" name="message" rows="5" cols="33" required></textarea><br><br>

<input type="submit" value="Envoyer">
</form>

</body>
</html>
40 changes: 40 additions & 0 deletions templates/graphique.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<html>
<head>
<meta charset="UTF-8" />
<title>Metrique</title>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
</head>
<body>
<div id="chart_div"></div>
<script>
google.charts.load('current', { packages: ['corechart'] });
google.charts.setOnLoadCallback(drawBackgroundColor);
function drawBackgroundColor() {
function drawChart(data) {
// Convertir les données récupérées en un tableau utilisable par Google Charts
var dataTable = new google.visualization.DataTable();
dataTable.addColumn('string', 'Date');
dataTable.addColumn('number', 'Valeur');
data.results.forEach(entry => {
var date = new Date(entry.Jour * 1000);
dataTable.addRow([date.toLocaleDateString(), entry.temp]);
});
// Configurer les options du graphique en ligne
var options = {
title: 'Évolution des températures de la ville de Tawarano',
curveType: 'function',
legend: { position: 'bottom' }
};
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(dataTable, options);
}
// Récupération de données depuis notre API /tawarano/
fetch('/tawarano/')
.then(response => response.json())
.then(data => {
drawChart(data);
})
}
</script>
</body>
</html>
2 changes: 1 addition & 1 deletion templates/hello.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<!doctype html>
<title>Evaluation</title>
<h1>Bienvenue sur votre projet Métriques</h1>
<h2>Ceci est le projet de : Prénom Nom</h2>
<h2>Ceci est le projet de : Angélique Bidot</h2>
<p>Si vous avez mis en ligne votre solution et si cette page d'accueil s'affiche dans votre navigateur alors <b>vous avez déjà gagné 4 points</b> sur votre note d'évaluation.</p>
<p>Notions acquises lors de cette étape : Vous avez lors cette première étape apris à créer votre hébergement en ligne sur Alwaydata, installer une application, Forker un projet GitHUB et créer des Secrets qui seront utilisés lors de vos Commits pour mettre à jour votre site en ligne</p>
<p>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - </p>
Expand Down
42 changes: 42 additions & 0 deletions templates/histogramme.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<html>
<head>
<meta charset="UTF-8" />
<title>Metrique</title>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
</head>

<body>
<div id="chart_div"></div>
<script>
google.charts.load('current', { packages: ['corechart'] });
google.charts.setOnLoadCallback(drawBackgroundColor);
function drawBackgroundColor() {
function drawChart(data) {
// Convertir les données récupérées en un tableau utilisable par Google Charts
var dataTable = new google.visualization.DataTable();
dataTable.addColumn('string', 'Date');
dataTable.addColumn('number', 'Valeur');
data.results.forEach(entry => {
var date = new Date(entry.Jour * 1000);
dataTable.addRow([date.toLocaleDateString(), entry.temp]);
});
// Configurer les options du graphique en ligne
var options = {
title: 'Évolution des températures de la ville de Tawarano',
curveType: 'function',
legend: { position: 'bottom' }
};
var chart = new google.visualization.Histogram(document.getElementById('chart_div'));
chart.draw(dataTable, options);
}
// Récupération de données depuis notre API /tawarano/
fetch('/tawarano/')
.then(response => response.json())
.then(data => {
drawChart(data);
})
}
</script>
</body>

</html>