From 7e9b23d4a12dd88ddafdf815caf067cd5ba1693c Mon Sep 17 00:00:00 2001 From: Midgard Date: Sat, 25 Jul 2020 18:28:04 +0200 Subject: [PATCH 1/4] Remove hardcoded "A" and "I" These stand for "admitted" and "interested", but we have constants for that. Also: fix a typo, remove cargo culted `.all()`, use saner indentation. --- events/tasks.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/events/tasks.py b/events/tasks.py index 6f24540..54eb9d5 100644 --- a/events/tasks.py +++ b/events/tasks.py @@ -6,11 +6,14 @@ from events.models import Event, EventRegistration from users.models import CustomUser -def calc_score(user: CustomUser): - registrations_last_month = EventRegistration.objects.all().filter(user_id=user.id, - event__date__gt=date.today() - timedelta(days=30), - event__date__lte=date.today(), - state__exact='A') +def calc_score(user: CustomUser, for_date): + registrations_last_month = EventRegistration.objects.filter( + user_id=user.id, + event__date__gt=for_date - timedelta(days=30), + event__date__lte=for_date, + state=EventRegistration.ADMITTED + ) + score = 0 for r in registrations_last_month: days_ago = (date.today() - r.event.date.date()).days @@ -22,7 +25,7 @@ def calc_score(user: CustomUser): @app.task(bind=True) def assign_reservations(self): """ - Chech if there are any events the next day. + Check if there are any events tomorrow. If so, calculate the current score for every interested user and assign the ones with the lowest scores. :param self: :return: @@ -33,9 +36,10 @@ def assign_reservations(self): events = Event.objects.all().filter(date__date=date.today() + timedelta(days=1)) # Reservations - registrations: List[EventRegistration] = EventRegistration.objects.all().filter( + registrations: List[EventRegistration] = EventRegistration.objects.filter( event_id__in=map(lambda event: event.id, events), - state__exact='I') + state=EventRegistration.INTERESTED) + if len(registrations) == 0: print("NO REGISTRATIONS?") -- 2.43.4 From c25356594a3709056849babeae7b48e8c67822af Mon Sep 17 00:00:00 2001 From: Midgard Date: Sat, 25 Jul 2020 21:23:46 +0200 Subject: [PATCH 2/4] Fix multiple problems in event place assignment --- events/tasks.py | 53 +++++++++++++++++++++++++++++++------------------ events/views.py | 3 ++- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/events/tasks.py b/events/tasks.py index 54eb9d5..ffa9e38 100644 --- a/events/tasks.py +++ b/events/tasks.py @@ -6,11 +6,11 @@ from events.models import Event, EventRegistration from users.models import CustomUser -def calc_score(user: CustomUser, for_date): +def calc_score(user: CustomUser): registrations_last_month = EventRegistration.objects.filter( user_id=user.id, - event__date__gt=for_date - timedelta(days=30), - event__date__lte=for_date, + event__date__gt=date.today() - timedelta(days=30), + event__date__lte=date.today(), state=EventRegistration.ADMITTED ) @@ -30,37 +30,52 @@ def assign_reservations(self): :param self: :return: """ - print("Assigning reservations") - print("======================") + out = [] + # Get all events of tomorrow - events = Event.objects.all().filter(date__date=date.today() + timedelta(days=1)) + events = Event.objects.filter(date=date.today() + timedelta(days=1)) + + out.append(f"{len(events) if events else 'Geen'} event(s)") # Reservations registrations: List[EventRegistration] = EventRegistration.objects.filter( - event_id__in=map(lambda event: event.id, events), - state=EventRegistration.INTERESTED) + event_id__in=map(lambda event: event.id, events)) - if len(registrations) == 0: - print("NO REGISTRATIONS?") + out.append(f"{len(registrations) if registrations else 'Geen'} registratie(s)") + out.append("") # Relevant users - users = set(map(lambda r: r.user, registrations)) + users = [r.user for r in registrations if r.state == EventRegistration.INTERESTED] scores = list(map(calc_score, users)) queue = sorted(list(zip(users, scores)), key=lambda tup: tup[1]) - print(f"Scores: {scores}") - print(f"Queue: {queue}") + out.append("Prioriteiten: " + ", ".join(f"{u.username} ({s})" for u, s in queue)) + out.append("") for event in events: - print(f"EVENT: {event.date} - {event.capacity}") - event_registrations = list(filter(lambda r: r.event == event, registrations)) - event_users = set(map(lambda r: r.user, event_registrations)) - event_queue = list(filter(lambda element: element[0] in event_users, queue)) + registrations = [r for r in registrations if r.event == event] - for user in event_queue[0:event.capacity]: - print(f"Selected {user[0]}") + already_admitted_regs = [r for r in registrations if r.state == EventRegistration.ADMITTED] + left = max(event.capacity - sum(1 for r in already_admitted_regs), 0) + + moment_str = Event.TIME_SLOTS[event.time] + out.append(f"• Event: {event.date}, {moment_str}. Vrije plaatsen: {left}/{event.capacity}") + for reg in already_admitted_regs: + out.append(f" = {reg.user.username}") + + interested_users = {r.user for r in registrations + if r.state == EventRegistration.INTERESTED} + user_queue = list(filter(lambda element: element[0] in interested_users, queue)) + + for user in user_queue[0:left]: + out.append(f" + {user[0].username}") r = EventRegistration.objects.get( event_id=event.id, user_id=user[0].id ) r.state = EventRegistration.ADMITTED r.save() + left -= 1 + + out.append(f" → Vrije plaatsen: {left}/{event.capacity}") + + return "\n".join(out) diff --git a/events/views.py b/events/views.py index a896dee..6d83df3 100644 --- a/events/views.py +++ b/events/views.py @@ -22,7 +22,8 @@ def index(request): def view_score_stuff(request): return HttpResponse( - assign_reservations() + assign_reservations(), + content_type="text/plain; charset=utf-8" ) -- 2.43.4 From a37e59ed024f1c3d3a6b62bcbbcda2c5da51c0ef Mon Sep 17 00:00:00 2001 From: Midgard Date: Sat, 25 Jul 2020 21:25:39 +0200 Subject: [PATCH 3/4] Remove /test endpoint --- events/urls.py | 1 - events/views.py | 7 ------- 2 files changed, 8 deletions(-) diff --git a/events/urls.py b/events/urls.py index b476340..812d2d2 100644 --- a/events/urls.py +++ b/events/urls.py @@ -7,5 +7,4 @@ urlpatterns = [ path("", views.index, name="index"), path("/register", views.register, name="register"), path("/deregister", views.deregister, name="deregister"), - path("test/", views.view_score_stuff, name="score_stuff"), ] diff --git a/events/views.py b/events/views.py index 6d83df3..7f093f3 100644 --- a/events/views.py +++ b/events/views.py @@ -20,13 +20,6 @@ def index(request): return render(request, "events/index.html", {"events": events_data}) -def view_score_stuff(request): - return HttpResponse( - assign_reservations(), - content_type="text/plain; charset=utf-8" - ) - - def register(request, event_id): if request.method != "POST": return HttpResponse(status_code=405) -- 2.43.4 From bd714538dfde34f439e1ec6136bdb696b3dbc3b6 Mon Sep 17 00:00:00 2001 From: Midgard Date: Sat, 25 Jul 2020 21:26:58 +0200 Subject: [PATCH 4/4] Convert back to print since not needed on web any more --- events/tasks.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/events/tasks.py b/events/tasks.py index ffa9e38..3a28805 100644 --- a/events/tasks.py +++ b/events/tasks.py @@ -30,26 +30,24 @@ def assign_reservations(self): :param self: :return: """ - out = [] - # Get all events of tomorrow events = Event.objects.filter(date=date.today() + timedelta(days=1)) - out.append(f"{len(events) if events else 'Geen'} event(s)") + print(f"{len(events) if events else 'Geen'} event(s)") # Reservations registrations: List[EventRegistration] = EventRegistration.objects.filter( event_id__in=map(lambda event: event.id, events)) - out.append(f"{len(registrations) if registrations else 'Geen'} registratie(s)") - out.append("") + print(f"{len(registrations) if registrations else 'Geen'} registratie(s)") + print("") # Relevant users users = [r.user for r in registrations if r.state == EventRegistration.INTERESTED] scores = list(map(calc_score, users)) queue = sorted(list(zip(users, scores)), key=lambda tup: tup[1]) - out.append("Prioriteiten: " + ", ".join(f"{u.username} ({s})" for u, s in queue)) - out.append("") + print("Prioriteiten: " + ", ".join(f"{u.username} ({s})" for u, s in queue)) + print("") for event in events: registrations = [r for r in registrations if r.event == event] @@ -58,16 +56,16 @@ def assign_reservations(self): left = max(event.capacity - sum(1 for r in already_admitted_regs), 0) moment_str = Event.TIME_SLOTS[event.time] - out.append(f"• Event: {event.date}, {moment_str}. Vrije plaatsen: {left}/{event.capacity}") + print(f"• Event: {event.date}, {moment_str}. Vrije plaatsen: {left}/{event.capacity}") for reg in already_admitted_regs: - out.append(f" = {reg.user.username}") + print(f" = {reg.user.username}") interested_users = {r.user for r in registrations if r.state == EventRegistration.INTERESTED} user_queue = list(filter(lambda element: element[0] in interested_users, queue)) for user in user_queue[0:left]: - out.append(f" + {user[0].username}") + print(f" + {user[0].username}") r = EventRegistration.objects.get( event_id=event.id, user_id=user[0].id @@ -76,6 +74,4 @@ def assign_reservations(self): r.save() left -= 1 - out.append(f" → Vrije plaatsen: {left}/{event.capacity}") - - return "\n".join(out) + print(f" → Vrije plaatsen: {left}/{event.capacity}") -- 2.43.4