Let referee levels inherit from a lower level instead of relying on ordering alone
RefereeLevel.inherits_from chains levels together so a higher tier is automatically eligible for everything a linked lower tier covers, transitively, without hand-duplicating teams onto every level. Kept the ordering field (still drives display order) but eligibility everywhere (RefereeProfile.eligible_teams, events.services.referees, the team detail page's eligible-referees list) now reads through RefereeLevel.eligible_team_ids, which walks the inherits_from chain. clean() rejects a loop, including an indirect one. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ECGMEwrc2k4D8VQuwjstj9
This commit is contained in:
@@ -56,12 +56,17 @@ class GroupForm(forms.ModelForm):
|
||||
class RefereeLevelForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = RefereeLevel
|
||||
fields = ["name", "ordering", "teams"]
|
||||
fields = ["name", "ordering", "teams", "inherits_from"]
|
||||
widgets = {"teams": forms.SelectMultiple(attrs={"data-searchable": "true", "data-search-placeholder": _("Type a team to search...")})}
|
||||
|
||||
def __init__(self, *args, club=None, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields["teams"].queryset = Team.objects.filter(club=club)
|
||||
# Excludes self from the dropdown -- self.instance always has a pk (UUIDModel
|
||||
# gets its default at construction, not at save()), so this also works for a
|
||||
# brand-new, unsaved level. clean() still catches an indirect loop (A -> B -> A).
|
||||
self.fields["inherits_from"].queryset = RefereeLevel.objects.filter(club=club).exclude(pk=self.instance.pk)
|
||||
self.fields["inherits_from"].empty_label = _("— none —")
|
||||
|
||||
|
||||
class MemberRefereeEligibilityForm(forms.ModelForm):
|
||||
|
||||
Reference in New Issue
Block a user