
To make kimchi's error handler and tabs handler resued for plugin, this patch moves the resource related code into a subclass. With this change, the plugin can have error handler and tabs handler by inheriting from this class. Signed-off-by: Mark Wu <wudxw@linux.vnet.ibm.com> --- src/kimchi/root.py | 20 +++++++++++++------- src/kimchi/server.py | 4 ++-- src/kimchi/template.py | 5 ++--- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/kimchi/root.py b/src/kimchi/root.py index 6e107bc..c3d471e 100644 --- a/src/kimchi/root.py +++ b/src/kimchi/root.py @@ -36,7 +36,7 @@ from kimchi.exception import OperationFailed class Root(Resource): - def __init__(self, model, dev_env): + def __init__(self, model, dev_env=False): super(Root, self).__init__(model) self._handled_error = ['error_page.400', 'error_page.404', 'error_page.405', 'error_page.406', @@ -49,11 +49,6 @@ class Root(Resource): self._cp_config = dict([(key, self.error_development_handler) for key in self._handled_error]) - for ident, node in sub_nodes.items(): - setattr(self, ident, node(model)) - self.api_schema = json.load(open(os.path.join(paths.src_dir, - 'API.json'))) - def error_production_handler(self, status, message, traceback, version): data = {'code': status, 'reason': message} res = template.render('error.html', data) @@ -70,7 +65,7 @@ class Root(Resource): return res def get(self): - return self.default('kimchi-ui.html') + return self.default(self.default_page) @cherrypy.expose def default(self, page, **kwargs): @@ -84,6 +79,17 @@ class Root(Resource): return template.render('tabs/' + page, None) raise cherrypy.HTTPError(404) + +class KimchiRoot(Root): + def __init__(self, model, dev_env): + super(KimchiRoot, self).__init__(model, dev_env) + self.default_page = 'kimchi-ui.html' + for ident, node in sub_nodes.items(): + setattr(self, ident, node(model)) + self.api_schema = json.load(open(os.path.join(paths.src_dir, + 'API.json'))) + self.paths = paths + @cherrypy.expose def login(self, *args): params = parse_request() diff --git a/src/kimchi/server.py b/src/kimchi/server.py index 9884249..6b5925c 100644 --- a/src/kimchi/server.py +++ b/src/kimchi/server.py @@ -35,7 +35,7 @@ from kimchi import mockmodel from kimchi import vnc from kimchi.config import paths, PluginPaths from kimchi.control import sub_nodes -from kimchi.root import Root +from kimchi.root import KimchiRoot from kimchi.utils import get_enabled_plugins, import_class @@ -192,7 +192,7 @@ class Server(object): if node.url_auth: self.configObj["/%s" % ident] = {'tools.kimchiauth.on': True} - self.app = cherrypy.tree.mount(Root(model_instance, dev_env), + self.app = cherrypy.tree.mount(KimchiRoot(model_instance, dev_env), config=self.configObj) self._load_plugins() diff --git a/src/kimchi/template.py b/src/kimchi/template.py index 37676b6..7891923 100644 --- a/src/kimchi/template.py +++ b/src/kimchi/template.py @@ -31,9 +31,6 @@ from Cheetah.Template import Template from glob import iglob -from kimchi.config import paths - - def get_lang(): cookie = cherrypy.request.cookie if "kimchiLang" in cookie.keys(): @@ -56,6 +53,7 @@ def get_lang(): def get_support_languages(): + paths = cherrypy.request.app.root.paths mopath = "%s/*" % paths.mo_dir return [path.rsplit('/', 1)[1] for path in iglob(mopath)] @@ -88,6 +86,7 @@ def can_accept_html(): can_accept('*/*') def render(resource, data): + paths = cherrypy.request.app.root.paths if can_accept('application/json'): cherrypy.response.headers['Content-Type'] = 'application/json;charset=utf-8' return json.dumps(data, indent=2, separators=(',', ':')) -- 1.8.4.2