aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/Dawn/dawn.py61
-rw-r--r--python/Dawn/load_cp.py36
-rw-r--r--python/Dawn/models.py9
3 files changed, 62 insertions, 44 deletions
diff --git a/python/Dawn/dawn.py b/python/Dawn/dawn.py
index abbb1407..98ff330f 100644
--- a/python/Dawn/dawn.py
+++ b/python/Dawn/dawn.py
@@ -1,5 +1,8 @@
from flask import Flask, request, render_template
from models import db, ModelForm, BondDeal, Counterparties
+from sqlalchemy.sql import text
+from sqlalchemy import create_engine
+import pandas as pd
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://dawn_user@debian/dawndb'
@@ -10,13 +13,46 @@ def list_counterparties():
return Counterparties.query.order_by('name').\
with_entities(Counterparties.code, Counterparties.name)
-# Base.metadata.create_all(engine)
+def load_counterparties():
+ counterparties = pd.read_csv("/home/share/CorpCDOs/data/counterparties.csv")
+ counterparties[['city', 'state']] = counterparties.Location.str.split(", ", expand=True)
+ counterparties.drop(['Location', 'Valuation Contact4', 'Valuation Contact4 Email'], axis=1, inplace=True)
+ counterparties.rename(columns ={'CODE': 'code',
+ 'DTC Number': 'dtc_number',
+ 'Email1': 'sales_email',
+ 'FIRM': 'name',
+ 'Phone': 'sales_phone',
+ 'Sales Contact': 'sales_contact',
+ 'Valuation Contact1': 'valuation_contact1',
+ 'Valuation Contact1 Email': 'valuation_email1',
+ 'Valuation Contact2': 'valuation_contact2',
+ 'Valuation Contact2 Email': 'valuation_email2',
+ 'Valuation Contact3': 'valuation_contact3',
+ 'Valuation Contact3 Email': 'valuation_email3',
+ 'Valuation Note': 'notes'}, inplace=True)
+ engine = create_engine('postgresql://dawn_user@debian/dawndb')
+ counterparties.to_sql('counterparties', engine, if_exists='append', index=False)
+
+def add_triggers():
+ engine = create_engine('postgresql://dawn_user@debian/dawndb')
+ engine.execute(text("""
+ CREATE OR REPLACE FUNCTION mydealid()
+ RETURNS TRIGGER AS $$
+ BEGIN
+ UPDATE bonds SET dealid = 'SC_' ||left(asset_class::text,3)||id 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()"""))
class BondForm(ModelForm):
class Meta:
model = BondDeal
include_foreign_keys = True
- exclude = ['dealid'] #we generate it with a trigger at the server level
+ exclude = ['dealid', 'lastupdate'] #we generate it with a trigger at the server level
@app.route('/', methods=['GET', 'POST'])
def trade_entry():
@@ -37,12 +73,27 @@ def trade_entry():
@app.route('/trade/<int:tradeid>', methods=['GET', 'POST'])
def trade_update(tradeid):
- bond_form = BondForm(obj = BondDeal().query.get(tradeid))
+ trade = BondDeal()
+ bond_form = BondForm(obj = trade.query.get(tradeid))
bond_form.counterparty.choices = list_counterparties()
+ if bond_form.is_submitted():
+ if bond_form.validate():
+ bond_form.populate_obj(trade)
+ return redirect(url_for('list_trades'))
+ else:
+ return "something wrong!"
return render_template("trade_entry.html", form=bond_form)
+@app.route('/blotter/')
+def list_trades():
+ trade = BondDeal()
+ trade_list = trade.query.order_by(trade.trade_date)
+ return render_template('blotter.html', trades=trade_list.all())
+
if __name__=="__main__":
- #db.drop_all(app=app)
- #db.create_all(app=app)
db.init_app(app)
+ # db.drop_all(app=app)
+ # db.create_all(app=app)
+ # add_triggers()
+ # load_counterparties()
app.run(debug=True)
diff --git a/python/Dawn/load_cp.py b/python/Dawn/load_cp.py
deleted file mode 100644
index 07f49060..00000000
--- a/python/Dawn/load_cp.py
+++ /dev/null
@@ -1,36 +0,0 @@
-import csv
-from sqlalchemy import bindparam, create_engine, MetaData
-from sqlalchemy.orm import sessionmaker
-
-engine = create_engine('postgresql://dawn_user@debian/dawndb')
-meta = MetaData()
-meta.reflect(bind=engine)
-counterparties = meta.tables['counterparties']
-ins = counterparties.insert().values(code = bindparam('CODE'),
- name = bindparam('FIRM'),
- dtc_number = bindparam('DTC Number'),
- sales_contact = bindparam('Sales Contact'),
- sales_email = bindparam('Email1'),
- sales_phone = bindparam('Phone'),
- valuation_contact1 = bindparam('Valuation Contact1'),
- valuation_email1 = bindparam('Valuation Contact1 Email'),
- valuation_contact2 = bindparam('Valuation Contact2'),
- valuation_email2 = bindparam('Valuation Contact2 Email'),
- valuation_contact3 = bindparam('Valuation Contact3'),
- valuation_email3 = bindparam('Valuation Contact3 Email'),
- notes = bindparam('Valuation Note'))
-
-
-with open("/home/share/CorpCDOs/data/counterparties.csv") as fh:
- csvreader = csv.DictReader(fh)
- to_insert = []
- for line in csvreader:
- for k, v in line.items():
- if v=="":
- line[k] = None
- if any(line.values()):
- line['city'] = line['Location'].split(", ")[0]
- line['state'] = line['Location'].split(", ")[1]
- to_insert.append(line)
- conn = engine.connect()
-conn.execute(ins, to_insert)
diff --git a/python/Dawn/models.py b/python/Dawn/models.py
index b9b6323c..dc8ff7d4 100644
--- a/python/Dawn/models.py
+++ b/python/Dawn/models.py
@@ -40,6 +40,7 @@ BOND_STRAT = ENUM('M_STR_MAV', 'M_STR_SMEZZ', 'CSO_TRANCH',
'M_MTG_GOOD', 'M_MTG_B4PR', 'M_MTG_RW', name='bond_strat')
ASSET_CLASS = ENUM('CSO', 'Subprime', 'CLO', 'Tranches', 'Futures', 'Cash', 'FX', 'Cleared',
name='asset_class')
+ACTION = ENUM('NEW', 'UPDATE', 'CANCEL', name='action')
def myticket(ctx):
return "{0}.{1}".format(ctx.current_parameters['dealid'],
@@ -49,14 +50,16 @@ class BondDeal(db.Model):
__tablename__ = 'bonds'
id = db.Column('id', db.Integer, primary_key=True)
dealid = db.Column(db.String(28))
+ lastupdate = db.Column(db.DateTime, server_default=db.func.now(), onupdate=db.func.now())
+ action = db.Column(ACTION)
folder = db.Column(BOND_STRAT, nullable=False)
- custodian = db.Column(db.String(12), nullable=False)
- cashaccount = db.Column(db.String(10), nullable=False)
+ custodian = db.Column(db.String(12), default='BAC', nullable=False)
+ cashaccount = db.Column(db.String(10), default='V0NSCLMAMB', nullable=False)
counterparty = db.Column(db.String, db.ForeignKey("counterparties.code"),
info={'choices': [(None, None)]})
trade_date = db.Column(db.Date, nullable = False, default = datetime.date.today)
settle_date = db.Column(db.Date, nullable = False, default =
- lambda : datetime.date.today()+datetime.timedelta(3))
+ lambda : datetime.date.today() + datetime.timedelta(3))
cusip = db.Column(db.String(9), info={'validators': Length(9,9)})
isin = db.Column(db.String(12), info={'validator': Length(12, 12)})
description = db.Column(db.String(32))