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()