2
0
Fork 0

fix(fallback): use fractional part of setpoint as extra shift chance
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Luca 2024-05-20 18:40:19 +02:00
parent 7242ed2edd
commit fecdf70ac5
1 changed files with 18 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,23 @@ 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)
)
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 +182,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(