Skip to content

Commit 0bb73ff

Browse files
committed
Allow editing package benefits from package form
1 parent ad636fe commit 0bb73ff

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

apps/sponsors/manage/forms.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,12 @@ def __init__(self, *args, **kwargs):
102102
class SponsorshipPackageManageForm(forms.ModelForm):
103103
"""Form for creating and editing sponsorship packages."""
104104

105+
benefits = forms.ModelMultipleChoiceField(
106+
queryset=SponsorshipBenefit.objects.none(),
107+
required=False,
108+
widget=forms.CheckboxSelectMultiple(),
109+
)
110+
105111
class Meta:
106112
"""Meta options."""
107113

@@ -114,6 +120,7 @@ class Meta:
114120
"logo_dimension",
115121
"year",
116122
"allow_a_la_carte",
123+
"benefits",
117124
]
118125
widgets = {
119126
"name": forms.TextInput(
@@ -131,12 +138,36 @@ class Meta:
131138
}
132139

133140
def __init__(self, *args, **kwargs):
134-
"""Initialize form with year choices."""
141+
"""Initialize form with year choices and year-specific benefits."""
135142
super().__init__(*args, **kwargs)
136143
self.fields["year"].widget = forms.Select(
137144
choices=[("", "---"), *year_choices()],
138145
attrs={"style": "padding:8px 12px;border:1px solid #ccc;border-radius:4px;font-size:14px;"},
139146
)
147+
filter_year = None
148+
if self.is_bound and self.data.get(self.add_prefix("year")):
149+
filter_year = self.data.get(self.add_prefix("year"))
150+
elif self.instance and self.instance.year:
151+
filter_year = self.instance.year
152+
elif self.initial.get("year"):
153+
filter_year = self.initial["year"]
154+
else:
155+
with contextlib.suppress(SponsorshipCurrentYear.DoesNotExist):
156+
filter_year = SponsorshipCurrentYear.get_year()
157+
158+
if filter_year:
159+
self.fields["benefits"].queryset = (
160+
SponsorshipBenefit.objects.filter(year=filter_year)
161+
.select_related("program")
162+
.order_by("program__order", "order", "name")
163+
)
164+
if self.instance and self.instance.pk:
165+
self.initial.setdefault("benefits", self.instance.benefits.values_list("pk", flat=True))
166+
167+
def _save_m2m(self):
168+
"""Persist reverse benefit associations after the package is saved."""
169+
super()._save_m2m()
170+
self.instance.benefits.set(self.cleaned_data["benefits"])
140171

141172

142173
class CloneYearForm(forms.Form):

apps/sponsors/templates/sponsors/manage/package_form.html

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,26 @@ <h2 style="font-size:18px;font-weight:700;color:#1a1a2e;margin:0 0 4px;">
9090
</div>
9191
</fieldset>
9292

93+
<fieldset class="manage-fieldset">
94+
<legend>Included Benefits</legend>
95+
<div class="form-group" style="margin-bottom:0;">
96+
<label for="id_benefits">
97+
Benefits{% if not is_create and benefit_count %} <span class="tag tag-blue">{{ benefit_count }}</span>{% endif %}
98+
</label>
99+
{% if form.fields.benefits.queryset %}
100+
<div class="checkbox-list">
101+
{% for checkbox in form.benefits %}
102+
{{ checkbox }}
103+
{% endfor %}
104+
</div>
105+
<span class="helptext">Checked benefits are included in this package. Uncheck to remove them.</span>
106+
{% else %}
107+
<p style="margin:0;color:#777;font-size:13px;">No benefits are available for the selected year yet.</p>
108+
{% endif %}
109+
{% if form.benefits.errors %}<div class="field-errors">{{ form.benefits.errors.0 }}</div>{% endif %}
110+
</div>
111+
</fieldset>
112+
93113
<div style="display:flex;gap:10px;align-items:center;padding-top:8px;">
94114
<button type="submit" class="btn btn-primary">
95115
{% if is_create %}Create Package{% else %}Save Changes{% endif %}

0 commit comments

Comments
 (0)