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