2
0
Fork 0

Compare commits

..

2 Commits

Author SHA1 Message Date
Luca 99285186e5 fix(fallback): missing conversion from float to int
continuous-integration/drone/push Build is passing Details
2024-05-20 18:44:36 +02:00
Luca fecdf70ac5 fix(fallback): use fractional part of setpoint as extra shift chance
continuous-integration/drone/push Build is passing Details
2024-05-20 18:40:19 +02:00
1 changed files with 19 additions and 7 deletions

View File

@ -2,7 +2,9 @@ import math
import secrets
from base64 import urlsafe_b64encode
from datetime import datetime, time
from random import random
import sentry_sdk
from django.db.models import Count, Exists, ExpressionWrapper, Max, OuterRef, Sum
from django.db.models.fields import DateTimeField
from django.db.models.lookups import LessThan
@ -74,17 +76,24 @@ class TeamMember(models.Model):
free_slot_count = free_bucket.annotate(
needed_helpers=F("required_helpers") - F("fallback_count")
).aggregate(sum=Sum("needed_helpers"))["sum"]
active_team_members = (
TeamMember.objects.filter(~Q(fallback_shifts=None)).count() + 1
)
quota = global_preferences["helper__fallback_quota"]
number_of_team_members = TeamMember.objects.count()
max_shifts_per_member = math.ceil(
total_slot_count / max((number_of_team_members * quota), 1)
max_shifts_per_member = total_slot_count / max(
number_of_team_members * quota, 1
)
shifts_per_member = math.ceil(total_slot_count / (active_team_members))
shift_count = min(max_shifts_per_member, shifts_per_member)
active_team_members = (
TeamMember.objects.filter(~Q(fallback_shifts=None)).count() + 1
)
shifts_per_member = total_slot_count / active_team_members
extra_chance, shift_count = math.modf(
min(max_shifts_per_member, shifts_per_member)
)
shift_count = int(shift_count)
if extra_chance > random():
shift_count += 1
blocked_times = []
for shift in self.fallback_shifts.all():
@ -174,6 +183,9 @@ class TeamMember(models.Model):
break
if not assignment:
print("could not find any matching assignments to take away")
sentry_sdk.capture_message(
"could not find any matching assignments to take away"
)
return
shifts_needed -= 1
blocked_times.append(