Completed
Push — master ( 3b5137...dd25e3 )
by Daniel
52s
created

WebPlugin.__init_flask()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
c 0
b 0
f 0
dl 0
loc 2
rs 10
1
import logging
2
from flask import Flask, render_template
3
from docutils.core import publish_parts
4
5
from groundwork.patterns import GwBasePattern
6
7
from groundwork_web.patterns.gw_web_pattern.server import ServerManagerApplication, ServerManagerPlugin
8
from groundwork_web.patterns.gw_web_pattern.context import ContextManagerApplication, ContextManagerPlugin
9
from groundwork_web.patterns.gw_web_pattern.route import RouteManagerApplication, RouteManagerPlugin
10
from groundwork_web.patterns.gw_web_pattern.menu import MenuApplication, MenuPlugin
11
12
13
class GwWebPattern(GwBasePattern):
14
15
    def __init__(self, *args, **kwargs):
16
        super().__init__(*args, **kwargs)
17
        if not hasattr(self.app, "web"):
18
            self.app.web = WebApplication(self.app)
19
20
        #: Instance of :class:`~.WebPlugin`.
21
        #: Provides functions to manage web based objects
22
        self.web = WebPlugin(self)
23
24
25
class WebPlugin:
26
    def __init__(self, plugin):
27
        self.plugin = plugin
28
        self.app = plugin.app
29
        self.log = plugin.log
30
31
        self.servers = ServerManagerPlugin(plugin)
32
        self.contexts = ContextManagerPlugin(plugin)
33
        self.routes = RouteManagerPlugin(plugin)
34
        self.menus = MenuPlugin(plugin)
35
36
        self.plugin.signals.connect(receiver="%s_flask_activation" % self.plugin.name,
37
                                    signal="plugin_activate_pre",
38
                                    function=self.__init_flask,
39
                                    description="Initialised flask during plugin activation of %s" % self.plugin.name,
40
                                    sender=self.plugin)
41
42
    @property
43
    def flask(self):
44
        return self.app.web.flask
45
46
    @flask.setter
47
    def flask(self, value):
48
        self.app.web.flask = value
49
50
    def __init_flask(self, plugin, *args, **kwargs):
51
        self.app.web.init_flask()
52
53
    def render(self, template, **kwargs):
54
        return self.app.web.render(template, **kwargs)
55
56
57
class WebApplication:
58
    def __init__(self, app):
59
        self.app = app
60
        self.log = logging.getLogger(__name__)
61
        self.flask = None
62
63
        self.servers = ServerManagerApplication(app)
64
        self.contexts = ContextManagerApplication(app)
65
        self.routes = RouteManagerApplication(app)
66
        self.menus = MenuApplication(app)
67
68
    def init_flask(self):
69
        if self.flask is None:
70
            self.flask = Flask(self.app.name)
71
72
            # Inject send_signal() to jinja templates
73
            # Use it like {{ send_signal("my_signal") }}
74
            self.flask.jinja_env.globals.update(send_signal=self.app.signals.send)
75
76
            self.flask.jinja_env.globals.update(get_menu=self.__get_menu)
77
            self.flask.jinja_env.globals.update(get_config=self.app.config.get)
78
            self.flask.jinja_env.globals.update(rst2html=self.__rst2html)
79
80
    def __get_menu(self, cluster="base"):
81
        return self.menus.get(cluster=cluster)
82
83
    def __rst2html(self, document, part="body"):
84
        if document is not None and type(document) == str:
85
            doc_rendered = publish_parts(document, writer_name="html")
86
            if part not in doc_rendered.keys():
87
                raise KeyError("%s is not a valid key for part parameter of rst2html.\nValid options: " %
88
                               (part, ",".join(doc_rendered.keys())))
89
            return doc_rendered[part]
90
        return document
91
92
    def render(self, template, **kwargs):
93
        """
94
        Renders a template and returns a strings, which represents the rendered data.
95
96
        Internally render_template() from flask is used.
97
98
        :param template: Name of the template
99
        :param kwargs: Optional key-word arguments, which get passed to the template engine.
100
        :return: Rendered template as string
101
        """
102
103
        return render_template(template, **kwargs)
104
105