Generateurv2/backend/api/room/management/commands/challenge.py
2022-06-24 13:42:16 +02:00

60 lines
2.8 KiB
Python

from datetime import datetime
import functools
from django.core.management.base import BaseCommand, CommandError
import faker
import pytz
from room.models import Room, Parcours
import string
import random
import uuid
class Command(BaseCommand):
help = 'Closes the specified poll for voting'
def add_arguments(self, parser):
parser.add_argument('parcoursId', nargs='+', type=str)
parser.add_argument('number', nargs='+', type=int)
def handle(self, *args, **options):
try:
parcours = Parcours.objects.get(id_code=options['parcoursId'][0])
except:
raise CommandError(f'Parcours "{options["parcoursId"][0]}" does not exist')
participants = [*parcours.room.anonymousMembers, *
[{'code': u.id_code, 'nick': u.username, 'clientId': u.clientId} for u in parcours.room.userMembers.all()]]
new_challengers = parcours.challenger
if len(parcours.exercices) != 1:
maxNote = functools.reduce(lambda a, b:{'number': a['number'] + b['number']}, parcours.exercices )['number']
else:
maxNote = parcours.exercices[0]['number']
for i in range(options['number'][0]):
challenger = random.choice(participants)
if challenger['code'] in [n['code'] for n in new_challengers]:
index = [i for i, n in enumerate(
new_challengers) if n['code'] == challenger['code']][0]
while True:
code = ''.join(random.choices(string.ascii_uppercase, k=6))
if code not in [p['code'] for p in new_challengers[index]['exos']]:
break
now = datetime.now()
date = str(now.astimezone(pytz.timezone('Europe/Berlin')))
fake = faker.Faker()
date = str(fake.date_time_this_month())
new_challengers[index] = {
**new_challengers[index], 'exos': [*new_challengers[index]['exos'], {'result': [], 'endAt': date, 'timer': random.randint(1, parcours.timer * 60), 'note': {'value': random.randint(0, maxNote), 'total': maxNote, 'isTrust': True}, 'code': code}]}
else:
code = ''.join(random.choices(string.ascii_uppercase, k=6))
now = datetime.now()
date = str(now.astimezone(pytz.timezone('Europe/Berlin')))
fake = faker.Faker()
date = str(fake.date_time_this_month())
new_challengers.append({**challenger, 'validate': False, 'exos': [{'result': [], 'endAt': date, 'timer': random.randint(
1, parcours.timer * 60), 'note': {'value': random.randint(0, maxNote), 'total': maxNote, 'isTrust': True, }, 'code': code}]})
parcours.challenger = new_challengers
parcours.save()
self.stdout.write(self.style.SUCCESS(
f'Successfully added {options["number"][0]} challenges to parcours {options["parcoursId"][0]}'))