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.
278 lines
10 KiB
278 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 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')
|
|
|