agendas: fix pg function set_ignore_reason on desk deletion (#66374)
This commit is contained in:
parent
b64dc05083
commit
8d7abfc5ca
|
@ -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)
|
|
@ -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;
|
||||
|
|
|
@ -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():
|
||||
|
|
Loading…
Reference in New Issue