[IMP] prevent edition of page if groups which current user doesn't have
authorXavier Morel <xmo@openerp.com>
Tue, 17 Jun 2014 10:01:52 +0000 (12:01 +0200)
committerXavier Morel <xmo@openerp.com>
Tue, 17 Jun 2014 10:01:52 +0000 (12:01 +0200)
If the current view uses @groups attributes (possibly in called templates),
the corresponding elements are rendered to a void (empty string in qweb). If
said user can edit the page, does so and saves a view section in which there's
a @groups to which he has no access, the element[@groups] is completely
removed from the template once saved, losing it.

If QWeb encounters an @groups to which the current user has no right during
rendering, have it request a no-RTE page, so the user can not RTE-edit the
page (or drop snippets in it).

addons/website/static/src/js/website.editor.js
addons/website/static/src/xml/website.xml
addons/website/views/website_templates.xml
openerp/addons/base/ir/ir_qweb.py

index fcb957c..f8d1a66 100644 (file)
@@ -3,6 +3,7 @@
 
     var website = openerp.website;
     var _t = openerp._t;
+    website.no_editor = !!$(document.documentElement).data('editable-no-editor');
 
     website.add_template_file('/website/static/src/xml/website.editor.xml');
     website.dom_ready.done(function () {
             this.$('#website-top-edit').hide();
             this.$('#website-top-view').show();
 
+            if (website.no_editor) {
+                var help_text = $(document.documentElement).data('editable-no-editor');
+                this.$('button[data-action=edit]')
+                    .prop('disabled', website.no_editor)
+                    .parent()
+                    // help must be set on form above button because it does
+                    // not appear on disabled button
+                    .attr('title', help_text);
+            }
+
+
             $('.dropdown-toggle').dropdown();
             this.customize_setup();
 
index 4d9c9fc..684a46a 100644 (file)
@@ -14,7 +14,8 @@
                         <span class="icon-bar"></span>
                     </button>
                     <form class="navbar-form navbar-left">
-                        <button type="button" data-action="edit" class="btn btn-primary hidden">Edit</button>
+                        <button type="button" data-action="edit"
+                                class="btn btn-primary hidden">Edit</button>
                     </form>
                 </div>
                 <div class="collapse navbar-collapse navbar-edit-collapse">
index e5c1bfc..50d4fa8 100644 (file)
@@ -59,6 +59,7 @@
     <html t-att-lang="lang and lang.replace('_', '-')"
           t-att-data-website-id="website.id if editable else None"
           t-att-data-editable="'1' if editable else None"
+          t-att-data-editable-no-editor="editable_no_editor or None"
           t-att-data-translatable="'1' if translatable else None"
           t-att-data-view-xmlid="xmlid if editable else None"
           t-att-data-main-object="repr(main_object) if editable else None"
     <xpath expr="//body" position="inside">
         <div id="website-top-navbar-placeholder" class="navbar navbar-inverse navbar-fixed-top hidden-xs">
             <div class="navbar-header">
-                <form class="navbar-form navbar-left">
-                    <button type="button" class="btn btn-primary">Edit</button>
+                <form class="navbar-form navbar-left" title="editable_no_editor or None">
+                    <button type="button" class="btn btn-primary"
+                            disabled="'disabled' if editable_no_editor else None"
+                        >Edit</button>
                 </form>
             </div>
             <div class="collapse navbar-collapse navbar-edit-collapse">
index be4bfe1..5fb56a2 100644 (file)
@@ -256,9 +256,15 @@ class QWeb(orm.AbstractModel):
                     cr = qwebcontext.get('request') and qwebcontext['request'].cr or None
                     uid = qwebcontext.get('request') and qwebcontext['request'].uid or None
                     can_see = self.user_has_groups(cr, uid, groups=attribute_value) if cr and uid else False
-                    if not can_see:
-                        return ''
-                    continue
+                    if can_see:
+                        continue
+                    if qwebcontext.get('editable') and not qwebcontext.get('editable_no_editor'):
+                        errmsg = _("Editor disabled because some content can not be seen by a user who does not belong to the groups %s")
+                        raise openerp.http.Retry(
+                            _("User does not belong to groups %s") % attribute_value, {
+                                'editable_no_editor': errmsg % attribute_value
+                            })
+                    return ''
 
                 if isinstance(attribute_value, unicode):
                     attribute_value = attribute_value.encode("utf8")
@@ -302,7 +308,7 @@ class QWeb(orm.AbstractModel):
             for current_node in element.childNodes:
                 try:
                     g_inner.append(self.render_node(current_node, qwebcontext))
-                except QWebException:
+                except (QWebException, openerp.http.Retry):
                     raise
                 except Exception:
                     template = qwebcontext.get('__template__')