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