Fusion application quiz atomes dans master #1

Merged
scayac merged 5 commits from quiz_atomes into master 4 years ago
  1. 7
      eduapps_project/settings.py
  2. 1
      eduapps_project/static/includes/vial-solid.svg
  3. 4
      eduapps_project/templates/basic_template.html
  4. 1
      eduapps_project/urls.py
  5. 6
      homeapp/templates/homeapp/main.html
  6. 1
      quiz/apps.py
  7. 0
      quiz_atomes/__init__.py
  8. 10
      quiz_atomes/admin.py
  9. 5
      quiz_atomes/apps.py
  10. 946
      quiz_atomes/data/quiz_atomes.atome.json
  11. 31
      quiz_atomes/migrations/0001_initial.py
  12. 0
      quiz_atomes/migrations/__init__.py
  13. 14
      quiz_atomes/models.py
  14. 7
      quiz_atomes/static/quiz_atomes/bootstrap.bundle.min.js
  15. 7
      quiz_atomes/static/quiz_atomes/bootstrap.min.css
  16. 1
      quiz_atomes/static/quiz_atomes/nav_padding.css
  17. BIN
      quiz_atomes/static/quiz_atomes/tableau_periodique-couleur.png
  18. 24
      quiz_atomes/templates/quiz_atomes/home.html
  19. 71
      quiz_atomes/templates/quiz_atomes/quiz_atomes.html
  20. 26
      quiz_atomes/templates/quiz_atomes/resultats.html
  21. 29
      quiz_atomes/templates/quiz_atomes/scores.html
  22. 46
      quiz_atomes/templates/quiz_atomes/settings.html
  23. 3
      quiz_atomes/tests.py
  24. 10
      quiz_atomes/urls.py
  25. 98
      quiz_atomes/views.py

7
eduapps_project/settings.py

@ -33,6 +33,7 @@ ALLOWED_HOSTS = ["*"]
INSTALLED_APPS = [ INSTALLED_APPS = [
'quiz.apps.QuizConfig', 'quiz.apps.QuizConfig',
'quiz_atomes.apps.QuizAtomesConfig',
'homeapp.apps.HomeappConfig', 'homeapp.apps.HomeappConfig',
'django.contrib.admin', 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
@ -60,6 +61,8 @@ STATICFILES_FINDERS = [
'compressor.finders.CompressorFinder', 'compressor.finders.CompressorFinder',
] ]
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
COMPRESS_PRECOMPILERS = ( COMPRESS_PRECOMPILERS = (
('text/x-scss', 'django_libsass.SassCompiler'), ('text/x-scss', 'django_libsass.SassCompiler'),
) )
@ -121,11 +124,11 @@ AUTH_PASSWORD_VALIDATORS = [
LANGUAGE_CODE = 'fr-FR' LANGUAGE_CODE = 'fr-FR'
TIME_ZONE = 'UTC' TIME_ZONE = 'Europe/Paris'
USE_I18N = True USE_I18N = True
USE_TZ = True USE_TZ = False
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)

1
eduapps_project/static/includes/vial-solid.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M502.6 169.4l-160-160C336.4 3.125 328.2 0 320 0s-16.38 3.125-22.62 9.375c-12.5 12.5-12.5 32.75 0 45.25l6.975 6.977l-271.4 271c-38.75 38.75-45.13 102-9.375 143.5C44.08 500 72.76 512 101.5 512h.4473c26.38 0 52.75-9.1 72.88-30.12l275.2-274.6l7.365 7.367C463.6 220.9 471.8 224 480 224s16.38-3.125 22.62-9.375C515.1 202.1 515.1 181.9 502.6 169.4zM310.6 256H200.2l149.3-149.1l55.18 55.12L310.6 256z"/></svg>

After

Width:  |  Height:  |  Size: 640 B

4
eduapps_project/templates/basic_template.html

@ -4,8 +4,8 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">{% compress css %} <meta name="viewport" content="width=device-width, initial-scale=1">{% compress css %}
<link href="{% static 'fontawesomefree/css/all.min.css' %}" rel="stylesheet" type="text/css"> <link href="{% static 'fontawesomefree/css/all.min.css' %}" rel="stylesheet" type="text/css">
<!-- <link rel="stylesheet" href="{% static 'wireframe.css' %}">--> <link rel="stylesheet" type="text/x-scss" href="{% static 'wireframe.scss' %}" />
<link rel="stylesheet" type="text/x-scss" href="{% static 'wireframe.scss' %}" />{% endcompress %} {% block 'extra_css' %}{% endblock %}{% endcompress %}
<link rel="icon" href="{% static 'includes/' %}{{favicon}}"> <link rel="icon" href="{% static 'includes/' %}{{favicon}}">
<title>Edu.apps</title> <title>Edu.apps</title>
</head> </head>

1
eduapps_project/urls.py

@ -20,5 +20,6 @@ from django.views.generic import TemplateView
urlpatterns = [ urlpatterns = [
path('', include('homeapp.urls')), path('', include('homeapp.urls')),
path('quiz/', include('quiz.urls')), path('quiz/', include('quiz.urls')),
path('quiz_atomes/', include('quiz_atomes.urls')),
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
] ]

6
homeapp/templates/homeapp/main.html

@ -23,9 +23,9 @@
<p>Un quiz de français pour tester tes connaissances en conjugaison.</p><a class="btn text-center btn-block btn-dark" href="quiz">J'y vais !</a> <p>Un quiz de français pour tester tes connaissances en conjugaison.</p><a class="btn text-center btn-block btn-dark" href="quiz">J'y vais !</a>
</div> </div>
<div class="p-4 col-lg-4 col-md-6 bg-dark"> <div class="p-4 col-lg-4 col-md-6 bg-dark">
<h4><b>Trivial physique chimie</b></h4> <h4><b>Quiz sur les atomes</b></h4>
<p>Le célèbre jeu de société dans une version spéciale physique chimie !</p> <p>Un quiz pour tester tes connaissances en symboles chimiques !</p>
<a class="btn btn-primary text-center btn-block disabled" href="trivial">Bientôt disponible...</a> <a class="btn btn-primary text-center btn-block" href="quiz_atomes">J'y vais !</a>
</div> </div>
</div> </div>
</div> </div>

1
quiz/apps.py

@ -1,6 +1,5 @@
from django.apps import AppConfig from django.apps import AppConfig
class QuizConfig(AppConfig): class QuizConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField' default_auto_field = 'django.db.models.BigAutoField'
name = 'quiz' name = 'quiz'

0
quiz_atomes/__init__.py

10
quiz_atomes/admin.py

@ -0,0 +1,10 @@
from django.contrib import admin
# Register your models here.
from .models import Atome, Score
class AtomeAdmin(admin.ModelAdmin):
list_display = ('pk','nom', 'symbole')
admin.site.register(Atome, AtomeAdmin)
admin.site.register(Score)

5
quiz_atomes/apps.py

@ -0,0 +1,5 @@
from django.apps import AppConfig
class QuizAtomesConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'quiz_atomes'

946
quiz_atomes/data/quiz_atomes.atome.json

@ -0,0 +1,946 @@
[
{
"model": "quiz_atomes.atome",
"pk": 1,
"fields": {
"nom": "Hydrogène",
"symbole": "H"
}
},
{
"model": "quiz_atomes.atome",
"pk": 2,
"fields": {
"nom": "Hélium",
"symbole": "He"
}
},
{
"model": "quiz_atomes.atome",
"pk": 3,
"fields": {
"nom": "Lithium",
"symbole": "Li"
}
},
{
"model": "quiz_atomes.atome",
"pk": 4,
"fields": {
"nom": "Béryllium",
"symbole": "Be"
}
},
{
"model": "quiz_atomes.atome",
"pk": 5,
"fields": {
"nom": "Bore",
"symbole": "B"
}
},
{
"model": "quiz_atomes.atome",
"pk": 6,
"fields": {
"nom": "Carbone",
"symbole": "C"
}
},
{
"model": "quiz_atomes.atome",
"pk": 7,
"fields": {
"nom": "Azote",
"symbole": "N"
}
},
{
"model": "quiz_atomes.atome",
"pk": 8,
"fields": {
"nom": "Oxygène",
"symbole": "O"
}
},
{
"model": "quiz_atomes.atome",
"pk": 9,
"fields": {
"nom": "Fluor",
"symbole": "F"
}
},
{
"model": "quiz_atomes.atome",
"pk": 10,
"fields": {
"nom": "Néon",
"symbole": "Ne"
}
},
{
"model": "quiz_atomes.atome",
"pk": 11,
"fields": {
"nom": "Sodium",
"symbole": "Na"
}
},
{
"model": "quiz_atomes.atome",
"pk": 12,
"fields": {
"nom": "Magnésium",
"symbole": "Mg"
}
},
{
"model": "quiz_atomes.atome",
"pk": 13,
"fields": {
"nom": "Aluminium",
"symbole": "Al"
}
},
{
"model": "quiz_atomes.atome",
"pk": 14,
"fields": {
"nom": "Silicium",
"symbole": "Si"
}
},
{
"model": "quiz_atomes.atome",
"pk": 15,
"fields": {
"nom": "Phosphore",
"symbole": "P"
}
},
{
"model": "quiz_atomes.atome",
"pk": 16,
"fields": {
"nom": "Soufre",
"symbole": "S"
}
},
{
"model": "quiz_atomes.atome",
"pk": 17,
"fields": {
"nom": "Chlore",
"symbole": "Cl"
}
},
{
"model": "quiz_atomes.atome",
"pk": 18,
"fields": {
"nom": "Argon",
"symbole": "Ar"
}
},
{
"model": "quiz_atomes.atome",
"pk": 19,
"fields": {
"nom": "Potassium",
"symbole": "K"
}
},
{
"model": "quiz_atomes.atome",
"pk": 20,
"fields": {
"nom": "Calcium",
"symbole": "Ca"
}
},
{
"model": "quiz_atomes.atome",
"pk": 21,
"fields": {
"nom": "Scandium",
"symbole": "Sc"
}
},
{
"model": "quiz_atomes.atome",
"pk": 22,
"fields": {
"nom": "Titane",
"symbole": "Ti"
}
},
{
"model": "quiz_atomes.atome",
"pk": 23,
"fields": {
"nom": "Vanadium",
"symbole": "V"
}
},
{
"model": "quiz_atomes.atome",
"pk": 24,
"fields": {
"nom": "Chrome",
"symbole": "Cr"
}
},
{
"model": "quiz_atomes.atome",
"pk": 25,
"fields": {
"nom": "Manganèse",
"symbole": "Mn"
}
},
{
"model": "quiz_atomes.atome",
"pk": 26,
"fields": {
"nom": "Fer",
"symbole": "Fe"
}
},
{
"model": "quiz_atomes.atome",
"pk": 27,
"fields": {
"nom": "Cobalt",
"symbole": "Co"
}
},
{
"model": "quiz_atomes.atome",
"pk": 28,
"fields": {
"nom": "Nickel",
"symbole": "Ni"
}
},
{
"model": "quiz_atomes.atome",
"pk": 29,
"fields": {
"nom": "Cuivre",
"symbole": "Cu"
}
},
{
"model": "quiz_atomes.atome",
"pk": 30,
"fields": {
"nom": "Zinc",
"symbole": "Zn"
}
},
{
"model": "quiz_atomes.atome",
"pk": 31,
"fields": {
"nom": "Gallium",
"symbole": "Ga"
}
},
{
"model": "quiz_atomes.atome",
"pk": 32,
"fields": {
"nom": "Germanium",
"symbole": "Ge"
}
},
{
"model": "quiz_atomes.atome",
"pk": 33,
"fields": {
"nom": "Arsenic",
"symbole": "As"
}
},
{
"model": "quiz_atomes.atome",
"pk": 34,
"fields": {
"nom": "Sélénium",
"symbole": "Se"
}
},
{
"model": "quiz_atomes.atome",
"pk": 35,
"fields": {
"nom": "Brome",
"symbole": "Br"
}
},
{
"model": "quiz_atomes.atome",
"pk": 36,
"fields": {
"nom": "Krypton",
"symbole": "Kr"
}
},
{
"model": "quiz_atomes.atome",
"pk": 37,
"fields": {
"nom": "Rubidium",
"symbole": "Rb"
}
},
{
"model": "quiz_atomes.atome",
"pk": 38,
"fields": {
"nom": "Strontium",
"symbole": "Sr"
}
},
{
"model": "quiz_atomes.atome",
"pk": 39,
"fields": {
"nom": "Yttrium",
"symbole": "Y"
}
},
{
"model": "quiz_atomes.atome",
"pk": 40,
"fields": {
"nom": "Zirconium",
"symbole": "Zr"
}
},
{
"model": "quiz_atomes.atome",
"pk": 41,
"fields": {
"nom": "Niobium",
"symbole": "Nb"
}
},
{
"model": "quiz_atomes.atome",
"pk": 42,
"fields": {
"nom": "Molybdène",
"symbole": "Mo"
}
},
{
"model": "quiz_atomes.atome",
"pk": 43,
"fields": {
"nom": "Technétium",
"symbole": "Tc"
}
},
{
"model": "quiz_atomes.atome",
"pk": 44,
"fields": {
"nom": "Ruthénium",
"symbole": "Ru"
}
},
{
"model": "quiz_atomes.atome",
"pk": 45,
"fields": {
"nom": "Rhodium",
"symbole": "Rh"
}
},
{
"model": "quiz_atomes.atome",
"pk": 46,
"fields": {
"nom": "Palladium",
"symbole": "Pd"
}
},
{
"model": "quiz_atomes.atome",
"pk": 47,
"fields": {
"nom": "Argent",
"symbole": "Ag"
}
},
{
"model": "quiz_atomes.atome",
"pk": 48,
"fields": {
"nom": "Cadmium",
"symbole": "Cd"
}
},
{
"model": "quiz_atomes.atome",
"pk": 49,
"fields": {
"nom": "Indium",
"symbole": "In"
}
},
{
"model": "quiz_atomes.atome",
"pk": 50,
"fields": {
"nom": "Étain",
"symbole": "Sn"
}
},
{
"model": "quiz_atomes.atome",
"pk": 51,
"fields": {
"nom": "Antimoine",
"symbole": "Sn"
}
},
{
"model": "quiz_atomes.atome",
"pk": 52,
"fields": {
"nom": "Tellure",
"symbole": "Te"
}
},
{
"model": "quiz_atomes.atome",
"pk": 53,
"fields": {
"nom": "Iode",
"symbole": "I"
}
},
{
"model": "quiz_atomes.atome",
"pk": 54,
"fields": {
"nom": "Xénon",
"symbole": "Xe"
}
},
{
"model": "quiz_atomes.atome",
"pk": 55,
"fields": {
"nom": "Césium",
"symbole": "Cs"
}
},
{
"model": "quiz_atomes.atome",
"pk": 56,
"fields": {
"nom": "Baryum",
"symbole": "Ba"
}
},
{
"model": "quiz_atomes.atome",
"pk": 57,
"fields": {
"nom": "Lanthane",
"symbole": "La"
}
},
{
"model": "quiz_atomes.atome",
"pk": 58,
"fields": {
"nom": "Cérium",
"symbole": "Ce"
}
},
{
"model": "quiz_atomes.atome",
"pk": 59,
"fields": {
"nom": "Praséodyme",
"symbole": "Pr"
}
},
{
"model": "quiz_atomes.atome",
"pk": 60,
"fields": {
"nom": "Néodyme",
"symbole": "Nd"
}
},
{
"model": "quiz_atomes.atome",
"pk": 61,
"fields": {
"nom": "Prométhium",
"symbole": "Pm"
}
},
{
"model": "quiz_atomes.atome",
"pk": 62,
"fields": {
"nom": "Samarium",
"symbole": "Sm"
}
},
{
"model": "quiz_atomes.atome",
"pk": 63,
"fields": {
"nom": "Europium",
"symbole": "Eu"
}
},
{
"model": "quiz_atomes.atome",
"pk": 64,
"fields": {
"nom": "Gadolinium",
"symbole": "Gd"
}
},
{
"model": "quiz_atomes.atome",
"pk": 65,
"fields": {
"nom": "Terbium",
"symbole": "Tb"
}
},
{
"model": "quiz_atomes.atome",
"pk": 66,
"fields": {
"nom": "Dysprosium",
"symbole": "Dy"
}
},
{
"model": "quiz_atomes.atome",
"pk": 67,
"fields": {
"nom": "Holmium",
"symbole": "Ho"
}
},
{
"model": "quiz_atomes.atome",
"pk": 68,
"fields": {
"nom": "Erbium",
"symbole": "Er"
}
},
{
"model": "quiz_atomes.atome",
"pk": 69,
"fields": {
"nom": "Thulium",
"symbole": "Tm"
}
},
{
"model": "quiz_atomes.atome",
"pk": 70,
"fields": {
"nom": "Ytterbium",
"symbole": "Yb"
}
},
{
"model": "quiz_atomes.atome",
"pk": 71,
"fields": {
"nom": "Lutécium",
"symbole": "Lu"
}
},
{
"model": "quiz_atomes.atome",
"pk": 72,
"fields": {
"nom": "Hafnium",
"symbole": "Hf"
}
},
{
"model": "quiz_atomes.atome",
"pk": 73,
"fields": {
"nom": "Tantale",
"symbole": "Ta"
}
},
{
"model": "quiz_atomes.atome",
"pk": 74,
"fields": {
"nom": "Tungstène",
"symbole": "W"
}
},
{
"model": "quiz_atomes.atome",
"pk": 75,
"fields": {
"nom": "Rhénium",
"symbole": "Re"
}
},
{
"model": "quiz_atomes.atome",
"pk": 76,
"fields": {
"nom": "Osmium",
"symbole": "Os"
}
},
{
"model": "quiz_atomes.atome",
"pk": 77,
"fields": {
"nom": "Iridium",
"symbole": "Ir"
}
},
{
"model": "quiz_atomes.atome",
"pk": 78,
"fields": {
"nom": "Platine",
"symbole": "Pt"
}
},
{
"model": "quiz_atomes.atome",
"pk": 79,
"fields": {
"nom": "Or",
"symbole": "Au"
}
},
{
"model": "quiz_atomes.atome",
"pk": 80,
"fields": {
"nom": "Mercure",
"symbole": "Hg"
}
},
{
"model": "quiz_atomes.atome",
"pk": 81,
"fields": {
"nom": "Thallium",
"symbole": "Tl"
}
},
{
"model": "quiz_atomes.atome",
"pk": 82,
"fields": {
"nom": "Plomb",
"symbole": "Pb"
}
},
{
"model": "quiz_atomes.atome",
"pk": 83,
"fields": {
"nom": "Bismuth",
"symbole": "Bi"
}
},
{
"model": "quiz_atomes.atome",
"pk": 84,
"fields": {
"nom": "Polonium",
"symbole": "Po"
}
},
{
"model": "quiz_atomes.atome",
"pk": 85,
"fields": {
"nom": "Astate",
"symbole": "At"
}
},
{
"model": "quiz_atomes.atome",
"pk": 86,
"fields": {
"nom": "Radon",
"symbole": "Rn"
}
},
{
"model": "quiz_atomes.atome",
"pk": 87,
"fields": {
"nom": "Francium",
"symbole": "Fr"
}
},
{
"model": "quiz_atomes.atome",
"pk": 88,
"fields": {
"nom": "Radium",
"symbole": "Ra"
}
},
{
"model": "quiz_atomes.atome",
"pk": 89,
"fields": {
"nom": "Actinium",
"symbole": "Ac"
}
},
{
"model": "quiz_atomes.atome",
"pk": 90,
"fields": {
"nom": "Thorium",
"symbole": "Th"
}
},
{
"model": "quiz_atomes.atome",
"pk": 91,
"fields": {
"nom": "Protactinium",
"symbole": "Pa"
}
},
{
"model": "quiz_atomes.atome",
"pk": 92,
"fields": {
"nom": "Uranium",
"symbole": "U"
}
},
{
"model": "quiz_atomes.atome",
"pk": 93,
"fields": {
"nom": "Neptunium",
"symbole": "Np"
}
},
{
"model": "quiz_atomes.atome",
"pk": 94,
"fields": {
"nom": "Plutonium",
"symbole": "Pu"
}
},
{
"model": "quiz_atomes.atome",
"pk": 95,
"fields": {
"nom": "Américium",
"symbole": "Am"
}
},
{
"model": "quiz_atomes.atome",
"pk": 96,
"fields": {
"nom": "Curium",
"symbole": "Cm"
}
},
{
"model": "quiz_atomes.atome",
"pk": 97,
"fields": {
"nom": "Berkélium",
"symbole": "Bk"
}
},
{
"model": "quiz_atomes.atome",
"pk": 98,
"fields": {
"nom": "Californium",
"symbole": "Cf"
}
},
{
"model": "quiz_atomes.atome",
"pk": 99,
"fields": {
"nom": "Einsteinium",
"symbole": "Es"
}
},
{
"model": "quiz_atomes.atome",
"pk": 100,
"fields": {
"nom": "Fermium",
"symbole": "Fm"
}
},
{
"model": "quiz_atomes.atome",
"pk": 101,
"fields": {
"nom": "Mendelévium",
"symbole": "Md"
}
},
{
"model": "quiz_atomes.atome",
"pk": 102,
"fields": {
"nom": "Nobélium",
"symbole": "No"
}
},
{
"model": "quiz_atomes.atome",
"pk": 103,
"fields": {
"nom": "Lawrencium",
"symbole": "Lr"
}
},
{
"model": "quiz_atomes.atome",
"pk": 104,
"fields": {
"nom": "Rutherfordium",
"symbole": "Rf"
}
},
{
"model": "quiz_atomes.atome",
"pk": 105,
"fields": {
"nom": "Dubnium",
"symbole": "Db"
}
},
{
"model": "quiz_atomes.atome",
"pk": 106,
"fields": {
"nom": "Seaborgium",
"symbole": "Sg"
}
},
{
"model": "quiz_atomes.atome",
"pk": 107,
"fields": {
"nom": "Bohrium",
"symbole": "Bh"
}
},
{
"model": "quiz_atomes.atome",
"pk": 108,
"fields": {
"nom": "Hassium",
"symbole": "Hs"
}
},
{
"model": "quiz_atomes.atome",
"pk": 109,
"fields": {
"nom": "Meitnérium",
"symbole": "Mt"
}
},
{
"model": "quiz_atomes.atome",
"pk": 110,
"fields": {
"nom": "Darmstadtium",
"symbole": "Ds"
}
},
{
"model": "quiz_atomes.atome",
"pk": 111,
"fields": {
"nom": "Roentgenium",
"symbole": "Rg"
}
},
{
"model": "quiz_atomes.atome",
"pk": 112,
"fields": {
"nom": "Copernicium",
"symbole": "Cn"
}
},
{
"model": "quiz_atomes.atome",
"pk": 113,
"fields": {
"nom": "Ununtrium",
"symbole": "Uut"
}
},
{
"model": "quiz_atomes.atome",
"pk": 114,
"fields": {
"nom": "Flérovium",
"symbole": "Fl"
}
},
{
"model": "quiz_atomes.atome",
"pk": 115,
"fields": {
"nom": "Ununpentium",
"symbole": "Uup"
}
},
{
"model": "quiz_atomes.atome",
"pk": 116,
"fields": {
"nom": "Livermorium",
"symbole": "Lv"
}
},
{
"model": "quiz_atomes.atome",
"pk": 117,
"fields": {
"nom": "Ununseptium",
"symbole": "Uus"
}
},
{
"model": "quiz_atomes.atome",
"pk": 118,
"fields": {
"nom": "Ununoctium",
"symbole": "Uuo"
}
}
]

31
quiz_atomes/migrations/0001_initial.py

@ -0,0 +1,31 @@
# Generated by Django 4.0.1 on 2022-03-28 13:37
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Atome',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('nom', models.CharField(max_length=20)),
('symbole', models.CharField(max_length=3)),
],
),
migrations.CreateModel(
name='Score',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('pseudo', models.CharField(max_length=20)),
('score', models.IntegerField(default=0)),
('score_date', models.DateTimeField(verbose_name='Date du score')),
],
),
]

0
quiz_atomes/migrations/__init__.py

14
quiz_atomes/models.py

@ -0,0 +1,14 @@
from django.db import models
class Atome(models.Model):
nom = models.CharField(max_length=20)
symbole = models.CharField(max_length=3)
def __str__(self):
return self.nom+" ("+self.symbole+")"
class Score(models.Model):
pseudo = models.CharField(max_length=20)
score = models.IntegerField(default=0)
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")

7
quiz_atomes/static/quiz_atomes/bootstrap.bundle.min.js vendored

File diff suppressed because one or more lines are too long

7
quiz_atomes/static/quiz_atomes/bootstrap.min.css vendored

File diff suppressed because one or more lines are too long

1
quiz_atomes/static/quiz_atomes/nav_padding.css

@ -0,0 +1 @@
body { padding-top: 70px; }

BIN
quiz_atomes/static/quiz_atomes/tableau_periodique-couleur.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

24
quiz_atomes/templates/quiz_atomes/home.html

@ -0,0 +1,24 @@
{% extends 'basic_template.html' %}{% block 'body' %}{% load static %}
<nav class="navbar navbar-light">
<div class="container">
<a class="navbar-brand text-primary" href="/">
<i class="fa fa-university"></i>
<b>Edu.apps</b>
</a>
</div>
</nav>
<div id="scoring" class="d-flex justify-content-center align-items-center">
<div class="py-3 d-flex flex-column align-items-center">
<h1 class="display-4"><b>LE QUIZ DES ATOMES</b>&nbsp;<i class="fa fa-vial"></i></h1>
<p class="py-3 w-50">Ta mission pour ce jeu ?<br/>
Connaître les symboles chimiques des atomes qui constituent l'univers. Chaque bonne réponse te rapporte 20 points. Une mauvaise t'en enlève 10 et une absence de réponse t'en enlève 5. Attention au temps ! Chaque seconde passée sur la partie t'enlèvera un point au moment de calculer ton score.<br/>Pour t'entraîner, aide toi de <a href="{% static 'quiz_atomes/tableau_periodique-couleur.png' %}">ce tableau</a>. Bon courage !</p>
<div class="d-inline">
<a href="{% url "quiz_atomes" %}">
<input type="button" value="JOUER" href=>
</a>
<a href="{% url "scores" %}">
<input type="button" value="Scores">
</a>
</div>
</div>
</div>{% endblock %}

71
quiz_atomes/templates/quiz_atomes/quiz_atomes.html

@ -0,0 +1,71 @@
{% extends 'basic_template.html' %}{% block 'extra_css' %}{% load static %}
<link href="{% static '/quiz_atomes/nav_padding.css' %}" rel="stylesheet" type="text/css">
{% endblock %}{% block 'body' %}
<nav class="navbar navbar-light fixed-top bg-light">
<div class="container">
<a class="navbar-brand text-primary" href="{% url "home" %}">
<i class="fa fa-home"></i>
</a>
<div class="navbar-brand">
<time>00m 00s</time>
</div>
<a class="navbar-brand text-primary" href="{% url "settings" %}">
<i class="fa fa-gear"></i>
</a>
</div>
</nav>
<div class="d-flex justify-content-center align-items-center">
<form action="{% url "quiz_atomes" %}" method="POST" id="quiz" name="quiz">
{% csrf_token %}
<table class="table table-striped w-auto table-responsive-lg">
<thead>
<tr>
<th scope="col">Atome</th>
<th scope="col">Symbole</th>
</tr>
</thead>
<tbody>{% if atome_list %}{% for atome in atome_list %}
<tr>
<td>{{atome.nom}}</td>
<td><input name="input{{ forloop.counter }}" maxlength="3" value=""></td>
</tr>{% endfor %}{% endif %}
<tr>
<td colspan="2"><input type="submit" name="ok" value="OK"></td>
</tr>
</tbody>
</table>
</form>
</div>{% endblock %}{% block 'extra_scripts' %}{% load static %}
<script>
var chrono = document.getElementsByTagName('time')[0];
var sec = 0;
var min = 0;
var t;
function tick(){
sec++;
if (sec >= 60) {
sec = 0;
min++;
if (min >= 60) {
min = 0;
}
}
}
function add() {
tick();
chrono.textContent = (min > 9 ? min : "0" + min)
+ "m " + (sec > 9 ? sec : "0" + sec) +"s";
timer();
}
function timer() {
t = setTimeout(add, 1000);
}
timer();
$(document).ready(function() {
timer;
});
</script>
{% endblock %}

26
quiz_atomes/templates/quiz_atomes/resultats.html

@ -0,0 +1,26 @@
{% extends 'basic_template.html' %}{% block 'body' %}
<nav class="navbar navbar-light">
<div class="container">
<a class="navbar-brand text-primary" href="{% url "home" %}">
<i class="fa fa-home"></i>
</a>
</div>
</nav>
<div id="scoring" class="d-flex justify-content-center align-items-center">
<div class="py-2 d-flex flex-column align-items-center">
<h4 id="points"><b>POINTS : {{points}}</b></h4>
<h4 id="dt"><b>TEMPS : {{dt}}</b></h4>
<h1 id="score"><b>SCORE : {{score}}</b></h1>{% if best_score %}
<h4><i class="fa-solid fa-star"></i><b>&nbsp;Nouveau&nbsp;<i class="fa-solid fa-star"></i><br/>meilleur score !</b>&nbsp;</h4>{% else %}
<h4><b>Essaie encore !</b></h4>
{% endif %}
<div class="d-inline">
<a href="{% url "scores" %}">
<input type="button" value="Scores">
</a>
<a href="{% url "quiz_atomes" %}">
<input type="button" value="Rejouer">
</a>
</div>
</div>
</div>{% endblock %}

29
quiz_atomes/templates/quiz_atomes/scores.html

@ -0,0 +1,29 @@
{% extends 'basic_template.html' %}{% block 'body' %}
<nav class="navbar navbar-light">
<div class="container">
<a class="navbar-brand text-primary" href="{% url "home" %}">
<i class="fa fa-home"></i>
</a>
</div>
</nav>
<div class="d-flex flex-column justify-content-center align-items-center">
<h3><b>Tableau des meilleurs scores</b></h3>
<table class="table table-striped w-auto table-responsive-lg">
<thead>
<tr>
<th scope="col">Rang</th>
<th scope="col">Score</th>
<th scope="col">Pseudo</th>
<th scope="col">Date</th>
</tr>
</thead>
<tbody>{% if score_list %}{% for score in score_list %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ score.score }}</td>
<td>{{ score.pseudo }}</td>
<td>{{ score.score_date }}</td>
</tr>{% endfor %}{% endif %}
</tbody>
</table>
</div>{% endblock %}

46
quiz_atomes/templates/quiz_atomes/settings.html

@ -0,0 +1,46 @@
{% extends 'basic_template.html' %}{% block 'body' %}
<nav class="navbar navbar-light">
<div class="container"> <a class="navbar-brand text-primary" href="{% url "quiz_atomes" %}">
<i class="fa fa-arrow-left"></i>
</a>
</div>
</nav>
<div class="d-flex flex-column justify-content-center align-items-center">
<h3><b>Paramètres du quiz</b></h3>
<form action="{% url "settings" %}" method="POST" name="settings">{% csrf_token %}
<table class="table w-auto table-responsive-lg">
<tr>
<td>NOM :</td>
<td><input id="nom" name="nom" maxlength="20"></td>
</tr>
<tr>
<td>Prénom :</td>
<td><input id="prenom" name="prenom" maxlength="20"></td>
</tr>
<tr>
<td>Nombre<br/>d'atomes :</td>
<td class="align-middle">
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="nb" id="inlineRadio1" value="10" checked>
<label class="form-check-label" for="inlineRadio1">10</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="nb" id="inlineRadio1" value="20">
<label class="form-check-label" for="inlineRadio2">20</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="nb" id="inlineRadio1" value="30">
<label class="form-check-label" for="inlineRadio1">30</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" type="radio" name="nb" id="inlineRadio1" value="40">
<label class="form-check-label" for="inlineRadio2">40</label>
</div>
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="OK"></td>
</tr>
</table>
</form>
</div>{% endblock %}

3
quiz_atomes/tests.py

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

10
quiz_atomes/urls.py

@ -0,0 +1,10 @@
from django.urls import path
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('scores/', views.scores, name='scores'),
]

98
quiz_atomes/views.py

@ -0,0 +1,98 @@
from django.http import HttpResponse
from django.template.response import TemplateResponse
from django.template import loader
from .models import Atome, Score
from random import shuffle
from datetime import datetime
from django.shortcuts import redirect
import time
from django.views.decorators.cache import never_cache
from django.db.models import Min
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['difficulte'] = request.POST.get('nb')
return redirect('quiz_atomes')
else:
return TemplateResponse(request, 'quiz_atomes/settings.html', {'favicon':'vial-solid.svg'})
@never_cache
def quiz_atomes(request):
if request.POST.get('ok'):
return resultats(request)
if 'pseudo' not in request.session or 'difficulte' not in request.session:
return redirect('settings')
atome_list = Atome.objects.all()
random_list = list(atome_list)
shuffle(random_list)
random_list = random_list[:int(request.session['difficulte'])]
symbole_list = []
for x in random_list:
symbole_list.append(x.symbole)
request.session['quiz'] = symbole_list
request.session['time'] = time.time()
template = loader.get_template('quiz_atomes/quiz_atomes.html')
context = {
'pseudo': request.session['pseudo'],
'diff': request.session['difficulte'],
'atome_list': random_list,
'favicon':'vial-solid.svg'
}
return HttpResponse(template.render(context, request))
def resultats(request):
points = 0
dt = round(time.time()-request.session['time']-1)*-1
for i in range(int(request.session['difficulte'])):
if request.POST.get('input'+str(i+1)).casefold()==request.session['quiz'][i].casefold():
points+=20
elif request.POST.get('input'+str(i+1)).casefold()=="":
points-=5
else:
points-=10
score=points+dt
best_score=0
if score>0:
score_list = Score.objects.all().order_by('-score')[:10]
min_selection_score = score_list.aggregate(Min("score")).get('score__min')
if score>=min_selection_score:
new_score = Score(pseudo=request.session['pseudo'], score=int(score), score_date=datetime.now())
new_score.save()
best_score=1
template = loader.get_template('quiz_atomes/resultats.html')
context = {
'points': points,
'dt': dt,
'score': score,
'best_score': best_score,
'favicon':'vial-solid.svg'
}
return HttpResponse(template.render(context, request))
def scores(request):
score_list = Score.objects.all().order_by('-score')[:10]
template = loader.get_template('quiz_atomes/scores.html')
context = {
'score_list': score_list,
'favicon':'vial-solid.svg'
}
return HttpResponse(template.render(context, request))
Loading…
Cancel
Save