diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py index 75be797753f76263f52941fd1c3cafbc7cb38c63..295bcdede7fb390ebb32dfdce877c37b0a005da8 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb.py @@ -68,7 +68,14 @@ class RADatabase: port=self.dbcreds.port, connect_timeout=5) self.cursor = self.conn.cursor(cursor_factory = psycopg2.extras.RealDictCursor) - self.conn.notices = collections.deque() + + # see http://initd.org/psycopg/docs/connection.html#connection.notices + # try to set the notices attribute with a non-list collection, + # so we can log more than 50 messages. Is only available since 2.7, so encapsulate in try/except. + try: + self.conn.notices = collections.deque() + except TypeError: + logger.warning("Cannot overwrite self.conn.notices with a deque... only max 50 notifications available per query. (That's ok, no worries.)") def _queryAsSingleLine(self, query, qargs=None): line = ' '.join(query.replace('\n', ' ').split()) diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_functions_and_triggers.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_functions_and_triggers.sql index 2242ac5e375ceb19c80d64d99db1863fcd48ae1e..b32116dd3e0fde128687d234fb1c6d381634c25b 100644 --- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_functions_and_triggers.sql +++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_functions_and_triggers.sql @@ -13,6 +13,8 @@ DECLARE claim_claimed_status_id int := 1; --beware: hard coded instead of lookup for performance task_approved_status_id int := 300; --beware: hard coded instead of lookup for performance task_conflict_status_id int := 335; --beware: hard coded instead of lookup for performance + task_prescheduled_status_id int := 350; --beware: hard coded instead of lookup for performance + task_scheduled_status_id int := 400; --beware: hard coded instead of lookup for performance task_finished_status_id int := 1000; --beware: hard coded instead of lookup for performance task_aborted_status_id int := 1100; --beware: hard coded instead of lookup for performance BEGIN @@ -21,8 +23,8 @@ BEGIN UPDATE resource_allocation.resource_claim SET status_id=claim_tentative_status_id WHERE (task_id=NEW.id AND status_id = claim_claimed_status_id); - ELSIF NEW.status_id = ANY(ARRAY[400, 500, 600, 900, 1000, 1100]) THEN - --prevent task status to be upgraded to scheduled (or beyond) when not all its claims are claimed + ELSIF OLD.status_id = task_prescheduled_status_id AND NEW.status_id = task_scheduled_status_id THEN + --prevent task status to be scheduled when not all its claims are claimed IF EXISTS (SELECT id FROM resource_allocation.resource_claim WHERE task_id = NEW.id AND status_id <> claim_claimed_status_id) THEN RAISE EXCEPTION 'Cannot update task status from % to % when not all its claims are claimed', OLD.status_id, NEW.status_id; END IF;