Allow unclaiming of sponsor sessions even after they're approved
authorMagnus Hagander <magnus@hagander.net>
Wed, 11 Sep 2024 13:13:55 +0000 (15:13 +0200)
committerMagnus Hagander <magnus@hagander.net>
Wed, 11 Sep 2024 13:14:45 +0000 (15:14 +0200)
This just deletes the sessions, and also the speaker in case it had no
other sessions.

postgresqleu/confsponsor/benefitclasses/sponsorsession.py

index 36cbf31142c943d6f2280a01f1107e0a3447943f..90e29bada3f797cce68d38ec51acb322a72a3d9d 100644 (file)
@@ -1,6 +1,7 @@
 from django import forms
 from django.core.exceptions import ValidationError
 from django.utils import timezone
+from django.db import transaction
 
 import base64
 
@@ -173,11 +174,20 @@ class SponsorSession(BaseBenefit):
             return ''
 
     def can_unclaim(self, claimedbenefit):
-        if 'session' in claimedbenefit.claimjson:
-            # If we've already assigned a session to it, we can't unclaim it
-            return False
+        # We allow unclaiming even of approved sessions, and we'll just go delete them.
         return True
 
+    def process_unclaim(self, claimedbenefit):
+        if 'session' in claimedbenefit.claimjson:
+            with transaction.atomic():
+                speaker = Speaker.objects.get(pk=claimedbenefit.claimjson['speaker'])
+                if not speaker.conferencesession_set.exclude(pk=claimedbenefit.claimjson['session']).exists():
+                    # This speaker has no other sessions, so delete it
+                    speaker.delete()
+
+                # Session exists, so we must delete it.
+                ConferenceSession.objects.get(pk=claimedbenefit.claimjson['session']).delete()
+
     def validate_parameters(self):
         # Verify that the track being copied in actually exists
         if not Track.objects.filter(conference=self.level.conference, pk=self.params['track']).exists():