[IMP] home controller

bzr revid: chs@openerp.com-20120808114110-b7x8b3e4pfn20ie5
This commit is contained in:
Christophe Simonis 2012-08-08 13:41:10 +02:00
parent d34fec4471
commit 1d75045294
2 changed files with 115 additions and 113 deletions

View File

@ -455,7 +455,6 @@ class Root(object):
by the server, will be filtered by this pattern by the server, will be filtered by this pattern
""" """
def __init__(self, options, openerp_addons_namespace=True): def __init__(self, options, openerp_addons_namespace=True):
self.root = '/web/webclient/home'
self.config = options self.config = options
if not hasattr(self.config, 'connector'): if not hasattr(self.config, 'connector'):
@ -495,11 +494,7 @@ class Root(object):
request.parameter_storage_class = werkzeug.datastructures.ImmutableDict request.parameter_storage_class = werkzeug.datastructures.ImmutableDict
request.app = self request.app = self
if request.path == '/': if request.path == '/mobile': # FIXME move to web_mobile module
params = urllib.urlencode(request.args)
return werkzeug.utils.redirect(self.root + '?' + params, 301)(
environ, start_response)
elif request.path == '/mobile':
return werkzeug.utils.redirect( return werkzeug.utils.redirect(
'/web_mobile/static/src/web_mobile.html', 301)(environ, start_response) '/web_mobile/static/src/web_mobile.html', 301)(environ, start_response)

View File

@ -163,16 +163,13 @@ def sass2scss(src):
return out return out
return write(sass) return write(sass)
class WebClient(openerpweb.Controller): def server_wide_modules(req):
_cp_path = "/web/webclient"
def server_wide_modules(self, req):
addons = [i for i in req.config.server_wide_modules if i in openerpweb.addons_manifest] addons = [i for i in req.config.server_wide_modules if i in openerpweb.addons_manifest]
return addons return addons
def manifest_glob(self, req, addons, key): def manifest_glob(req, addons, key):
if addons is None: if addons is None:
addons = self.server_wide_modules(req) addons = server_wide_modules(req)
else: else:
addons = addons.split(',') addons = addons.split(',')
r = [] r = []
@ -188,32 +185,21 @@ class WebClient(openerpweb.Controller):
r.append((path, path[len(addons_path):])) r.append((path, path[len(addons_path):]))
return r return r
def manifest_list(self, req, mods, extension): def manifest_list(req, mods, extension):
if not req.debug: if not req.debug:
path = '/web/webclient/' + extension path = '/web/webclient/' + extension
if mods is not None: if mods is not None:
path += '?mods=' + mods path += '?mods=' + mods
return [path] return [path]
no_sugar = req.httprequest.environ["QUERY_STRING"].count("no_sugar") >= 1 files = manifest_glob(req, mods, extension)
no_sugar = no_sugar or req.httprequest.environ.get('HTTP_REFERER', '').count("no_sugar") >= 1 i_am_diabetic = req.httprequest.environ["QUERY_STRING"].count("no_sugar") >= 1 or \
if not no_sugar: req.httprequest.environ.get('HTTP_REFERER', '').count("no_sugar") >= 1
return ['%s?debug=%s' % (wp, os.path.getmtime(fp)) for fp, wp in self.manifest_glob(req, mods, extension)] if i_am_diabetic:
return [wp for _fp, wp in files]
else: else:
return [el[1] for el in self.manifest_glob(req, mods, extension)] return ['%s?debug=%s' % (wp, os.path.getmtime(fp)) for fp, wp in files]
@openerpweb.jsonrequest def get_last_modified(files):
def csslist(self, req, mods=None):
return self.manifest_list(req, mods, 'css')
@openerpweb.jsonrequest
def jslist(self, req, mods=None):
return self.manifest_list(req, mods, 'js')
@openerpweb.jsonrequest
def qweblist(self, req, mods=None):
return self.manifest_list(req, mods, 'qweb')
def get_last_modified(self, files):
""" Returns the modification time of the most recently modified """ Returns the modification time of the most recently modified
file provided file provided
@ -227,7 +213,7 @@ class WebClient(openerpweb.Controller):
for f in files) for f in files)
return datetime.datetime(1970, 1, 1) return datetime.datetime(1970, 1, 1)
def make_conditional(self, req, response, last_modified=None, etag=None): def make_conditional(req, response, last_modified=None, etag=None):
""" Makes the provided response conditional based upon the request, """ Makes the provided response conditional based upon the request,
and mandates revalidation from clients and mandates revalidation from clients
@ -251,10 +237,52 @@ class WebClient(openerpweb.Controller):
response.set_etag(etag) response.set_etag(etag)
return response.make_conditional(req.httprequest) return response.make_conditional(req.httprequest)
class Home(openerpweb.Controller):
_cp_path = '/'
@openerpweb.httprequest
def index(self, req, s_action=None, **kw):
js = "\n ".join('<script type="text/javascript" src="%s"></script>' % i for i in manifest_list(req, None, 'js'))
css = "\n ".join('<link rel="stylesheet" href="%s">' % i for i in manifest_list(req, None, 'css'))
r = html_template % {
'js': js,
'css': css,
'modules': simplejson.dumps(server_wide_modules(req)),
'init': 'var wc = new s.web.WebClient();wc.appendTo($(document.body));'
}
return r
@openerpweb.httprequest
def login(self, req, db, login, key):
return self._login(req, db, login, key)
def _login(self, req, db, login, key, redirect_url='/'):
req.session.authenticate(db, login, key, {})
redirect = werkzeug.utils.redirect(redirect_url, 303)
cookie_val = urllib2.quote(simplejson.dumps(req.session_id))
redirect.set_cookie('instance0|session_id', cookie_val)
return redirect
class WebClient(openerpweb.Controller):
_cp_path = "/web/webclient"
@openerpweb.jsonrequest
def csslist(self, req, mods=None):
return manifest_list(req, mods, 'css')
@openerpweb.jsonrequest
def jslist(self, req, mods=None):
return manifest_list(req, mods, 'js')
@openerpweb.jsonrequest
def qweblist(self, req, mods=None):
return manifest_list(req, mods, 'qweb')
@openerpweb.httprequest @openerpweb.httprequest
def css(self, req, mods=None): def css(self, req, mods=None):
files = list(self.manifest_glob(req, mods, 'css')) files = list(manifest_glob(req, mods, 'css'))
last_modified = self.get_last_modified(f[0] for f in files) last_modified = get_last_modified(f[0] for f in files)
if req.httprequest.if_modified_since and req.httprequest.if_modified_since >= last_modified: if req.httprequest.if_modified_since and req.httprequest.if_modified_since >= last_modified:
return werkzeug.wrappers.Response(status=304) return werkzeug.wrappers.Response(status=304)
@ -287,57 +315,36 @@ class WebClient(openerpweb.Controller):
content, checksum = concat_files((f[0] for f in files), reader) content, checksum = concat_files((f[0] for f in files), reader)
return self.make_conditional( return make_conditional(
req, req.make_response(content, [('Content-Type', 'text/css')]), req, req.make_response(content, [('Content-Type', 'text/css')]),
last_modified, checksum) last_modified, checksum)
@openerpweb.httprequest @openerpweb.httprequest
def js(self, req, mods=None): def js(self, req, mods=None):
files = [f[0] for f in self.manifest_glob(req, mods, 'js')] files = [f[0] for f in manifest_glob(req, mods, 'js')]
last_modified = self.get_last_modified(files) last_modified = get_last_modified(files)
if req.httprequest.if_modified_since and req.httprequest.if_modified_since >= last_modified: if req.httprequest.if_modified_since and req.httprequest.if_modified_since >= last_modified:
return werkzeug.wrappers.Response(status=304) return werkzeug.wrappers.Response(status=304)
content, checksum = concat_files(files, intersperse=';') content, checksum = concat_files(files, intersperse=';')
return self.make_conditional( return make_conditional(
req, req.make_response(content, [('Content-Type', 'application/javascript')]), req, req.make_response(content, [('Content-Type', 'application/javascript')]),
last_modified, checksum) last_modified, checksum)
@openerpweb.httprequest @openerpweb.httprequest
def qweb(self, req, mods=None): def qweb(self, req, mods=None):
files = [f[0] for f in self.manifest_glob(req, mods, 'qweb')] files = [f[0] for f in manifest_glob(req, mods, 'qweb')]
last_modified = self.get_last_modified(files) last_modified = get_last_modified(files)
if req.httprequest.if_modified_since and req.httprequest.if_modified_since >= last_modified: if req.httprequest.if_modified_since and req.httprequest.if_modified_since >= last_modified:
return werkzeug.wrappers.Response(status=304) return werkzeug.wrappers.Response(status=304)
content, checksum = concat_xml(files) content, checksum = concat_xml(files)
return self.make_conditional( return make_conditional(
req, req.make_response(content, [('Content-Type', 'text/xml')]), req, req.make_response(content, [('Content-Type', 'text/xml')]),
last_modified, checksum) last_modified, checksum)
@openerpweb.httprequest
def home(self, req, s_action=None, **kw):
js = "\n ".join('<script type="text/javascript" src="%s"></script>'%i for i in self.manifest_list(req, None, 'js'))
css = "\n ".join('<link rel="stylesheet" href="%s">'%i for i in self.manifest_list(req, None, 'css'))
r = html_template % {
'js': js,
'css': css,
'modules': simplejson.dumps(self.server_wide_modules(req)),
'init': 'var wc = new s.web.WebClient();wc.appendTo($(document.body));'
}
return r
@openerpweb.httprequest
def login(self, req, db, login, key):
req.session.authenticate(db, login, key, {})
redirect = werkzeug.utils.redirect('/web/webclient/home', 303)
cookie_val = urllib2.quote(simplejson.dumps(req.session_id))
redirect.set_cookie('instance0|session_id', cookie_val)
return redirect
@openerpweb.jsonrequest @openerpweb.jsonrequest
def translations(self, req, mods, lang): def translations(self, req, mods, lang):
lang_model = req.session.model('res.lang') lang_model = req.session.model('res.lang')