summaryrefslogtreecommitdiff
path: root/addons/website/views
diff options
context:
space:
mode:
authorJoren Van Onder <jov@odoo.com>2018-08-12 22:40:50 +0200
committerJeremy Kersten <jke@odoo.com>2018-08-13 19:51:10 +0200
commit4f6ec1cd2a9253bb0c6c17d304490c7809facf8a (patch)
tree3ef047b311595b8f89d74adf90b2f891e7bba2a3 /addons/website/views
parent5ff87e8039676db5a0c48422998d0cabd556a12d (diff)
[IMP] website,*: support multiple websites
This implements support to administer multiple websites. Although the core functionality already existed, managing multiple websites was fairly technical. In the interest of database updates and migration this attempts to keep duplicated data to a minimum. To do this the usual generic records are rendered unless some website-specific record exists that replaces it. Copy-on-write (COW) is used to create these website-specific records. Through this mechanism creating a website-specific record is delayed until necessary. A COW mechanism has been implemented on 4 models: ir.ui.view, website.page, website.menu and ir.attachment. These COW mechanisms are activated when editing data through the website (aka frontend). These frontend edits (e.g. with web_editor) will be website-specific, possibly creating a website-specific record when necessary. When editing data in the backend nothing special will happen, even when editing a generic record. Note that because of this mechanism also facilitates the ability to create new, uncustomized websites because the generic data is kept. Support is provided for a website to have any theme. Themes are fairly complex to handle. Standalone themes can depend on other standalone themes (e.g. theme_beauty depends on theme_loftspace) and themes usually modify some data of the themes they depend on. Because a theme can be installed on multiple websites, using website_id m2o fields does not work well. It would require duplicate data, making updates and migration harder. Because of this, data for themes (ir.ui.view and ir.attachment specifically) have a theme_id m2o. website has a theme_ids m2m that identifies all theme modules currently installed on it. Through these fields we figure out what to render. A theme is only fully uninstalled when it's no longer active on any website. The advantage of this approach is that upgrading or migrating theme data is no different from the single-website case. The website.published.mixin class was modified to handle multiple websites. A wizard was added in the backend to easily manage this for multiple website. Although not used anywhere in this commit, a 'website_id' variable has been added in the evaluation context of ir.rule. It allows to easily make any model multi-website aware, all that's needed is a custom website_id m2o field on a model and a custom record rule.
Diffstat (limited to 'addons/website/views')
-rw-r--r--addons/website/views/ir_attachment_views.xml14
-rw-r--r--addons/website/views/res_config_settings_views.xml111
-rw-r--r--addons/website/views/res_partner_views.xml13
-rw-r--r--addons/website/views/website_navbar_templates.xml14
-rw-r--r--addons/website/views/website_templates.xml20
-rw-r--r--addons/website/views/website_views.xml43
6 files changed, 191 insertions, 24 deletions
diff --git a/addons/website/views/ir_attachment_views.xml b/addons/website/views/ir_attachment_views.xml
new file mode 100644
index 00000000000..c553c280d2f
--- /dev/null
+++ b/addons/website/views/ir_attachment_views.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+ <record id="view_attachment_form_inherit_website" model="ir.ui.view">
+ <field name="name">ir.attachment.form.inherit.website</field>
+ <field name="model">ir.attachment</field>
+ <field name="inherit_id" ref="base.view_attachment_form"/>
+ <field name="arch" type="xml">
+ <field name="mimetype" position="after">
+ <field name="key" groups="base.group_no_one"/>
+ <field name="theme_id" groups="base.group_no_one"/>
+ </field>
+ </field>
+ </record>
+</odoo>
diff --git a/addons/website/views/res_config_settings_views.xml b/addons/website/views/res_config_settings_views.xml
index 8a19354c6f2..d8b44e6c65f 100644
--- a/addons/website/views/res_config_settings_views.xml
+++ b/addons/website/views/res_config_settings_views.xml
@@ -10,12 +10,27 @@
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<div class="app_settings_block" data-string="Website" string="Website" data-key="website" groups="website.group_website_designer">
- <field name="website_id" invisible="1"/>
+ <h2 groups="website.group_multi_website">Select the Website to Configure</h2>
+ <div class="row mt16 o_settings_container" id="website_selection_settings" groups="website.group_multi_website">
+ <div class="col-xs-12 col-md-6 o_setting_box" id="website">
+ <div class="o_setting_right_pane">
+ <label string="Website" for="website_id"/>
+ <div class="text-muted">
+ Settings on this page will apply to this website
+ </div>
+ <field name="website_id" options="{'no_open': True, 'no_create_edit': True}"/>
+ <div>
+ <button name="website_go_to" type="object" string="Go to website"/>
+ </div>
+ </div>
+ </div>
+ </div>
<h2>Website</h2>
<div class="row mt16 o_settings_container" id="webmaster_settings">
<div class="col-12 col-lg-6 o_setting_box" id="domain_setting">
<div class="o_setting_right_pane">
- <span class="o_form_label">Website Title</span>
+ <label for="website_name" string="Website Title"/>
+ <span class="fa fa-lg fa-globe" title="Values set here are website-specific." groups="website.group_multi_website"/>
<div class="text-muted">
Name and favicon of your website
</div>
@@ -31,9 +46,40 @@
</div>
</div>
</div>
+ <div class="col-12 col-lg-6 o_setting_box" id="company_settings" groups="base.group_multi_company">
+ <div class="o_setting_right_pane">
+ <label string="Company" for="website_company_id"/>
+ <span class="fa fa-lg fa-globe" title="Values set here are website-specific." groups="website.group_multi_website"/>
+ <div class="text-muted">
+ The company this website belongs to
+ </div>
+ <field name="website_company_id"/>
+ </div>
+ </div>
+ <div class="col-12 col-lg-6 o_setting_box" id="domain_settings" groups="website.group_multi_website">
+ <div class="o_setting_right_pane">
+ <label string="Domain" for="website_domain"/>
+ <span class="fa fa-lg fa-globe" title="Values set here are website-specific." groups="website.group_multi_website"/>
+ <div class="text-muted">
+ Display this website when users visit this domain
+ </div>
+ <field name="website_domain"/>
+ </div>
+ </div>
+ <div class="col-12 col-lg-6 o_setting_box" id="website_geoip_settings" groups="website.group_multi_website">
+ <div class="o_setting_right_pane">
+ <label string="Country Groups" for="website_country_group_ids"/>
+ <span class="fa fa-lg fa-globe" title="Values set here are website-specific." groups="website.group_multi_website"/>
+ <div class="text-muted">
+ Display this website for users from these country groups
+ </div>
+ <field name="website_country_group_ids" widget="many2many_tags"/>
+ </div>
+ </div>
<div class="col-12 col-lg-6 o_setting_box" id="languages_setting">
<div class="o_setting_right_pane">
<label for="language_ids"/>
+ <span class="fa fa-lg fa-globe" title="Values set here are website-specific." groups="website.group_multi_website"/>
<div class="text-muted">
Languages available on your website
</div>
@@ -58,6 +104,7 @@
</div>
<div class="o_setting_right_pane">
<label for="has_google_analytics"/>
+ <span class="fa fa-lg fa-globe" title="Values set here are website-specific." groups="website.group_multi_website"/>
<div class="text-muted">
Track visits in Google Analytics
</div>
@@ -142,6 +189,7 @@
</div>
<div class="o_setting_right_pane">
<label for="auth_signup_uninvited"/>
+ <span class="fa fa-lg fa-globe" title="Values set here are website-specific." groups="website.group_multi_website"/>
<div class="text-muted">
Let your customers log in to see their documents
</div>
@@ -155,12 +203,49 @@
</div>
</div>
</div>
+ <div class="col-12 col-lg-6 o_setting_box">
+ <div class="o_setting_left_pane"/>
+ <div class="o_setting_right_pane">
+ <label string="Social Media" for="social_twitter"/>
+ <span class="fa fa-lg fa-globe" title="Values set here are website-specific." groups="website.group_multi_website"/>
+ <div class="text-muted">
+ Add links to social media on your website
+ </div>
+ <div class="content-group">
+ <div class="row">
+ <label for="social_twitter" string="Twitter" class="col-md-3 o_light_label"/>
+ <field name="social_twitter"/>
+ </div>
+ <div class="row">
+ <label for="social_facebook" string="Facebook" class="col-md-3 o_light_label"/>
+ <field name="social_facebook"/>
+ </div>
+ <div class="row">
+ <label for="social_github" string="GitHub" class="col-md-3 o_light_label"/>
+ <field name="social_github"/>
+ </div>
+ <div class="row">
+ <label for="social_linkedin" string="LinkedIn" class="col-md-3 o_light_label"/>
+ <field name="social_linkedin"/>
+ </div>
+ <div class="row">
+ <label for="social_youtube" string="YouTube" class="col-md-3 o_light_label"/>
+ <field name="social_youtube"/>
+ </div>
+ <div class="row">
+ <label for="social_googleplus" string="Google Plus" class="col-md-3 o_light_label"/>
+ <field name="social_googleplus"/>
+ </div>
+ </div>
+ </div>
+ </div>
<div class="col-12 col-lg-6 o_setting_box" id="cdn_setting" title="A CDN helps you serve your website’s content with high availability and high performance to any visitor wherever they are located." groups="base.group_no_one">
<div class="o_setting_left_pane">
<field name="cdn_activated"/>
</div>
<div class="o_setting_right_pane">
<label for="cdn_activated" string="Content Delivery Network (CDN)"/>
+ <span class="fa fa-lg fa-globe" title="Values set here are website-specific." groups="website.group_multi_website"/>
<div class="text-muted">
Use a CDN to optimize the availability of your website's content
</div>
@@ -192,6 +277,20 @@
</div>
</div>
</div>
+ <h2>Multi-Website</h2>
+ <div class="row mt16 o_settings_container" id="multi_website" name="multi_website">
+ <div class="col-xs-12 col-md-6 o_setting_box">
+ <div class="o_setting_left_pane">
+ <field name="group_multi_website"/>
+ </div>
+ <div class="o_setting_right_pane">
+ <label string="Multi-Website" for="group_multi_website"/>
+ <div class="text-muted">
+ Manage multiple websites
+ </div>
+ </div>
+ </div>
+ </div>
</div>
</xpath>
</field>
@@ -227,6 +326,14 @@
<menuitem id="menu_website_add_features" parent="website.menu_website_global_configuration"
sequence="20" groups="base.group_system" action="action_website_add_features"/>
+ <menuitem name="Websites"
+ id="menu_website_websites_list"
+ action="action_website_list"
+ parent="menu_website_global_configuration"
+ groups="website.group_multi_website"
+ sequence="10"
+ />
+
<menuitem name="Pages"
id="menu_website_pages_list"
action="action_website_pages_list"
diff --git a/addons/website/views/res_partner_views.xml b/addons/website/views/res_partner_views.xml
new file mode 100644
index 00000000000..51bc3590725
--- /dev/null
+++ b/addons/website/views/res_partner_views.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<odoo>
+ <record id="view_partner_form_inherit_website" model="ir.ui.view">
+ <field name="name">res.partner.form.website.inherit</field>
+ <field name="model">res.partner</field>
+ <field name="inherit_id" ref="base.view_partner_form"/>
+ <field name="arch" type="xml">
+ <field name="company_id" position="after" options="{'no_create': True}">
+ <field name="website_id" groups="website.group_multi_website"/>
+ </field>
+ </field>
+ </record>
+</odoo>
diff --git a/addons/website/views/website_navbar_templates.xml b/addons/website/views/website_navbar_templates.xml
index 7433259ae5f..7f0adea2f56 100644
--- a/addons/website/views/website_navbar_templates.xml
+++ b/addons/website/views/website_navbar_templates.xml
@@ -77,6 +77,20 @@
<li class="o_mobile_preview" id="mobile-menu">
<a data-action="show-mobile-preview" href="#"><span title="Mobile preview" role="img" aria-label="Mobile preview" class="fa fa-mobile"/></a>
</li>
+ <li class="dropdown" groups="website.group_multi_website">
+ <a class="dropdown-toggle waves" data-toggle="dropdown" href="#"><t t-esc="multi_website_selected_website['name']"/> <span class="caret"/></a>
+ <ul class="dropdown-menu" role="menu">
+ <li t-as="multi_website_website" t-foreach="multi_website_websites">
+ <a href="#">
+ <t t-if="multi_website_selected_website['website_id'] != multi_website_website['website_id']">
+ <span class="oe_menu_text js_multi_website_switch" t-att-website-id="str(multi_website_website['website_id'])">
+ <t t-esc="multi_website_website['name']"/>
+ </span>
+ </t>
+ </a>
+ </li>
+ </ul>
+ </li>
<!-- Page Edition -->
<li class="o_new_content_menu" id="new-content-menu">
<a href="#"><span class="fa fa-plus"/>New</a>
diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index 535887fde4e..6ff8df377d5 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -210,7 +210,7 @@
<attribute name="t-if">website.user_id != user_id</attribute>
</xpath>
<xpath expr="//header//ul[@id='top_menu']/li[hasclass('divider')]" position="before">
- <t t-foreach="website.menu_id.child_id" t-as="submenu">
+ <t t-foreach="website.menu_id.get_children_for_current_website()" t-as="submenu">
<t t-call="website.submenu">
<t t-set="submenu_type" t-value="'nav'"/>
</t>
@@ -1126,4 +1126,22 @@ Sitemap: <t t-esc="url_root"/>sitemap.xml
</t>
</template>
+<template id="default_homepage">
+ <div id="wrap" class="oe_structure oe_empty">
+ <div class="item image_text oe_img_bg active">
+ <div class="container">
+ <div class="row content">
+ <div class="col-md-6 col-sm-12">
+ <h2>Homepage of <t t-esc="website.name"/></h2>
+ <h3>Click to customize this text</h3>
+ <p>
+ <a role="button" class="btn btn-success btn-large" href="/contactus">Contact us</a>
+ </p>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+</template>
+
</odoo>
diff --git a/addons/website/views/website_views.xml b/addons/website/views/website_views.xml
index c48c7842b06..39107ad58e7 100644
--- a/addons/website/views/website_views.xml
+++ b/addons/website/views/website_views.xml
@@ -14,29 +14,15 @@
<field name="model">website</field>
<field name="arch" type="xml">
<form string="Website Settings">
- <header>
- <button string="Apply" type="object" name="noop" class="oe_highlight"/>
- <button string="Cancel" type="object" name="noop" class="oe_link"/>
- </header>
<div name="domain">
<separator name="domain" string="Domain"/>
<group name="domain">
<field name="name"/>
<field name="domain"/>
+ <field name="country_group_ids" widget="many2many_tags"/>
<field name="google_analytics_key" placeholder="UA-XXXXXXXX-Y"/>
</group>
</div>
- <div name="social_media">
- <separator string="Social Media"/>
- <group name="social_media">
- <field name="social_twitter" placeholder="https://twitter.com/Odoo"/>
- <field name="social_facebook" placeholder="https://www.facebook.com/odoo"/>
- <field name="social_googleplus" placeholder="https://plus.google.com/+Odooapps"/>
- <field name="social_linkedin" placeholder="https://www.linkedin.com/company/odoo"/>
- <field name="social_youtube" placeholder="https://www.youtube.com/user/OpenERPonline"/>
- <field name="social_github" placeholder="https://youraccount.github.io"/>
- </group>
- </div>
<div name="other">
<separator string="Other Info"/>
<group name="other">
@@ -55,8 +41,12 @@
<field name="arch" type="xml">
<tree string="Websites">
<field name="name"/>
+ <field name="domain"/>
+ <field name="country_group_ids" widget="many2many_tags"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="default_lang_id"/>
+ <field name="installed_theme_id" groups="base.group_no_one"/>
+ <field name="theme_ids" groups="base.group_no_one" widget="many2many_tags"/>
</tree>
</field>
</record>
@@ -77,6 +67,15 @@
</field>
</record>
+ <record id="action_website_list" model="ir.actions.act_window">
+ <field name="name">Websites</field>
+ <field name="res_model">website</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form</field>
+ <field name="view_id" ref="view_website_tree"/>
+ <field name="target">current</field>
+ </record>
+
<!-- website.redirect views -->
<record id="website_redirect_form_view" model="ir.ui.view">
<field name="name">website.redirect.form</field>
@@ -91,7 +90,7 @@
<field name="url_to"/>
</group>
<group>
- <field name="website_id"/>
+ <field name="website_id" groups="website.group_multi_website"/>
<field name="active"/>
</group>
</group>
@@ -108,7 +107,7 @@
<field name="type"/>
<field name="url_from"/>
<field name="url_to"/>
- <field name="website_id"/>
+ <field name="website_id" groups="website.group_multi_website"/>
<field name="active"/>
<field name="sequence" widget="handle" />
</tree>
@@ -137,6 +136,8 @@
<field name="name"/>
<field name="url"/>
<field name="view_id"/>
+ <field groups="base.group_no_one" name="is_published"/>
+ <field groups="website.group_multi_website" name="website_id"/>
</group>
<group>
<field name="website_indexed"/>
@@ -144,7 +145,6 @@
<field name="date_publish"/>
</group>
</group>
- <field groups="base.group_no_one" name="website_ids"/>
<label for="menu_ids" string="Related Menu Items"/>
<field name="menu_ids"/>
</sheet>
@@ -193,7 +193,7 @@
<group>
<field name="new_window"/>
<field name="sequence"/>
- <field attrs="{'invisible': [('parent_id', '!=', False)]}" name="website_id"/>
+ <field name="website_id" groups="website.group_multi_website"/>
</group>
<group>
<field name="parent_id"/>
@@ -219,7 +219,7 @@
<field name="arch" type="xml">
<tree string="Website menu" editable="bottom">
<field name="sequence" widget="handle"/>
- <field name="website_id" options="{'no_create': True}"/>
+ <field name="website_id" options="{'no_create': True}" groups="website.group_multi_website"/>
<field name="name"/>
<field name="url"/>
<field name="new_window"/>
@@ -263,7 +263,8 @@
<field name="inherit_id" ref="base.view_view_form"/>
<field name="arch" type="xml">
<field name="name" position="after">
- <field name="website_id" readonly="1"/>
+ <field name="website_id" groups="website.group_multi_website"/>
+ <field name="theme_id" groups="base.group_no_one"/>
<field name="key" readonly="1"/>
<field name="page_ids" invisible="1" />
<field name="first_page_id" attrs="{'invisible': [('page_ids', '=', [])]}" />