Completed
Push — master ( 5e72be...193f1f )
by Daniel
01:47
created

GwWebFlask.__get_menu()   A

Complexity

Conditions 1

Size

Total Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

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