Completed
Push — master ( 193f1f...0fe699 )
by Daniel
01:07
created

GwWebFlask.__rst2html()   A

Complexity

Conditions 4

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
c 0
b 0
f 0
dl 0
loc 9
rs 9.2
1
from docutils.core import publish_parts
2
3
from flask import Flask, render_template, Blueprint, request
4
from groundwork.patterns import GwCommandsPattern
5
6
from groundwork_web.patterns import GwWebPattern
7
from groundwork_web.patterns.gw_web_pattern.provider import BaseProvider
8
9
10
class GwWebFlask(GwWebPattern, GwCommandsPattern):
11
    def __init__(self, *args, **kwargs):
12
        self.name = kwargs.get("name", self.__class__.__name__)
13
        super().__init__(*args, **kwargs)
14
        self.flask_app = None
15
16
    def activate(self):
17
        self.flask_app = Flask(__name__)
18
19
        # Inject send_signal() to jinja templates
20
        # Use it like {{ send_signal("my_signal") }}
21
        self.flask_app.jinja_env.globals.update(send_signal=self.signals.send)
22
23
        self.flask_app.jinja_env.globals.update(get_menu=self.__get_menu)
24
25
        self.flask_app.jinja_env.globals.update(get_config=self.app.config.get)
26
27
        self.flask_app.jinja_env.globals.update(rst2html=self.__rst2html)
28
29
        # self.signals.register("web_menu", "signal to retrieve entries for the web menu")
30
        # self.signals.connect("test", "test_web", blub, description="test web signal")
31
32
        self.web.providers.register("flask", FlaskProvider(self.flask_app), "Flask web provider")
33
        self.web.servers.register("flask_debug", self.__start_flask_debug_server, "Starts the flask debug server")
34
35
    def deactivate(self):
36
        self.flask_app = None
37
38
    def __start_flask_debug_server(self):
39
        self.flask_app.run()
40
41
    def __get_menu(self, cluster="base"):
42
        return self.web.menus.get(cluster=cluster)
43
44
    def __rst2html(self, document, part="body"):
45
        if document is not None and type(document) == str:
46
            doc_rendered = publish_parts(document, writer_name="html")
47
            if part not in doc_rendered.keys():
48
                raise KeyError("%s is not a valid key for part parameter of rst2html.\nValid options: " %
49
                               (part, ",".join(doc_rendered.keys())))
50
51
            return doc_rendered[part]
52
        return document
53
54
55
class FlaskProvider(BaseProvider):
56
    def __init__(self, instance, *args, **kwargs):
57
        self.flask_app = instance
58
        self.blueprints = {}
59
        self.request = request
60
61
    def register_route(self, url, methods, endpoint, context, *arg, **kwargs):
62
        if context not in self.blueprints.keys():
63
            raise NameError("Context %s does not exist" % context)
64
65
        blueprint = self.blueprints[context]
66
        blueprint.add_url_rule(url, methods=methods, endpoint=endpoint.__name__, view_func=endpoint)
67
68
        # We have to register our blueprint to activate the route
69
        self.flask_app.register_blueprint(blueprint)
70
71
    def register_context(self, name, template_folder, static_folder, url_prefix, overwrite=False, *arg, **kwargs):
72
        if name in self.blueprints.keys() and not overwrite:
73
            raise NameError("Context %s already exists" % name)
74
75
        blueprint = Blueprint(name, __name__,
76
                              url_prefix=url_prefix,
77
                              subdomain=None,
78
                              template_folder=template_folder,
79
                              static_folder=static_folder,
80
                              static_url_path="/static/" + name)
81
        self.blueprints[name] = blueprint
82
        self.flask_app.register_blueprint(blueprint)
83
84
    def render(self, template, **kwargs):
85
        return render_template(template, **kwargs)
86
87