[REF] web_editor, website: move ACE editor to web_editor

The commit e59a7fe3ff has moved
the ACE editor from website to web_editor. As some code on ir_ui_view
was used for this widget, the code has also been moved to web_editor.
This commit is contained in:
Martin Geubelle
2016-09-28 16:55:51 +02:00
committed by Géry Debongnie
parent fa4fa90890
commit e11f23b701
6 changed files with 178 additions and 133 deletions
+8
View File
@@ -222,3 +222,11 @@ class Web_Editor(http.Controller):
if attachments_to_remove:
attachments_to_remove.unlink()
return removal_blocked_by
@http.route('/web_editor/customize_template_get', type='json', auth='user', website=True)
def customize_template_get(self, key, full=False, bundles=False):
""" Get inherit view's informations of the template ``key``.
returns templates (which can be active or not)
``bundles=True`` returns also the asset bundles
"""
return request.env["ir.ui.view"].customize_template_get(key, full=full, bundles=bundles)
+96
View File
@@ -113,3 +113,99 @@ class IrUiView(models.Model):
view.write({'arch': view._pretty_arch(arch)})
self.sudo().mapped('model_data_id').write({'noupdate': True})
@api.model
def _view_obj(self, view_id):
if isinstance(view_id, basestring):
return self.env.ref(view_id)
elif isinstance(view_id, (int, long)):
return self.browse(view_id)
# assume it's already a view object (WTF?)
return view_id
# Returns all views (called and inherited) related to a view
# Used by translation mechanism, SEO and optional templates
@api.model
def _views_get(self, view_id, options=True, bundles=False, root=True):
""" For a given view ``view_id``, should return:
* the view itself
* all views inheriting from it, enabled or not
- but not the optional children of a non-enabled child
* all views called from it (via t-call)
:returns recordset of ir.ui.view
"""
try:
view = self._view_obj(view_id)
except ValueError:
_logger.warning("Could not find view object with view_id '%s'", view_id)
return []
while root and view.inherit_id:
view = view.inherit_id
views_to_return = view
node = etree.fromstring(view.arch)
xpath = "//t[@t-call]"
if bundles:
xpath += "| //t[@t-call-assets]"
for child in node.xpath(xpath):
try:
called_view = self._view_obj(child.get('t-call', child.get('t-call-assets')))
except ValueError:
continue
if called_view not in views_to_return:
views_to_return += self._views_get(called_view, options=options, bundles=bundles)
extensions = view.inherit_children_ids
if not options:
# only active children
extensions = view.inherit_children_ids.filtered(lambda view: view.active)
# Keep options in a deterministic order regardless of their applicability
for extension in extensions.sorted(key=lambda v: v.id):
# only return optional grandchildren if this child is enabled
for ext_view in self._views_get(extension, options=extension.active, root=False):
if ext_view not in views_to_return:
views_to_return += ext_view
return views_to_return
@api.model
def customize_template_get(self, key, full=False, bundles=False):
""" Get inherit view's informations of the template ``key``.
returns templates (which can be active or not)
``bundles=True`` returns also the asset bundles
"""
user = self.env.user
user_groups = set(user.groups_id)
views = self.with_context(active_test=False)._views_get(key, bundles=bundles)
done = set()
result = []
for view in views:
if full:
if not user_groups.issuperset(view.groups_id):
continue
if view.inherit_id not in done:
result.append({
'name': view.inherit_id.name,
'id': view.id,
'key': view.key,
'xml_id': view.xml_id,
'arch': view.arch,
'inherit_id': view.inherit_id.id,
'header': True,
'active': False
})
done.add(view.inherit_id)
result.append({
'name': view.name,
'id': view.id,
'key': view.key,
'xml_id': view.xml_id,
'arch': view.arch,
'inherit_id': view.inherit_id.id,
'header': False,
'active': view.active,
})
return result
@@ -119,6 +119,63 @@
.o-animation(fadeInDownSmall, 700ms, @fill-mode: forwards);
}
// ACE EDITOR
.o_ace_view_editor {
@o-ace-color: #2F3129;
background: @o-ace-color;
color: white;
.o-flex-display();
.o-flex-flow(column, nowrap);
.o_ace_view_editor_title {
.o-flex(0, 0, auto);
.o-flex-display();
.o-align-items(center);
.o-justify-content(space-between);
padding: @grid-gutter-width/4;
> * {
.o-flex(0, 0, auto);
margin: 0 @grid-gutter-width/4;
&.oe_include_bundles {
.o-flex-display();
.o-align-items(center);
font-size: 11px;
> .o_checkbox {
margin-right: @grid-gutter-width/4;
}
}
}
> select {
.o-flex(0, 1, auto);
min-width: 60px;
}
}
#ace-view-id {
.o-flex(0, 0, auto);
padding: @grid-gutter-width/4 @grid-gutter-width/2;
background-color: lighten(@o-ace-color, 10%);
}
#ace-view-editor {
height: 70%; // in case flex is not supported
.o-flex(1, 1, auto);
.ace_gutter {
cursor: ew-resize;
}
}
&.oe_ace_open {
opacity: 0.97;
}
&.oe_ace_closed {
z-index: -1000;
opacity: 0;
}
}
// MODALS
body .modal {
// SELECT MEDIA
+1 -1
View File
@@ -261,7 +261,7 @@ class Website(Home):
return request.redirect(redirect)
@http.route('/website/customize_template_get', type='json', auth='user', website=True)
def customize_template_get(self, key, full=False, bundles=False):
def customize_template_get(self, key, full=True, bundles=False):
""" Get inherit view's informations of the template ``key``. By default, only
:returns ``customize_show`` templates (which can be active or not), if
``full=True`` returns inherit view's informations of the template ``key``.
+16 -78
View File
@@ -69,54 +69,6 @@ class View(models.Model):
# assume it's already a view object (WTF?)
return view_id
# Returns all views (called and inherited) related to a view
# Used by translation mechanism, SEO and optional templates
@api.model
def _views_get(self, view_id, options=True, bundles=False, root=True):
""" For a given view ``view_id``, should return:
* the view itself
* all views inheriting from it, enabled or not
- but not the optional children of a non-enabled child
* all views called from it (via t-call)
:returns recordset of ir.ui.view
"""
try:
view = self._view_obj(view_id)
except ValueError:
_logger.warning("Could not find view object with view_id '%s'", view_id)
return []
while root and view.inherit_id:
view = view.inherit_id
views_to_return = view
node = etree.fromstring(view.arch)
xpath = "//t[@t-call]"
if bundles:
xpath += "| //t[@t-call-assets]"
for child in node.xpath(xpath):
try:
called_view = self._view_obj(child.get('t-call', child.get('t-call-assets')))
except ValueError:
continue
if called_view not in views_to_return:
views_to_return += self._views_get(called_view, options=options, bundles=bundles)
extensions = view.inherit_children_ids
if not options:
# only active children
extensions = view.inherit_children_ids.filtered(lambda view: view.active)
# Keep options in a deterministic order regardless of their applicability
for extension in extensions.sorted(key=lambda v: v.id):
# only return optional grandchildren if this child is enabled
for ext_view in self._views_get(extension, options=extension.active, root=False):
if ext_view not in views_to_return:
views_to_return += ext_view
return views_to_return
@api.model
@tools.ormcache_context('self._uid', 'xml_id', keys=('website_id',))
def get_view_id(self, xml_id):
@@ -186,37 +138,23 @@ class View(models.Model):
@api.model
def customize_template_get(self, key, full=False, bundles=False):
""" Get inherit view's informations of the template ``key``. By default, only
returns ``customize_show`` templates (which can be active or not), if
``full=True`` returns inherit view's informations of the template ``key``.
``bundles=True`` returns also the asset bundles
:returns ``customize_show`` templates (which can be active or not), if
``full=True`` returns inherit view's informations of the template ``key``.
``bundles=True`` returns also the asset bundles
"""
result = super(View, self).customize_template_get(key, full=full, bundles=bundles)
imd = self.env['ir.model.data']
view_theme_id = imd.xmlid_to_res_id('website.theme')
user = self.env.user
user_groups = set(user.groups_id)
views = self.with_context(active_test=False)._views_get(key, bundles=bundles)
done = set()
result = []
for view in views:
if not user_groups.issuperset(view.groups_id):
result_filtered = []
for x in result:
if not full:
view = self.browse(x['id'])
if not view.customize_show:
continue
if view_theme_id and x['inherit_id'] == view_theme_id:
continue
if full or (view.customize_show and view.inherit_id.id != view_theme_id):
if view.inherit_id not in done:
result.append({
'name': view.inherit_id.name,
'id': view.id,
'key': view.key,
'inherit_id': view.inherit_id.id,
'header': True,
'active': False
})
done.add(view.inherit_id)
result.append({
'name': view.name,
'id': view.id,
'key': view.key,
'inherit_id': view.inherit_id.id,
'header': False,
'active': view.active,
})
return result
result_filtered.append(x)
return result_filtered
@@ -324,63 +324,9 @@ body .modal {
// ACE EDITOR
.o_ace_view_editor {
@o-ace-color: #2F3129;
.o-position-absolute(@odoo-navbar-height, 0, 0);
position: fixed;
.o-flex-display();
.o-flex-flow(column, nowrap);
z-index: 1001;
background: @o-ace-color;
color: white;
.o_ace_view_editor_title {
.o-flex(0, 0, auto);
.o-flex-display();
.o-align-items(center);
.o-justify-content(space-between);
padding: @grid-gutter-width/4;
> * {
.o-flex(0, 0, auto);
margin: 0 @grid-gutter-width/4;
&.oe_include_bundles {
.o-flex-display();
.o-align-items(center);
font-size: 11px;
> .o_checkbox {
margin-right: @grid-gutter-width/4;
}
}
}
> select {
.o-flex(0, 1, auto);
min-width: 60px;
}
}
#ace-view-id {
.o-flex(0, 0, auto);
padding: @grid-gutter-width/4 @grid-gutter-width/2;
background-color: lighten(@o-ace-color, 10%);
}
#ace-view-editor {
height: 70%; // in case flex is not supported
.o-flex(1, 1, auto);
.ace_gutter {
cursor: ew-resize;
}
}
&.oe_ace_open {
opacity: 0.97;
}
&.oe_ace_closed {
z-index: -1000;
opacity: 0;
}
}
// PLANNER DIALOG