[MERGE] ir-ui-view split active and show_customize

Split the ternary field application in active and show_customize, all four
possible value are now needed for the customize theme popup.
This commit is contained in:
Antony Lesuisse 2014-08-31 16:56:44 +02:00
parent 1564a66dd6
commit 2d296cb779
22 changed files with 120 additions and 134 deletions

View File

@ -41,7 +41,7 @@ class WebkitXMLImport(original_xml_import):
# The solution is not meant to be long term solution, but at least # The solution is not meant to be long term solution, but at least
# allows chaining of several overrides of the _tag_report method, # allows chaining of several overrides of the _tag_report method,
# and does not require a copy/paste of the original code. # and does not require a copy/paste of the original code.
def _tag_report(self, cr, rec, data_node=None): def _tag_report(self, cr, rec, data_node=None, mode=None):
report_id = super(WebkitXMLImport, self)._tag_report(cr, rec, data_node) report_id = super(WebkitXMLImport, self)._tag_report(cr, rec, data_node)
if rec.get('report_type') == 'webkit': if rec.get('report_type') == 'webkit':
header = rec.get('webkit_header') header = rec.get('webkit_header')

View File

@ -186,19 +186,18 @@ class Website(openerp.addons.web.controllers.main.Home):
request.cr, request.uid, 'website', 'theme') request.cr, request.uid, 'website', 'theme')
views = Views.search(request.cr, request.uid, [ views = Views.search(request.cr, request.uid, [
('inherit_id', '=', theme_template_id), ('inherit_id', '=', theme_template_id),
('application', '=', 'enabled'),
], context=request.context) ], context=request.context)
Views.write(request.cr, request.uid, views, { Views.write(request.cr, request.uid, views, {
'application': 'disabled', 'active': False,
}, context=request.context) }, context=dict(request.context or {}, active_test=True))
if theme_id: if theme_id:
module, xml_id = theme_id.split('.') module, xml_id = theme_id.split('.')
_, view_id = imd.get_object_reference( _, view_id = imd.get_object_reference(
request.cr, request.uid, module, xml_id) request.cr, request.uid, module, xml_id)
Views.write(request.cr, request.uid, [view_id], { Views.write(request.cr, request.uid, [view_id], {
'application': 'enabled' 'active': True
}, context=request.context) }, context=dict(request.context or {}, active_test=True))
return request.render('website.themes', {'theme_changed': True}) return request.render('website.themes', {'theme_changed': True})
@ -242,13 +241,13 @@ class Website(openerp.addons.web.controllers.main.Home):
user_groups = set(user.groups_id) user_groups = set(user.groups_id)
views = request.registry["ir.ui.view"]\ views = request.registry["ir.ui.view"]\
._views_get(request.cr, request.uid, xml_id, context=request.context) ._views_get(request.cr, request.uid, xml_id, context=dict(request.context or {}, active_test=False))
done = set() done = set()
result = [] result = []
for v in views: for v in views:
if not user_groups.issuperset(v.groups_id): if not user_groups.issuperset(v.groups_id):
continue continue
if full or (v.application != 'always' and v.inherit_id.id != view_theme_id): if full or (v.customize_show and v.inherit_id.id != view_theme_id):
if v.inherit_id not in done: if v.inherit_id not in done:
result.append({ result.append({
'name': v.inherit_id.name, 'name': v.inherit_id.name,
@ -265,7 +264,7 @@ class Website(openerp.addons.web.controllers.main.Home):
'xml_id': v.xml_id, 'xml_id': v.xml_id,
'inherit_id': v.inherit_id.id, 'inherit_id': v.inherit_id.id,
'header': False, 'header': False,
'active': v.application in ('always', 'enabled'), 'active': v.active,
}) })
return result return result

View File

@ -1,8 +1,5 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import copy import copy
import re
import simplejson
import werkzeug
from lxml import etree, html from lxml import etree, html
@ -18,9 +15,11 @@ class view(osv.osv):
'website_meta_title': fields.char("Website meta title", size=70, translate=True), 'website_meta_title': fields.char("Website meta title", size=70, translate=True),
'website_meta_description': fields.text("Website meta description", size=160, translate=True), 'website_meta_description': fields.text("Website meta description", size=160, translate=True),
'website_meta_keywords': fields.char("Website meta keywords", translate=True), 'website_meta_keywords': fields.char("Website meta keywords", translate=True),
'customize_show': fields.boolean("Show As Optional Inherit"),
} }
_defaults = { _defaults = {
'page': False, 'page': False,
'customize_show': False,
} }
@ -68,15 +67,14 @@ class view(osv.osv):
extensions = view.inherit_children_ids extensions = view.inherit_children_ids
if not options: if not options:
# only active children # only active children
extensions = (v for v in view.inherit_children_ids extensions = (v for v in view.inherit_children_ids if v.active)
if v.application in ('always', 'enabled'))
# Keep options in a deterministic order regardless of their applicability # Keep options in a deterministic order regardless of their applicability
for extension in sorted(extensions, key=lambda v: v.id): for extension in sorted(extensions, key=lambda v: v.id):
for r in self._views_get( for r in self._views_get(
cr, uid, extension, cr, uid, extension,
# only return optional grandchildren if this child is enabled # only return optional grandchildren if this child is enabled
options=extension.application in ('always', 'enabled'), options=extension.active,
context=context, root=False): context=context, root=False):
if r not in result: if r not in result:
result.append(r) result.append(r)
@ -214,3 +212,4 @@ class view(osv.osv):
view = self.browse(cr, SUPERUSER_ID, res_id, context=context) view = self.browse(cr, SUPERUSER_ID, res_id, context=context)
if view.model_data_id: if view.model_data_id:
view.model_data_id.write({'noupdate': True}) view.model_data_id.write({'noupdate': True})

View File

@ -203,82 +203,82 @@
All Default Themes All Default Themes
--> -->
<template id="website.theme_amelia" name="Amelia" inherit_id="website.theme" optional="disabled"> <template id="website.theme_amelia" name="Amelia" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/amelia.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/amelia.min.css' t-ignore="true"/>
<link rel='stylesheet' href='/website/static/src/css/bootswatch/amelia.fix.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/amelia.fix.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_cerulean" name="Cerulean" inherit_id="website.theme" optional="disabled"> <template id="website.theme_cerulean" name="Cerulean" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/cerulean.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/cerulean.min.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_cosmo" name="Cosmo" inherit_id="website.theme" optional="disabled"> <template id="website.theme_cosmo" name="Cosmo" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/cosmo.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/cosmo.min.css' t-ignore="true"/>
<link rel='stylesheet' href='/website/static/src/css/bootswatch/cosmo.fix.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/cosmo.fix.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_cyborg" name="Cyborg" inherit_id="website.theme" optional="disabled"> <template id="website.theme_cyborg" name="Cyborg" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/cyborg.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/cyborg.min.css' t-ignore="true"/>
<link rel='stylesheet' href='/website/static/src/css/bootswatch/cyborg.fix.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/cyborg.fix.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_flatly" name="Flatly" inherit_id="website.theme" optional="disabled"> <template id="website.theme_flatly" name="Flatly" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/flatly.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/flatly.min.css' t-ignore="true"/>
<link rel='stylesheet' href='/website/static/src/css/bootswatch/flatly.fix.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/flatly.fix.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_journal" name="Journal" inherit_id="website.theme" optional="disabled"> <template id="website.theme_journal" name="Journal" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/journal.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/journal.min.css' t-ignore="true"/>
<link rel='stylesheet' href='/website/static/src/css/bootswatch/journal.fix.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/journal.fix.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_readable" name="Readable" inherit_id="website.theme" optional="disabled"> <template id="website.theme_readable" name="Readable" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/readable.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/readable.min.css' t-ignore="true"/>
<link rel='stylesheet' href='/website/static/src/css/bootswatch/readable.fix.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/readable.fix.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_simplex" name="Simplex" inherit_id="website.theme" optional="disabled"> <template id="website.theme_simplex" name="Simplex" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/simplex.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/simplex.min.css' t-ignore="true"/>
<link rel='stylesheet' href='/website/static/src/css/bootswatch/simplex.fix.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/simplex.fix.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_slate" name="Slate" inherit_id="website.theme" optional="disabled"> <template id="website.theme_slate" name="Slate" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/slate.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/slate.min.css' t-ignore="true"/>
<link rel='stylesheet' href='/website/static/src/css/bootswatch/slate.fix.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/slate.fix.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_spacelab" name="Spacelab" inherit_id="website.theme" optional="disabled"> <template id="website.theme_spacelab" name="Spacelab" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/spacelab.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/spacelab.min.css' t-ignore="true"/>
<link rel='stylesheet' href='/website/static/src/css/bootswatch/spacelab.fix.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/spacelab.fix.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_united" name="United" inherit_id="website.theme" optional="disabled"> <template id="website.theme_united" name="United" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/united.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/united.min.css' t-ignore="true"/>
</xpath> </xpath>
</template> </template>
<template id="website.theme_yeti" name="Yeti" inherit_id="website.theme" optional="disabled"> <template id="website.theme_yeti" name="Yeti" inherit_id="website.theme" active="False" customize_show="True">
<xpath expr="//link[@id='bootstrap_css']" position="replace"> <xpath expr="//link[@id='bootstrap_css']" position="replace">
<link rel='stylesheet' href='/website/static/src/css/bootswatch/yeti.min.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/yeti.min.css' t-ignore="true"/>
<link rel='stylesheet' href='/website/static/src/css/bootswatch/yeti.fix.css' t-ignore="true"/> <link rel='stylesheet' href='/website/static/src/css/bootswatch/yeti.fix.css' t-ignore="true"/>

View File

@ -169,7 +169,7 @@
</xpath> </xpath>
</template> </template>
<template id="layout_logo_show" inherit_id="website.layout" optional="enabled" name="Show Logo"> <template id="layout_logo_show" inherit_id="website.layout" customize_show="True" name="Show Logo">
<xpath expr="//header//a[@class='navbar-brand']" position="replace"> <xpath expr="//header//a[@class='navbar-brand']" position="replace">
<a href="/" class="navbar-brand logo"> <a href="/" class="navbar-brand logo">
<img src="/logo.png"/> <img src="/logo.png"/>
@ -230,7 +230,7 @@
</xpath> </xpath>
</template> </template>
<template id="show_sign_in" optional="enabled" inherit_id="website.layout" name="Show Sign In" groups="base.group_public"> <template id="show_sign_in" customize_show="True" inherit_id="website.layout" name="Show Sign In" groups="base.group_public">
<xpath expr="//ul[@id='top_menu']" position="inside"> <xpath expr="//ul[@id='top_menu']" position="inside">
<li class="divider"/> <li class="divider"/>
<li> <li>
@ -272,7 +272,7 @@
</xpath> </xpath>
</template> </template>
<template id="footer_default" inherit_id="website.footer_custom" optional="enabled" name="Automatic Footer"> <template id="footer_default" inherit_id="website.footer_custom" customize_show="True" name="Automatic Footer">
<xpath expr="//div[@id='footer']" position="replace"> <xpath expr="//div[@id='footer']" position="replace">
<div class="container hidden-print"> <div class="container hidden-print">
<div class="row"> <div class="row">

View File

@ -161,7 +161,7 @@
<!-- Option: Blog Post List: show tags --> <!-- Option: Blog Post List: show tags -->
<template id="opt_blog_post_short_tags" name="Tags" <template id="opt_blog_post_short_tags" name="Tags"
optional="enabled" inherit_id="website_blog.blog_post_short"> customize_show="True" inherit_id="website_blog.blog_post_short">
<xpath expr="//div[@name='blog_post_data']" position="inside"> <xpath expr="//div[@name='blog_post_data']" position="inside">
<p class="post-meta text-muted text-center" t-if="len(blog_post.tag_ids)"> <p class="post-meta text-muted text-center" t-if="len(blog_post.tag_ids)">
<span class="fa fa-tags"/> <span class="fa fa-tags"/>
@ -265,7 +265,7 @@
<!-- Options: Blog Post: breadcrumb --> <!-- Options: Blog Post: breadcrumb -->
<template id="blog_breadcrumb" name="Breadcrumb" <template id="blog_breadcrumb" name="Breadcrumb"
inherit_id="website_blog.blog_post_complete" optional="disabled"> inherit_id="website_blog.blog_post_complete" active="False" customize_show="True">
<xpath expr="//div[@id='title']" position="before"> <xpath expr="//div[@id='title']" position="before">
<div class="container"> <div class="container">
<div class="row"> <div class="row">
@ -285,7 +285,7 @@
<!-- Options: Blog Post: user can reply --> <!-- Options: Blog Post: user can reply -->
<template id="opt_blog_post_complete_comment" name="Allow blog post comment" <template id="opt_blog_post_complete_comment" name="Allow blog post comment"
inherit_id="website_blog.blog_post_complete" optional="disabled" inherit_id="website_blog.blog_post_complete" active="False" customize_show="True"
groups="website_mail.group_comment"> groups="website_mail.group_comment">
<xpath expr="//ul[@id='comments-list']" position="before"> <xpath expr="//ul[@id='comments-list']" position="before">
<section class="mb32 read_width css_editable_mode_hidden"> <section class="mb32 read_width css_editable_mode_hidden">
@ -307,7 +307,7 @@
<!-- Options: Blog Post: user can select text for tweet --> <!-- Options: Blog Post: user can select text for tweet -->
<template id="opt_blog_post_select_to_tweet" name="Select to Tweet" <template id="opt_blog_post_select_to_tweet" name="Select to Tweet"
inherit_id="website_blog.blog_post_complete" optional="disabled"> inherit_id="website_blog.blog_post_complete" active="False" customize_show="True">
<xpath expr="//div[@id='blog_content']" position="attributes"> <xpath expr="//div[@id='blog_content']" position="attributes">
<attribute name="class">js_tweet mt32</attribute> <attribute name="class">js_tweet mt32</attribute>
</xpath> </xpath>
@ -318,7 +318,7 @@
<!-- Options: Blog Post: user can add Inline Discussion --> <!-- Options: Blog Post: user can add Inline Discussion -->
<template id="opt_blog_post_inline_discussion" name="Allow comment in text" <template id="opt_blog_post_inline_discussion" name="Allow comment in text"
inherit_id="website_blog.blog_post_complete" optional="disabled"> inherit_id="website_blog.blog_post_complete" active="False" customize_show="True">
<xpath expr="//div[@id='blog_content']" position="attributes"> <xpath expr="//div[@id='blog_content']" position="attributes">
<attribute name="enable_chatter_discuss">True</attribute> <attribute name="enable_chatter_discuss">True</attribute>
</xpath> </xpath>
@ -326,7 +326,7 @@
<!-- Options: Blog Post: show tags --> <!-- Options: Blog Post: show tags -->
<template id="opt_blog_post_complete_tags" name="Tags" <template id="opt_blog_post_complete_tags" name="Tags"
optional="enabled" inherit_id="website_blog.blog_post_complete"> customize_show="True" inherit_id="website_blog.blog_post_complete">
<xpath expr="//p[@name='blog_post_data']" position="after"> <xpath expr="//p[@name='blog_post_data']" position="after">
<p class="post-meta text-muted text-center" t-if="len(blog_post.tag_ids)"> <p class="post-meta text-muted text-center" t-if="len(blog_post.tag_ids)">
<span class="fa fa-tags"/> <span class="fa fa-tags"/>
@ -358,7 +358,7 @@
<!-- Option:Right Column for extra info --> <!-- Option:Right Column for extra info -->
<template id="index_right" name="Right Column" <template id="index_right" name="Right Column"
inherit_id="website_blog.blog_post_short" optional="disabled"> inherit_id="website_blog.blog_post_short" active="False" customize_show="True">
<xpath expr="//div[@id='main_column']" position="attributes"> <xpath expr="//div[@id='main_column']" position="attributes">
<attribute name="class">col-sm-8</attribute> <attribute name="class">col-sm-8</attribute>
</xpath> </xpath>
@ -369,7 +369,7 @@
<!-- Option:Right Column: tags --> <!-- Option:Right Column: tags -->
<template id="opt_blog_rc_tags" name="Tags" <template id="opt_blog_rc_tags" name="Tags"
inherit_id="website_blog.index_right" optional="disabled"> inherit_id="website_blog.index_right" active="False" customize_show="True">
<xpath expr="//div[@id='blog_right_column']" position="inside"> <xpath expr="//div[@id='blog_right_column']" position="inside">
<section class="mt32"> <section class="mt32">
<h4>Tags</h4> <h4>Tags</h4>
@ -386,7 +386,7 @@
<!-- Option:Right Column: archives --> <!-- Option:Right Column: archives -->
<template id="opt_blog_rc_history" name="Archives" <template id="opt_blog_rc_history" name="Archives"
inherit_id="website_blog.index_right" optional="disabled"> inherit_id="website_blog.index_right" active="False" customize_show="True">
<xpath expr="//div[@id='blog_right_column']" position="inside"> <xpath expr="//div[@id='blog_right_column']" position="inside">
<section class="mt32"> <section class="mt32">
<h4>Archives</h4> <h4>Archives</h4>
@ -403,7 +403,7 @@
<!-- Option:Right Column: about us --> <!-- Option:Right Column: about us -->
<template id="opt_blog_rc_about_us" name="About Us" priority="2" <template id="opt_blog_rc_about_us" name="About Us" priority="2"
inherit_id="website_blog.index_right" optional="disabled"> inherit_id="website_blog.index_right" active="False" customize_show="True">
<xpath expr="//div[@id='blog_right_column']" position="inside"> <xpath expr="//div[@id='blog_right_column']" position="inside">
<section class="mt32"> <section class="mt32">
<h4>About us</h4> <h4>About us</h4>
@ -420,7 +420,7 @@
<!-- Option:Right Column: follow us --> <!-- Option:Right Column: follow us -->
<template id="opt_blog_rc_follow_us" name="Follow us" priority="4" <template id="opt_blog_rc_follow_us" name="Follow us" priority="4"
inherit_id="website_blog.index_right" optional="disabled"> inherit_id="website_blog.index_right" active="False" customize_show="True">
<xpath expr="//div[@id='blog_right_column']" position="inside"> <xpath expr="//div[@id='blog_right_column']" position="inside">
<section class="mt32"> <section class="mt32">
<h4>Follow us<small t-if="blog">: <t t-esc="blog.name"/></small></h4> <h4>Follow us<small t-if="blog">: <t t-esc="blog.name"/></small></h4>
@ -447,7 +447,7 @@
<!-- Option:Right Column: blogs --> <!-- Option:Right Column: blogs -->
<template id="opt_blog_rc_blogs" name="Our Blogs" priority="6" <template id="opt_blog_rc_blogs" name="Our Blogs" priority="6"
inherit_id="website_blog.index_right" optional="disabled"> inherit_id="website_blog.index_right" active="False" customize_show="True">
<xpath expr="//div[@id='blog_right_column']" position="inside"> <xpath expr="//div[@id='blog_right_column']" position="inside">
<section class="mt32 mb32"> <section class="mt32 mb32">
<h4>Our Blogs</h4> <h4>Our Blogs</h4>

View File

@ -2,7 +2,7 @@
<openerp> <openerp>
<data> <data>
<template id="contactus_form" name="Contact Form" inherit_id="website.contactus" optional="enabled"> <template id="contactus_form" name="Contact Form" inherit_id="website.contactus" customize_show="True">
<xpath expr="//div[@name='mail_button']" position="replace"> <xpath expr="//div[@name='mail_button']" position="replace">
<form action="/crm/contactus" method="post" class="form-horizontal mt32" enctype="multipart/form-data"> <form action="/crm/contactus" method="post" class="form-horizontal mt32" enctype="multipart/form-data">
<t t-foreach="kwargs" t-as="kwarg"> <t t-foreach="kwargs" t-as="kwarg">
@ -47,7 +47,7 @@
</xpath> </xpath>
</template> </template>
<template id="contactus_form_company_name" name="Company Name" inherit_id="website_crm.contactus_form" optional="enabled"> <template id="contactus_form_company_name" name="Company Name" inherit_id="website_crm.contactus_form" customize_show="True">
<xpath expr="//div[@name='email_from_container']" position="after"> <xpath expr="//div[@name='email_from_container']" position="after">
<div t-attf-class="form-group #{error and 'partner_name' in error and 'has-error' or ''}"> <div t-attf-class="form-group #{error and 'partner_name' in error and 'has-error' or ''}">
<label class="col-md-3 col-sm-4 control-label" for="partner_name">Your Company</label> <label class="col-md-3 col-sm-4 control-label" for="partner_name">Your Company</label>

View File

@ -113,7 +113,7 @@
</t> </t>
</template> </template>
<template id="ref_country" inherit_id="website_crm_partner_assign.index" optional="enabled" name="Left World Map"> <template id="ref_country" inherit_id="website_crm_partner_assign.index" customize_show="True" name="Left World Map">
<xpath expr="//ul[@id='reseller_countries']" position="after"> <xpath expr="//ul[@id='reseller_countries']" position="after">
<!-- modal for large map --> <!-- modal for large map -->
<div class="modal fade partner_map_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true"> <div class="modal fade partner_map_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">

View File

@ -66,7 +66,7 @@
</template> </template>
<!-- Option: left column: World Map --> <!-- Option: left column: World Map -->
<template id="opt_country" inherit_id="website_customer.index" optional="enabled" name="Show Map"> <template id="opt_country" inherit_id="website_customer.index" customize_show="True" name="Show Map">
<xpath expr="//div[@id='ref_left_column']" position="inside"> <xpath expr="//div[@id='ref_left_column']" position="inside">
<!-- modal for large map --> <!-- modal for large map -->
<div class="modal fade customer_map_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true"> <div class="modal fade customer_map_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">
@ -90,7 +90,7 @@
</xpath> </xpath>
</template> </template>
<template id="opt_country_list" inherit_id="website_customer.index" optional="enabled" name="Filter on Countries"> <template id="opt_country_list" inherit_id="website_customer.index" customize_show="True" name="Filter on Countries">
<xpath expr="//div[@id='ref_left_column']" position="inside"> <xpath expr="//div[@id='ref_left_column']" position="inside">
<h3>References by Country</h3> <h3>References by Country</h3>
<ul class="nav nav-pills nav-stacked mt16 mb32"> <ul class="nav nav-pills nav-stacked mt16 mb32">

View File

@ -88,7 +88,7 @@
</t> </t>
</template> </template>
<template id="event_right_photos" inherit_id="website_event.index" optional="disabled" name="Photos"> <template id="event_right_photos" inherit_id="website_event.index" active="False" customize_show="True" name="Photos">
<xpath expr="//div[@id='right_column']" position="inside"> <xpath expr="//div[@id='right_column']" position="inside">
<div class="row"> <div class="row">
<div class="col-md-12 mb16"> <div class="col-md-12 mb16">
@ -107,7 +107,7 @@
</xpath> </xpath>
</template> </template>
<template id="event_right_quotes" inherit_id="website_event.index" optional="disabled" name="Quotes"> <template id="event_right_quotes" inherit_id="website_event.index" active="False" customize_show="True" name="Quotes">
<xpath expr="//div[@id='right_column']" position="inside"> <xpath expr="//div[@id='right_column']" position="inside">
<div class="row"> <div class="row">
<div class="col-md-12 mb16"> <div class="col-md-12 mb16">
@ -124,7 +124,7 @@
</xpath> </xpath>
</template> </template>
<template id="event_right_country_event" inherit_id="website_event.index" optional="disabled" name="Country Events"> <template id="event_right_country_event" inherit_id="website_event.index" active="False" customize_show="True" name="Country Events">
<xpath expr="//div[@id='right_column']" position="inside"> <xpath expr="//div[@id='right_column']" position="inside">
<div class="row"> <div class="row">
<div class="col-md-12 mb16 mt16 country_events"> <div class="col-md-12 mb16 mt16 country_events">
@ -141,7 +141,7 @@
</xpath> </xpath>
</template> </template>
<template id="event_left_column" optional="enabled" inherit_id="website_event.index" name="Filters"> <template id="event_left_column" customize_show="True" inherit_id="website_event.index" name="Filters">
<xpath expr="//div[@id='middle_column']" position="attributes"> <xpath expr="//div[@id='middle_column']" position="attributes">
<attribute name="class">col-md-6</attribute> <attribute name="class">col-md-6</attribute>
</xpath> </xpath>
@ -160,7 +160,7 @@
</xpath> </xpath>
</template> </template>
<template id="event_category" inherit_id="website_event.event_left_column" optional="disabled" name="Filter by Category"> <template id="event_category" inherit_id="website_event.event_left_column" active="False" customize_show="True" name="Filter by Category">
<xpath expr="//div[@id='left_column']" position="inside"> <xpath expr="//div[@id='left_column']" position="inside">
<ul class="nav nav-pills nav-stacked mt32"> <ul class="nav nav-pills nav-stacked mt32">
<t t-foreach="types" t-as="type"> <t t-foreach="types" t-as="type">
@ -175,7 +175,7 @@
</xpath> </xpath>
</template> </template>
<template id="event_location" inherit_id="website_event.event_left_column" optional="disabled" name="Filter by Country"> <template id="event_location" inherit_id="website_event.event_left_column" active="False" customize_show="True" name="Filter by Country">
<xpath expr="//div[@id='left_column']" position="inside"> <xpath expr="//div[@id='left_column']" position="inside">
<ul class="nav nav-pills nav-stacked mt32"> <ul class="nav nav-pills nav-stacked mt32">
<t t-foreach="countries" t-as="country"> <t t-foreach="countries" t-as="country">

View File

@ -25,7 +25,7 @@
</xpath> </xpath>
</template> </template>
<template id="event_description_full" inherit_id="website_event.event_description_full" optional="enabled" name="Event's Ticket form"> <template id="event_description_full" inherit_id="website_event.event_description_full" customize_show="True" name="Event's Ticket form">
<xpath expr="//div[@t-field='event.description']" position="before"> <xpath expr="//div[@t-field='event.description']" position="before">
<form t-attf-action="/event/cart/update?event_id=#{ event.id }" method="post" t-if="event.event_ticket_ids"> <form t-attf-action="/event/cart/update?event_id=#{ event.id }" method="post" t-if="event.event_ticket_ids">
<table itemprop="offers" class="table table-striped"> <table itemprop="offers" class="table table-striped">

View File

@ -2,7 +2,7 @@
<openerp> <openerp>
<data> <data>
<template name="Sponsors" id="event_sponsor" optional="enabled" inherit_id="website_event.layout"> <template name="Sponsors" id="event_sponsor" customize_show="True" inherit_id="website_event.layout">
<xpath expr="//t[@t-call='website.layout']" position="inside"> <xpath expr="//t[@t-call='website.layout']" position="inside">
<t t-set="head"> <t t-set="head">
<link rel='stylesheet' href='/website_event_track/static/src/css/website_event_track.css'/> <link rel='stylesheet' href='/website_event_track/static/src/css/website_event_track.css'/>
@ -155,7 +155,7 @@
</t> </t>
</template> </template>
<template id="tracks_filter" inherit_id="website_event_track.tracks" optional="enabled" name="Filter on Tags"> <template id="tracks_filter" inherit_id="website_event_track.tracks" customize_show="True" name="Filter on Tags">
<xpath expr="//div[@id='left_column']" position="inside"> <xpath expr="//div[@id='left_column']" position="inside">
<ul class="nav nav-pills nav-stacked"> <ul class="nav nav-pills nav-stacked">
<li t-att-class="'' if searches.get('tag') else 'active'"><a t-attf-href="/event/#{ slug(event) }/track">All Tags</a></li> <li t-att-class="'' if searches.get('tag') else 'active'"><a t-attf-href="/event/#{ slug(event) }/track">All Tags</a></li>
@ -244,7 +244,7 @@
</t> </t>
</template> </template>
<template id="event_track_social" name="Social Widgets" inherit_id="website_event_track.track_view" optional="disabled"> <template id="event_track_social" name="Social Widgets" inherit_id="website_event_track.track_view" active="False" customize_show="True">
<xpath expr="//div[@id='right_column']" position="inside"> <xpath expr="//div[@id='right_column']" position="inside">
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">

View File

@ -3,7 +3,7 @@
<data> <data>
<!-- Page --> <!-- Page -->
<template id="aboutus" inherit_id="website.aboutus" optional="enabled" name="Our Team"> <template id="aboutus" inherit_id="website.aboutus" customize_show="True" name="Our Team">
<xpath expr="//div[@class='oe_structure']" position="after"> <xpath expr="//div[@class='oe_structure']" position="after">
<section class="container"> <section class="container">
<div class="col-sm-12 text-center" t-if="len(employee_ids)"> <div class="col-sm-12 text-center" t-if="len(employee_ids)">

View File

@ -224,7 +224,7 @@
</t> </t>
</template> </template>
<template id="job_countries" inherit_id="website_hr_recruitment.index" optional="disabled" name="Filter by Countries"> <template id="job_countries" inherit_id="website_hr_recruitment.index" active="False" customize_show="True" name="Filter by Countries">
<xpath expr="//div[@id='jobs_grid_left']" position="inside"> <xpath expr="//div[@id='jobs_grid_left']" position="inside">
<ul class="nav nav-pills nav-stacked mb32"> <ul class="nav nav-pills nav-stacked mb32">
<li t-att-class=" '' if country_id else 'active' "><a t-attf-href="/jobs#{ '/department/%s' % slug(department_id) if department_id else '' }#{ '/office/%s' % office_id if office_id else '' }">All Countries</a></li> <li t-att-class=" '' if country_id else 'active' "><a t-attf-href="/jobs#{ '/department/%s' % slug(department_id) if department_id else '' }#{ '/office/%s' % office_id if office_id else '' }">All Countries</a></li>
@ -243,7 +243,7 @@
</xpath> </xpath>
</template> </template>
<template id="job_departments" inherit_id="website_hr_recruitment.index" optional="disabled" name="Filter by Departments"> <template id="job_departments" inherit_id="website_hr_recruitment.index" active="False" customize_show="True" name="Filter by Departments">
<xpath expr="//div[@id='jobs_grid_left']" position="inside"> <xpath expr="//div[@id='jobs_grid_left']" position="inside">
<ul class="nav nav-pills nav-stacked mb32"> <ul class="nav nav-pills nav-stacked mb32">
<li t-att-class=" '' if department_id else 'active' "><a t-attf-href="/jobs#{ '/country/%s' % slug(country_id) if country_id else '' }#{ '/office/%s' % office_id if office_id else '' }">All Departments</a></li> <li t-att-class=" '' if department_id else 'active' "><a t-attf-href="/jobs#{ '/country/%s' % slug(country_id) if country_id else '' }#{ '/office/%s' % office_id if office_id else '' }">All Departments</a></li>
@ -262,7 +262,7 @@
</xpath> </xpath>
</template> </template>
<template id="job_offices" inherit_id="website_hr_recruitment.index" optional="disabled" name="Filter by Offices"> <template id="job_offices" inherit_id="website_hr_recruitment.index" active="False" customize_show="True" name="Filter by Offices">
<xpath expr="//div[@id='jobs_grid_left']" position="inside"> <xpath expr="//div[@id='jobs_grid_left']" position="inside">
<ul class="nav nav-pills nav-stacked mb32"> <ul class="nav nav-pills nav-stacked mb32">
<li t-att-class=" '' if office_id else 'active' "><a t-attf-href="/jobs#{ '/country/%s' % slug(country_id) if country_id else '' }#{ '/department/%s' % slug(department_id) if department_id else '' }">All Offices</a></li> <li t-att-class=" '' if office_id else 'active' "><a t-attf-href="/jobs#{ '/country/%s' % slug(country_id) if country_id else '' }#{ '/department/%s' % slug(department_id) if department_id else '' }">All Offices</a></li>

View File

@ -84,7 +84,7 @@
</template> </template>
<template id="opt_index_country" name="Location" <template id="opt_index_country" name="Location"
optional="enabled" inherit_id="website_membership.index"> customize_show="True" inherit_id="website_membership.index">
<xpath expr="//div[@id='left_column']/ul[1]" position="after"> <xpath expr="//div[@id='left_column']/ul[1]" position="after">
<ul class="nav nav-pills nav-stacked mt16"> <ul class="nav nav-pills nav-stacked mt16">
<li class="nav-header"><h3>Location</h3></li> <li class="nav-header"><h3>Location</h3></li>
@ -101,7 +101,7 @@
<!-- Option: index: Left Google Map --> <!-- Option: index: Left Google Map -->
<template id="opt_index_google_map" name="Left World Map" <template id="opt_index_google_map" name="Left World Map"
optional="enabled" inherit_id="website_membership.index"> customize_show="True" inherit_id="website_membership.index">
<xpath expr="//div[@id='left_column']/ul[last()]" position="after"> <xpath expr="//div[@id='left_column']/ul[last()]" position="after">
<!-- modal for large map --> <!-- modal for large map -->
<div class="modal fade partner_map_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true"> <div class="modal fade partner_map_modal" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" aria-hidden="true">

View File

@ -92,7 +92,7 @@
</section> </section>
</template> </template>
<template id="change_quantity" inherit_id="website_quote.pricing" optional="disabled" name="Change Quantity"> <template id="change_quantity" inherit_id="website_quote.pricing" active="False" customize_show="True" name="Change Quantity">
<xpath expr="//div[@id='quote_qty']" position="replace"> <xpath expr="//div[@id='quote_qty']" position="replace">
<div class="input-group"> <div class="input-group">
<span class="input-group-addon hidden-print"> <span class="input-group-addon hidden-print">
@ -130,7 +130,7 @@
</template> </template>
<!-- Options:Quotation Chatter: user can reply --> <!-- Options:Quotation Chatter: user can reply -->
<template id="opt_quotation_chatter_post_complete_comment" name="Allow Comments" optional="enabled" inherit_id="website_quote.chatter"> <template id="opt_quotation_chatter_post_complete_comment" name="Allow Comments" customize_show="True" inherit_id="website_quote.chatter">
<xpath expr="//h1" position="after"> <xpath expr="//h1" position="after">
<section class="mb32 css_editable_mode_hidden hidden-print"> <section class="mb32 css_editable_mode_hidden hidden-print">
<form id="comment" t-attf-action="/quote/#{quotation.id}/#{quotation.access_token}/post" method="POST"> <form id="comment" t-attf-action="/quote/#{quotation.id}/#{quotation.access_token}/post" method="POST">
@ -388,7 +388,7 @@
</template> </template>
<!-- Options:Quotation Signature --> <!-- Options:Quotation Signature -->
<template id="opt_quotation_signature" name="Ask Signature" optional="enabled" inherit_id="website_quote.so_quotation"> <template id="opt_quotation_signature" name="Ask Signature" customize_show="True" inherit_id="website_quote.so_quotation">
<xpath expr="//div[@id='sign-dialog']" position="inside"> <xpath expr="//div[@id='sign-dialog']" position="inside">
<div class="panel panel-default mt16 mb0" id="drawsign"> <div class="panel panel-default mt16 mb0" id="drawsign">
<div class="panel-heading"> <div class="panel-heading">

View File

@ -104,7 +104,7 @@
</form> </form>
</template> </template>
<template id="products_description" inherit_id="website_sale.products_item" optional="disabled" name="Product Description"> <template id="products_description" inherit_id="website_sale.products_item" active="False" customize_show="True" name="Product Description">
<xpath expr="//div[@class='product_price']" position="before"> <xpath expr="//div[@class='product_price']" position="before">
<div class="text-info oe_subdescription" contenteditable="false"> <div class="text-info oe_subdescription" contenteditable="false">
<div itemprop="description" t-field="product.description_sale"></div> <div itemprop="description" t-field="product.description_sale"></div>
@ -112,7 +112,7 @@
</xpath> </xpath>
</template> </template>
<template id="products_add_to_cart" inherit_id="website_sale.products_item" optional="disabled" name="Add to Cart"> <template id="products_add_to_cart" inherit_id="website_sale.products_item" active="False" customize_show="True" name="Add to Cart">
<xpath expr="//div[@class='product_price']" position="inside"> <xpath expr="//div[@class='product_price']" position="inside">
<input name="product_id" t-att-value="product.product_variant_ids[0].id" type="hidden"/> <input name="product_id" t-att-value="product.product_variant_ids[0].id" type="hidden"/>
<a class="btn btn-default btn-xs fa fa-shopping-cart a-submit"/> <a class="btn btn-default btn-xs fa fa-shopping-cart a-submit"/>
@ -259,7 +259,7 @@
</li> </li>
</template> </template>
<template id="products_categories" inherit_id="website_sale.products" optional="disabled" name="Product Categories"> <template id="products_categories" inherit_id="website_sale.products" active="False" customize_show="True" name="Product Categories">
<xpath expr="//div[@id='products_grid_before']" position="inside"> <xpath expr="//div[@id='products_grid_before']" position="inside">
<ul class="nav nav-pills nav-stacked mt16"> <ul class="nav nav-pills nav-stacked mt16">
<li t-att-class=" '' if category else 'active' "><a t-att-href="keep('/shop',category=0)">All Products</a></li> <li t-att-class=" '' if category else 'active' "><a t-att-href="keep('/shop',category=0)">All Products</a></li>
@ -276,7 +276,7 @@
</xpath> </xpath>
</template> </template>
<template id="products_attributes" inherit_id="website_sale.products" optional="disabled" name="Product Attribute's Filters"> <template id="products_attributes" inherit_id="website_sale.products" active="False" customize_show="True" name="Product Attribute's Filters">
<xpath expr="//div[@id='products_grid_before']" position="inside"> <xpath expr="//div[@id='products_grid_before']" position="inside">
<form class="js_attributes" method="get"> <form class="js_attributes" method="get">
<input type="hidden" name="search" t-att-value="search"/> <input type="hidden" name="search" t-att-value="search"/>
@ -331,7 +331,7 @@
</xpath> </xpath>
</template> </template>
<template id="products_list_view" inherit_id="website_sale.products" optional="disabled" name="List View"> <template id="products_list_view" inherit_id="website_sale.products" active="False" customize_show="True" name="List View">
<xpath expr="//div[@id='products_grid']//table" position="replace"> <xpath expr="//div[@id='products_grid']//table" position="replace">
<t t-foreach="products" t-as="product"> <t t-foreach="products" t-as="product">
<div class="oe_product oe_list oe_product_cart" t-att-data-publish="product.website_published and 'on' or 'off'"> <div class="oe_product oe_list oe_product_cart" t-att-data-publish="product.website_published and 'on' or 'off'">
@ -414,7 +414,7 @@
</t> </t>
</template> </template>
<template id="product_quantity" inherit_id="website_sale.product" optional="enabled" name="Select Quantity"> <template id="product_quantity" inherit_id="website_sale.product" customize_show="True" name="Select Quantity">
<xpath expr="//a[@id='add_to_cart']" position="before"> <xpath expr="//a[@id='add_to_cart']" position="before">
<div class="css_quantity input-group" style="width: 108px;"> <div class="css_quantity input-group" style="width: 108px;">
<span class="input-group-addon"> <span class="input-group-addon">
@ -462,7 +462,7 @@
</div> </div>
</template> </template>
<template id="product_variants" inherit_id="website_sale.product" optional="disabled" name="List View of Variants"> <template id="product_variants" inherit_id="website_sale.product" active="False" customize_show="True" name="List View of Variants">
<xpath expr="//t[@t-placeholder='select']" position="replace"> <xpath expr="//t[@t-placeholder='select']" position="replace">
<input type="hidden" t-if="len(product.product_variant_ids) == 1" name="product_id" t-att-value="product.product_variant_ids[0].id"/> <input type="hidden" t-if="len(product.product_variant_ids) == 1" name="product_id" t-att-value="product.product_variant_ids[0].id"/>
<t t-if="len(product.product_variant_ids) &gt; 1"> <t t-if="len(product.product_variant_ids) &gt; 1">
@ -550,7 +550,7 @@
</ul> </ul>
</template> </template>
<template id="recommended_products" inherit_id="website_sale.product" optional="enabled" name="Alternative Products"> <template id="recommended_products" inherit_id="website_sale.product" customize_show="True" name="Alternative Products">
<xpath expr="//div[@id='product_full_description']" position="after"> <xpath expr="//div[@id='product_full_description']" position="after">
<div class="container mt32" t-if="product.alternative_product_ids"> <div class="container mt32" t-if="product.alternative_product_ids">
<h3>Suggested alternatives:</h3> <h3>Suggested alternatives:</h3>
@ -572,7 +572,7 @@
</xpath> </xpath>
</template> </template>
<template id="product_attributes" inherit_id="website_sale.product" optional="enabled" name="Product attributes"> <template id="product_attributes" inherit_id="website_sale.product" customize_show="True" name="Product attributes">
<xpath expr="//p[@t-field='product.description_sale']" position="after"> <xpath expr="//p[@t-field='product.description_sale']" position="after">
<hr t-if="sum([(1 if len(l.value_ids)==1 else 0) for l in product.attribute_line_ids])"/> <hr t-if="sum([(1 if len(l.value_ids)==1 else 0) for l in product.attribute_line_ids])"/>
<p class="text-muted"> <p class="text-muted">
@ -587,7 +587,7 @@
<!-- Product options: OpenChatter --> <!-- Product options: OpenChatter -->
<template id="product_comment" inherit_id="website_sale.product" optional="disabled" name="Discussion"> <template id="product_comment" inherit_id="website_sale.product" active="False" customize_show="True" name="Discussion">
<xpath expr="//div[@t-field='product.website_description']" position="after"> <xpath expr="//div[@t-field='product.website_description']" position="after">
<hr class="mb32"/> <hr class="mb32"/>
<section class="container"> <section class="container">
@ -753,7 +753,7 @@
</t> </t>
</template> </template>
<template id="suggested_products_list" inherit_id="website_sale.cart" optional="enabled" name="Suggested Products in my cart"> <template id="suggested_products_list" inherit_id="website_sale.cart" customize_show="True" name="Suggested Products in my cart">
<xpath expr="//table[@id='cart_products']" position="after"> <xpath expr="//table[@id='cart_products']" position="after">
<table t-if="suggested_products" class='table table-striped table-condensed'> <table t-if="suggested_products" class='table table-striped table-condensed'>
<colgroup> <colgroup>
@ -810,13 +810,13 @@
</xpath> </xpath>
</template> </template>
<template id="continue_shopping" inherit_id="website_sale.cart" optional="enabled" name="Continue Shopping Button"> <template id="continue_shopping" inherit_id="website_sale.cart" customize_show="True" name="Continue Shopping Button">
<xpath expr="//a[@href='/shop/checkout']" position="before"> <xpath expr="//a[@href='/shop/checkout']" position="before">
<a href="/shop" class="btn btn-default mb32"><span class="fa fa-long-arrow-left"/> Continue Shopping</a> <a href="/shop" class="btn btn-default mb32"><span class="fa fa-long-arrow-left"/> Continue Shopping</a>
</xpath> </xpath>
</template> </template>
<template id="reduction_code" inherit_id="website_sale.cart" optional="disabled" name="Reduction Code"> <template id="reduction_code" inherit_id="website_sale.cart" active="False" customize_show="True" name="Reduction Code">
<xpath expr="//div[@id='right_column']" position="inside"> <xpath expr="//div[@id='right_column']" position="inside">
<h4>Coupon Code</h4> <h4>Coupon Code</h4>
<p> <p>

View File

@ -167,21 +167,15 @@ class view(osv.osv):
(<xpath/>) are applied, and the result is used as if it were this view's (<xpath/>) are applied, and the result is used as if it were this view's
actual arch. actual arch.
"""), """),
'application': fields.selection([ 'active': fields.boolean("Active", required=True,
('always', "Always applied"),
('enabled', "Optional, enabled"),
('disabled', "Optional, disabled"),
],
required=True, string="Application status",
help="""If this view is inherited, help="""If this view is inherited,
* if always, the view always extends its parent * if True, the view always extends its parent
* if enabled, the view currently extends its parent but can be disabled * if False, the view currently does not extend its parent but can be enabled
* if disabled, the view currently does not extend its parent but can be enabled
"""), """),
} }
_defaults = { _defaults = {
'mode': 'primary', 'mode': 'primary',
'application': 'always', 'active': True,
'priority': 16, 'priority': 16,
} }
_order = "priority,name" _order = "priority,name"
@ -289,18 +283,10 @@ class view(osv.osv):
return ret return ret
def toggle(self, cr, uid, ids, context=None): def toggle(self, cr, uid, ids, context=None):
""" Switches between enabled and disabled application statuses """ Switches between enabled and disabled statuses
""" """
for view in self.browse(cr, uid, ids, context=context): for view in self.browse(cr, uid, ids, context=dict(context or {}, active_test=False)):
if view.application == 'enabled': view.write({'active': not view.active})
view.write({'application': 'disabled'})
elif view.application == 'disabled':
view.write({'application': 'enabled'})
else:
raise ValueError(_("Can't toggle view %d with application %r") % (
view.id,
view.application,
))
# default view selection # default view selection
def default_view(self, cr, uid, model, view_type, context=None): def default_view(self, cr, uid, model, view_type, context=None):
@ -346,7 +332,7 @@ class view(osv.osv):
['inherit_id', '=', view_id], ['inherit_id', '=', view_id],
['model', '=', model], ['model', '=', model],
['mode', '=', 'extension'], ['mode', '=', 'extension'],
['application', 'in', ['always', 'enabled']], ['active', '=', True],
] ]
if self.pool._init: if self.pool._init:
# Module init currently in progress, only consider views from # Module init currently in progress, only consider views from

View File

@ -19,7 +19,7 @@
<field name="inherit_id"/> <field name="inherit_id"/>
<field name="model_data_id"/> <field name="model_data_id"/>
<field name="xml_id"/> <field name="xml_id"/>
<field name="application"/> <field name="active"/>
</group> </group>
</group> </group>
<notebook> <notebook>
@ -61,6 +61,8 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<search string="Views"> <search string="Views">
<field name="name" filter_domain="['|', '|', ('name','ilike',self), ('model','ilike',self), ('model_data_id','ilike',self)]" string="View"/> <field name="name" filter_domain="['|', '|', ('name','ilike',self), ('model','ilike',self), ('model_data_id','ilike',self)]" string="View"/>
<filter string="Active" name="active" domain="[('active', '=',True)]"/>
<filter string="Unactive" domain="[('active', '=',False)]"/>
<filter string="Form" domain="[('type', '=','form')]"/> <filter string="Form" domain="[('type', '=','form')]"/>
<filter string="Tree" domain="[('type', '=', 'tree')]"/> <filter string="Tree" domain="[('type', '=', 'tree')]"/>
<filter string="Kanban" domain="[('type', '=', 'kanban')]"/> <filter string="Kanban" domain="[('type', '=', 'kanban')]"/>
@ -83,6 +85,7 @@
<field name="type">ir.actions.act_window</field> <field name="type">ir.actions.act_window</field>
<field name="res_model">ir.ui.view</field> <field name="res_model">ir.ui.view</field>
<field name="view_id" ref="view_view_tree"/> <field name="view_id" ref="view_view_tree"/>
<field name="context">{'search_default_active': 1}</field>
<field name="help">Views allows you to personalize each view of Odoo. You can add new fields, move fields, rename them or delete the ones that you do not need.</field> <field name="help">Views allows you to personalize each view of Odoo. You can add new fields, move fields, rename them or delete the ones that you do not need.</field>
</record> </record>
<menuitem action="action_ui_view" id="menu_action_ui_view" parent="base.next_id_2" sequence="2"/> <menuitem action="action_ui_view" id="menu_action_ui_view" parent="base.next_id_2" sequence="2"/>

View File

@ -642,7 +642,7 @@ class test_views(ViewCase):
"""Insert view into database via a query to passtrough validation""" """Insert view into database via a query to passtrough validation"""
kw.pop('id', None) kw.pop('id', None)
kw.setdefault('mode', 'extension' if kw.get('inherit_id') else 'primary') kw.setdefault('mode', 'extension' if kw.get('inherit_id') else 'primary')
kw.setdefault('application', 'always') kw.setdefault('active', True)
keys = sorted(kw.keys()) keys = sorted(kw.keys())
fields = ','.join('"%s"' % (k.replace('"', r'\"'),) for k in keys) fields = ','.join('"%s"' % (k.replace('"', r'\"'),) for k in keys)
@ -1095,21 +1095,21 @@ class TestOptionalViews(ViewCase):
self.v1 = self.create({ self.v1 = self.create({
'model': 'a', 'model': 'a',
'inherit_id': self.v0, 'inherit_id': self.v0,
'application': 'always', 'active': True,
'priority': 10, 'priority': 10,
'arch': '<xpath expr="//base" position="after"><v1/></xpath>', 'arch': '<xpath expr="//base" position="after"><v1/></xpath>',
}) })
self.v2 = self.create({ self.v2 = self.create({
'model': 'a', 'model': 'a',
'inherit_id': self.v0, 'inherit_id': self.v0,
'application': 'enabled', 'active': True,
'priority': 9, 'priority': 9,
'arch': '<xpath expr="//base" position="after"><v2/></xpath>', 'arch': '<xpath expr="//base" position="after"><v2/></xpath>',
}) })
self.v3 = self.create({ self.v3 = self.create({
'model': 'a', 'model': 'a',
'inherit_id': self.v0, 'inherit_id': self.v0,
'application': 'disabled', 'active': False,
'priority': 8, 'priority': 8,
'arch': '<xpath expr="//base" position="after"><v3/></xpath>' 'arch': '<xpath expr="//base" position="after"><v3/></xpath>'
}) })
@ -1128,10 +1128,10 @@ class TestOptionalViews(ViewCase):
) )
def test_applied_state_toggle(self): def test_applied_state_toggle(self):
""" Change application states of v2 and v3, check that the results """ Change active states of v2 and v3, check that the results
are as expected are as expected
""" """
self.browse(self.v2).write({'application': 'disabled'}) self.browse(self.v2).toggle()
arch = self.read_combined(self.v0)['arch'] arch = self.read_combined(self.v0)['arch']
self.assertEqual( self.assertEqual(
ET.fromstring(arch), ET.fromstring(arch),
@ -1141,7 +1141,7 @@ class TestOptionalViews(ViewCase):
) )
) )
self.browse(self.v3).write({'application': 'enabled'}) self.browse(self.v3).toggle()
arch = self.read_combined(self.v0)['arch'] arch = self.read_combined(self.v0)['arch']
self.assertEqual( self.assertEqual(
ET.fromstring(arch), ET.fromstring(arch),
@ -1152,7 +1152,7 @@ class TestOptionalViews(ViewCase):
) )
) )
self.browse(self.v2).write({'application': 'enabled'}) self.browse(self.v2).toggle()
arch = self.read_combined(self.v0)['arch'] arch = self.read_combined(self.v0)['arch']
self.assertEqual( self.assertEqual(
ET.fromstring(arch), ET.fromstring(arch),

View File

@ -204,14 +204,8 @@
</rng:optional> </rng:optional>
</rng:optional> </rng:optional>
<rng:optional><rng:attribute name="groups"/></rng:optional> <rng:optional><rng:attribute name="groups"/></rng:optional>
<rng:optional> <rng:optional><rng:attribute name="active"></rng:attribute></rng:optional>
<rng:attribute name="optional"> <rng:optional><rng:attribute name="customize_show"></rng:attribute></rng:optional>
<rng:choice>
<rng:value>enabled</rng:value>
<rng:value>disabled</rng:value>
</rng:choice>
</rng:attribute>
</rng:optional>
</rng:group> </rng:group>
<rng:optional> <rng:optional>
<rng:attribute name="page"><rng:value>True</rng:value></rng:attribute> <rng:attribute name="page"><rng:value>True</rng:value></rng:attribute>

View File

@ -60,6 +60,8 @@ from misc import SKIPPED_ELEMENT_TYPES
from misc import unquote from misc import unquote
from openerp import SUPERUSER_ID
# Import of XML records requires the unsafe eval as well, # Import of XML records requires the unsafe eval as well,
# almost everywhere, which is ok because it supposedly comes # almost everywhere, which is ok because it supposedly comes
# from trusted data, but at least we make it obvious now. # from trusted data, but at least we make it obvious now.
@ -289,7 +291,7 @@ form: module.record_id""" % (xml_id,)
if len(id) > 64: if len(id) > 64:
_logger.error('id: %s is to long (max: 64)', id) _logger.error('id: %s is to long (max: 64)', id)
def _tag_delete(self, cr, rec, data_node=None): def _tag_delete(self, cr, rec, data_node=None, mode=None):
d_model = rec.get("model") d_model = rec.get("model")
d_search = rec.get("search",'').encode('utf-8') d_search = rec.get("search",'').encode('utf-8')
d_id = rec.get("id") d_id = rec.get("id")
@ -320,7 +322,7 @@ form: module.record_id""" % (xml_id,)
return True return True
def _tag_report(self, cr, rec, data_node=None): def _tag_report(self, cr, rec, data_node=None, mode=None):
res = {} res = {}
for dest,f in (('name','string'),('model','model'),('report_name','name')): for dest,f in (('name','string'),('model','model'),('report_name','name')):
res[dest] = rec.get(f,'').encode('utf8') res[dest] = rec.get(f,'').encode('utf8')
@ -369,7 +371,7 @@ form: module.record_id""" % (xml_id,)
self._remove_ir_values(cr, res['name'], value, res['model']) self._remove_ir_values(cr, res['name'], value, res['model'])
return id return id
def _tag_function(self, cr, rec, data_node=None): def _tag_function(self, cr, rec, data_node=None, mode=None):
if self.isnoupdate(data_node) and self.mode != 'init': if self.isnoupdate(data_node) and self.mode != 'init':
return return
context = self.get_context(data_node, rec, {'ref': _ref(self, cr)}) context = self.get_context(data_node, rec, {'ref': _ref(self, cr)})
@ -377,7 +379,7 @@ form: module.record_id""" % (xml_id,)
_eval_xml(self,rec, self.pool, cr, uid, self.idref, context=context) _eval_xml(self,rec, self.pool, cr, uid, self.idref, context=context)
return return
def _tag_url(self, cr, rec, data_node=None): def _tag_url(self, cr, rec, data_node=None, mode=None):
url = rec.get("url",'').encode('utf8') url = rec.get("url",'').encode('utf8')
target = rec.get("target",'').encode('utf8') target = rec.get("target",'').encode('utf8')
name = rec.get("name",'').encode('utf8') name = rec.get("name",'').encode('utf8')
@ -389,7 +391,7 @@ form: module.record_id""" % (xml_id,)
id = self.pool['ir.model.data']._update(cr, self.uid, "ir.actions.act_url", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode) id = self.pool['ir.model.data']._update(cr, self.uid, "ir.actions.act_url", self.module, res, xml_id, noupdate=self.isnoupdate(data_node), mode=self.mode)
self.idref[xml_id] = int(id) self.idref[xml_id] = int(id)
def _tag_act_window(self, cr, rec, data_node=None): def _tag_act_window(self, cr, rec, data_node=None, mode=None):
name = rec.get('name','').encode('utf-8') name = rec.get('name','').encode('utf-8')
xml_id = rec.get('id','').encode('utf8') xml_id = rec.get('id','').encode('utf8')
self._test_xml_id(xml_id) self._test_xml_id(xml_id)
@ -497,7 +499,7 @@ form: module.record_id""" % (xml_id,)
self.pool['ir.model.data'].ir_set(cr, self.uid, 'action', keyword, xml_id, [src_model], value, replace=replace, isobject=True, xml_id=xml_id) self.pool['ir.model.data'].ir_set(cr, self.uid, 'action', keyword, xml_id, [src_model], value, replace=replace, isobject=True, xml_id=xml_id)
# TODO add remove ir.model.data # TODO add remove ir.model.data
def _tag_ir_set(self, cr, rec, data_node=None): def _tag_ir_set(self, cr, rec, data_node=None, mode=None):
if self.mode != 'init': if self.mode != 'init':
return return
res = {} res = {}
@ -507,7 +509,7 @@ form: module.record_id""" % (xml_id,)
res[f_name] = f_val res[f_name] = f_val
self.pool['ir.model.data'].ir_set(cr, self.uid, res['key'], res['key2'], res['name'], res['models'], res['value'], replace=res.get('replace',True), isobject=res.get('isobject', False), meta=res.get('meta',None)) self.pool['ir.model.data'].ir_set(cr, self.uid, res['key'], res['key2'], res['name'], res['models'], res['value'], replace=res.get('replace',True), isobject=res.get('isobject', False), meta=res.get('meta',None))
def _tag_workflow(self, cr, rec, data_node=None): def _tag_workflow(self, cr, rec, data_node=None, mode=None):
if self.isnoupdate(data_node) and self.mode != 'init': if self.isnoupdate(data_node) and self.mode != 'init':
return return
model = rec.get('model').encode('ascii') model = rec.get('model').encode('ascii')
@ -533,7 +535,7 @@ form: module.record_id""" % (xml_id,)
# action="action_id" # action="action_id"
# parent="parent_id" # parent="parent_id"
# #
def _tag_menuitem(self, cr, rec, data_node=None): def _tag_menuitem(self, cr, rec, data_node=None, mode=None):
rec_id = rec.get("id",'').encode('ascii') rec_id = rec.get("id",'').encode('ascii')
self._test_xml_id(rec_id) self._test_xml_id(rec_id)
m_l = map(escape, escape_re.split(rec.get("name",'').encode('utf8'))) m_l = map(escape, escape_re.split(rec.get("name",'').encode('utf8')))
@ -622,7 +624,7 @@ form: module.record_id""" % (xml_id,)
def _assert_equals(self, f1, f2, prec=4): def _assert_equals(self, f1, f2, prec=4):
return not round(f1 - f2, prec) return not round(f1 - f2, prec)
def _tag_assert(self, cr, rec, data_node=None): def _tag_assert(self, cr, rec, data_node=None, mode=None):
if self.isnoupdate(data_node) and self.mode != 'init': if self.isnoupdate(data_node) and self.mode != 'init':
return return
@ -686,7 +688,7 @@ form: module.record_id""" % (xml_id,)
else: # all tests were successful for this assertion tag (no break) else: # all tests were successful for this assertion tag (no break)
self.assertion_report.record_success() self.assertion_report.record_success()
def _tag_record(self, cr, rec, data_node=None): def _tag_record(self, cr, rec, data_node=None, mode=None):
rec_model = rec.get("model").encode('ascii') rec_model = rec.get("model").encode('ascii')
model = self.pool[rec_model] model = self.pool[rec_model]
rec_id = rec.get("id",'').encode('ascii') rec_id = rec.get("id",'').encode('ascii')
@ -767,7 +769,7 @@ form: module.record_id""" % (xml_id,)
cr.commit() cr.commit()
return rec_model, id return rec_model, id
def _tag_template(self, cr, el, data_node=None): def _tag_template(self, cr, el, data_node=None, mode=None):
# This helper transforms a <template> element into a <record> and forwards it # This helper transforms a <template> element into a <record> and forwards it
tpl_id = el.get('id', el.get('t-name', '')).encode('ascii') tpl_id = el.get('id', el.get('t-name', '')).encode('ascii')
full_tpl_id = tpl_id full_tpl_id = tpl_id
@ -798,6 +800,10 @@ form: module.record_id""" % (xml_id,)
record.append(Field(el.get('priority', "16"), name='priority')) record.append(Field(el.get('priority', "16"), name='priority'))
if 'inherit_id' in el.attrib: if 'inherit_id' in el.attrib:
record.append(Field(name='inherit_id', ref=el.get('inherit_id'))) record.append(Field(name='inherit_id', ref=el.get('inherit_id')))
if el.get('active') in ("True", "False") and mode != "update":
record.append(Field(name='active', eval=el.get('active')))
if el.get('customize_show') in ("True", "False"):
record.append(Field(name='customize_show', eval=el.get('customize_show')))
groups = el.attrib.pop('groups', None) groups = el.attrib.pop('groups', None)
if groups: if groups:
grp_lst = map(lambda x: "ref('%s')" % x, groups.split(',')) grp_lst = map(lambda x: "ref('%s')" % x, groups.split(','))
@ -814,8 +820,6 @@ form: module.record_id""" % (xml_id,)
) )
) )
record.append(Field('primary', name='mode')) record.append(Field('primary', name='mode'))
if el.get('optional'):
record.append(Field(el.get('optional'), name='application'))
# inject complete <template> element (after changing node name) into # inject complete <template> element (after changing node name) into
# the ``arch`` field # the ``arch`` field
record.append(Field(el, name="arch", type="xml")) record.append(Field(el, name="arch", type="xml"))
@ -836,7 +840,7 @@ form: module.record_id""" % (xml_id,)
mod,id_str = id_str.split('.') mod,id_str = id_str.split('.')
return model_data_obj.get_object_reference(cr, self.uid, mod, id_str) return model_data_obj.get_object_reference(cr, self.uid, mod, id_str)
def parse(self, de): def parse(self, de, mode=None):
if de.tag != 'openerp': if de.tag != 'openerp':
raise Exception("Mismatch xml format: root tag must be `openerp`.") raise Exception("Mismatch xml format: root tag must be `openerp`.")
@ -844,7 +848,7 @@ form: module.record_id""" % (xml_id,)
for rec in n: for rec in n:
if rec.tag in self._tags: if rec.tag in self._tags:
try: try:
self._tags[rec.tag](self.cr, rec, n) self._tags[rec.tag](self.cr, rec, n, mode=mode)
except Exception, e: except Exception, e:
self.cr.rollback() self.cr.rollback()
exc_info = sys.exc_info() exc_info = sys.exc_info()
@ -883,6 +887,7 @@ def convert_file(cr, module, filename, idref, mode='update', noupdate=False, kin
pathname = os.path.join(module, filename) pathname = os.path.join(module, filename)
fp = misc.file_open(pathname) fp = misc.file_open(pathname)
ext = os.path.splitext(filename)[1].lower() ext = os.path.splitext(filename)[1].lower()
try: try:
if ext == '.csv': if ext == '.csv':
convert_csv_import(cr, module, pathname, fp.read(), idref, mode, noupdate) convert_csv_import(cr, module, pathname, fp.read(), idref, mode, noupdate)
@ -977,7 +982,7 @@ def convert_xml_import(cr, module, xmlfile, idref=None, mode='init', noupdate=Fa
if idref is None: if idref is None:
idref={} idref={}
obj = xml_import(cr, module, idref, mode, report=report, noupdate=noupdate) obj = xml_import(cr, module, idref, mode, report=report, noupdate=noupdate)
obj.parse(doc.getroot()) obj.parse(doc.getroot(), mode=mode)
return True return True