diff options
Diffstat (limited to 'python')
| -rw-r--r-- | python/Dawn/models.py | 27 | ||||
| -rw-r--r-- | python/Dawn/static/dawn.js | 11 | ||||
| -rw-r--r-- | python/Dawn/templates/swaption_blotter.html | 2 | ||||
| -rw-r--r-- | python/Dawn/templates/termination.html | 50 | ||||
| -rw-r--r-- | python/Dawn/views.py | 41 |
5 files changed, 112 insertions, 19 deletions
diff --git a/python/Dawn/models.py b/python/Dawn/models.py index 87a16275..dd670b96 100644 --- a/python/Dawn/models.py +++ b/python/Dawn/models.py @@ -471,18 +471,7 @@ class SwaptionDeal(db.Model): maturity = db.Column(db.Date, nullable=False) currency = db.Column(CCY, nullable=False) settlement_type = db.Column(SETTLEMENT_TYPE, nullable=False) - termination_date = db.Column(db.Date) - termination_fee = db.Column(db.Float) - termination_amount = db.Column(db.Float) - termination_cp = db.Column( - db.String(12), - db.ForeignKey("counterparties.code"), - info={"choices": [(None, "")], "label": "termination_counterparty"}, - ) counterparty = db.relationship(Counterparties, foreign_keys=[cp_code]) - termination_counterparty = db.relationship( - Counterparties, foreign_keys=[termination_cp] - ) class FutureDeal(db.Model): @@ -648,6 +637,22 @@ class CapFloorDeal(db.Model): ) +class Termination(db.Model): + __tablename__ = "terminations" + id = db.Column("id", db.Integer, primary_key=True) + dealid = db.Column(db.String(28), nullable=False) + termination_date = db.Column(db.Date, nullable=False) + termination_cp = db.Column( + db.String(12), + db.ForeignKey("counterparties.code"), + info={"choices": [(None, "")], "label": "termination counterparty"}, + ) + counterparty = db.relationship(Counterparties, foreign_keys=[termination_cp]) + termination_amount = db.Column(db.Float) + termination_fee = db.Column(db.Float, nullable=False) + partial_termination = db.Column(db.Boolean, nullable=False, default=False) + + BaseModelForm = model_form_factory(FlaskForm) diff --git a/python/Dawn/static/dawn.js b/python/Dawn/static/dawn.js index d8c6270f..886f304b 100644 --- a/python/Dawn/static/dawn.js +++ b/python/Dawn/static/dawn.js @@ -159,6 +159,17 @@ $(function() { break; } }); + $('#partial_termination').change( + function() { + if( $(this).prop('checked') ) { + $('#termination_amount').parent().parent().css('display', 'block'); + } else { + ('#termination_amount').val(''); + $('#termination_amount').parent().parent().css('display', 'none'); + } + } + ); + $('#partial_termination').change(); $('#swap_type').change(); var datalist = $('#index_list'); index_list.forEach(function(item) { diff --git a/python/Dawn/templates/swaption_blotter.html b/python/Dawn/templates/swaption_blotter.html index c0787137..c22539bd 100644 --- a/python/Dawn/templates/swaption_blotter.html +++ b/python/Dawn/templates/swaption_blotter.html @@ -17,6 +17,7 @@ <td>Counterparty</td> <td>Trade Type</td> <td>Strategy</td> + <td>Termination</td> </tr> </thead> {% for trade in trades %} @@ -36,6 +37,7 @@ cpcode=trade.cp_code)}}">{{trade.name}}</a></td> <td>{{trade.trade_type}}</td> <td>{{trade.folder}}</td> + <td>{% if trade.trade_type == "New" %}<a href="{{url_for('terminate', dealid=trade.dealid, kind='swaption')}}">x</a>{% endif %}</td> </tr> {% endfor %} </table> diff --git a/python/Dawn/templates/termination.html b/python/Dawn/templates/termination.html new file mode 100644 index 00000000..d12b3304 --- /dev/null +++ b/python/Dawn/templates/termination.html @@ -0,0 +1,50 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"> + </head> + <body style="max-width:1024px; margin:3em auto"> + <form method="POST" class="form-horizontal" + action="{{action_url}}" enctype="multipart/form-data"> + {% for field in form if field.name != "upload_globeop" %} + <div class="form-group {% if field.id in form.errors %}has-error{% endif %}"> + {% if field.type != 'CSRFTokenField' %} + <label class="control-label col-md-2" for="{{ field.id }}"> + {{ field.label.text }} + </label> + {% endif %} + <div class="col-md-3"> + {{ field(class_="form-control") }} + </div> + {% if field.id in form.errors %} + <div class="col-md-3"> + {{form.errors[field.id][0]}} + </div>{% endif %} + </div> + {% endfor %} + <div class="form-group"> + <div class="col-md-offset-2 col-md-3"> + <div class="checkbox"> + <label> + <input id="upload_globeop" name="upload_globeop" type="checkbox" value="y">Upload to globeop? + </label> + </div> + </div> + </div> + <div class="form-group"> + <div class="col-md-offset-2 col-md-3"> + <button type="submit" class="btn btn-default">Submit</button> + </div> + </div> + </form> + {% if 'cds' or 'swaption' or 'terminate' in action_url %} + <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.min.js"></script> + <script type="text/javascript" + src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" + integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" + crossorigin="anonymous"></script> + <script type="text/javascript" src="{{ url_for('static', filename='dawn.js') }}"></script> + {% endif %} + </body> +</html> diff --git a/python/Dawn/views.py b/python/Dawn/views.py index 5b3b6d9c..9c824bc7 100644 --- a/python/Dawn/views.py +++ b/python/Dawn/views.py @@ -30,6 +30,7 @@ from .models import ( SpotDeal, Counterparties, Accounts, + Termination, ) from sqlalchemy.exc import IntegrityError @@ -146,14 +147,15 @@ class SwaptionForm(ModelForm): class Meta: model = SwaptionDeal include_foreign_keys = True - exclude = [ - "dealid", - "lastupdate", - "termination_fee", - "termination_amount", - "termination_cp", - "termination_date", - ] + exclude = ["dealid", "lastupdate"] + + +class TerminationForm(ModelForm): + upload_globeop = BooleanField(label="Upload to globeop?") + + class Meta: + model = Termination + include_foreign_keys = True class FutureForm(ModelForm): @@ -410,6 +412,29 @@ def wire_manage(wire_id): ) +@app.route("/trades/<kind>/<dealid>/terminate", methods=["GET", "POST"]) +def terminate(dealid, kind): + termination = Termination(dealid=dealid, termination_date=datetime.date.today()) + form = TerminationForm(obj=termination) + form.termination_cp.choices = form.termination_cp.choices + list(cp_choices(kind)) + if form.validate_on_submit(): + form.populate_obj(termination) + session = form.get_session() + try: + session.commit() + except IntegrityError as e: + app.logger.error(e) + session.rollback() + else: + return redirect(url_for("list_trades", kind=kind)) + else: + return render_template( + "termination.html", + form=form, + action_url=url_for("terminate", dealid=dealid, kind=kind), + ) + + @app.route("/trades/<kind>/<int:tradeid>", methods=["GET", "POST"]) @app.route("/trades/<kind>/", defaults={"tradeid": None}, methods=["GET", "POST"]) @app.route( |
