From 1484299984b6d3105267e1a375b9616528af1432 Mon Sep 17 00:00:00 2001
From: e22duva2 <elvan.duval@imt-atlantique.net>
Date: Wed, 19 Mar 2025 13:35:59 +0100
Subject: [PATCH] Logo et equipe

---
 .../__pycache__/settings.cpython-310.pyc      | Bin 2432 -> 2432 bytes
 .../AppGCC/__pycache__/urls.cpython-310.pyc   | Bin 622 -> 622 bytes
 .../AppGCC/__pycache__/views.cpython-310.pyc  | Bin 3671 -> 10054 bytes
 AppGCC/AppGCC/templates/challenges.html       |  80 +++++++++++--
 AppGCC/AppGCC/templates/login.html            |   3 +
 AppGCC/AppGCC/templates/ranking.html          | 112 +++++++++++++-----
 AppGCC/AppGCC/views.py                        |  43 ++++++-
 AppGCC/daily_challenges.csv                   |  11 --
 AppGCC/db.sqlite3                             | Bin 131072 -> 131072 bytes
 AppGCC/difficulties.csv                       |   2 -
 AppGCC/scores.csv                             |   5 -
 AppGCC/static/js/serviceworker.js             |   0
 AppGCC/users.csv                              |   7 --
 AppGCC/challenges.csv => challenges.csv       |  74 ++++++------
 daily_challenges.csv                          |  25 ++++
 difficulties.csv                              |   4 +-
 postgresData/pg_stat_tmp/db_0.stat            | Bin 2129 -> 2129 bytes
 postgresData/pg_stat_tmp/db_13468.stat        | Bin 4961 -> 4961 bytes
 postgresData/pg_stat_tmp/global.stat          | Bin 1151 -> 1151 bytes
 scores.csv                                    |  22 +++-
 users.csv                                     |  11 ++
 21 files changed, 288 insertions(+), 111 deletions(-)
 delete mode 100644 AppGCC/daily_challenges.csv
 delete mode 100644 AppGCC/difficulties.csv
 delete mode 100644 AppGCC/scores.csv
 create mode 100644 AppGCC/static/js/serviceworker.js
 delete mode 100644 AppGCC/users.csv
 rename AppGCC/challenges.csv => challenges.csv (51%)
 create mode 100644 daily_challenges.csv
 create mode 100644 users.csv

diff --git a/AppGCC/AppGCC/__pycache__/settings.cpython-310.pyc b/AppGCC/AppGCC/__pycache__/settings.cpython-310.pyc
index b0787d6b4cbcf21500c7d47d83e05cdf2e1cb78c..7e84dfa38c5c8c1fe9906069f407c178ef966b93 100644
GIT binary patch
delta 20
ZcmZn=ZV=|q=jG*M00Q~^TN}AcIRPqF1ZMyM

delta 20
ZcmZn=ZV=|q=jG*M00OtBiyOI1IRPuH1egE-

diff --git a/AppGCC/AppGCC/__pycache__/urls.cpython-310.pyc b/AppGCC/AppGCC/__pycache__/urls.cpython-310.pyc
index b8eb334a169d8563ee0f6497d3c2c9125b63777d..b9ebf563d98a5edac5a5b02b647bbbcf24119a29 100644
GIT binary patch
delta 20
acmaFI@{WZ&pO=@50SJEN-P*{V%me^FO9kWr

delta 20
acmaFI@{WZ&pO=@50SIQaUfjr?%me^D2nCV=

diff --git a/AppGCC/AppGCC/__pycache__/views.cpython-310.pyc b/AppGCC/AppGCC/__pycache__/views.cpython-310.pyc
index 72c9bc106856317ceadcdba22292abbef13ca646..00213f907ea4bb9bd476703de0a488f94984ac09 100644
GIT binary patch
literal 10054
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

literal 3671
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
EA0jCb!T<mO

diff --git a/AppGCC/AppGCC/templates/challenges.html b/AppGCC/AppGCC/templates/challenges.html
index 36f92b5..d34640f 100644
--- a/AppGCC/AppGCC/templates/challenges.html
+++ b/AppGCC/AppGCC/templates/challenges.html
@@ -6,25 +6,38 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>Mes Défis</title>
     <script src="https://cdn.tailwindcss.com"></script>
+    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" rel="stylesheet">
+
 </head>
 <body class="bg-[#dfdbec] flex flex-col items-center justify-between min-h-screen p-6">
-    
+
     <!-- Main Container -->
     <div class="bg-white p-8 rounded-2xl shadow-2xl w-full max-w-3xl">
         
         <!-- User Profile Section -->
         <div class="flex items-center justify-between mb-6">
+            <!-- Partie gauche : Profil utilisateur -->
             <div class="flex items-center">
-                <img src="{% static 'img/default-avatar.png' %}" alt="Avatar" class="h-16 w-16 rounded-full shadow-lg border-2 border-[#102564] cursor-pointer" onclick="toggleProfilePopup()">
+                <!-- Avatar dynamique basé sur le nom d'utilisateur -->
+                <img src="https://ui-avatars.com/api/?name={{ user.username }}&background=102564&color=fff&size=128" 
+                     alt="Avatar" class="h-16 w-16 rounded-full shadow-lg border-2 border-[#102564] cursor-pointer" onclick="toggleProfilePopup()">
                 <div class="ml-4">
                     <p class="text-2xl font-semibold text-[#102564]">{{ user.username }}</p>
                     <p class="text-sm text-gray-500">Bienvenue, {{ user.username }}</p>
                 </div>
             </div>
+        
+            <!-- Logo centré -->
+            <div class="flex justify-center flex-1">
+                <img src="{% static 'img/chadfit1024.png' %}" alt="Logo" class="h-20 w-auto shadow-lg rounded-lg">
+            </div>
+        
+            <!-- Bouton déconnexion -->
             <div class="flex space-x-4">
-                <a href="{% url 'logout' %}" class="bg-[#102564] text-white py-2 px-4 rounded-lg shadow-md hover:bg-[#000000] transition duration-300">Se déconnecter</a>
+                <a href="{% url 'logout' %}" class="bg-[#102564] text-white py-2 px-4 rounded-lg shadow-md hover:bg-[#000000] transition duration-300"><i class="fas fa-sign-out-alt"></i><span>  Se déconnecter</span></a>
             </div>
         </div>
+        
 
         <!-- Title -->
         <h2 class="text-3xl font-bold text-[#102564] text-center mb-6">Mes Challenges du Jour</h2>
@@ -39,7 +52,7 @@
                     <span class="text-sm text-gray-500">Lieu: {{ challenge.lieu }}</span>
                     <span class="text-sm text-gray-500">Points: {{ challenge.points }}</span>
                 </div>
-                <button onclick="completeChallenge('{{ challenge.id }}')" class="py-2 px-4 bg-[#102564] text-white font-semibold rounded-lg shadow-md hover:bg-[#000000] transition duration-300">Valider</button>
+                <button id="validate-btn-{{ challenge.id }}" onclick="completeChallenge('{{ challenge.id }}')" class="py-2 px-4 bg-[#102564] text-white font-semibold rounded-lg shadow-md hover:bg-[#000000] transition duration-300">Valider</button>
             </li>
             {% endfor %}
         </ul>
@@ -47,9 +60,20 @@
     
     <!-- Navigation Bar -->
     <div class="fixed bottom-0 w-full bg-[#102564] text-white flex justify-around py-3 shadow-md">
-        <a href="{% url 'challenges' %}" class="text-lg font-semibold hover:text-gray-300">Accueil</a>
-        <a href="{% url 'ranking' %}" class="text-lg font-semibold hover:text-gray-300">Classement</a>
+        <a href="{% url 'challenges' %}" class="text-lg font-semibold hover:text-gray-300 flex items-center space-x-2">
+            <!-- Icône Maison (Accueil) -->
+            <i class="fas fa-home text-white text-2xl"></i>
+            <span>Accueil</span>
+        </a>
+        <a href="{% url 'ranking' %}" class="text-lg font-semibold hover:text-gray-300 flex items-center space-x-2">
+            <!-- Icône Coupe (Classement) -->
+            <i class="fas fa-trophy text-[#cd7f32] text-2xl"></i>
+            <span>Classement</span>
+        </a>
     </div>
+
+
+
     
     <!-- Profile Popup -->
     <div id="profilePopup" class="hidden fixed inset-0 bg-black bg-opacity-50 flex justify-center items-center">
@@ -80,6 +104,37 @@
             document.getElementById("profilePopup").classList.toggle("hidden");
         }
 
+        function getCookie(name) {
+            let value = "; " + document.cookie;
+            let parts = value.split("; " + name + "=");
+            if (parts.length === 2) return parts.pop().split(";").shift();
+        }
+
+        function addValidatedChallenge(challengeId) {
+            let existing = getCookie("validatedChallenges");
+            let validatedList = existing ? existing.split(",") : [];
+            if (!validatedList.includes(challengeId)) {
+                validatedList.push(challengeId);
+                document.cookie = "validatedChallenges=" + validatedList.join(",") + "; path=/; max-age=" + (7*24*60*60);
+            }
+        }
+
+        function checkValidatedButtons() {
+            let existing = getCookie("validatedChallenges");
+            if (existing) {
+                let validatedList = existing.split(",");
+                validatedList.forEach(id => {
+                    let button = document.getElementById(`validate-btn-${id}`);
+                    if (button) {
+                        button.innerText = "Déjà validé ✅";
+                        button.disabled = true;
+                        button.classList.remove("hover:bg-[#000000]");
+                        button.classList.add("bg-green-500", "cursor-not-allowed");
+                    }
+                });
+            }
+        }
+
         function completeChallenge(challengeId) {
             fetch("/complete_challenge/", {
                 method: "POST",
@@ -92,6 +147,14 @@
             .then(response => response.json())
             .then(data => {
                 if (data.status == "success") {
+                    const button = document.getElementById(`validate-btn-${challengeId}`);
+                    if (button) {
+                        button.innerText = "Déjà validé ✅";
+                        button.disabled = true;
+                        button.classList.remove("hover:bg-[#000000]");
+                        button.classList.add("bg-green-500", "cursor-not-allowed");
+                    }
+                    addValidatedChallenge(challengeId);
                     document.getElementById("confirmationText").innerText = data.message + " (" + data.points + " points)";
                     document.getElementById("confirmationMessage").classList.remove("hidden");
                 } else {
@@ -102,7 +165,6 @@
 
         function closeConfirmationMessage() {
             document.getElementById("confirmationMessage").classList.add("hidden");
-            location.reload();
         }
 
         function saveProfileSettings() {
@@ -125,6 +187,8 @@
                 }
             });
         }
+
+        window.onload = checkValidatedButtons;
     </script>
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/AppGCC/AppGCC/templates/login.html b/AppGCC/AppGCC/templates/login.html
index af596fe..f4018da 100644
--- a/AppGCC/AppGCC/templates/login.html
+++ b/AppGCC/AppGCC/templates/login.html
@@ -26,6 +26,9 @@
                 <label for="username" class="block text-sm font-medium text-[#000000]">Nom d'utilisateur:</label>
                 <input type="text" name="username" id="username" required
                        class="w-full p-3 mt-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#102564] focus:border-[#102564]">
+                <label for="team" class="block text-sm font-medium text-[#000000]">Nom d'équipe:</label>
+                <input type="text" name="team" id="team"
+                       class="w-full p-3 mt-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-2 focus:ring-[#102564] focus:border-[#102564]">
             </div>
 
             <!-- Submit Button -->
diff --git a/AppGCC/AppGCC/templates/ranking.html b/AppGCC/AppGCC/templates/ranking.html
index 0ac4e67..9ad5a07 100644
--- a/AppGCC/AppGCC/templates/ranking.html
+++ b/AppGCC/AppGCC/templates/ranking.html
@@ -6,45 +6,95 @@
     <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css" rel="stylesheet">
 </head>
 <body class="bg-[#dfdbec] flex items-center justify-center min-h-screen p-6">
-    <div class="bg-white p-8 rounded-2xl shadow-2xl w-full max-w-3xl">
-        <h2 class="text-3xl font-bold text-[#102564] text-center mb-6">Classement</h2>
-        <ul class="space-y-4">
-            {% for user in ranking %}
-            <li class="flex items-center justify-between p-4 
+    <div class="grid grid-cols-1 lg:grid-cols-2 gap-8 w-full max-w-6xl">
+        <!-- Bloc Utilisateur -->
+        <div class="bg-white p-8 rounded-2xl shadow-2xl">
+            <h2 class="text-xl sm:text-2xl md:text-3xl font-bold text-[#102564] text-center mb-6">Classement Utilisateurs</h2>
+            <ul class="space-y-4">
+                {% for user in ranking %}
+                <li class="flex items-center justify-between p-4 
+                            {% if forloop.counter == 1 %}
+                                bg-gradient-to-r from-yellow-500 to-yellow-400 text-white text-base sm:text-lg md:text-xl lg:text-2xl
+                            {% elif forloop.counter == 2 %}
+                                bg-gradient-to-r from-gray-400 to-gray-300 text-white text-base sm:text-lg md:text-xl lg:text-2xl
+                            {% elif forloop.counter == 3 %}
+                                bg-gradient-to-r from-[#cd7f32] to-[#b56d4e] text-white text-base sm:text-lg md:text-xl lg:text-2xl
+                            {% else %}
+                                bg-gray-100 text-[#102564] text-base sm:text-lg md:text-xl lg:text-2xl
+                            {% endif %}
+                            rounded-lg shadow-lg hover:shadow-xl transition duration-300">
+                    
+                    <div class="flex items-center space-x-3">
                         {% if forloop.counter == 1 %}
-                            bg-gradient-to-r from-yellow-500 to-yellow-400 text-white text-2xl
+                            <i class="fas fa-medal text-yellow-300"></i>
                         {% elif forloop.counter == 2 %}
-                            bg-gradient-to-r from-gray-400 to-gray-300 text-white text-xl
+                            <i class="fas fa-medal text-gray-200"></i>
                         {% elif forloop.counter == 3 %}
-                            bg-gradient-to-r from-[#cd7f32] to-[#b56d4e] text-white text-xl
-                        {% else %}
-                            bg-gray-100 text-[#102564] text-lg
+                            <i class="fas fa-medal text-[#d49e6a]"></i>
                         {% endif %}
-                        rounded-lg shadow-lg hover:shadow-xl transition duration-300">
-                
-                <div class="flex items-center space-x-3">
-                    {% if forloop.counter == 1 %}
-                        <i class="fas fa-medal text-yellow-300"></i>
-                    {% elif forloop.counter == 2 %}
-                        <i class="fas fa-medal text-gray-200"></i>
-                    {% elif forloop.counter == 3 %}
-                        <i class="fas fa-medal text-[#d49e6a]"></i>
-                    {% endif %}
-                    <div class="flex flex-col">
-                        <span class="font-medium">{{ user.username }}</span>
-                        <span class="text-sm text-gray-500">Points: {{ user.score }}</span>
+                        <div class="flex flex-col">
+                            <span class="font-medium">{{ user.username }} ({{ user.user_team }})</span>
+                            <span class="text-sm text-gray-500">Points: {{ user.score }}</span>
+                        </div>
                     </div>
-                </div>
-                <span class="font-medium">{{ forloop.counter }}</span>
-            </li>
-            {% endfor %}
-        </ul>
+                    <span class="font-medium">{{ forloop.counter }}</span>
+                </li>
+                {% endfor %}
+            </ul>
+        </div>
+
+        <!-- Bloc Équipe -->
+        <div class="bg-white p-8 rounded-2xl shadow-2xl">
+            <h2 class="text-xl sm:text-2xl md:text-3xl font-bold text-[#102564] text-center mb-6">Classement Équipes</h2>
+            <ul class="space-y-4">
+                {% for team in team_ranking %}
+                <li class="flex items-center justify-between p-4 
+                            {% if forloop.counter == 1 %}
+                                bg-gradient-to-r from-green-500 to-green-400 text-white text-base sm:text-lg md:text-xl lg:text-2xl
+                            {% elif forloop.counter == 2 %}
+                                bg-gradient-to-r from-blue-400 to-blue-300 text-white text-base sm:text-lg md:text-xl lg:text-2xl
+                            {% elif forloop.counter == 3 %}
+                                bg-gradient-to-r from-purple-400 to-purple-300 text-white text-base sm:text-lg md:text-xl lg:text-2xl
+                            {% else %}
+                                bg-gray-100 text-[#102564] text-base sm:text-lg md:text-xl lg:text-2xl
+                            {% endif %}
+                            rounded-lg shadow-lg hover:shadow-xl transition duration-300">
+                    
+                    <div class="flex items-center space-x-3">
+                        {% if forloop.counter == 1 %}
+                            <i class="fas fa-trophy text-yellow-300"></i>
+                        {% elif forloop.counter == 2 %}
+                            <i class="fas fa-trophy text-gray-300"></i>
+                        {% elif forloop.counter == 3 %}
+                            <i class="fas fa-trophy text-[#cd7f32]"></i>
+                        {% endif %}
+                        <div class="flex flex-col">
+                            <span class="font-medium">{{ team.team }}</span>
+                            <span class="text-sm text-gray-500">Points: {{ team.score }}</span>
+                        </div>
+                    </div>
+                    <span class="font-medium">{{ forloop.counter }}</span>
+                </li>
+                {% endfor %}
+            </ul>
+        </div>
     </div>
 
     <!-- Navigation Bar -->
     <div class="fixed bottom-0 w-full bg-[#102564] text-white flex justify-around py-3 shadow-md">
-        <a href="{% url 'challenges' %}" class="text-lg font-semibold hover:text-gray-300">Accueil</a>
-        <a href="{% url 'ranking' %}" class="text-lg font-semibold hover:text-gray-300">Classement</a>
+        <a href="{% url 'challenges' %}" class="text-lg font-semibold hover:text-gray-300 flex items-center space-x-2">
+            <!-- Icône Maison (Accueil) -->
+            <i class="fas fa-home text-white text-2xl"></i>
+            <span>Accueil</span>
+        </a>
+        <a href="{% url 'ranking' %}" class="text-lg font-semibold hover:text-gray-300 flex items-center space-x-2">
+            <!-- Icône Coupe (Classement) -->
+            <i class="fas fa-trophy text-[#cd7f32] text-2xl"></i>
+            <span>Classement</span>
+        </a>
     </div>
+
+
+
 </body>
-</html>
\ No newline at end of file
+</html>
diff --git a/AppGCC/AppGCC/views.py b/AppGCC/AppGCC/views.py
index 9b5a50e..6f6fe4a 100644
--- a/AppGCC/AppGCC/views.py
+++ b/AppGCC/AppGCC/views.py
@@ -36,9 +36,10 @@ def login_view(request):
     # se log ou bien créer un compte si l'utilisateur n'existe pas sans mot de passe 
     if request.method == "POST":
         username = request.POST.get("username")
+        team = request.POST.get("team")
         user = User.objects.filter(username=username).first()
         if user is None:
-            user = User.objects.create_user(username=username, password=None)
+            user = User.objects.create_user(username=username, password=None, last_name=team)
             user.save()
             add_user_to_csv(username, user.id)
         login(request, user)
@@ -74,20 +75,43 @@ def ranking_view(request):
     
     # Lire les utilisateurs depuis la base de données Django
     users = read_users()
+
+    # Lire les équipes depuis la base de données Django
+    teams, user_teams = read_teams()
     
     # Créer le classement en associant le score avec le nom d'utilisateur
     ranking = []
     for user_id, score in scores.items():
         if int(user_id) in users:  # Associer le user_id avec l'utilisateur dans le dictionnaire
-            ranking.append({"username": users[int(user_id)], "score": score})
-    
+            ranking.append({"username": users[int(user_id)], "score": score, "user_team": user_teams[int(user_id)] if user_teams[int(user_id)] else "No Team"})
+
+    # Construire un dictionnaire pour les scores d'équipe
+    team_scores = {}
+
+    for entry in ranking:
+        team = entry["user_team"]
+        if team not in team_scores:
+            team_scores[team] = 0
+        team_scores[team] += entry["score"]
+
+    # Convertir en liste pour le template
+    team_ranking = []
+    for team, score in team_scores.items():
+        team_ranking.append({
+            "team": team,
+            "score": score
+        })
+
+    team_ranking = [team for team in team_ranking if team["team"] != "No Team"]
+
     # Trier le classement par score (du plus élevé au plus bas)
     ranking.sort(key=lambda x: x['score'], reverse=True)
-    
+    team_ranking.sort(key=lambda x: x["score"], reverse=True) 
+       
     print(f"Classement: {ranking}")  # Debug : Afficher le classement
     
     # Passer le classement à la vue pour l'afficher
-    return render(request, "ranking.html", {"ranking": ranking})
+    return render(request, "ranking.html", {"ranking": ranking, "team_ranking": team_ranking})
 
 def read_users():
     """Lire les utilisateurs depuis django"""
@@ -98,6 +122,15 @@ def read_users():
     print(f"Utilisateurs: {users}")
     return users
 
+def read_teams():
+    """Lire les équipes depuis django"""
+    teams = {}
+    for user in User.objects.all():
+        teams[user.id] = user.last_name
+
+    print(f"Équipes: {teams}")
+    return list(set(teams)), teams
+
 #####################
 # Page de Challenge #
 #####################
diff --git a/AppGCC/daily_challenges.csv b/AppGCC/daily_challenges.csv
deleted file mode 100644
index 438c70b..0000000
--- a/AppGCC/daily_challenges.csv
+++ /dev/null
@@ -1,11 +0,0 @@
-2025-03-12,2,6,13,2
-2025-03-12,,27,25,20
-2025-03-12,,27,18,23
-2025-03-12,,16,22,26
-2025-03-12,,21,18,30
-2025-03-12,,17,30,25
-2025-03-12,,28,23,18
-2025-03-12,,20,27,21
-2025-03-12,17,18,21,30
-2025-03-12,18,16,22,30
-2025-03-12,19,28,18,22
diff --git a/AppGCC/db.sqlite3 b/AppGCC/db.sqlite3
index 5c56fd9b9bc7474e650944e45a79315ad2337988..8e87ad356b6a81275014b8ba125eeba2d297a6d2 100644
GIT binary patch
delta 3548
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

delta 1736
zcmb_cOKcle6!p|e{7K{2HjRR4C7NW@D6%{M--?Ojj2%1iC-%e%NWmV@#LkRoJmVQp
z#w?t;>WWQ^k-|qvELc`;L!gKS5)upcbX8Rdx@Lu_!~&_saSBRHr2^vVJ?Xu7XYRT8
zoTIn9>)+k=U%vp&-MAPXp7TUn?;KQwD<k8R!(I&9pQ=LRhxe{T;8BmqGamTZ1HJ-{
zp8u_jBf+b|{`p`}4|J^Y)1FPvKQlJw4{&2sczkiaQe;+E@=|Rz$~Yul#aea4SwM<t
zQ7j}}VyPk#Q3QoiA`D|;1igf!EJCt48No4{!D-7fCDS^Z){8&FD1^|?4Nxb?I>)fm
z25&dlOpb8Um?=}0c7A<Z$jG)}3N5BAuW{+NBB$-fvl(HWMc@d-;0R5+N8^QInm{mg
z@BG;TqWHAWZB>geCdERhp4lN>A}<lVAsdAzWh^PSu#uuTHNBih_1tqQF%}~tB#OcW
zq1PnGb}ijDUCT8k%e5`n>hJpV=<0YK9jxc;I!=P%42B%Ost7};_*1=~w8=9lGGLO5
z&@e_YaK4w(&xa6{#jps2qa=pMpk79M<qec2Xci+Q1kE5Y8B<#&?L?XV9}t9vkqC@p
zB#8u%#1B3602%xSJ^??2uR#u&;5#q}J^){U>!IJlo8TV!G4v3`LcbjB9fp>GcLq8k
z<9NV32@Uu?cf~70|Dx}+y}8ae6QkY>P`+9#m+Z<Zzjrb)DEPBo=*&cr_xOB|Jg0Ar
zs-XvCcLUSGr0>ze-uJ%q-7Xm%UcUM^2P;x{?r1A<y&rB}I=uM)2-N9L`};SmoJPrR
z-DxULt?k%5GTv4hNv%pu1+ko_XjLQ9(vGkli=~|!m(59=QMAf!E!PFnZi&nD{5o&s
zjFK8J3sSsd!Mb2?Vy#x$HR_d;x<lntait<Gt`&<UR!r6!RJKA#(@2=?<Qk=Blio04
zGi=OPFt@aZYzoe%Ll|UBD04drYHKT&O6=5mWh;#<deWiS9iqOzRI9-<y0zhGN-n`?
z%%+%1aq(=c80I);KAomn#A>GGEXz3UsKnC-mszms9Nf~Id?8#+7PRmh(#*|KZFr?w
zs7VQ;Y{veS9wjgJr9XBC2_q;?^pzhvOn#_%FL$R$285|-71rF^c6*z#;f5n=cBS5K
zFa%+XEzOYR-g_T?-dV<U){&@Hdod}fd^sOarJ^fZcp+P^HJswMV)L#MU(K#%+Dm1<
zq@2XZSQKM%Izo^%Mo``9;Q^{*Q7SH@WetaQ6w#$Jp^&uN5*=cz(V$G@S(!Tjn@;~t
zrp`arNl36Os+h{U*^JFg^`wzqQQJyvd9_IC<OZLZH;iIARZv7xN^0Cmn$SK+EKElb
zhM_4c2)^|ALiar&4jzOa1797?fOkXp5B9zd_3q!AoqCze{k@snvr{i4dAL`<ZBD(+
z03+Qycke($ub=aQfCqdEuJxad%itm4LEvET*U<jW$53#8{0a2h1Q!0g;r#pj6KM9Y
T(8(r;_pd#H<fox$Z8Gu)sxTAb

diff --git a/AppGCC/difficulties.csv b/AppGCC/difficulties.csv
deleted file mode 100644
index 832a26c..0000000
--- a/AppGCC/difficulties.csv
+++ /dev/null
@@ -1,2 +0,0 @@
-2,difficile
-17,difficile
diff --git a/AppGCC/scores.csv b/AppGCC/scores.csv
deleted file mode 100644
index d3033a6..0000000
--- a/AppGCC/scores.csv
+++ /dev/null
@@ -1,5 +0,0 @@
-user_id,score
-2,49
-17,10
-18,26
-19,36
diff --git a/AppGCC/static/js/serviceworker.js b/AppGCC/static/js/serviceworker.js
new file mode 100644
index 0000000..e69de29
diff --git a/AppGCC/users.csv b/AppGCC/users.csv
deleted file mode 100644
index 14e763d..0000000
--- a/AppGCC/users.csv
+++ /dev/null
@@ -1,7 +0,0 @@
-12,Bonjour
-13,qqqqq
-14,dffsd
-15,uuuuuuuu
-17,oiewuytourytyretyutyttyrtyruryturyturtyruty
-18,yyyyy
-19,ttrertertet
diff --git a/AppGCC/challenges.csv b/challenges.csv
similarity index 51%
rename from AppGCC/challenges.csv
rename to challenges.csv
index 20f8108..6eda847 100644
--- a/AppGCC/challenges.csv
+++ b/challenges.csv
@@ -1,45 +1,45 @@
 1,Étirements des bras et épaules (2 min),Facile,Au bureau (poste),5,arrows-move
 2,Se tenir droit et contracter les abdos (5 min),Facile,Au bureau (poste),5,user
-3,S'asseoir et se lever de sa chaise (10 fois),Facile,Au bureau (poste),6,arrow-up-circle
+3,S'asseoir et se lever de sa chaise (10 fois),Facile,Au bureau (poste),5,arrow-up-circle
 4,Tenir 30 sec en équilibre sur un pied,Facile,Au bureau (poste),5,accessibility
 5,Rotations poignets et épaules (1 min),Facile,Au bureau (poste),5,refresh
-6,Prendre les escaliers toute la journée,Facile,Au bureau (espaces communs),8,stairs
+6,Prendre les escaliers toute la journée,Facile,Au bureau (espaces communs),10,stairs
 7,Marcher 5000 pas dans la journée,Facile,Au bureau (espaces communs),10,footprints
-8,Marcher 5 min après chaque réunion,Facile,Au bureau (espaces communs),8,clock
-9,Flexions des genoux (10 fois),Facile,Au bureau (espaces communs),6,arrow-down-circle
-10,Respiration profonde (5 fois),Facile,Au bureau (espaces communs),5,wind
-11,Marche rapide (10 min) pause déjeuner,Facile,Extérieur,10,walk
-12,Descendre un arrêt plus tôt,Facile,Extérieur,10,bus
-13,Aller voir un collègue au lieu d’un e-mail,Facile,Extérieur,5,mail-opened
-14,Balade autour du bureau,Facile,Extérieur,9,trees
-15,20 montées de marches en extérieur,Facile,Extérieur,10,stairs
-16,10 squats sans quitter son bureau,Moyen,Au bureau (poste),10,run
-17,Gainage sur chaise (30 sec),Moyen,Au bureau (poste),10,grip-horizontal
-18,20 extensions de mollets,Moyen,Au bureau (poste),10,walk
-19,30 contractions abdos assis,Moyen,Au bureau (poste),10,user
-20,Alterner assis/debout toutes les 30 min (2h),Moyen,Au bureau (poste),12,clock
-21,Escaliers 3 jours d’affilée,Moyen,Au bureau (espaces communs),15,stairs
-22,Se lever et marcher 5 min toutes les heures,Moyen,Au bureau (espaces communs),12,clock
-23,10 montées de marches,Moyen,Au bureau (espaces communs),12,stairs
-24,15 squats en salle de repos,Moyen,Au bureau (espaces communs),12,dumbbell
+8,Marcher 5 min après chaque réunion,Facile,Au bureau (espaces communs),10,clock
+9,Flexions des genoux (10 fois),Facile,Au bureau (espaces communs),10,arrow-down-circle
+10,Respiration profonde (5 fois),Facile,Au bureau (espaces communs),10,wind
+11,Marche rapide (10 min) pause déjeuner,Facile,Extérieur,15,walk
+12,Descendre un arrêt plus tôt,Facile,Extérieur,15,bus
+13,Aller voir un collègue au lieu d’un e-mail,Facile,Extérieur,15,mail-opened
+14,Balade autour du bureau,Facile,Extérieur,15,trees
+15,20 montées de marches en extérieur,Facile,Extérieur,15,stairs
+16,10 squats sans quitter son bureau,Moyen,Au bureau (poste),5,run
+17,Gainage sur chaise (30 sec),Moyen,Au bureau (poste),5,grip-horizontal
+18,20 extensions de mollets,Moyen,Au bureau (poste),5,walk
+19,30 contractions abdos assis,Moyen,Au bureau (poste),5,user
+20,Alterner assis/debout toutes les 30 min (2h),Moyen,Au bureau (poste),5,clock
+21,Escaliers 3 jours d’affilée,Moyen,Au bureau (espaces communs),10,stairs
+22,Se lever et marcher 5 min toutes les heures,Moyen,Au bureau (espaces communs),10,clock
+23,10 montées de marches,Moyen,Au bureau (espaces communs),10,stairs
+24,15 squats en salle de repos,Moyen,Au bureau (espaces communs),10,dumbbell
 25,10 rotations de chevilles assis,Moyen,Au bureau (espaces communs),10,refresh
-26,Marche rapide (15 min),Moyen,Extérieur,12,walk
-27,10 flexions jambes en attendant métro,Moyen,Extérieur,10,bus
+26,Marche rapide (15 min),Moyen,Extérieur,15,walk
+27,10 flexions jambes en attendant métro,Moyen,Extérieur,15,bus
 28,Aller au travail à pied/vélo (1x/semaine),Moyen,Extérieur,15,bike
 29,7500 pas dans la journée,Moyen,Extérieur,15,footprints
-30,Balade de 20 min en fin de journée,Moyen,Extérieur,14,trees
-31,Gainage contre mur (1 min),Difficile,Au bureau (poste),15,grip-horizontal
-32,20 squats en plusieurs fois,Difficile,Au bureau (poste),15,run
-33,50 extensions de mollets,Difficile,Au bureau (poste),15,walk
-34,Planche sur chaise (2 min),Difficile,Au bureau (poste),18,grip-horizontal
-35,50 contractions abdos assis,Difficile,Au bureau (poste),15,user
-36,Escaliers uniquement (5 jours consécutifs),Difficile,Au bureau (espaces communs),20,stairs
-37,Marche 10 min après déjeuner (3 jours),Difficile,Au bureau (espaces communs),20,walk
-38,Défi collectif avec 3 collègues,Difficile,Au bureau (espaces communs),15,users
-39,Se lever et marcher toutes les 30 min,Difficile,Au bureau (espaces communs),18,clock
-40,3 min de montées de genoux salle de repos,Difficile,Au bureau (espaces communs),18,run
-41,10000 pas dans la journée,Difficile,Extérieur,20,footprints
-42,Balade de 30 min après le travail,Difficile,Extérieur,20,trees
-43,Aller au travail à vélo (3x/semaine),Difficile,Extérieur,25,bike
-44,Marcher/courir 5 km en dehors du bureau,Difficile,Extérieur,25,footprints
-45,Séance collective sportive extérieure,Difficile,Extérieur,22,users
+30,Balade de 20 min en fin de journée,Moyen,Extérieur,15,trees
+31,Gainage contre mur (1 min),Difficile,Au bureau (poste),5,grip-horizontal
+32,20 squats en plusieurs fois,Difficile,Au bureau (poste),5,run
+33,50 extensions de mollets,Difficile,Au bureau (poste),5,walk
+34,Planche sur chaise (2 min),Difficile,Au bureau (poste),5,grip-horizontal
+35,50 contractions abdos assis,Difficile,Au bureau (poste),5,user
+36,Escaliers uniquement (5 jours consécutifs),Difficile,Au bureau (espaces communs),10,stairs
+37,Marche 10 min après déjeuner (3 jours),Difficile,Au bureau (espaces communs),10,walk
+38,Défi collectif avec 3 collègues,Difficile,Au bureau (espaces communs),10,users
+39,Se lever et marcher toutes les 30 min,Difficile,Au bureau (espaces communs),10,clock
+40,3 min de montées de genoux salle de repos,Difficile,Au bureau (espaces communs),10,run
+41,10000 pas dans la journée,Difficile,Extérieur,15,footprints
+42,Balade de 30 min après le travail,Difficile,Extérieur,15,trees
+43,Aller au travail à vélo (3x/semaine),Difficile,Extérieur,15,bike
+44,Marcher/courir 5 km en dehors du bureau,Difficile,Extérieur,15,footprints
+45,Séance collective sportive extérieure,Difficile,Extérieur,15,users
diff --git a/daily_challenges.csv b/daily_challenges.csv
new file mode 100644
index 0000000..6083f52
--- /dev/null
+++ b/daily_challenges.csv
@@ -0,0 +1,25 @@
+2025-03-12,2,6,13,2
+2025-03-12,,27,25,20
+2025-03-12,,27,18,23
+2025-03-12,,16,22,26
+2025-03-12,,21,18,30
+2025-03-12,,17,30,25
+2025-03-12,,28,23,18
+2025-03-12,,20,27,21
+2025-03-12,17,18,21,30
+2025-03-12,18,16,22,30
+2025-03-12,19,28,18,22
+2025-03-19,20,17,29,21
+2025-03-19,1,30,18,23
+2025-03-19,21,17,25,29
+2025-03-19,22,17,26,25
+2025-03-19,23,27,22,20
+2025-03-19,24,28,18,24
+2025-03-19,,20,29,21
+2025-03-19,25,22,30,16
+2025-03-19,26,16,29,25
+2025-03-19,27,26,17,22
+2025-03-19,28,18,21,26
+2025-03-19,29,17,27,22
+2025-03-19,30,19,24,30
+2025-03-19,31,19,22,30
diff --git a/difficulties.csv b/difficulties.csv
index 0e91f7e..76c2fae 100644
--- a/difficulties.csv
+++ b/difficulties.csv
@@ -1 +1,3 @@
-Elvan,moyen
+2,difficile
+17,difficile
+22,difficile
diff --git a/postgresData/pg_stat_tmp/db_0.stat b/postgresData/pg_stat_tmp/db_0.stat
index 46bd13463f21acf06423c7d37cb7fd980e826f07..eee48f39b45f8b7cd7c15853e23d70404823034c 100644
GIT binary patch
delta 161
zcmca8a8Y1GKBJJ_0tPUUh0~K88Qr+FPC$f3PE5YY=+C8~0pZ#%n0$s=Z}Kf>fyo(6
z0$k1?Ai@qGfU4Z3^0^>fW~gc=I1M(FH2@<0)gPpKa}{$fGn3AO$&Jim+z}3pU^!n0
O#>t9|Zj%?VZv+5_mLWI*

delta 159
zcmca8a8Y1GKBLfXW(F|W1*a!BGP-fCV}S_IVwrrA(VvTz5yHLBJoyZ>-sD@%0+TbC
z1i03+LWEbb0#&(7=5s-~uOSq}D;Pbwk=dQ=D%6bQj3C9EtC(w<nNBbRrNX!-utQX~
Mv4f;0FJRvY05||5W&i*H

diff --git a/postgresData/pg_stat_tmp/db_13468.stat b/postgresData/pg_stat_tmp/db_13468.stat
index e7871ecd712c191a1afd83e901d6cb5ec5f079ec..ba1ca88fbc30a42b264e051d404580c5626f027d 100644
GIT binary patch
delta 444
zcmaE;_E1fJ?w+NLA@N)cVBo9)p|@1P=!pm2xF$k*1r?JoGP-Zvmc=M^dnH6cjUFSI
zQKL6`BZnK;^=b&Ws~W@=3bBBiD+W=`AU5%!KUXBw5<d-)aZ+heH4>o^MF<*XxAi56
zsMIBpVj)eaVs5Az+!_-P`f<T{3}6!{-(lh4^o82!3$pQoHiWlC8)V4jUe=wQFc*R4
zXG2ZP2kYPbp3RYsd+q{=o>s2i6A$`wFRJ7K^TjJUCMz<!N!6o;7%b$Rfev!x@(X}y
zwg>=wu^g&c1L_V04N`0z3{fl_3{t$=nm>z?s}dr_V8aCR-~3GwZuUm73O_+%CIIzY
BR3iWY

delta 437
zcmaE;_E1fJ?w+NLA@N)cV4%tfp<|d~^u&X1TsBai9P{LhjP4t^Wibj(=Yc3VEd`@N
z3QeHAcak85f)-FyMIdSzL?#~e=d^@cp+9*ehr4u08dOaY8$=O;1{rvb7b3cY7i^#=
zRPiUMfuBGI!Z<G`9(134n}w6p4Jzvfl;uibf$%I?KqgG?W!=dMa}G$JvlQwaUyyS)
zzhiS^<JN;}S(nH%@t`l)N=t|d+Lj;_B<s<F3KnFlAOpC>nIMXpnLvuA%AtynLqiZj
qgM7CWYSB`#+csPCXEAc+K^@P*H1VJxS3lIP<-#E2Hv0(*GXVhDh)nPR

diff --git a/postgresData/pg_stat_tmp/global.stat b/postgresData/pg_stat_tmp/global.stat
index 4e78e3f72da20353df105fa6e4f9997d81a23859..e827284e92ea808de8721185029d7096e3624b88 100644
GIT binary patch
literal 1151
zcmbQcXDQ>d&HLClTxMeU&&~h_Oc08J4UJ}o@(EE9P=#+kne-_D%^he!sXIpXQx=ct
z;m1f~f<V_#qIL$DewR5W3=C!lrVL^Ms79n(^MVB;Eg-a0>s~Pbm_Po+%fA+qaZpX8
yK5tT?IXEN1GO7#Mio85AbgS-oK(gL!D4mu832WsO5S65cJi7Um^0%OQ#1#OG6h;mJ

literal 1151
zcmbQcXDQ=pnM6^Q%S;S93=qHsrCHHvW+<N!#RpaR=95XE0?^!n29&yER6k|$h#r27
zBqj)S{UmB<fa!OcW5U2-W?;(j1kDBY9S|e8w?gO#eJo(c3{Cu2Efj-f9Q>*%mz`8-
s4$erhjOqe5GA~aI-RMig5Rqw6x|IXMUjgwC1De0lwbPux1<fO_0Dx&gFaQ7m

diff --git a/scores.csv b/scores.csv
index dd85714..85e5f13 100644
--- a/scores.csv
+++ b/scores.csv
@@ -1,4 +1,18 @@
-username,score
-Thibaud,100
-Elvan,800
-buval,100
+user_id,score
+2,49
+17,10
+18,26
+19,36
+20,75
+21,60
+1,50
+22,135
+23,96
+24,22
+25,12
+26,5
+27,20
+28,15
+29,15
+30,30
+31,30
diff --git a/users.csv b/users.csv
new file mode 100644
index 0000000..e53e4f7
--- /dev/null
+++ b/users.csv
@@ -0,0 +1,11 @@
+21,Anto
+22,Elvan
+23,Thibaud
+24,toutdanslebaltrou
+25,anto
+26,elvan
+27,Pierre
+28,Etienne
+29,Mathilda
+30,Bernard
+31,Martine
-- 
GitLab