Merge pull request #584 from xmo-odoo/master-qweb-groups-xmo
`@groups` attribute in qweb views
This commit is contained in:
commit
3160eb74c4
|
@ -134,14 +134,15 @@ class Report(osv.Model):
|
||||||
website = None
|
website = None
|
||||||
if request and hasattr(request, 'website'):
|
if request and hasattr(request, 'website'):
|
||||||
website = request.website
|
website = request.website
|
||||||
values.update({
|
values.update(
|
||||||
'time': time,
|
time=time,
|
||||||
'translate_doc': translate_doc,
|
translate_doc=translate_doc,
|
||||||
'editable': True, # Will active inherit_branding
|
editable=True, # Will active inherit_branding
|
||||||
'user': user,
|
user=user,
|
||||||
'res_company': user.company_id,
|
res_company=user.company_id,
|
||||||
'website': website,
|
website=website,
|
||||||
})
|
editable_no_editor=True,
|
||||||
|
)
|
||||||
return view_obj.render(cr, uid, template, values, context=context)
|
return view_obj.render(cr, uid, template, values, context=context)
|
||||||
|
|
||||||
#--------------------------------------------------------------------------
|
#--------------------------------------------------------------------------
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
var website = openerp.website;
|
var website = openerp.website;
|
||||||
var _t = openerp._t;
|
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.add_template_file('/website/static/src/xml/website.editor.xml');
|
||||||
website.dom_ready.done(function () {
|
website.dom_ready.done(function () {
|
||||||
|
@ -496,6 +497,17 @@
|
||||||
this.$('#website-top-edit').hide();
|
this.$('#website-top-edit').hide();
|
||||||
this.$('#website-top-view').show();
|
this.$('#website-top-view').show();
|
||||||
|
|
||||||
|
var $edit_button = this.$('button[data-action=edit]')
|
||||||
|
.prop('disabled', website.no_editor);
|
||||||
|
if (website.no_editor) {
|
||||||
|
var help_text = $(document.documentElement).data('editable-no-editor');
|
||||||
|
$edit_button.parent()
|
||||||
|
// help must be set on form above button because it does
|
||||||
|
// not appear on disabled button
|
||||||
|
.attr('title', help_text);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$('.dropdown-toggle').dropdown();
|
$('.dropdown-toggle').dropdown();
|
||||||
this.customize_setup();
|
this.customize_setup();
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,8 @@
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
</button>
|
</button>
|
||||||
<form class="navbar-form navbar-left">
|
<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>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="collapse navbar-collapse navbar-edit-collapse">
|
<div class="collapse navbar-collapse navbar-edit-collapse">
|
||||||
|
|
|
@ -59,6 +59,7 @@
|
||||||
<html t-att-lang="lang and lang.replace('_', '-')"
|
<html t-att-lang="lang and lang.replace('_', '-')"
|
||||||
t-att-data-website-id="website.id if editable else None"
|
t-att-data-website-id="website.id if editable else None"
|
||||||
t-att-data-editable="'1' 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-translatable="'1' if translatable else None"
|
||||||
t-att-data-view-xmlid="xmlid if editable else None"
|
t-att-data-view-xmlid="xmlid if editable else None"
|
||||||
t-att-data-main-object="repr(main_object) 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">
|
<xpath expr="//body" position="inside">
|
||||||
<div id="website-top-navbar-placeholder" class="navbar navbar-inverse navbar-fixed-top hidden-xs">
|
<div id="website-top-navbar-placeholder" class="navbar navbar-inverse navbar-fixed-top hidden-xs">
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
<form class="navbar-form navbar-left">
|
<form class="navbar-form navbar-left" title="editable_no_editor or None">
|
||||||
<button type="button" class="btn btn-primary">Edit</button>
|
<button type="button" class="btn btn-primary"
|
||||||
|
disabled="'disabled' if editable_no_editor else None"
|
||||||
|
>Edit</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="collapse navbar-collapse navbar-edit-collapse">
|
<div class="collapse navbar-collapse navbar-edit-collapse">
|
||||||
|
|
|
@ -257,8 +257,13 @@ class QWeb(orm.AbstractModel):
|
||||||
uid = qwebcontext.get('request') and qwebcontext['request'].uid 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
|
can_see = self.user_has_groups(cr, uid, groups=attribute_value) if cr and uid else False
|
||||||
if not can_see:
|
if not can_see:
|
||||||
|
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 ''
|
return ''
|
||||||
continue
|
|
||||||
|
|
||||||
if isinstance(attribute_value, unicode):
|
if isinstance(attribute_value, unicode):
|
||||||
attribute_value = attribute_value.encode("utf8")
|
attribute_value = attribute_value.encode("utf8")
|
||||||
|
@ -302,7 +307,7 @@ class QWeb(orm.AbstractModel):
|
||||||
for current_node in element.childNodes:
|
for current_node in element.childNodes:
|
||||||
try:
|
try:
|
||||||
g_inner.append(self.render_node(current_node, qwebcontext))
|
g_inner.append(self.render_node(current_node, qwebcontext))
|
||||||
except QWebException:
|
except (QWebException, openerp.http.Retry):
|
||||||
raise
|
raise
|
||||||
except Exception:
|
except Exception:
|
||||||
template = qwebcontext.get('__template__')
|
template = qwebcontext.get('__template__')
|
||||||
|
|
|
@ -1037,6 +1037,15 @@ mimetypes.add_type('application/font-woff', '.woff')
|
||||||
mimetypes.add_type('application/vnd.ms-fontobject', '.eot')
|
mimetypes.add_type('application/vnd.ms-fontobject', '.eot')
|
||||||
mimetypes.add_type('application/x-font-ttf', '.ttf')
|
mimetypes.add_type('application/x-font-ttf', '.ttf')
|
||||||
|
|
||||||
|
class Retry(RuntimeError):
|
||||||
|
""" Exception raised during QWeb rendering to signal that the rendering
|
||||||
|
should be retried with the provided ``render_updates`` dict merged into
|
||||||
|
the previous rendering context
|
||||||
|
"""
|
||||||
|
def __init__(self, name, render_updates=None):
|
||||||
|
super(Retry, self).__init__(name)
|
||||||
|
self.updates = render_updates or {}
|
||||||
|
|
||||||
class Response(werkzeug.wrappers.Response):
|
class Response(werkzeug.wrappers.Response):
|
||||||
""" Response object passed through controller route chain.
|
""" Response object passed through controller route chain.
|
||||||
|
|
||||||
|
@ -1077,7 +1086,13 @@ class Response(werkzeug.wrappers.Response):
|
||||||
def render(self):
|
def render(self):
|
||||||
view_obj = request.registry["ir.ui.view"]
|
view_obj = request.registry["ir.ui.view"]
|
||||||
uid = self.uid or request.uid or openerp.SUPERUSER_ID
|
uid = self.uid or request.uid or openerp.SUPERUSER_ID
|
||||||
return view_obj.render(request.cr, uid, self.template, self.qcontext, context=request.context)
|
while True:
|
||||||
|
try:
|
||||||
|
return view_obj.render(
|
||||||
|
request.cr, uid, self.template, self.qcontext,
|
||||||
|
context=request.context)
|
||||||
|
except Retry, e:
|
||||||
|
self.qcontext.update(e.updates)
|
||||||
|
|
||||||
def flatten(self):
|
def flatten(self):
|
||||||
self.response.append(self.render())
|
self.response.append(self.render())
|
||||||
|
|
|
@ -1704,8 +1704,8 @@ class BaseModel(object):
|
||||||
:return: True if the current user is a member of one of the
|
:return: True if the current user is a member of one of the
|
||||||
given groups
|
given groups
|
||||||
"""
|
"""
|
||||||
return any([self.pool.get('res.users').has_group(cr, uid, group_ext_id)
|
return any(self.pool['res.users'].has_group(cr, uid, group_ext_id)
|
||||||
for group_ext_id in groups.split(',')])
|
for group_ext_id in groups.split(','))
|
||||||
|
|
||||||
def _get_default_form_view(self, cr, user, context=None):
|
def _get_default_form_view(self, cr, user, context=None):
|
||||||
""" Generates a default single-line form view using all fields
|
""" Generates a default single-line form view using all fields
|
||||||
|
|
Loading…
Reference in New Issue