diff options
Diffstat (limited to 'pysite')
| -rw-r--r-- | pysite/base_route.py | 22 | ||||
| -rw-r--r-- | pysite/route_manager.py | 59 | ||||
| -rw-r--r-- | pysite/views/healthcheck.py | 7 | ||||
| -rw-r--r-- | pysite/views/index.py | 6 | ||||
| -rw-r--r-- | pysite/views/invite.py | 7 | 
5 files changed, 83 insertions, 18 deletions
| diff --git a/pysite/base_route.py b/pysite/base_route.py index 4fdad857..916e7fae 100644 --- a/pysite/base_route.py +++ b/pysite/base_route.py @@ -1,23 +1,31 @@  # coding=utf-8 -from flask import Flask +from flask import Flask, render_template  from flask.views import MethodView  class BaseView(MethodView): -    path = None  #: str -    name = None  #: str +    name = None  # type: str + +    def render(self, *template_names, **context): +        context["current_page"] = self.name +        context["view"] = self + +        return render_template(template_names, **context) + + +class RouteView(BaseView): +    path = None  # type: str      @classmethod -    def setup(cls: "BaseView", app: Flask): +    def setup(cls: "RouteView", app: Flask):          if not cls.path or not cls.name:              raise RuntimeError("Route views must have both `path` and `name` defined")          app.add_url_rule(cls.path, view_func=cls.as_view(cls.name)) -class ErrorView(MethodView): -    name = None  #: str -    error_code = None  #: int +class ErrorView(BaseView): +    error_code = None  # type: int      @classmethod      def setup(cls: "ErrorView", app: Flask): diff --git a/pysite/route_manager.py b/pysite/route_manager.py index 5fe22ba0..09202d0c 100644 --- a/pysite/route_manager.py +++ b/pysite/route_manager.py @@ -3,20 +3,35 @@ import importlib  import inspect  import os -from flask import Flask +from flask import Flask, abort, g  from pysite.base_route import BaseView, ErrorView +import rethinkdb + +from pysite.base_route import BaseView, ErrorView, RouteView + +DB_HOST = os.environ.get("RETHINKDB_HOST") +DB_PORT = os.environ.get("RETHINKDB_PORT") +DB_DATABASE = os.environ.get("RETHINKDB_DATABASE") +DB_TABLE = os.environ.get("RETHINKDB_TABLE") + +TEMPLATES_PATH = "../templates" +STATIC_PATH = "../static"  class RouteManager:      def __init__(self): -        self.app = Flask(__name__) +        self.app = Flask( +            __name__, template_folder=TEMPLATES_PATH, static_folder=STATIC_PATH, static_url_path="/static", +        )          self.app.secret_key = os.environ.get("WEBPAGE_SECRET_KEY")          self.load_views()      def run(self): -        self.app.run(port=int(os.environ.get("WEBPAGE_PORT")), debug=False) +        self.app.run( +            port=int(os.environ.get("WEBPAGE_PORT")), debug="FLASK_DEBUG" in os.environ +        )      def load_views(self, location="pysite/views"):          for filename in os.listdir(location): @@ -33,7 +48,43 @@ class RouteManager:                              inspect.isclass(cls) and                              cls is not BaseView and                              cls is not ErrorView and -                            (BaseView in cls.__mro__ or ErrorView in cls.__mro__) +                            cls is not RouteView and +                            BaseView in cls.__mro__                      ):                          cls.setup(self.app)                          print(f"View loaded: {cls.name: <25} ({module.__name__}.{cls_name})") + +    def setup_db(self): +        connection = self.get_db_connection(connect_database=False) + +        try: +            rethinkdb.db_create(DB_DATABASE).run(connection) +            rethinkdb.db(DB_DATABASE).table_create(DB_TABLE).run(connection) +            print("Database created") +        except rethinkdb.RqlRuntimeError: +            print("Database found") +        finally: +            connection.close() + +        self.app.before_request(self.db_before_request) +        self.app.teardown_request(self.db_teardown_request) + +    def get_db_connection(self, connect_database=True): +        if connect_database: +            return rethinkdb.connect(host=DB_HOST, port=DB_PORT, db=DB_DATABASE) +        else: +            return rethinkdb.connect(host=DB_HOST, port=DB_PORT) + +    def db_before_request(self): +        try: +            # g is the Flask global context object +            g.rdb_conn = self.get_db_connection() +        except rethinkdb.RqlDriverError: +            abort(503, "Database connection could be established.") + +    def db_teardown_request(self, _): +        try: +            # g is the Flask global context object +            g.rdb_conn.close() +        except AttributeError: +            pass diff --git a/pysite/views/healthcheck.py b/pysite/views/healthcheck.py index 3931100c..088bc7b3 100644 --- a/pysite/views/healthcheck.py +++ b/pysite/views/healthcheck.py @@ -1,10 +1,13 @@  # coding=utf-8  from flask import jsonify -from pysite.base_route import BaseView +from pysite.base_route import RouteView -class IndexView(BaseView): +__author__ = "Gareth Coles" + + +class IndexView(RouteView):      path = "/healthcheck"      name = "healthcheck" diff --git a/pysite/views/index.py b/pysite/views/index.py index 48a98fac..0c2d1578 100644 --- a/pysite/views/index.py +++ b/pysite/views/index.py @@ -1,10 +1,10 @@  # coding=utf-8 -from pysite.base_route import BaseView +from pysite.base_route import RouteView -class IndexView(BaseView): +class IndexView(RouteView):      path = "/"      name = "index"      def get(self): -        return "Coming soon:tm:" +        return self.render("index.html") diff --git a/pysite/views/invite.py b/pysite/views/invite.py index 65cd75a5..07ddc830 100644 --- a/pysite/views/invite.py +++ b/pysite/views/invite.py @@ -1,10 +1,13 @@  # coding=utf-8  from flask import redirect -from pysite.base_route import BaseView +from pysite.base_route import RouteView -class InviteView(BaseView): +__author__ = "Gareth Coles" + + +class InviteView(RouteView):      path = "/invite"      name = "invite" | 
