You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

280 lines
10 KiB

import random
from django.db.models import Max;
from django.http import HttpResponse
from django.template import loader
from django.contrib import admin
from django.conf import settings
from django.shortcuts import redirect
from django.contrib import messages
from .forms import *
from .models import *
from django.apps import apps
from .functions import *
from datetime import datetime
"""
Fonction displayZone
Cette vue permet de charger les données d'une zone
Si zone_id n'est pas fourni, cela affiche la première vue du jeu qui démarre le chrono de l'équipe
et qui
"""
def displayZone(request, zone_id=None):
if 'equipe_code' not in request.session:
return redirect('app:setEquipe')
equipe = Equipe.objects.get(code=request.session['equipe_code'])
template = loader.get_template('app/zone.html')
context = {
'zone':None
}
challenge = getMaxChallenge(equipe)
if zone_id is None:
messages.error(request, "Merci d'indiquer une zone à charger !")
else:
try:
zone = Zone.objects.filter(code=challenge.zone.code)[0]
if request.method == 'POST':
form = ZoneForm(request.POST)
if form.is_valid() and int(request.POST.get('code')) == zone.mdp:
zone.etat = 'L'
zone.save()
stopChallengeTime(challenge)
challenge = createChallenge(equipe)
if challenge == -1:
messages.warning(request, "Oups, aucune salle n'est disponible. Contactez l'administrateur !")
elif 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 <br/>"+zone.nom,
'form': ZoneForm(),
}
elif zone_id == zone.code:
startChallengeTime(challenge)
zone.etat = 'O'
zone.save()
context = {
'zone':zone,
'title': "Bienvenue dans la zone <br/>"+zone.nom,
'form': ZoneForm(),
}
else:
messages.warning(request, "Mauvaise zone ! vous devez vous rendre dans la zone "+zone.nom)
except Zone.DoesNotExist:
messages.error(request, "Cette zone n'existe pas !")
return HttpResponse(template.render(context, request))
"""
Fonction setEquipe
Fonction permettant d'enregistrer une équipe et de lui donner la prochaine zone de destination.
Lors de la première exécution, la fonction démarre le chrono de l'équipe.
"""
def setEquipe(request):
template = loader.get_template('app/setEquipe.html')
if 'equipe_code' not in request.session:
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
equipe = Equipe.objects.get(code=int(form.cleaned_data['equipe']))
request.session['equipe_code'] = equipe.code
request.session['equipe_nom'] = equipe.nom
challenge = getMaxChallenge(equipe)
if challenge is None:
startEquipeTime(equipe)
challenge = createChallenge(equipe)
context = {
'zone': challenge.zone.nom,
'equipe_nom': request.session['equipe_nom'],
}
else:
context = {
'form': LoginForm(request.POST),
}
else:
context = {
'form': LoginForm(),
}
else:
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 < getSettings().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 logout(request):
request.session.flush()
return redirect('app:setEquipe')
def dashboard(request):
if not request.user.is_authenticated & request.user.is_superuser:
return redirect("/admin/login/?next=/admin-dashboard")
template = loader.get_template('app/dashboard.html')
liste_equipe = Equipe.objects.all().order_by('nom')
liste_equipe_challenges = list()
for equipe in liste_equipe:
liste_challenges = Challenge.objects.filter(equipe=equipe).order_by('rank')
liste_affichage = list()
for challenge in liste_challenges:
affichage = {"class":"","text":""}
zone = Zone.objects.filter(code=challenge.zone.code)[0]
text = "<strong>"+zone.nom+"</strong><br/><u>Code :</u> "+str(zone.code)+"<br/><u>Mdp :</u> "+str(zone.mdp)
if challenge.start_time is not None and challenge.end_time is not None:#Challenge terminé
affichage["class"] = "table-success"
debut = datetime.strptime(challenge.start_time.strftime("%H:%M:%S"), "%H:%M:%S")
fin = datetime.strptime(challenge.end_time.strftime("%H:%M:%S"), "%H:%M:%S")
total_time = fin - debut
text = text+"<br/><u>Temps :</u> "+str(total_time)
elif challenge.start_time is not None and challenge.end_time is None:#Challenge en cours
affichage["class"] = "table-primary"
elif challenge.start_time is None and challenge.end_time is None:#Challenge attribué
affichage["class"] = "table-warning"
else:
affichage["class"] = ""
affichage["text"] = text
liste_affichage.append(affichage)
temps_equipe=""
if equipe.start_time is not None and equipe.end_time is not None:#EscapeGame terminé
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
temps_equipe = "<br/><u>Temps :</u> "+str(total_time)
data = {'equipe':equipe,'liste_affichage':liste_affichage,'temps_equipe':temps_equipe}
liste_equipe_challenges.append(data)
nb_challenges = list()
for i in range(getSettings().nb_challenges):
nb_challenges.append(i+1)
context = {
'title': "Dashboard",
'nb_challenges': nb_challenges,
'liste_equipe_challenges': liste_equipe_challenges
}
return HttpResponse(template.render(context, request))
def distances(request):
if request.method == 'POST':
for key, value in request.POST.items():
if key != 'csrfmiddlewaretoken':
zone1 = Zone.objects.filter(pk=key.split("_")[0])[0]
zone2 = Zone.objects.filter(pk=key.split("_")[1])[0]
if value == "":
value = 0
try:
distance = Distance.objects.filter(zone1=zone1,zone2=zone2)[0]
distance.distance = int(value)
distance.save()
except IndexError:
distance = Distance(zone1=zone1,zone2=zone2,distance=value)
distance.save()
try:
distance = Distance.objects.filter(zone1=zone2,zone2=zone1)[0]
distance.distance = int(value)
distance.save()
except IndexError:
distance = Distance(zone1=zone2,zone2=zone1,distance=value)
distance.save()
template = loader.get_template('app/distances.html')
liste_zones = Zone.objects.all().order_by("id")
data = list()
for zone_row in liste_zones:
row = list()
for zone_col in liste_zones:
if zone_col.id <= zone_row.id :
row.append({"class":"table-secondary","value":""})
else:
try:
distance = Distance.objects.filter(zone1=zone_row,zone2=zone_col)[0]
row.append({"class":"","value":distance.distance,"ref":str(zone_row.id)+"_"+str(zone_col.id)})
except IndexError:
row.append({"class":"","value":"","ref":str(zone_row.id)+"_"+str(zone_col.id)})
data.append({"zone":zone_row,"distances":row})
context = {
'data':data,
'title': "Gestion des distances",
}
return HttpResponse(template.render(context, request))
def settings(request):
template = loader.get_template('app/settings.html')
if request.method == 'POST':
form = SettingsForm(request.POST)
if form.is_valid():
settings = getSettings()
if settings is None:
settings = Settings(nb_challenges = int(form.cleaned_data['nb_challenges']))
settings.save()
else:
settings.nb_challenges = int(form.cleaned_data['nb_challenges'])
settings.save()
try:
settings = Settings.objects.all()[0]
initial_values = {
"nb_challenges":settings.nb_challenges,
}
context = {
'form': SettingsForm(initial = initial_values),
'title': "Paramètres",
}
except IndexError:
context = {
'form': SettingsForm(),
'title': "Paramètres",
}
return HttpResponse(template.render(context, request))
"""
Fonction createNewGame
Cette fonction efface les challenges présents en base pour en créer de nouveaux pour chacune des équipes
"""
def createNewGame(request):
#On efface les challenges existants
Challenge.objects.all().delete()
#On libère toutes les zones
liste_zone = Zone.objects.all()
for zone in liste_zone.iterator():
zone.etat='L'
zone.save()
liste_equipe = Equipe.objects.all()
for equipe in liste_equipe.iterator():
equipe.start_time=None
equipe.end_time=None
equipe.save()
#On vérifie que le nombre de zones soit au moins égal au nombre d'équipe +1
if len(liste_zone) < len(liste_equipe)+1:
messages.error(request, "Pas assez de zone pour créer un nouveau jeu")
else:
messages.info(request, 'Création du jeu OK.')
return redirect('app:admin-dashboard')