agendas: fix pg function set_ignore_reason on desk deletion (#66374)

This commit is contained in:
Lauréline Guérin 2022-06-17 17:14:46 +02:00
parent b64dc05083
commit 8d7abfc5ca
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
3 changed files with 54 additions and 10 deletions

View File

@ -0,0 +1,45 @@
import os
from django.db import migrations, transaction
from django.db.utils import InternalError, OperationalError, ProgrammingError
with open(
os.path.join(
os.path.dirname(os.path.realpath(__file__)),
'..',
'sql',
'event_triggers_for_tstzrange_constraint.sql',
)
) as sql_file:
sql_forwards = sql_file.read()
class Migration(migrations.Migration):
dependencies = [
('agendas', '0127_remove_pricing_models'),
]
operations = [
migrations.RunSQL(sql=sql_forwards, reverse_sql=migrations.RunSQL.noop),
]
def _check_db(self, project_state, schema_editor):
try:
with transaction.atomic():
try:
# will fail if extension does not exist and can not be created
schema_editor.execute('CREATE EXTENSION IF NOT EXISTS btree_Gist SCHEMA public')
except (OperationalError, ProgrammingError):
# if no extension, do not create trigger
return project_state
except InternalError:
return project_state
def apply(self, project_state, schema_editor, *args, **kwargs):
result = self._check_db(project_state, schema_editor)
return result or super().apply(project_state, schema_editor, *args, **kwargs)
def unapply(self, project_state, schema_editor, *args, **kwargs):
result = self._check_db(project_state, schema_editor)
return result or super().unapply(project_state, schema_editor, *args, **kwargs)

View File

@ -6,18 +6,17 @@ CREATE OR REPLACE FUNCTION set_ignore_reason() RETURNS TRIGGER AS $$
UPDATE agendas_event SET _ignore_reason = 'cancel' WHERE id = NEW.event_id;
END IF;
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
UPDATE agendas_event SET _ignore_reason = 'delete' WHERE id = OLD.event_id;
RETURN OLD;
ELSE
PERFORM 1 FROM agendas_booking b WHERE b.event_id = OLD.event_id AND b.cancellation_datetime IS NOT NULL;
PERFORM 1 FROM agendas_booking b WHERE b.event_id = NEW.event_id AND b.cancellation_datetime IS NOT NULL;
IF FOUND THEN
UPDATE agendas_event SET _ignore_reason = 'cancel' WHERE id = OLD.event_id;
UPDATE agendas_event SET _ignore_reason = 'cancel' WHERE id = NEW.event_id;
ELSE
UPDATE agendas_event SET _ignore_reason = NULL WHERE id = OLD.event_id;
END IF;
IF (TG_OP = 'UPDATE') THEN
RETURN NEW;
ELSE
RETURN OLD;
UPDATE agendas_event SET _ignore_reason = NULL WHERE id = NEW.event_id;
END IF;
RETURN NEW;
END IF;
END;
$$ LANGUAGE plpgsql;

View File

@ -53,9 +53,9 @@ def test_event_ignore_reason():
Booking.objects.update(cancellation_datetime=now())
check_ignore_reason(event, 'cancel')
Booking.objects.first().delete()
check_ignore_reason(event, 'cancel')
check_ignore_reason(event, 'delete')
Booking.objects.all().delete()
check_ignore_reason(event, None)
check_ignore_reason(event, 'delete')
def test_event_end_datetime():