@@ -161,6 +161,7 @@ class Sponsorship(models.Model):
161161 status = models .CharField (
162162 max_length = 20 , choices = STATUS_CHOICES , default = APPLIED , db_index = True
163163 )
164+ locked = models .BooleanField (default = False )
164165
165166 start_date = models .DateField (null = True , blank = True )
166167 end_date = models .DateField (null = True , blank = True )
@@ -211,6 +212,12 @@ def __str__(self):
211212 repr += f" [{ start } - { end } ]"
212213 return repr
213214
215+ def save (self , * args , ** kwargs ):
216+ if "locked" not in kwargs .get ("update_fields" , []):
217+ if self .status != self .APPLIED :
218+ self .locked = True
219+ return super ().save (* args , ** kwargs )
220+
214221 @classmethod
215222 @transaction .atomic
216223 def new (cls , sponsor , benefits , package = None , submited_by = None ):
@@ -287,6 +294,7 @@ def reject(self):
287294 msg = f"Can't reject a { self .get_status_display ()} sponsorship."
288295 raise InvalidStatusException (msg )
289296 self .status = self .REJECTED
297+ self .locked = True
290298 self .rejected_on = timezone .now ().date ()
291299
292300 def approve (self , start_date , end_date ):
@@ -297,6 +305,7 @@ def approve(self, start_date, end_date):
297305 msg = f"Start date greater or equal than end date"
298306 raise SponsorshipInvalidDateRangeException (msg )
299307 self .status = self .APPROVED
308+ self .locked = True
300309 self .start_date = start_date
301310 self .end_date = end_date
302311 self .approved_on = timezone .now ().date ()
@@ -320,6 +329,10 @@ def rollback_to_editing(self):
320329 self .approved_on = None
321330 self .rejected_on = None
322331
332+ @property
333+ def unlocked (self ):
334+ return not self .locked
335+
323336 @property
324337 def verified_emails (self ):
325338 emails = [self .submited_by .email ]
@@ -353,7 +366,7 @@ def added_benefits(self):
353366
354367 @property
355368 def open_for_editing (self ):
356- return self .status == self .APPLIED
369+ return ( self .status == self .APPLIED ) or ( self . unlocked )
357370
358371 @property
359372 def next_status (self ):
0 commit comments