[IMP] prevent edition of page if groups which current user doesn't have

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).
This commit is contained in:
Xavier Morel
2014-06-17 12:01:52 +02:00
parent 63a6ba92e2
commit 79e10200d5
4 changed files with 29 additions and 7 deletions
@@ -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 () {
@@ -496,6 +497,17 @@
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();
+2 -1
View 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">
+5 -2
View 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"
@@ -179,8 +180,10 @@
<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">
+10 -4
View 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__')