@@ -102,6 +102,12 @@ def __init__(self, *args, **kwargs):
102102class 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
142173class CloneYearForm (forms .Form ):
0 commit comments