/gryphon/dashboards/handlers/base.py

https://github.com/garethdmm/gryphon · Python · 152 lines · 102 code · 25 blank · 25 comment · 12 complexity · ab3a52ee527b112929795aee1c0e9c30 MD5 · raw file

  1. # -*- coding: utf-8 -*-
  2. import logging
  3. import os
  4. import traceback
  5. import sqlalchemy.exc
  6. import tornado.web
  7. from tornadotoad import api
  8. from tornadotoad import my
  9. from gryphon.lib.models.emeraldhavoc.orderbook import Orderbook
  10. logger = logging.getLogger(__name__)
  11. P3P_POLICY = u"""\
  12. CP="Like Facebook, This App does not have a P3P policy -Learn why: http://fb.me/p3p\
  13. """
  14. class BaseHandler(tornado.web.RequestHandler):
  15. """
  16. A class to collect common handler methods - all other handlers should subclass this
  17. one.
  18. """
  19. @property
  20. def dashboard_db(self):
  21. return self.application.dashboard_db
  22. @property
  23. def trading_db(self):
  24. return self.application.trading_db
  25. @property
  26. def gds_db(self):
  27. return self.application.gds_db
  28. @property
  29. def configuration(self):
  30. return self.application.configuration
  31. def send_error(self, status_code, **kwargs):
  32. if status_code == 403 and not my.log_403:
  33. return super(BaseHandler, self).send_error(status_code, **kwargs)
  34. if status_code == 404 and not my.log_404:
  35. return super(BaseHandler, self).send_error(status_code, **kwargs)
  36. if status_code == 405 and not my.log_405:
  37. return super(BaseHandler, self).send_error(status_code, **kwargs)
  38. tornado_toad = api.TornadoToad()
  39. exception = kwargs.get('exc_info')
  40. if exception:
  41. formatted_arguments = {}
  42. for key in self.request.arguments.keys():
  43. formatted_arguments[key] = u','.join(self.request.arguments[key])
  44. request_data = {
  45. 'url': self.request.full_url(),
  46. 'component': self.__class__.__name__,
  47. 'cgi-data': self.request.headers,
  48. 'params': formatted_arguments,
  49. }
  50. tornado_toad.post_notice(exception, request=request_data)
  51. return super(BaseHandler, self).send_error(status_code, **kwargs)
  52. def commit_session(self):
  53. try:
  54. self.dashboard_db.commit()
  55. except Exception as e:
  56. self.dashboard_db.rollback()
  57. logger.critical(u'BASE - commit needed to roll back.')
  58. logger.critical(
  59. u'Transaction needed to be rolled back because of: \n %s' % (
  60. traceback.format_exc(),
  61. ))
  62. def prepare(self):
  63. if (os.environ.get('APP_ENV') == 'PRODUCTION'
  64. and self.request.headers.get('X-Forwarded-Proto') != 'https'):
  65. old_url = self.request.full_url()
  66. new_url = old_url.replace('http://', 'https://')
  67. self.redirect(new_url, permanent=True)
  68. return
  69. p3p = P3P_POLICY
  70. self.add_header('Accept-Charset', u'utf-8')
  71. self.add_header('X-Frame-Options', u'deny')
  72. self.set_header('P3P', p3p)
  73. @property
  74. def should_recalculate_stored_results(self):
  75. return self.get_argument('recalculate', None) is not None
  76. def is_gds_connection_active(self):
  77. """
  78. Simple function to test if we have a working connection to a GDS instance so
  79. we don't error out accidentally.
  80. """
  81. if self.gds_db is None:
  82. return False
  83. try:
  84. self.gds_db.query(Orderbook.orderbook_id).first()
  85. except sqlalchemy.exc.OperationalError as error:
  86. return False
  87. return True
  88. def on_finish(self):
  89. try:
  90. self.dashboard_db.commit()
  91. except Exception:
  92. self.dashboard_db.rollback()
  93. logger.critical(
  94. u'Transaction needed to be rolled back because of: \n %s' % (
  95. traceback.format_exc(),
  96. ))
  97. finally:
  98. self.dashboard_db.remove()
  99. try:
  100. self.trading_db.commit()
  101. except Exception:
  102. self.trading_db.rollback()
  103. logger.critical(
  104. u'Transaction needed to be rolled back because of: \n %s' % (
  105. traceback.format_exc(),
  106. ))
  107. finally:
  108. self.trading_db.remove()
  109. if self.gds_db is not None:
  110. try:
  111. self.gds_db.commit()
  112. except Exception:
  113. self.gds_db.rollback()
  114. logger.critical(
  115. u'TC Transaction needed to be rolled back because of: \n %s' % (
  116. traceback.format_exc(),
  117. ))
  118. finally:
  119. self.gds_db.remove()