[IMP] website, *: fill the "Content" area of the main website menu
*: website_blog, website_event, website_forum, website_hr_recruitment, website_sale, website_slides As indicated by previous commits, new custom list views are created to fill the "Content" area of the main website menu with key app models: blog posts, events, forum posts, jobs, products and courses (+ some in the enterprise version, see related commit). Those list views will act as the page manager one: a click on an item redirect to the website iframe, the create button acts as creating a record via the "+ New" systray button while being on the iframe, the delete button will in the future allow to know the page that mentions the related object before deleting it, etc etc. task-2889981 closes odoo/odoo#98937 Related: odoo/enterprise#30782 Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com>
This commit is contained in:
@@ -73,6 +73,7 @@
|
||||
<record id="website_pages_tree_view" model="ir.ui.view">
|
||||
<field name="name">website.page.list</field>
|
||||
<field name="model">website.page</field>
|
||||
<field name="priority">99</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree js_class="website_pages_list" type="object" action="open_website_url" default_order="url">
|
||||
<field name="is_homepage" invisible="1"/>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
<?xml version="1.0"?>
|
||||
<odoo>
|
||||
|
||||
<!-- Blog views -->
|
||||
<record id="view_blog_blog_list" model="ir.ui.view">
|
||||
<field name="name">blog.blog.list</field>
|
||||
@@ -128,8 +127,8 @@
|
||||
|
||||
<menuitem id="menu_blog_global" parent="menu_website_blog_root_global" name="Blogs" action="action_blog_blog" sequence="20"/>
|
||||
|
||||
<menuitem id="menu_blog_tag_global" parent="menu_website_blog_root_global" name="Tags" action="action_tags" sequence="40" />
|
||||
<menuitem id="menu_blog_tag_global" parent="menu_website_blog_root_global" name="Tags" action="action_tags" sequence="30"/>
|
||||
|
||||
<menuitem id="menu_website_blog_tag_category_global" parent="menu_website_blog_root_global"
|
||||
name="Tag Categories" action="action_tag_category" sequence="50" />
|
||||
name="Tag Categories" action="action_tag_category" sequence="40"/>
|
||||
</odoo>
|
||||
|
||||
@@ -69,10 +69,10 @@
|
||||
</div>
|
||||
<div class="col-4 text-end">
|
||||
<img t-if="record.author_id.raw_value"
|
||||
t-att-title="record.author_id.value"
|
||||
t-att-alt="record.author_id.value"
|
||||
class="oe_kanban_avatar o_image_24_cover"
|
||||
t-att-src="kanban_image('res.partner', 'avatar_128', record.author_id.raw_value)"/>
|
||||
t-att-title="record.author_id.value"
|
||||
t-att-alt="record.author_id.value"
|
||||
class="oe_kanban_avatar o_image_24_cover"
|
||||
t-att-src="kanban_image('res.partner', 'avatar_128', record.author_id.raw_value)"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -101,41 +101,42 @@
|
||||
</record>
|
||||
|
||||
<record id="view_blog_post_list" model="ir.ui.view">
|
||||
<field name="name">blog.post.list</field>
|
||||
<field name="name">Blog Post Pages Tree</field>
|
||||
<field name="model">blog.post</field>
|
||||
<field name="priority">99</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Blog Posts" multi_edit="1" sample="1">
|
||||
<field name="name"/>
|
||||
<tree js_class="website_pages_list" type="object" action="open_website_url">
|
||||
<field name="active" invisible="1"/>
|
||||
<field name="author_id"/>
|
||||
<field name="blog_id"/>
|
||||
<field name="name"/>
|
||||
<field name="website_url"/>
|
||||
|
||||
<field name="author_id" optional="show"/>
|
||||
<field name="blog_id" optional="hide"/>
|
||||
<field name="create_uid" optional="hide"/>
|
||||
<field name="write_uid" optional="hide"/>
|
||||
<field name="write_date" optional="hide"/>
|
||||
|
||||
<field name="is_seo_optimized"/>
|
||||
<field name="is_published"/>
|
||||
|
||||
<field name="website_id" groups="website.group_multi_website"/>
|
||||
<field name="is_published" string="Is Published" optional="hide"/>
|
||||
<field name="create_uid" invisible="1"/>
|
||||
<field name="write_uid"/>
|
||||
<field name="write_date"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_blog_post" model="ir.actions.act_window">
|
||||
<field name="name">Blog Posts</field>
|
||||
<field name="name">Blog Post Pages</field>
|
||||
<field name="res_model">blog.post</field>
|
||||
<field name="view_mode">tree,form,kanban</field>
|
||||
<field name="view_mode">tree,kanban,form</field>
|
||||
<field name="view_id" ref="view_blog_post_list"/>
|
||||
<field name="search_view_id" ref="view_blog_post_search"/>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create a new blog post
|
||||
</p>
|
||||
</field>
|
||||
<field name="context">{'create_action': 'website_blog.blog_post_action_add'}</field>
|
||||
</record>
|
||||
|
||||
<menuitem name="Blog Post"
|
||||
id="menu_website_blog_post"
|
||||
sequence="30"
|
||||
parent="menu_website_blog_root_global"
|
||||
groups="website.group_website_designer"
|
||||
<menuitem id="menu_blog_post_pages"
|
||||
parent="website.menu_content"
|
||||
sequence="20"
|
||||
name="Blog Posts"
|
||||
action="action_blog_post"/>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
'views/website_event_menu_views.xml',
|
||||
'views/website_visitor_views.xml',
|
||||
'views/event_menus.xml',
|
||||
'views/website_pages_views.xml',
|
||||
'views/event_event_add.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'security/event_security.xml',
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0"?>
|
||||
<odoo>
|
||||
|
||||
<record id="event_pages_tree_view" model="ir.ui.view">
|
||||
<field name="name">Event Pages Tree</field>
|
||||
<field name="model">event.event</field>
|
||||
<field name="priority">99</field>
|
||||
<field name="mode">primary</field>
|
||||
<field name="inherit_id" ref="event.view_event_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//tree" position="attributes">
|
||||
<attribute name="js_class">website_pages_list</attribute>
|
||||
<attribute name="type">object</attribute>
|
||||
<attribute name="action">open_website_url</attribute>
|
||||
</xpath>
|
||||
|
||||
<field name="name" position="after">
|
||||
<field name="website_url"/>
|
||||
</field>
|
||||
<xpath expr="//tree">
|
||||
<field name="is_seo_optimized"/>
|
||||
<field name="is_published"/>
|
||||
|
||||
<field name="website_id" position="move"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_event_pages_list" model="ir.actions.act_window">
|
||||
<field name="name">Event Pages</field>
|
||||
<field name="res_model">event.event</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="event_pages_tree_view"/>
|
||||
<field name="context">{'create_action': 'website_event.event_event_action_add'}</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_event_pages"
|
||||
parent="website.menu_content"
|
||||
sequence="40"
|
||||
name="Events"
|
||||
action="action_event_pages_list"/>
|
||||
|
||||
</odoo>
|
||||
@@ -255,7 +255,7 @@ class Forum(models.Model):
|
||||
return {
|
||||
'type': 'ir.actions.act_url',
|
||||
'target': 'self',
|
||||
'url': self._compute_website_url(),
|
||||
'url': self.env['website'].get_client_action_url(self._compute_website_url()),
|
||||
}
|
||||
|
||||
@api.model
|
||||
@@ -313,6 +313,7 @@ class Post(models.Model):
|
||||
views = fields.Integer('Views', default=0, readonly=True, copy=False)
|
||||
active = fields.Boolean('Active', default=True)
|
||||
website_message_ids = fields.One2many(domain=lambda self: [('model', '=', self._name), ('message_type', 'in', ['email', 'comment'])])
|
||||
website_url = fields.Char('Website URL', compute='_compute_website_url')
|
||||
website_id = fields.Many2one(related='forum_id.website_id', readonly=True)
|
||||
|
||||
# history
|
||||
@@ -965,18 +966,18 @@ class Post(models.Model):
|
||||
return super(Post, self)._notify_thread_by_inbox(message, recipients_data, msg_vals=msg_vals, **kwargs)
|
||||
|
||||
def _compute_website_url(self):
|
||||
return '/forum/{forum}/{post}{anchor}'.format(
|
||||
forum=slug(self.forum_id),
|
||||
post=slug(self),
|
||||
anchor=self.parent_id and '#answer_%d' % self.id or ''
|
||||
)
|
||||
for post in self:
|
||||
forum_slug = slug(post.forum_id)
|
||||
post_slug = slug(post)
|
||||
anchor = post.parent_id and '#answer_%d' % post.id or ''
|
||||
post.website_url = f'/forum/{forum_slug}/{post_slug}{anchor}'
|
||||
|
||||
def go_to_website(self):
|
||||
self.ensure_one()
|
||||
return {
|
||||
'type': 'ir.actions.act_url',
|
||||
'target': 'self',
|
||||
'url': self._compute_website_url(),
|
||||
'url': self.env['website'].get_client_action_url(self.website_url),
|
||||
}
|
||||
|
||||
@api.model
|
||||
@@ -984,7 +985,7 @@ class Post(models.Model):
|
||||
with_description = options['displayDescription']
|
||||
with_date = options['displayDetail']
|
||||
search_fields = ['name']
|
||||
fetch_fields = ['id', 'name']
|
||||
fetch_fields = ['id', 'name', 'website_url']
|
||||
mapping = {
|
||||
'name': {'name': 'name', 'type': 'text', 'match': True},
|
||||
'website_url': {'name': 'website_url', 'type': 'text', 'truncate': False},
|
||||
@@ -1043,7 +1044,6 @@ class Post(models.Model):
|
||||
with_date = 'detail' in mapping
|
||||
results_data = super()._search_render_results(fetch_fields, mapping, icon, limit)
|
||||
for post, data in zip(self, results_data):
|
||||
data['website_url'] = post._compute_website_url()
|
||||
if with_date:
|
||||
data['date'] = self.env['ir.qweb.field.date'].record_to_html(post, 'write_date', {})
|
||||
return results_data
|
||||
|
||||
@@ -229,15 +229,14 @@
|
||||
<field name="view_mode">tree</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- FORUM MENUS -->
|
||||
<menuitem name="Forum" id="menu_website_forum_global"
|
||||
parent="website.menu_website_global_configuration" sequence="170" groups="website.group_website_designer"/>
|
||||
|
||||
<menuitem id="menu_forum_global" parent="menu_website_forum_global" name="Forums" action="action_forum_forum" sequence="10"/>
|
||||
<menuitem id="menu_forum_rank_global" parent="menu_website_forum_global" name="Ranks" action="gamification.gamification_karma_ranks_action" sequence="30"/>
|
||||
<menuitem id="menu_forum_tag_global" parent="menu_website_forum_global" name="Tags" action="forum_tag_action" sequence="40"/>
|
||||
<menuitem id="menu_forum_badges" parent="menu_website_forum_global" name="Badges" action="gamification.badge_list_action" sequence="50"/>
|
||||
<menuitem id="menu_forum_post_reasons" parent="menu_website_forum_global" name="Close Reasons" action="forum_post_reasons_action" sequence="60"/>
|
||||
<menuitem id="menu_forum_rank_global" parent="menu_website_forum_global" name="Ranks" action="gamification.gamification_karma_ranks_action" sequence="20"/>
|
||||
<menuitem id="menu_forum_tag_global" parent="menu_website_forum_global" name="Tags" action="forum_tag_action" sequence="30"/>
|
||||
<menuitem id="menu_forum_badges" parent="menu_website_forum_global" name="Badges" action="gamification.badge_list_action" sequence="40"/>
|
||||
<menuitem id="menu_forum_post_reasons" parent="menu_website_forum_global" name="Close Reasons" action="forum_post_reasons_action" sequence="50"/>
|
||||
</data>
|
||||
</odoo>
|
||||
|
||||
@@ -106,31 +106,37 @@
|
||||
</record>
|
||||
|
||||
<record id="view_forum_post_list" model="ir.ui.view">
|
||||
<field name="name">forum.post.list</field>
|
||||
<field name="name">Forum Post Pages Tree</field>
|
||||
<field name="model">forum.post</field>
|
||||
<field name="priority">99</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Forum Posts">
|
||||
<field name="name"/>
|
||||
<tree js_class="website_pages_list" create="false" type="object" action="go_to_website">
|
||||
<field name="active" invisible="1"/>
|
||||
<field name="forum_id"/>
|
||||
<field name="views" string="# Views" sum="Total Views"/>
|
||||
<field name="child_count" string="# Answers" sum="Total Answers"/>
|
||||
<field name="name"/>
|
||||
<field name="website_url"/>
|
||||
|
||||
<field name="forum_id" optional="show"/>
|
||||
<field name="views" string="# Views" sum="Total Views" optional="hide"/>
|
||||
<field name="child_count" string="# Answers" sum="Total Answers" optional="hide"/>
|
||||
<field name="state" widget="badge"
|
||||
decoration-success="state == 'active'"
|
||||
decoration-danger="state == 'close'"
|
||||
decoration-warning="state not in ('active', 'close')"/>
|
||||
<field name="website_id" groups="website.group_multi_website" optional="hide"/>
|
||||
decoration-warning="state not in ('active', 'close')" optional="show"/>
|
||||
|
||||
<field name="is_seo_optimized"/>
|
||||
|
||||
<field name="website_id" groups="website.group_multi_website"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_forum_post" model="ir.actions.act_window">
|
||||
<field name="name">Forum Posts</field>
|
||||
<field name="name">Forum Post Pages</field>
|
||||
<field name="res_model">forum.post</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="view_mode">tree,graph</field>
|
||||
<field name="view_id" ref="view_forum_post_list"/>
|
||||
<field name="search_view_id" ref="view_forum_post_search"/>
|
||||
<field name="context">{'search_default_posts':1}</field>
|
||||
<field name="context">{'search_default_posts': 1, 'create_action': 'website_forum.forum_forum_action_add'}</field>
|
||||
<field name="help" type="html">
|
||||
<p class="o_view_nocontent_smiling_face">
|
||||
Create a new forum post
|
||||
@@ -138,6 +144,10 @@
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_forum_posts" parent="menu_website_forum_global" name="Forum Post" action="action_forum_post" sequence="20"/>
|
||||
<menuitem id="menu_forum_post_pages"
|
||||
parent="website.menu_content"
|
||||
sequence="80"
|
||||
name="Forum Posts"
|
||||
action="action_forum_post"/>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
'views/website_hr_recruitment_templates.xml',
|
||||
'views/hr_recruitment_views.xml',
|
||||
'views/hr_job_views.xml',
|
||||
'views/website_pages_views.xml',
|
||||
'views/snippets.xml',
|
||||
],
|
||||
'demo': [
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
<field name="website_id" groups="website.group_multi_website" optional="hide"/>
|
||||
</field>
|
||||
<xpath expr="//field[@name='alias_id']" position="before">
|
||||
<field name="website_published" string="Published" widget="toggle_button"/>
|
||||
<field name="is_published" string="Published" widget="toggle_button"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0"?>
|
||||
<odoo>
|
||||
|
||||
<record id="job_pages_tree_view" model="ir.ui.view">
|
||||
<field name="name">Job Pages Tree</field>
|
||||
<field name="model">hr.job</field>
|
||||
<field name="priority">99</field>
|
||||
<field name="mode">primary</field>
|
||||
<field name="inherit_id" ref="hr.view_hr_job_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//tree" position="attributes">
|
||||
<attribute name="js_class">website_pages_list</attribute>
|
||||
<attribute name="type">object</attribute>
|
||||
<attribute name="action">open_website_url</attribute>
|
||||
</xpath>
|
||||
|
||||
<field name="name" position="after">
|
||||
<field name="website_url"/>
|
||||
</field>
|
||||
<xpath expr="//tree">
|
||||
<field name="is_seo_optimized"/>
|
||||
<field name="is_published" position="move"/>
|
||||
|
||||
<field name="website_id" groups="website.group_multi_website"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_job_pages_list" model="ir.actions.act_window">
|
||||
<field name="name">Job Pages</field>
|
||||
<field name="res_model">hr.job</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="job_pages_tree_view"/>
|
||||
<field name="context">{'create_action': '/jobs/add'}</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_job_pages"
|
||||
parent="website.menu_content"
|
||||
sequence="70"
|
||||
name="Jobs"
|
||||
action="action_job_pages_list"/>
|
||||
|
||||
</odoo>
|
||||
@@ -34,6 +34,7 @@
|
||||
'views/base_unit_view.xml',
|
||||
'views/product_product_add.xml',
|
||||
'views/website_views.xml',
|
||||
'views/website_pages_views.xml',
|
||||
],
|
||||
'demo': [
|
||||
'data/demo.xml',
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0"?>
|
||||
<odoo>
|
||||
|
||||
<record id="product_pages_tree_view" model="ir.ui.view">
|
||||
<field name="name">Product Pages Tree</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="priority">99</field>
|
||||
<field name="mode">primary</field>
|
||||
<field name="inherit_id" ref="product_template_view_tree_website_sale"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//tree" position="attributes">
|
||||
<attribute name="js_class">website_pages_list</attribute>
|
||||
<attribute name="type">object</attribute>
|
||||
<attribute name="action">open_website_url</attribute>
|
||||
</xpath>
|
||||
|
||||
<field name="is_published" position="replace"/>
|
||||
|
||||
<field name="name" position="after">
|
||||
<field name="website_url"/>
|
||||
</field>
|
||||
<xpath expr="//tree">
|
||||
<field name="is_seo_optimized"/>
|
||||
<field name="is_published"/>
|
||||
|
||||
<field name="website_id" position="move"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_product_pages_list" model="ir.actions.act_window">
|
||||
<field name="name">Product Pages</field>
|
||||
<field name="res_model">product.template</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="product_pages_tree_view"/>
|
||||
<field name="context">{'create_action': 'website_sale.product_product_action_add'}</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_product_pages"
|
||||
parent="website.menu_content"
|
||||
sequence="30"
|
||||
name="Products"
|
||||
action="action_product_pages_list"/>
|
||||
|
||||
</odoo>
|
||||
@@ -47,6 +47,7 @@ Featuring
|
||||
'views/website_slides_templates_lesson_embed.xml',
|
||||
'views/website_slides_templates_profile.xml',
|
||||
'views/website_slides_templates_utils.xml',
|
||||
'views/website_pages_views.xml',
|
||||
'views/slide_channel_add.xml',
|
||||
'wizard/slide_channel_invite_views.xml',
|
||||
'data/gamification_data.xml',
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0"?>
|
||||
<odoo>
|
||||
|
||||
<record id="slide_channel_pages_tree_view" model="ir.ui.view">
|
||||
<field name="name">Course Pages Tree</field>
|
||||
<field name="model">slide.channel</field>
|
||||
<field name="priority">99</field>
|
||||
<field name="mode">primary</field>
|
||||
<field name="inherit_id" ref="slide_channel_view_tree"/>
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//tree" position="attributes">
|
||||
<attribute name="js_class">website_pages_list</attribute>
|
||||
<attribute name="type">object</attribute>
|
||||
<attribute name="action">open_website_url</attribute>
|
||||
</xpath>
|
||||
|
||||
<field name="name" position="after">
|
||||
<field name="website_url"/>
|
||||
</field>
|
||||
<xpath expr="//tree">
|
||||
<field name="is_seo_optimized"/>
|
||||
<field name="is_published"/>
|
||||
|
||||
<field name="website_id" position="move"/>
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="action_slide_channel_pages_list" model="ir.actions.act_window">
|
||||
<field name="name">Course Pages</field>
|
||||
<field name="res_model">slide.channel</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_id" ref="slide_channel_pages_tree_view"/>
|
||||
<field name="context">{'create_action': 'website_slides.slide_channel_action_add'}</field>
|
||||
</record>
|
||||
|
||||
<menuitem id="menu_slide_channel_pages"
|
||||
parent="website.menu_content"
|
||||
sequence="50"
|
||||
name="Courses"
|
||||
action="action_slide_channel_pages_list"/>
|
||||
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user