ProviderManagerApplication.render()   A
last analyzed

Complexity

Conditions 4

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 4
c 1
b 0
f 0
dl 0
loc 9
rs 9.2
1
from groundwork.util import gw_get
2
3
4
class ProviderManagerPlugin:
5
6
    def __init__(self, plugin):
7
        self.plugin = plugin
8
        self.log = plugin.log
9
        self.app = plugin.app
10
        # self.default = plugin.app.web.providers.default
11
12
    def register(self, name, instance, description):
13
        return self.app.web.providers.register(name, instance, description, self.plugin)
14
15
    def render(self, *args, **kwargs):
16
        return self.app.web.providers.render(*args, **kwargs)
17
18
19
class ProviderManagerApplication:
20
    def __init__(self, app):
21
        self._providers = {}
22
        self.app = app
23
        self.default = None
24
25
    def register(self, name, instance, description, plugin):
26
        if name not in self._providers.keys():
27
            self._providers[name] = Provider(name, instance, description, plugin)
28
            self._load_context(self._providers[name])
29
            self._load_routes(self._providers[name])
30
31
        if name == self.app.config.get("DEFAULT_PROVIDER", None) or self.default is None:
32
            self.default = self._providers[name]
33
34
        return self._providers[name]
35
36
    def render(self, template, provider=None, **kwargs):
37
        if self.default is None:
38
            raise RuntimeError("No default provider is set")
39
        if provider is None:
40
            return self.default.instance.render(template, **kwargs)
41
        if provider not in self._providers.keys():
42
            raise NameError("Provider %s does not exist" % provider)
43
44
        return self._providers[provider].instance.render(template, **kwargs)
45
46
    def set_default_provider(self, name):
47
        if name not in self._providers.keys():
48
            raise NameError("Provider %s does not exist" % name)
49
        self.default = self._providers[name]
50
51
    def get(self, name=None, plugin=None):
52
        return gw_get(self._providers, name, plugin)
53
54
    def _load_routes(self, provider):
55
        if provider.instance is not None:
56
            for name, route in self.app.web.routes.get().items():
57
                provider.instance.register_route(route.url, route.methods, route.endpoint, route.context)
58
59
    def _load_context(self, provider):
60
        if provider.instance is not None:
61
            for name, context in self.app.web.contexts.get().items():
62
                provider.instance.register_context(context.name, context.template_folder,
63
                                                   context.static_folder, context.url_prefix)
64
65
66
class Provider:
67
    def __init__(self, name, instance, description, plugin):
68
        self.name = name
69
70
        if isinstance(instance, BaseProvider):
71
            self.instance = instance
72
        else:
73
            raise TypeError("instance must be of type BaseProvider, got %s instead" % str(type(instance)))
74
75
        self.description = description
76
        self.plugin = plugin
77
78
79
class BaseProvider:
80
    def __init__(self, instance=None):
81
        self.instance = instance
82
        self.request = None
83
84
    def register_route(self, url, methods, endpoint, context, *arg, **kwargs):
85
        pass
86
87
    def unregister_route(self, url, methods, context, *arg, **kwargs):
88
        pass
89
90
    def register_context(self, name, template_folder, static_folder, url_prefix, *arg, **kwargs):
91
        pass
92
93
    def unregister_context(self, name):
94
        pass
95
96
    def render(self, template, **kwargs):
97
        pass
98