[ADD] WebContext object and language selector
authorFabien Meghazi <fme@openerp.com>
Tue, 3 Sep 2013 15:35:20 +0000 (17:35 +0200)
committerFabien Meghazi <fme@openerp.com>
Tue, 3 Sep 2013 15:35:20 +0000 (17:35 +0200)
bzr revid: fme@openerp.com-20130903153520-14o3vk29l3ft7z0a

addons/website/controllers/main.py
addons/website/views/views.xml
addons/website/website.py
addons/website_project/controllers/main.py
addons/website_sale/controllers/main.py

index 6605f03..c2dd664 100644 (file)
@@ -14,6 +14,7 @@ import werkzeug.wrappers
 from PIL import Image
 
 import openerp
+from openerp.addons.website.website import route
 from openerp.addons.web import http
 from openerp.addons.web.http import request
 
@@ -34,7 +35,7 @@ PIL_MIME_MAPPING = {'PNG': 'image/png', 'JPEG': 'image/jpeg', 'GIF': 'image/gif'
 # Completely arbitrary limits
 MAX_IMAGE_WIDTH, MAX_IMAGE_HEIGHT = IMAGE_LIMITS = (1024, 768)
 class Website(openerp.addons.web.controllers.main.Home):
-    @http.route('/', type='http', auth="admin")
+    @route('/', type='http', auth="admin")
     def index(self, **kw):
         return self.page("website.homepage")
 
@@ -42,7 +43,7 @@ class Website(openerp.addons.web.controllers.main.Home):
     def admin(self, *args, **kw):
         return super(Website, self).index(*args, **kw)
 
-    @http.route('/pagenew/<path:path>', type='http', auth="admin")
+    @route('/pagenew/<path:path>', type='http', auth="admin")
     def pagenew(self, path, noredirect=NOPE):
         if '.' in path:
             module, idname = path.split('.', 1)
@@ -80,7 +81,7 @@ class Website(openerp.addons.web.controllers.main.Home):
             return werkzeug.wrappers.Response(url, mimetype='text/plain')
         return werkzeug.utils.redirect(url)
 
-    @http.route('/website/theme_change', type='http', auth="admin")
+    @route('/website/theme_change', type='http', auth="admin")
     def theme_change(self, theme_id=False, **kwargs):
         imd = request.registry['ir.model.data']
         view = request.registry['ir.ui.view']
@@ -94,25 +95,19 @@ class Website(openerp.addons.web.controllers.main.Home):
             view_model, view_id = imd.get_object_reference(request.cr, request.uid, module, xml_id)
             view.write(request.cr, request.uid, [view_id], {'inherit_id':view_option_id})
 
-        website = request.registry.get("website")
-        values = website.get_rendering_context({
-            'theme_changed': True
-        })
-        return website.render('website.themes', values)
+        request.webcontext['theme_changed'] = True
+        return request.webcontext.render('website.themes')
 
-    @http.route('/page/<path:path>', type='http', auth="admin")
+    @route('/page/<path:path>', type='http', auth="admin")
     def page(self, path, **kwargs):
-        website = request.registry['website']
-        values = website.get_rendering_context({
-            'path': path
-        })
+        request.webcontext['path'] = path
         try:
-            html = website.render(path, values)
+            html = request.webcontext.render(path)
         except ValueError:
-            html = website.render('website.404', values)
+            html = request.webcontext.render('website.404')
         return html
 
-    @http.route('/website/customize_template_toggle', type='json', auth='admin') # FIXME: auth
+    @route('/website/customize_template_toggle', type='json', auth='admin') # FIXME: auth
     def customize_template_set(self, view_id):
         view_obj = request.registry.get("ir.ui.view")
         view = view_obj.browse(request.cr, request.uid, int(view_id), context=request.context)
@@ -125,7 +120,7 @@ class Website(openerp.addons.web.controllers.main.Home):
         }, context=request.context)
         return True
 
-    @http.route('/website/customize_template_get', type='json', auth='admin') # FIXME: auth
+    @route('/website/customize_template_get', type='json', auth='admin') # FIXME: auth
     def customize_template_get(self, xml_id):
         imd = request.registry['ir.model.data']
         view_model, view_theme_id = imd.get_object_reference(request.cr, request.uid, 'website', 'theme')
@@ -151,7 +146,7 @@ class Website(openerp.addons.web.controllers.main.Home):
                 })
         return result
 
-    @http.route('/website/attach', type='http', auth='admin') # FIXME: auth
+    @route('/website/attach', type='http', auth='admin') # FIXME: auth
     def attach(self, func, upload):
         req = request.httprequest
         if req.method != 'POST':
@@ -175,7 +170,7 @@ class Website(openerp.addons.web.controllers.main.Home):
             window.parent['%s'](%s, %s);
         </script>""" % (func, json.dumps(url), json.dumps(message))
 
-    @http.route('/website/attachment/<int:id>', type='http', auth="admin")
+    @route('/website/attachment/<int:id>', type='http', auth="admin")
     def attachment(self, id):
         # FIXME: can't use Binary.image because auth=user and website attachments need to be public
         attachment = request.registry['ir.attachment'].browse(
@@ -200,7 +195,7 @@ class Website(openerp.addons.web.controllers.main.Home):
         image.save(response.stream, image.format)
         return response
 
-    @http.route('/website/image', type='http', auth="public")
+    @route('/website/image', type='http', auth="public")
     def image(self, model, id, field, **kw):
         last_update = '__last_update'
         Model = request.registry[model]
@@ -241,7 +236,7 @@ class Website(openerp.addons.web.controllers.main.Home):
             pass
         return request.make_response(image_data, headers)
 
-    @http.route(['/website/publish/'], type='http', auth="public")
+    @route(['/website/publish/'], type='http', auth="public")
     def publish(self, **post):
         _id = int(post['id'])
         _object = request.registry[post['object']]
@@ -252,7 +247,7 @@ class Website(openerp.addons.web.controllers.main.Home):
 
         return obj.website_published and "1" or "0"
 
-    @http.route(['/website/kanban/'], type='http', auth="public")
+    @route(['/website/kanban/'], type='http', auth="public")
     def kanban(self, **post):
         return request.registry['website'].kanban_col(**post)
 
index b431b4f..df60734 100644 (file)
                                         <ul class="nav navbar-nav navbar-right" id="top_menu">
                                             <li><a href="/page/website.contactus">Contact us</a></li>
                                             <li><a href="/admin">Sign in</a></li>
+                                            <li t-if="len(lang_list) &gt; 1" class="dropdown">
+                                                <a class="dropdown-toggle" data-toggle="dropdown" href="#">
+                                                    <t t-esc="lang_selected['name']"/> <span class="caret"></span>
+                                                </a>
+                                                <ul class="dropdown-menu" role="menu">
+                                                    <li t-foreach="lang_list" t-as="lg">
+                                                        <a href="#" role="menuitem">
+                                                            <strong t-att-class="'icon-check' if lg['code'] == lang_selected['code']
+                                                                else 'icon-check-empty'"></strong>
+                                                            <t t-esc="lg['name']"/>
+                                                        </a>
+                                                    </li>
+                                                </ul>
+                                            </li>
                                         </ul>
                                     </div>
                                 </div>
index 993b086..839a1ba 100644 (file)
@@ -22,8 +22,7 @@ def route(*route_args, **route_kwargs):
         @functools.wraps(f, assigned=functools.WRAPPER_ASSIGNMENTS + ('func_name',))
         def wrap(*args, **kwargs):
             if not hasattr(request, 'webcontext'):
-                website = request.registry.get("website")
-                request.webcontext = website.get_rendering_context(lang=kwargs.get('lang', None))
+                request.webcontext = WebContext()
                 request.context['lang'] = request.webcontext['lang_selected']['code']
 
             return f(*args, **kwargs)
@@ -50,6 +49,22 @@ def urlplus(url, params):
 class WebsiteError(Exception):
     pass
 
+class WebContext(dict):
+    def __init__(self):
+        self.website = request.registry.get("website")
+        lang = request.httprequest.host.split('.')[0]
+        context = self.website.get_rendering_context(lang=lang)
+        dict.__init__(self, context)
+    def __getattr__(self, name):
+        if hasattr(self.website, name):
+            return getattr(self.website, name)
+        elif name in self:
+            return self[name]
+        else:
+            raise AttributeError
+    def render(self, template, values=None):
+        return self.website.render(template, self)
+
 class website(osv.osv):
     _name = "website" # Avoid website.website convention for conciseness (for new api). Got a special authorization from xmo and rco
     _description = "Website"
index 1d87564..5831bfa 100644 (file)
@@ -7,7 +7,7 @@ from openerp.addons.web.http import request
 
 class website(osv.osv):
     _inherit = "website"
-    def get_rendering_context(self, additional_values=None):
+    def get_rendering_context(self, additional_values=None, **kw):
         project_obj = request.registry['project.project']
         project_ids = project_obj.search(request.cr, request.uid, [('privacy_visibility', "=", "public")])
         values = {
index 1ee5f33..f03ad54 100644 (file)
@@ -42,7 +42,7 @@ def get_current_order():
 
 class website(osv.osv):
     _inherit = "website"
-    def get_rendering_context(self, additional_values=None):
+    def get_rendering_context(self, additional_values=None, **kw):
         values = {
             'order': get_current_order(),
             # 'website_sale_get_current_order': get_current_order, # TODO: replace 'order' key in templates