diff --git a/Readme.md b/Readme.md index 4f51619..774eba0 100644 --- a/Readme.md +++ b/Readme.md @@ -25,3 +25,7 @@ Initialiser la base de données et créer un compte admin pour l'interface de ge Lancer le serveur de test : `python manage.py runserver` + +Pour importer une liste de logins pour l'application quiz_atomes : + +`python manage.py import_login` (le fichier login.csv doit être présent dans .quiz_atomes/date/login.csv avec une première ligne nommée login) diff --git a/quiz_atomes/admin.py b/quiz_atomes/admin.py index fe841f3..fb6640a 100644 --- a/quiz_atomes/admin.py +++ b/quiz_atomes/admin.py @@ -1,10 +1,11 @@ from django.contrib import admin # Register your models here. -from .models import Atome, Score +from .models import Atome, Score, User class AtomeAdmin(admin.ModelAdmin): list_display = ('pk','nom', 'symbole') admin.site.register(Atome, AtomeAdmin) admin.site.register(Score) +admin.site.register(User) diff --git a/quiz_atomes/data/login.csv b/quiz_atomes/data/login.csv new file mode 100644 index 0000000..43c0b21 --- /dev/null +++ b/quiz_atomes/data/login.csv @@ -0,0 +1,421 @@ +login +aarir +abeghraa +abidina +agodori +alami +amado_mh +amegatsl +amezians +amirouy +amri--bl +antonina +azzouza +abousefa +achie +achim +adewumia +agbanyoe +agnest +aissanim +ait_bads +akakpom +al_ghouj +ali_mbas +almeidaa +amary +amegatst +amirouo +ammarii +amrani2 +antonini +aqqaoumz +ardesd +ayathura +bahiay +balobaya +bamwangm +bananea +baradjim +barryh +belkhiri +ben_amog +ben_amom +benmehin +bennoitl +berquiel +bestaniy +biain +bilongie +blauwarm +bouabidm +boucharm +boukhriw +bourys +bourye +bouyahic +babylonm +badiabin +baghrard +bahadouj +bailhacl +bakayokr +baniyahh +bathilym +bazilee +beaudran +bektacha +belahdar +belfkihw +belfkihl +belhasns +belhotim +belkaidi +bellarhs +ben_ahma +ben_aqdi +benmehim +ben_nacr +benrohoi +berangak +berangac +berbrim +berdegs +bibongeb +blaquiem +blondi +bonito_t +bonninn +bouabidy +bouazzaa +bougdira +boujerfr +boumedjm +bourhans +bourhanz +boutal +bouyahiz +brahimim +brunetm +brusselo +butonh +byadit +cantavet +cantem +chanteue +charoyk +cheikh_k +costa_ds +camaram +camarad +capards +capela +careanoc +caronm +carvalhj +catalana +chagasm +champenk +champenn +chanteus +cherifh +cidim +cimpana +clossec +cordonnm +correiar +corvon +cossard2 +cossarda +costa_dr +courbe_m +couturac +crepinl +daboh +dadr +delmairm +deroussk +desicy-m +diallo2 +doirin-k +drouartl +dubucl +dabom +da_cunhi +daot +darrajid +da_silv2 +defossel +delaunal +demraoum +depierrl +derrazs +desauffs +de_sousl +dhornen +diabateb +dialloa +dialloi +dialloj +diarrac +diarraw +dobok +dorghale +doumbiaa +doumboum +dramea +drissoue +dumoulii +el_baiza +el_barda +el_bouhs +el_mahbn +elevet +el_baizw +el_ghazh +el_jahoh +esans +estelanl +ez_zahrj +faivrem +fernandt +ferreirb +franceal +francisa +fresacs +farssi2 +farssis +faussoum +ferrandr +ferreirl +ferreirt +ferreirs +firetton +fofanac +fouched +furcyc +garniery +gauliert +guissec +gumiennt +gyalwant +gabi_gal +gerardt +germanyk +gomisj +goncalvn +gracchuc +guisses +hagen--m +halla2 +hammamia +huitelel +habibib +haddadof +hallaa +haniquea +haquea +hassanys +hemontq +herzigm +hibaa +hollieza +ichoungm +illan2 +imadoucs +iordaici +illanw +jaghninz +jean-man +jeremiej +jiliann +kamalm +kerdjouy +khataouc +koffi_gy +kabiwae +kamalb +kamals +kanoutea +karaa +khallada +klein_sl +klein_st +konatem +konen +kouadioj +kouassij +kouassia +labhiris +lamgardm +le_gueda +lonyn +laarejw +labbezc +labhirib +laden_gl +lahmarc +laidouna +lamgardw +langillh +laurat +lebarrom +le_couvr +lefevrek +le_guenj +lepetitc +lepetitm +lerouxt +le_sauss +liberkoj +locillaa +logboe +lopesd +mansourt +marquese +marquetk +martinsr +mendym +merilm +mohamede +mouassia +mounis +musitat +magassat +mahamani +mahnoukz +maisont +mampassy +mangalae +mapolac +marct +marcellv +mariem +martyr +matale_s +mateta-v +mateta_p +mayeye_t +mbembaa +mehrezr +mehrezn +meites +mekerria +mennani2 +mfumuk +mohamedc +mohamedy +mokrania +montagnj +nguemae +nikamier +naouae +nedeya +ngomaj +nguyenm +nguyenn +nika_mif +nobletk +ondo-_nn +oualia +oualissy +oualkaiy +obounouk +oualis +oualissa +oualkais +oukrinew +peyenk +piresc +pruvostc +pachecoj +pagnerrl +payetk +payonm +pazs +peyenl +pezousm +pichona +piresi +piresm +poderk +podere +poirot-l +quimbren +quintelc +robichoj +rabaha +rabehy +rabihiy +radjii +raimbaul +ramdanee +ramdanih +ramdanir +ramothek +regaigui +rekioukl +renardm +renaude +rezkalll +ribeiroi +roselmaj +roselmaw +roussels +ruaulte +sais +said_saa +sanogoa +seggara +selvath2 +sidiber +sissokom +sissoko2 +syg +syb +syllaf +saheln +sahenouh +saint-je +saint_ct +salmit +sassil +sayadam +scheidl +schneidj +selvatha +serym +simoa_dm +sissokop +sissokos +sym +syd +sy-n_dii +szalansc +tacitet +thomas_l +timizara +tourem +tunkaray +tafitasy +taleby +tartier +tehars +termouly +thalesc +theophil +torneror +tourea +tra_biy +valee +valeriuk +valerium +valettea +vanessee +ventadok +verons +visiedol +wauquien +willayj +yaacouba +zhengm diff --git a/quiz_atomes/forms.py b/quiz_atomes/forms.py new file mode 100644 index 0000000..c945156 --- /dev/null +++ b/quiz_atomes/forms.py @@ -0,0 +1,16 @@ +from django import forms +from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ + +from .models import User + +def validate_login(value): + if len(User.objects.filter(login=value)) == 0: + raise ValidationError( + _("Ce login n'existe pas"), + params={'value': value}, + ) + +class UserForm(forms.Form): + login = forms.CharField(label="Login", max_length=10, validators=[validate_login]) + diff = forms.DecimalField(initial=10,label="Nombre d'atomes", min_value=10, max_value=100, decimal_places=0) diff --git a/quiz_atomes/management/commands/import_login.py b/quiz_atomes/management/commands/import_login.py new file mode 100644 index 0000000..c2b3754 --- /dev/null +++ b/quiz_atomes/management/commands/import_login.py @@ -0,0 +1,18 @@ +from django.core.management.base import BaseCommand +from csv import DictReader +from quiz_atomes.models import User + +class Command(BaseCommand): + # Show this when the user types help + help = "Chargement des comptes depuis login.csv" + + def handle(self, *args, **options): + + if User.objects.exists(): + print('Données déjà présentes') + return + + print("Chargement des comptes") + + for row in DictReader(open('./quiz_atomes/data/login.csv')): + User(login=row['login']).save() diff --git a/quiz_atomes/migrations/0002_user.py b/quiz_atomes/migrations/0002_user.py new file mode 100644 index 0000000..80fad34 --- /dev/null +++ b/quiz_atomes/migrations/0002_user.py @@ -0,0 +1,21 @@ +# Generated by Django 4.0.1 on 2022-04-10 15:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('quiz_atomes', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('login', models.CharField(max_length=10)), + ('pwd', models.CharField(max_length=10)), + ], + ), + ] diff --git a/quiz_atomes/migrations/0003_remove_user_pwd.py b/quiz_atomes/migrations/0003_remove_user_pwd.py new file mode 100644 index 0000000..e63ca8a --- /dev/null +++ b/quiz_atomes/migrations/0003_remove_user_pwd.py @@ -0,0 +1,17 @@ +# Generated by Django 4.0.1 on 2022-04-11 20:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('quiz_atomes', '0002_user'), + ] + + operations = [ + migrations.RemoveField( + model_name='user', + name='pwd', + ), + ] diff --git a/quiz_atomes/models.py b/quiz_atomes/models.py index f74edec..73391ac 100644 --- a/quiz_atomes/models.py +++ b/quiz_atomes/models.py @@ -12,3 +12,8 @@ class Score(models.Model): score_date = models.DateTimeField('Date du score') def __str__(self): return self.pseudo+" - "+str(self.score)+" - "+self.score_date.strftime("%Y-%m-%d %H:%M") + +class User(models.Model): + login = models.CharField(max_length=10) + def __str__(self): + return self.login diff --git a/quiz_atomes/templates/quiz_atomes/login.html b/quiz_atomes/templates/quiz_atomes/login.html new file mode 100644 index 0000000..5276aba --- /dev/null +++ b/quiz_atomes/templates/quiz_atomes/login.html @@ -0,0 +1,20 @@ +{% extends 'basic_template.html' %}{% block 'body' %} + +
+

Nouvelle partie

+

Pour accéder au quiz, utilise le login utilisé pour accéder aux ordinateurs du collège. +
Choisis ensuite un nombre d'atomes et à toi de jouer !

+
{% csrf_token %} + + {{ form.as_table }} + + + +
+
+
{% endblock %} diff --git a/quiz_atomes/templates/quiz_atomes/quiz_atomes.html b/quiz_atomes/templates/quiz_atomes/quiz_atomes.html index a66953c..a1ef8b1 100644 --- a/quiz_atomes/templates/quiz_atomes/quiz_atomes.html +++ b/quiz_atomes/templates/quiz_atomes/quiz_atomes.html @@ -3,15 +3,15 @@ {% endblock %}{% block 'body' %}
diff --git a/quiz_atomes/urls.py b/quiz_atomes/urls.py index d82fcf0..96849b0 100644 --- a/quiz_atomes/urls.py +++ b/quiz_atomes/urls.py @@ -5,6 +5,7 @@ from . import views urlpatterns = [ path('', views.home, name='home'), path('quiz_atomes/', views.quiz_atomes, name='quiz_atomes'), - path('settings/', views.settings, name='settings'), + path('login/', views.login, name='login'), + path('logout/', views.logout, name='logout'), path('scores/', views.scores, name='scores'), ] diff --git a/quiz_atomes/views.py b/quiz_atomes/views.py index faca895..bfa4398 100644 --- a/quiz_atomes/views.py +++ b/quiz_atomes/views.py @@ -8,34 +8,30 @@ from django.shortcuts import redirect import time from django.views.decorators.cache import never_cache from django.db.models import Min +from .forms import UserForm def home(request): return TemplateResponse(request, 'quiz_atomes/home.html', {'favicon':'vial-solid.svg'}) - -def settings(request): - if request.method =='POST': - if not request.POST.get('prenom') or not request.POST.get('nom'): - request.session['pseudo'] = "Anonyme" - else: - request.session['pseudo'] = request.POST.get('prenom')[0].upper()+". "+request.POST.get('nom').upper() - request.session['nom'] = request.POST.get('nom').upper() - request.session['prenom'] = request.POST.get('prenom').upper() - if request.POST.get('nb') == "10" or request.POST.get('nb') == "20" or request.POST.get('nb') == "30" or request.POST.get('nb') == "40": - request.session['difficulte'] = request.POST.get('nb') - else: - request.session['difficulte'] = "10" - return redirect('quiz_atomes') + +def login(request): + if request.method == 'POST': + form = UserForm(request.POST) + if form.is_valid(): + request.session['pseudo'] = form.cleaned_data['login'].upper() + request.session['difficulte'] = int(form.cleaned_data['diff']) + return redirect('quiz_atomes') else: - if 'nom' in request.session and 'prenom' in request.session: - context = { - 'nom': request.session['nom'], - 'prenom': request.session['prenom'], - 'difficulte': request.session['difficulte'], - 'favicon':'vial-solid.svg' - } - else: - context = {'favicon':'vial-solid.svg', 'difficulte': '10'} - return TemplateResponse(request, 'quiz_atomes/settings.html', context) + form = UserForm() + + context = { + 'form': form, + 'favicon':'vial-solid.svg' + } + return TemplateResponse(request, 'quiz_atomes/login.html', {'form': form}) + +def logout(request): + request.session.flush() + return redirect('home') @never_cache def quiz_atomes(request): @@ -44,7 +40,7 @@ def quiz_atomes(request): return resultats(request) if 'pseudo' not in request.session or 'difficulte' not in request.session: - return redirect('settings') + return redirect('login') atome_list = Atome.objects.all().values() random_list = list(atome_list) @@ -56,8 +52,7 @@ def quiz_atomes(request): template = loader.get_template('quiz_atomes/quiz_atomes.html') context = { - 'pseudo': request.session['pseudo'], - 'diff': request.session['difficulte'], + 'user': request.session['pseudo']+" ("+str(request.session['difficulte'])+")", 'atome_list': random_list, 'favicon':'vial-solid.svg' }