aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/Dawn/models.py27
-rw-r--r--python/Dawn/static/dawn.js11
-rw-r--r--python/Dawn/templates/swaption_blotter.html2
-rw-r--r--python/Dawn/templates/termination.html50
-rw-r--r--python/Dawn/views.py41
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(