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.
 
 
 

88 lines
3.0 KiB

from .models import *
from django.db.models import Max;
from django.apps import apps
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
except Challenge.DoesNotExist:
return None
"""
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):
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(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(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
print("max_id "+str(max_id))
pk = random.randint(1, max_id)
zone = Zone.objects.get(pk=pk)
zone.etat = 'A'
zone.save()
return zone
else:
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:
equipe.start_time = datetime.now()
equipe.save()
def stopEquipeTime(equipe):
if equipe.end_time is None:
equipe.end_time = datetime.now()
equipe.save()
def startChallengeTime(challenge):
if challenge.start_time is None:
challenge.start_time = datetime.now()
challenge.save()
def stopChallengeTime(challenge):
if challenge.end_time is None:
challenge.end_time = datetime.now()
challenge.save()