Browse Source

Modifs 10/09

master
Christophe SCAYA 3 years ago
parent
commit
e99a535f93
  1. 4
      EscapeGame/templates/default_template.html
  2. 2
      app/apps.py
  3. 5
      app/forms.py
  4. 32
      app/functions.py
  5. 2
      app/models.py
  6. 5
      app/templates/app/setEquipe.html
  7. 35
      app/templates/app/zone.html
  8. 38
      app/views.py

4
EscapeGame/templates/default_template.html

@ -7,7 +7,7 @@
<meta name="author" content="Christophe SCAYA"> <meta name="author" content="Christophe SCAYA">
<link rel="icon" href="{% static 'escape-icon-2.jpg' %}"> <link rel="icon" href="{% static 'escape-icon-2.jpg' %}">
<title>Cover Template for Bootstrap</title> <title>Escape Game</title>
<!-- Bootstrap core CSS --> <!-- Bootstrap core CSS -->
<link href="{% static 'bootstrap.min.css' %}" rel="stylesheet"> <link href="{% static 'bootstrap.min.css' %}" rel="stylesheet">
@ -36,10 +36,8 @@
</div> </div>
{% endfor %}{% block 'contenu' %}{% endblock %} {% endfor %}{% block 'contenu' %}{% endblock %}
<footer class="mastfoot mt-auto"></footer>
</div> </div>
<!-- Bootstrap core JavaScript <!-- Bootstrap core JavaScript
================================================== --> ================================================== -->
<!-- Placed at the end of the document so the pages load faster --> <!-- Placed at the end of the document so the pages load faster -->

2
app/apps.py

@ -3,4 +3,4 @@ from django.apps import AppConfig
class AppConfig(AppConfig): class AppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField' default_auto_field = 'django.db.models.BigAutoField'
name = 'app' name = 'app'
nb_challenges = 5 nb_challenges = 3

5
app/forms.py

@ -13,6 +13,5 @@ def validateEquipe(value):
class LoginForm(forms.Form): class LoginForm(forms.Form):
equipe = forms.DecimalField(label="Code équipe", min_value=1000, max_value=9999, decimal_places=0, validators=[validateEquipe]) equipe = forms.DecimalField(label="Code équipe", min_value=1000, max_value=9999, decimal_places=0, validators=[validateEquipe])
class CreateGameForm(forms.Form): class ZoneForm(forms.Form):
nb_equipes = forms.DecimalField(label="Nombre d'équipes", min_value=0, max_value=10, decimal_places=0) code = forms.DecimalField(label="Code", min_value=1000, max_value=9999, decimal_places=0)
nb_challenges = forms.DecimalField(label="Nombre de challenges", min_value=0, max_value=10, decimal_places=0)

32
app/functions.py

@ -5,6 +5,8 @@ from datetime import datetime
def getMaxChallenge(equipe): def getMaxChallenge(equipe):
max_rank = Challenge.objects.filter(equipe=equipe).aggregate(max_rank=Max("rank"))['max_rank'] max_rank = Challenge.objects.filter(equipe=equipe).aggregate(max_rank=Max("rank"))['max_rank']
if max_rank is None:
return None
try: try:
challenge = Challenge.objects.filter(equipe=equipe, rank=max_rank)[0] challenge = Challenge.objects.filter(equipe=equipe, rank=max_rank)[0]
return challenge return challenge
@ -16,13 +18,18 @@ Fonction createChallenge
Ajoute un challenge à l'équipe fournie et le retourne. Si le nombre max de challenges est déjà atteint, Ajoute un challenge à l'équipe fournie et le retourne. Si le nombre max de challenges est déjà atteint,
la fonction retourne None. la fonction retourne None.
Si prevZone est fournie, la zone du nouveau challenge sera la plus éloignée possible. Si prevZone est fournie, la zone du nouveau challenge sera la plus éloignée possible.
La fonction retourne None si le nombre total de challenges a déjà été atteint
""" """
def createChallenge(equipe,prevZone=None): def createChallenge(equipe):
max_rank = Challenge.objects.filter(equipe=equipe).aggregate(max_rank=Max("rank"))['max_rank'] max_rank = Challenge.objects.filter(equipe=equipe).aggregate(max_rank=Max("rank"))['max_rank']
if max_rank is None: if max_rank is None:
max_rank = 0 max_rank = 0
if max_rank == 0:
challenge = Challenge(equipe=equipe,zone=attributeZone(),rank=1)
challenge.save()
return challenge
if max_rank < apps.get_app_config('app').nb_challenges: if max_rank < apps.get_app_config('app').nb_challenges:
challenge = Challenge(equipe=equipe,zone=attributeZone(prevZone)) challenge = Challenge(equipe=equipe,zone=attributeZone(equipe),rank=max_rank+1)
challenge.save() challenge.save()
return challenge return challenge
else: else:
@ -33,8 +40,8 @@ Fonction attributeZone
Cette fonction recherche une zone avec l'attribut libre et lui donne l'attribut A Cette fonction recherche une zone avec l'attribut libre et lui donne l'attribut A
Si une zone est donnée en paramètre, le zone recherchée sera la zone libre la plus éloignée de celle fournie en paramètre. Si une zone est donnée en paramètre, le zone recherchée sera la zone libre la plus éloignée de celle fournie en paramètre.
""" """
def attributeZone(zone=None): def attributeZone(equipe=None):
if zone is None: if equipe is None:
max_id = Zone.objects.filter(etat='L').aggregate(max_id=Max("id"))['max_id'] max_id = Zone.objects.filter(etat='L').aggregate(max_id=Max("id"))['max_id']
if max_id is None:#aucune zone libre disponible if max_id is None:#aucune zone libre disponible
return None return None
@ -45,7 +52,20 @@ def attributeZone(zone=None):
zone.save() zone.save()
return zone return zone
else: else:
return None#todo current_challenge = getMaxChallenge(equipe)#challenge en cours
current_zone = current_challenge.zone#zone du dernier challenge en cours
zone_id_list = Distance.objects.filter(zone1=current_zone).order_by('-distance').values_list('zone2', flat=True)#liste des zones des plus éloignées à la plus proche de la dernière zone
for zone_id in zone_id_list:
zone = Zone.objects.filter(pk=zone_id)[0]
if zone.etat == 'L' and not Challenge.objects.filter(equipe=equipe, zone=zone):
zone.etat = 'A'
zone.save()
return zone
return None
def getZonesHistory(equipe):
zones = Challenge.objects.filter(equipe=equipe)
def startEquipeTime(equipe): def startEquipeTime(equipe):
if equipe.start_time is None: if equipe.start_time is None:
@ -62,7 +82,7 @@ def startChallengeTime(challenge):
challenge.start_time = datetime.now() challenge.start_time = datetime.now()
challenge.save() challenge.save()
def stopChallengeTime(equipe): def stopChallengeTime(challenge):
if challenge.end_time is None: if challenge.end_time is None:
challenge.end_time = datetime.now() challenge.end_time = datetime.now()
challenge.save() challenge.save()

2
app/models.py

@ -44,4 +44,4 @@ class Challenge(models.Model):
start_time = models.TimeField(null=True, blank=True) start_time = models.TimeField(null=True, blank=True)
end_time = models.TimeField(null=True, blank=True) end_time = models.TimeField(null=True, blank=True)
def __str__(self): def __str__(self):
return self.equipe.nom+" ("+str(self.code)+") -> rang : "+str(self.rank) return self.equipe.nom+" -> salle : "+self.zone.nom+" rang : "+str(self.rank)

5
app/templates/app/setEquipe.html

@ -8,5 +8,8 @@
</form>{% elif zone %} </form>{% elif zone %}
<h3>Bienvenue équipe {{equipe_nom}} ! Pour votre prochain challenge, rendez-vous dans la zone {{zone}} <h3>Bienvenue équipe {{equipe_nom}} ! Pour votre prochain challenge, rendez-vous dans la zone {{zone}}
et flashez le QR code pour connaître votre prochaine mission ! </h3> et flashez le QR code pour connaître votre prochaine mission ! </h3>
{% elif formated_total_time %}
<h3>Félicitations, vous avez terminé cet Escape Game en {{formated_total_time}} !</h3>
{% endif %} {% endif %}
</div>{% endblock %} </div>
<footer class="mastfoot mt-auto"></footer>{% endblock %}

35
app/templates/app/zone.html

@ -1,33 +1,14 @@
{% extends 'default_template.html' %}{% block 'contenu' %} {% extends 'default_template.html' %}{% block 'contenu' %}
<main role="main" class="inner cover">{{zone.description |safe}} <main role="main" class="inner cover">{{zone.description |safe}}
</main>{% if zone.description %} </main>{% if zone.description %}
<div class="inner cover"> <footer class="masthead mt-auto">
<div class="inner cover">
<div class="pb-2">Une fois trouvé, saisissez votre code ci-dessous :</div>
<form action="{% url 'app:displayZone' zone.code %}" method="POST">{% csrf_token %} <form action="{% url 'app:displayZone' zone.code %}" method="POST">{% csrf_token %}
<div class="btn-group-vertical ml-4 mt-4 " role="group" aria-label="Basic example"> {{ form }}
<div class="btn-group"> <input type="submit" value="OK">
<input class="text-center form-control-lg mb-2" name="mdp" id="mdp" min="1000" max="9999" required type="number">
</div>
<div class="btn-group">
<button type="button" class="btn btn-outline-light py-3 w-100" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value + '1';">1</button>
<button type="button" class="btn btn-outline-light py-3" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value + '2';">2</button>
<button type="button" class="btn btn-outline-light py-3" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value + '3';">3</button>
</div>
<div class="btn-group">
<button type="button" class="btn btn-outline-light py-3" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value + '4';">4</button>
<button type="button" class="btn btn-outline-light py-3" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value + '5';">5</button>
<button type="button" class="btn btn-outline-light py-3" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value + '6';">6</button>
</div>
<div class="btn-group">
<button type="button" class="btn btn-outline-light py-3" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value + '7';">7</button>
<button type="button" class="btn btn-outline-light py-3" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value + '8';">8</button>
<button type="button" class="btn btn-outline-light py-3" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value + '9';">9</button>
</div>
<div class="btn-group">
<button type="button" class="btn btn-outline-light py-3" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value.slice(0, -1);">&lt;</button>
<button type="button" class="btn btn-outline-light py-3" onclick="document.getElementById('mdp').value=document.getElementById('mdp').value + '0';">0</button>
<button type="submit" class="btn btn-primary py-3">Go</button>
</div>
</div>
</form> </form>
</div>{% endif %} </div>
</footer>
{% endif %}
{% endblock %} {% endblock %}

38
app/views.py

@ -6,10 +6,11 @@ from django.contrib import admin
from django.conf import settings from django.conf import settings
from django.shortcuts import redirect from django.shortcuts import redirect
from django.contrib import messages from django.contrib import messages
from .forms import LoginForm from .forms import *
from .models import * from .models import *
from django.apps import apps from django.apps import apps
from .functions import * from .functions import *
from datetime import datetime
""" """
Fonction displayZone Fonction displayZone
@ -34,16 +35,22 @@ def displayZone(request, zone_id=None):
try: try:
zone = Zone.objects.filter(code=challenge.zone.code)[0] zone = Zone.objects.filter(code=challenge.zone.code)[0]
if request.method == 'POST': if request.method == 'POST':
if int(request.POST.get('mdp')) == zone.mdp: form = ZoneForm(request.POST)
if form.is_valid() and int(request.POST.get('code')) == zone.mdp:
zone.etat = 'L' zone.etat = 'L'
zone.save() zone.save()
#next_zone = attributeZone(zone) stopChallengeTime(challenge)
messages.success(request, "Bon mot de passe") challenge = createChallenge(equipe)
if challenge is not None:
messages.success(request, "Bien joué, rendez-vous maintenant dans la zone "+challenge.zone.nom+" pour la suite de l'aventure");
else:#escape game terminé
messages.success(request, "Bien joué, rendez-vous maintenant au point de départ pour scanner le QR code de fin de partie");
else: else:
messages.warning(request, "Mauvais mot de passe") messages.warning(request, "Mauvais mot de passe")
context = { context = {
'zone':zone, 'zone':zone,
'title': "Bienvenue dans la zone "+zone.nom, 'title': "Bienvenue dans la zone "+zone.nom,
'form': ZoneForm(),
} }
elif zone_id == zone.code: elif zone_id == zone.code:
startChallengeTime(challenge) startChallengeTime(challenge)
@ -52,6 +59,7 @@ def displayZone(request, zone_id=None):
context = { context = {
'zone':zone, 'zone':zone,
'title': "Bienvenue dans la zone "+zone.nom, 'title': "Bienvenue dans la zone "+zone.nom,
'form': ZoneForm(),
} }
else: else:
messages.warning(request, "Mauvaise zone ! vous devez vous rendre dans la zone "+zone.nom) messages.warning(request, "Mauvaise zone ! vous devez vous rendre dans la zone "+zone.nom)
@ -93,10 +101,24 @@ def setEquipe(request):
'form': LoginForm(), 'form': LoginForm(),
} }
else: else:
context = { equipe = Equipe.objects.get(code=request.session['equipe_code'])
'zone': getMaxChallenge(Equipe.objects.get(code=request.session['equipe_code'])).zone.nom, max_rank = Challenge.objects.filter(equipe=equipe).aggregate(max_rank=Max("rank"))['max_rank']
'equipe_nom': request.session['equipe_nom'], if max_rank is None:
} max_rank = 0
if max_rank < apps.get_app_config('app').nb_challenges:
context = {
'zone': getMaxChallenge(Equipe.objects.get(code=request.session['equipe_code'])).zone.nom,
'equipe_nom': request.session['equipe_nom'],
}
else:
stopEquipeTime(equipe)
debut = datetime.strptime(equipe.start_time.strftime("%H:%M:%S"), "%H:%M:%S")
fin = datetime.strptime(equipe.end_time.strftime("%H:%M:%S"), "%H:%M:%S")
total_time = fin - debut
#request.session.flush()
context = {
'formated_total_time': total_time
}
return HttpResponse(template.render(context, request)) return HttpResponse(template.render(context, request))
def dashboard(request): def dashboard(request):

Loading…
Cancel
Save