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. 7
      app/forms.py
  4. 34
      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 @@ @@ -7,7 +7,7 @@
<meta name="author" content="Christophe SCAYA">
<link rel="icon" href="{% static 'escape-icon-2.jpg' %}">
<title>Cover Template for Bootstrap</title>
<title>Escape Game</title>
<!-- Bootstrap core CSS -->
<link href="{% static 'bootstrap.min.css' %}" rel="stylesheet">
@ -36,10 +36,8 @@ @@ -36,10 +36,8 @@
</div>
{% endfor %}{% block 'contenu' %}{% endblock %}
<footer class="mastfoot mt-auto"></footer>
</div>
<!-- Bootstrap core JavaScript
================================================== -->
<!-- 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 @@ -3,4 +3,4 @@ from django.apps import AppConfig
class AppConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app'
nb_challenges = 5
nb_challenges = 3

7
app/forms.py

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

34
app/functions.py

@ -5,6 +5,8 @@ from datetime import datetime @@ -5,6 +5,8 @@ from datetime import datetime
def getMaxChallenge(equipe):
max_rank = Challenge.objects.filter(equipe=equipe).aggregate(max_rank=Max("rank"))['max_rank']
if max_rank is None:
return None
try:
challenge = Challenge.objects.filter(equipe=equipe, rank=max_rank)[0]
return challenge
@ -16,25 +18,30 @@ Fonction createChallenge @@ -16,25 +18,30 @@ Fonction createChallenge
Ajoute un challenge à l'équipe fournie et le retourne. Si le nombre max de challenges est déjà atteint,
la fonction retourne None.
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']
if max_rank is None:
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:
challenge = Challenge(equipe=equipe,zone=attributeZone(prevZone))
challenge = Challenge(equipe=equipe,zone=attributeZone(equipe),rank=max_rank+1)
challenge.save()
return challenge
else:
return None
"""
Fonction attributeZone
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.
"""
def attributeZone(zone=None):
if zone is None:
def attributeZone(equipe=None):
if equipe is None:
max_id = Zone.objects.filter(etat='L').aggregate(max_id=Max("id"))['max_id']
if max_id is None:#aucune zone libre disponible
return None
@ -45,7 +52,20 @@ def attributeZone(zone=None): @@ -45,7 +52,20 @@ def attributeZone(zone=None):
zone.save()
return zone
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):
if equipe.start_time is None:
@ -62,7 +82,7 @@ def startChallengeTime(challenge): @@ -62,7 +82,7 @@ def startChallengeTime(challenge):
challenge.start_time = datetime.now()
challenge.save()
def stopChallengeTime(equipe):
def stopChallengeTime(challenge):
if challenge.end_time is None:
challenge.end_time = datetime.now()
challenge.save()

2
app/models.py

@ -44,4 +44,4 @@ class Challenge(models.Model): @@ -44,4 +44,4 @@ class Challenge(models.Model):
start_time = models.TimeField(null=True, blank=True)
end_time = models.TimeField(null=True, blank=True)
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 @@ @@ -8,5 +8,8 @@
</form>{% elif 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>
{% elif formated_total_time %}
<h3>Félicitations, vous avez terminé cet Escape Game en {{formated_total_time}} !</h3>
{% endif %}
</div>{% endblock %}
</div>
<footer class="mastfoot mt-auto"></footer>{% endblock %}

35
app/templates/app/zone.html

@ -1,33 +1,14 @@ @@ -1,33 +1,14 @@
{% extends 'default_template.html' %}{% block 'contenu' %}
<main role="main" class="inner cover">{{zone.description |safe}}
</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 %}
<div class="btn-group-vertical ml-4 mt-4 " role="group" aria-label="Basic example">
<div class="btn-group">
<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 }}
<input type="submit" value="OK">
</form>
</div>{% endif %}
</div>
</footer>
{% endif %}
{% endblock %}

38
app/views.py

@ -6,10 +6,11 @@ from django.contrib import admin @@ -6,10 +6,11 @@ from django.contrib import admin
from django.conf import settings
from django.shortcuts import redirect
from django.contrib import messages
from .forms import LoginForm
from .forms import *
from .models import *
from django.apps import apps
from .functions import *
from datetime import datetime
"""
Fonction displayZone
@ -34,16 +35,22 @@ def displayZone(request, zone_id=None): @@ -34,16 +35,22 @@ def displayZone(request, zone_id=None):
try:
zone = Zone.objects.filter(code=challenge.zone.code)[0]
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.save()
#next_zone = attributeZone(zone)
messages.success(request, "Bon mot de passe")
stopChallengeTime(challenge)
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:
messages.warning(request, "Mauvais mot de passe")
context = {
'zone':zone,
'title': "Bienvenue dans la zone "+zone.nom,
'form': ZoneForm(),
}
elif zone_id == zone.code:
startChallengeTime(challenge)
@ -52,6 +59,7 @@ def displayZone(request, zone_id=None): @@ -52,6 +59,7 @@ def displayZone(request, zone_id=None):
context = {
'zone':zone,
'title': "Bienvenue dans la zone "+zone.nom,
'form': ZoneForm(),
}
else:
messages.warning(request, "Mauvaise zone ! vous devez vous rendre dans la zone "+zone.nom)
@ -93,10 +101,24 @@ def setEquipe(request): @@ -93,10 +101,24 @@ def setEquipe(request):
'form': LoginForm(),
}
else:
context = {
'zone': getMaxChallenge(Equipe.objects.get(code=request.session['equipe_code'])).zone.nom,
'equipe_nom': request.session['equipe_nom'],
}
equipe = Equipe.objects.get(code=request.session['equipe_code'])
max_rank = Challenge.objects.filter(equipe=equipe).aggregate(max_rank=Max("rank"))['max_rank']
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))
def dashboard(request):

Loading…
Cancel
Save