When a sponsorship benefit is unclaimed, delete the attached data
authorMagnus Hagander <magnus@hagander.net>
Wed, 3 Sep 2025 19:52:04 +0000 (21:52 +0200)
committerMagnus Hagander <magnus@hagander.net>
Wed, 3 Sep 2025 20:01:58 +0000 (22:01 +0200)
If an image or a file is attached to the benefit, it should be deleted.

postgresqleu/confsponsor/benefitclasses/base.py
postgresqleu/confsponsor/benefitclasses/fileupload.py
postgresqleu/confsponsor/benefitclasses/imageupload.py
postgresqleu/confsponsor/views.py
postgresqleu/util/storage.py

index d37cfa6449f72d3a4ba276d459256a757917a19d..6f0dcbf8510757cd61fe3cc82cdf8d49395f6642 100644 (file)
@@ -40,6 +40,9 @@ class BaseBenefit(object):
     def process_unclaim(self, claim):
         pass
 
+    def delete_claimed_benefit(self, claim):
+        claim.delete()
+
     def validate_parameters(self):
         pass
 
index 3940628d646cd3cbc0615d4726b3b2397c051332..f80e86db022ca6934e356be9780c2fef2f232b1f 100644 (file)
@@ -151,3 +151,7 @@ class FileUpload(BaseBenefit):
         resp['ETag'] = '"{}"'.format(hashval)
         resp.write(data)
         return resp
+
+    def delete_claimed_benefit(self, claim):
+        InlineEncodedStorage('benefit_file').delete(claim.id)
+        super().delete_claimed_benefit(claim)
index 344bb3682013540f7124e3fb635a3547bfd8433f..a9cce79bab773a862eddb1bcbac0955c7bb42e20 100644 (file)
@@ -171,3 +171,7 @@ class ImageUpload(BaseBenefit):
         resp['ETag'] = '"{}"'.format(hashval)
         resp.write(data)
         return resp
+
+    def delete_claimed_benefit(self, claim):
+        InlineEncodedStorage('benefit_image').delete(claim.id)
+        super().delete_claimed_benefit(claim)
index 0da8c0bfcddf0f234ad35db0180e4b428dd38114..15621908ed53ac17a581bc70547cb247badbccf6 100644 (file)
@@ -1108,7 +1108,8 @@ def _unclaim_benefit(request, claimed_benefit):
         # itself.
         if claimed_benefit.confirmed:
             benefitclass.process_unclaim(claimed_benefit)
-        claimed_benefit.delete()
+        benefitclass.delete_claimed_benefit(claimed_benefit)
+
         # If this was a multiclaim we will need to renumber the existing ones
         exec_no_result("WITH  t AS (SELECT id, row_number() OVER (ORDER BY claimnum) AS r FROM confsponsor_sponsorclaimedbenefit WHERE benefit_id=%(bid)s) UPDATE confsponsor_sponsorclaimedbenefit SET claimnum=r FROM t WHERE confsponsor_sponsorclaimedbenefit.id=t.id", {
             'bid': benefit.pk,
index 243ca3c93039da30f93b866fe596386a7c9eed87..f2924f66aa223a2d5531cff35b774f1f916da3aa 100644 (file)
@@ -47,6 +47,13 @@ class InlineEncodedStorage(object):
             'id': name,
         })
 
+    def delete(self, name):
+        curs = connection.cursor()
+        curs.execute("DELETE FROM util_storage WHERE key=%(key)s AND storageid=%(id)s", {
+            'key': self.key,
+            'id': name,
+        })
+
 
 def inlineencoded_upload_path(instance, filename):
     # Needs to exist for old migrations, but *NOT* in use