Skip to content

Commit 8d5c614

Browse files
committed
adjust queries and template
1 parent b228565 commit 8d5c614

File tree

4 files changed

+28
-15
lines changed

4 files changed

+28
-15
lines changed

ephios/core/models/events.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -546,8 +546,9 @@ def save(self, *args, **kwargs):
546546
# Currently, this permission does not get removed automatically.
547547
assign_perm("core.view_event", user_or_group=self.user, obj=self.shift.event)
548548

549-
@property
549+
@cached_property
550550
def participant(self):
551+
# pylint: disable=invalid-overridden-method
551552
return self.user.as_participant()
552553

553554
class Meta:

ephios/core/services/matching.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from ephios.core.services.qualification import QualificationUniverse
1010
from ephios.core.signup.participants import AbstractParticipant
1111

12+
# pylint: disable=too-many-instance-attributes too-many-locals
13+
1214

1315
@dataclasses.dataclass(unsafe_hash=True)
1416
class Position:
@@ -123,24 +125,25 @@ def score_pairing(
123125
# (similar for prefers and skill level). It can be arbitrarily big, but must be at least bigger than the sum of
124126
# all the other constants used in the score.
125127
padded_participant_count = 10 + 2 * number_of_participants
126-
base_score = 1.0
128+
base_score = 5.0
127129
preferred_value = 3.0
128130
max_aux_value = 2.0
129131
confirmed_value = 2.0
130132
max_skill_value = 1.0
131133
required_value = padded_participant_count * sum(
132134
(base_score, preferred_value, max_skill_value, confirmed_value, max_aux_value)
133135
)
134-
designated_unqualified_value = required_value**2
136+
designated_unqualified_value = required_value * required_value
135137
designated_and_qualified_value = 2 * designated_unqualified_value
136-
undesignated_unqualified_value = designated_unqualified_value**2
138+
undesignated_unqualified_value = designated_unqualified_value * designated_unqualified_value
137139

138-
is_designated = participant in position.designated_for
139140
# optimally, we should reject a pairing for a participant designated for another position,
140141
# but we don't have that info here.
142+
is_designated = participant in position.designated_for
143+
141144
is_qualified = position.required_skill <= participant.skill
142145

143-
if not is_designated and not is_qualified:
146+
if not is_designated and (not is_qualified or position.designation_only):
144147
# the participant does not have some required skill
145148
return -undesignated_unqualified_value # avoid matching unqualified participants
146149

@@ -177,7 +180,9 @@ def match_participants_to_positions(
177180
) -> Matching:
178181
participants = list(participants)
179182
positions = list(positions)
180-
confirmed_participants = list(confirmed_participants) if confirmed_participants else []
183+
confirmed_participants = (
184+
frozenset(confirmed_participants) if confirmed_participants else frozenset()
185+
)
181186
costs = csr_matrix(
182187
[
183188
[

ephios/plugins/complexsignup/structure.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -320,8 +320,10 @@ def _search_block(
320320
composed_label: Optional[str] = None,
321321
): # pylint: disable=too-many-locals
322322
required_here = set(required_qualifications)
323-
for requirement in block.qualification_requirements.filter(everyone=True):
324-
# at least one is not supported
323+
for requirement in block.qualification_requirements.all():
324+
if not requirement.everyone:
325+
# at least one is not supported
326+
raise ValueError("unsupported requirement")
325327
required_here |= set(requirement.qualifications.all())
326328

327329
all_positions = []
@@ -343,11 +345,16 @@ def _search_block(
343345
"signup_stats": SignupStats.ZERO,
344346
}
345347
if block.is_composite():
346-
for composition in block.sub_blocks.through.objects.filter(
347-
composite_block=block
348-
).prefetch_related(
349-
"sub_block__positions__qualifications",
350-
"sub_block__qualification_requirements__qualifications",
348+
for composition in (
349+
block.sub_compositions.all()
350+
.select_related(
351+
"sub_block",
352+
)
353+
.prefetch_related(
354+
"sub_block__positions__qualifications",
355+
"sub_block__qualification_requirements__qualifications",
356+
"sub_block__sub_compositions",
357+
)
351358
):
352359
positions, sub_structure = _search_block(
353360
block=composition.sub_block,

ephios/plugins/complexsignup/templates/complexsignup/shift_state.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
{% block groups %}
55
{% include "complexsignup/shift_state_block.html" with current=structure flatten=False %}
66
{% if matching.unpaired_participations %}
7-
<div class="row">
7+
<div class="row mt-3">
88
<div class="col-12 order-sm-1 col-sm-auto text-body-secondary">
99
{% translate "unassigned" %}
1010
</div>

0 commit comments

Comments
 (0)