from flask.ext.sqlalchemy import SQLAlchemy from flask_wtf import Form from flask_wtf.file import FileField from sqlalchemy.dialects.postgresql import ENUM, OID from sqlalchemy.types import TypeDecorator, LargeBinary from wtforms import SelectField from wtforms.validators import Length from wtforms_alchemy import model_form_factory from sqlalchemy_utils import EmailType, PhoneNumberType import datetime db = SQLAlchemy() class MyBinary(TypeDecorator): impl = LargeBinary def process_bind_param(self, value, dialect): return value.stream.getbuffer() class Counterparties(db.Model): __tablename__ = 'counterparties' code = db.Column(db.String(12), primary_key=True) name = db.Column(db.String) city = db.Column(db.String) state = db.Column(db.String(2)) dtc_number = db.Column(db.Integer) sales_contact = db.Column(db.String) sales_email = db.Column(EmailType) sales_phone = db.Column(PhoneNumberType()) valuation_contact1 = db.Column(db.String) valuation_email1 = db.Column(EmailType) valuation_contact2 = db.Column(db.String) valuation_email2 = db.Column(EmailType) valuation_contact3 = db.Column(db.String) valuation_email3 = db.Column(EmailType) valuation_contact4 = db.Column(db.String) valuation_email4 = db.Column(EmailType) notes = db.Column(db.String) instructions = db.Column(db.String, info={'form_field_class': FileField}) BOND_STRAT = ENUM('M_STR_MAV', 'M_STR_MEZZ', 'CSO_TRANCH', 'M_CLO_BB20', 'M_CLO_AAA', 'M_CLO_BBB', 'M_MTG_IO', 'M_MTG_THRU', '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'], str(datetime.datetime.now())) 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), default='BAC', nullable=False) cashaccount = db.Column(db.String(10), default='V0NSCLMAMB', nullable=False) cp_code = db.Column(db.String(12), db.ForeignKey('counterparties.code'), info={'choices': [(None, None)], 'label': 'counterparty'}, nullable = False) trade_date = db.Column(db.Date, nullable = False) settle_date = db.Column(db.Date, nullable = False) cusip = db.Column(db.String(9), info={'validators': Length(9,9), 'filters': [lambda x: x or None]}) isin = db.Column(db.String(12), info={'validators': Length(12, 12), 'filters': [lambda x: x or None]}) description = db.Column(db.String(32), nullable=False) buysell = db.Column(db.Boolean, nullable = False, info={'choices':[(0, 'sell'), (1, 'buy')], 'filters': [lambda x: x=='1']}) faceamount = db.Column(db.Float, nullable=False) price = db.Column(db.Float, nullable=False) accrued = db.Column(db.Float, nullable = False) asset_class = db.Column(ASSET_CLASS) ticket = db.Column(db.String, info={'form_field_class': FileField}) counterparty = db.relationship(Counterparties) __table_args__= (db.CheckConstraint('cusip is not Null or isin is not Null'),) BaseModelForm = model_form_factory(Form) class ModelForm(BaseModelForm): @classmethod def get_session(self): return db.session