aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/Dawn/utils.py15
-rw-r--r--python/dawn_utils.py60
2 files changed, 60 insertions, 15 deletions
diff --git a/python/Dawn/utils.py b/python/Dawn/utils.py
index 37350949..99451080 100644
--- a/python/Dawn/utils.py
+++ b/python/Dawn/utils.py
@@ -1,5 +1,4 @@
import pandas as pd
-from sqlalchemy.sql import text
import os
import re
from pickle import dumps
@@ -54,20 +53,6 @@ def load_trades(engine):
blotter.to_sql('bonds', engine, if_exists='append', index=False)
return blotter
-def add_triggers(engine):
- engine.execute(text("""
- CREATE OR REPLACE FUNCTION mydealid()
- RETURNS TRIGGER AS $$
- BEGIN
- UPDATE bonds SET dealid = 'SC_' ||upper(left(asset_class::text,3))||id,
- identifier = COALESCE(identifier, cusip, isin) WHERE bonds.id = NEW.id;
- RETURN NEW;
- END;
- $$ language plpgsql"""))
- engine.execute(text("""CREATE TRIGGER dealid
- AFTER INSERT ON bonds
- FOR EACH ROW
- EXECUTE PROCEDURE mydealid()"""))
def bump_rev(filename):
pattern = "([^r]*)(\srev(\d)|).pdf"
diff --git a/python/dawn_utils.py b/python/dawn_utils.py
new file mode 100644
index 00000000..b2c7ae49
--- /dev/null
+++ b/python/dawn_utils.py
@@ -0,0 +1,60 @@
+from sqlalchemy.sql import text
+from sqlalchemy import create_engine, MetaData
+import os
+
+def create_trigger_function(conn):
+ auto_dealid = text("""
+ CREATE OR REPLACE FUNCTION auto_dealid()
+ RETURNS TRIGGER AS $$
+ DECLARE stub text;
+ sqlstr text;
+ BEGIN
+ sqlstr:= 'UPDATE '|| TG_TABLE_NAME ||' SET %s WHERE id = %L AND dealid is NULL';
+
+ IF (TG_TABLE_NAME = 'bonds') THEN
+ stub := 'SC_';
+ sqlstr := format(sqlstr, 'dealid = $1||upper(left(asset_class::text,3))||id,
+identifier = COALESCE(identifier, cusip, isin)', NEW.id);
+ ELSIF (TG_TABLE_NAME = 'cds') THEN
+ stub := 'SCCDS';
+ sqlstr := format(sqlstr, 'dealid = $1||id', NEW.id);
+ ELSIF (TG_TABLE_NAME = 'repo') THEN
+ stub := 'SC_REP';
+ sqlstr := format(sqlstr, 'dealid = $1||id', NEW.id);
+ ELSIF (TG_TABLE_NAME = 'swaptions') THEN
+ stub := 'SWPTN';
+ sqlstr := format(sqlstr, 'dealid = $1||id', NEW.id);
+ END IF;
+ EXECUTE sqlstr USING stub;
+ RETURN NEW;
+ END;
+ $$ language plpgsql""")
+ conn.execute(auto_dealid)
+
+def create_triggers(schema = None):
+ trigger = db.DDL("""CREATE TRIGGER dealid
+ AFTER INSERT ON %(fullname)s
+ FOR EACH ROW
+ EXECUTE PROCEDURE %(schema)s.auto_dealid()""")
+ for name, tb in db.metadata.tables.items():
+ if schema is not None:
+ tb.schema = schema
+ db.event.listen(tb, 'after_create', trigger)
+
+if __name__ == "__main__":
+ """ This script will create the tables and triggers for the Dawn app.
+ If schema is not None, it will create it under a specific schema"""
+ engine = create_engine('postgresql://dawn_user@debian/dawndb')
+ conn = engine.connect()
+ schema = 'qa'
+ conn.execute("CREATE SCHEMA IF NOT EXISTS {}".format(schema))
+ conn.execute("SET search_path TO %s", (schema,))
+ create_trigger_function(conn)
+ conn.close()
+
+ os.environ['CONF'] = 'config.ini'
+ from Dawn import db, app
+ db.init_app(app)
+ with app.app_context():
+ create_triggers('qa')
+ db.create_all()