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