LP#1676608: provide DB update script to convert legacy copy alert messages
authorGalen Charlton <gmc@equinoxinitiative.org>
Thu, 22 Feb 2018 22:02:11 +0000 (17:02 -0500)
committerMike Rylander <mrylander@gmail.com>
Wed, 28 Feb 2018 15:26:44 +0000 (10:26 -0500)
Legacy copy alert messages are moved to new normal checkout and
normal checkin copy alerts. This patch also converts the foreign
key relationship from asset.copy_alert to asset.copy to a "fake"
one using a constraint trigger.

Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/sql/Pg/040.schema.asset.sql
Open-ILS/src/sql/Pg/800.fkeys.sql
Open-ILS/src/sql/Pg/950.data.seed-values.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.schema.copy_alerts.sql
Open-ILS/src/sql/Pg/upgrade/YYYY.data.stock_copy_alert_types.sql
Open-ILS/src/sql/Pg/upgrade/ZZZA.data.move_legacy_copy_alerts.sql [new file with mode: 0644]

index d17dcfa..24dda3c 100644 (file)
@@ -1065,7 +1065,7 @@ CREATE TABLE actor.copy_alert_suppress (
 CREATE TABLE asset.copy_alert (
     id      bigserial   primary key,
     alert_type  int     not null references config.copy_alert_type (id) on delete cascade,
-    copy        bigint  not null references asset.copy (id) on delete cascade,
+    copy        bigint  not null,
     temp        bool    not null default false,
     create_time timestamptz not null default now(),
     create_staff    bigint  not null references actor.usr (id) on delete set null,
index 5835ee3..c396119 100644 (file)
@@ -157,6 +157,22 @@ BEGIN
 END;
 $f$ LANGUAGE PLPGSQL VOLATILE COST 50;
 
+CREATE OR REPLACE FUNCTION evergreen.asset_copy_alert_copy_inh_fkey() RETURNS TRIGGER AS $f$
+BEGIN
+        PERFORM 1 FROM asset.copy WHERE id = NEW.copy;
+        IF NOT FOUND THEN
+                RAISE foreign_key_violation USING MESSAGE = FORMAT(
+                        $$Referenced asset.copy id not found, copy:%s$$, NEW.copy
+                );
+        END IF;
+        RETURN NEW;
+END;
+$f$ LANGUAGE PLPGSQL VOLATILE COST 50;
+
+CREATE CONSTRAINT TRIGGER inherit_asset_copy_alert_copy_fkey
+        AFTER UPDATE OR INSERT ON asset.copy_alert
+        DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.asset_copy_alert_copy_inh_fkey();
+
 CREATE CONSTRAINT TRIGGER inherit_asset_copy_tag_copy_map_copy_fkey
         AFTER UPDATE OR INSERT ON asset.copy_tag_copy_map
         DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.asset_copy_tag_copy_map_copy_inh_fkey();
index 44dba2d..ea80115 100644 (file)
@@ -17211,9 +17211,9 @@ VALUES (
 
 -- staff-usable alert types with no location awareness
 INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew)
-VALUES (1, 1, FALSE, 'Normal checkout', 'NORMAL', 'CHECKOUT', FALSE);
+VALUES (1, 1, TRUE, 'Normal checkout', 'NORMAL', 'CHECKOUT', FALSE);
 INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew)
-VALUES (2, 1, FALSE, 'Normal checkin', 'NORMAL', 'CHECKIN', FALSE);
+VALUES (2, 1, TRUE, 'Normal checkin', 'NORMAL', 'CHECKIN', FALSE);
 INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew)
 VALUES (3, 1, FALSE, 'Normal renewal', 'NORMAL', 'CHECKIN', TRUE);
 
index db4cd25..993b679 100644 (file)
@@ -69,6 +69,22 @@ CREATE TABLE config.copy_alert_type (
 );
 SELECT SETVAL('config.copy_alert_type_id_seq'::TEXT, 100);
 
+CREATE OR REPLACE FUNCTION evergreen.asset_copy_alert_copy_inh_fkey() RETURNS TRIGGER AS $f$
+BEGIN
+        PERFORM 1 FROM asset.copy WHERE id = NEW.copy;
+        IF NOT FOUND THEN
+                RAISE foreign_key_violation USING MESSAGE = FORMAT(
+                        $$Referenced asset.copy id not found, copy:%s$$, NEW.copy
+                );
+        END IF;
+        RETURN NEW;
+END;
+$f$ LANGUAGE PLPGSQL VOLATILE COST 50;
+
+CREATE CONSTRAINT TRIGGER inherit_asset_copy_alert_copy_fkey
+        AFTER UPDATE OR INSERT ON asset.copy_alert
+        DEFERRABLE FOR EACH ROW EXECUTE PROCEDURE evergreen.asset_copy_alert_copy_inh_fkey();
+
 CREATE TABLE actor.copy_alert_suppress (
     id          serial primary key,
     org         int not null references actor.org_unit (id) on delete cascade,
@@ -78,7 +94,7 @@ CREATE TABLE actor.copy_alert_suppress (
 CREATE TABLE asset.copy_alert (
     id      bigserial   primary key,
     alert_type  int     not null references config.copy_alert_type (id) on delete cascade,
-    copy        bigint  not null references asset.copy (id) on delete cascade,
+    copy        bigint  not null,
     temp        bool    not null default false,
     create_time timestamptz not null default now(),
     create_staff    bigint  not null references actor.usr (id) on delete set null,
index cc09016..ae79a9c 100644 (file)
@@ -2,9 +2,9 @@ BEGIN;
 
 -- staff-usable alert types with no location awareness
 INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew)
-VALUES (1, 1, FALSE, 'Normal checkout', 'NORMAL', 'CHECKOUT', FALSE);
+VALUES (1, 1, TRUE, 'Normal checkout', 'NORMAL', 'CHECKOUT', FALSE);
 INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew)
-VALUES (2, 1, FALSE, 'Normal checkin', 'NORMAL', 'CHECKIN', FALSE);
+VALUES (2, 1, TRUE, 'Normal checkin', 'NORMAL', 'CHECKIN', FALSE);
 INSERT INTO config.copy_alert_type (id, scope_org, active, name, state, event, in_renew)
 VALUES (3, 1, FALSE, 'Normal renewal', 'NORMAL', 'CHECKIN', TRUE);
 
diff --git a/Open-ILS/src/sql/Pg/upgrade/ZZZA.data.move_legacy_copy_alerts.sql b/Open-ILS/src/sql/Pg/upgrade/ZZZA.data.move_legacy_copy_alerts.sql
new file mode 100644 (file)
index 0000000..f430cbf
--- /dev/null
@@ -0,0 +1,23 @@
+BEGIN;
+
+--- SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+\qecho Copying copy alert messages to normal checkout copy alerts...
+INSERT INTO asset.copy_alert (alert_type, copy, note, create_staff)
+SELECT 1, id, alert_message, 1
+FROM asset.copy
+WHERE alert_message IS NOT NULL
+AND   alert_message <> '';
+
+\qecho Copying copy alert messages to normal checkin copy alerts...
+INSERT INTO asset.copy_alert (alert_type, copy, note, create_staff)
+SELECT 2, id, alert_message, 1
+FROM asset.copy
+WHERE alert_message IS NOT NULL
+AND   alert_message <> '';
+
+\qecho Clearing legacy copy alert field; this may take a while
+UPDATE asset.copy SET alert_message = NULL
+WHERE alert_message IS NOT NULL;
+
+COMMIT;