FIX Last Contributor (uid and date). Use related fields instead of computed where possible.

Fix search views, store some fields to make them searchable, added filters
This commit is contained in:
Iván Todorovich 2018-03-01 11:45:45 -03:00
parent 2b4327751f
commit dbeec6ef0f
9 changed files with 323 additions and 255 deletions

View File

@ -37,6 +37,8 @@
'wizard/document_page_create_menu.xml',
'wizard/document_page_show_diff.xml',
'views/document_page.xml',
'views/document_page_category.xml',
'views/document_page_history.xml',
'views/document_page_assets.xml',
'views/report_document_page.xml',
'security/document_page_security.xml',

View File

@ -55,6 +55,7 @@ class DocumentPage(models.Model):
"Content",
compute='_compute_content',
inverse='_inverse_content',
search='_search_content',
required=True,
)
@ -78,12 +79,20 @@ class DocumentPage(models.Model):
compute='_compute_display_content'
)
history_head = fields.Many2one(
'document.page.history',
'HEAD',
compute='_compute_history_head',
store=True,
auto_join=True,
)
history_ids = fields.One2many(
'document.page.history',
'page_id',
'History',
order='create_date DESC',
readonly=True
readonly=True,
)
menu_id = fields.Many2one(
@ -92,29 +101,21 @@ class DocumentPage(models.Model):
readonly=True
)
create_date = fields.Datetime(
"Created on",
content_date = fields.Datetime(
'Last Contribution Date',
related='history_head.create_date',
store=True,
index=True,
readonly=True
readonly=True,
)
create_uid = fields.Many2one(
content_uid = fields.Many2one(
'res.users',
'Author',
'Last Contributor',
related='history_head.create_uid',
store=True,
index=True,
readonly=True
)
write_date = fields.Datetime(
"Modification Date",
index=True,
readonly=True)
write_uid = fields.Many2one(
'res.users',
"Last Contributor",
index=True,
readonly=True
readonly=True,
)
@api.multi
@ -133,19 +134,21 @@ class DocumentPage(models.Model):
return r
@api.multi
@api.depends('content')
def _compute_display_content(self):
# @deprecated, simply use content
for rec in self:
rec.display_content = rec.content
@api.multi
@api.depends('history_head', 'history_ids')
def _compute_content(self):
for rec in self:
if rec.type == 'category':
rec.content = rec._get_page_index(link=False)
else:
if rec.history_ids:
rec.content = rec.history_ids[0].content
if rec.history_head:
rec.content = rec.history_head.content
else:
# html widget's default, so it doesn't trigger ghost save
rec.content = '<p><br></p>'
@ -159,6 +162,17 @@ class DocumentPage(models.Model):
'summary': rec.summary,
})
@api.multi
def _search_content(self, operator, value):
return [('history_head.content', operator, value)]
@api.multi
@api.depends('history_ids')
def _compute_history_head(self):
for rec in self:
if rec.history_ids:
rec.history_head = rec.history_ids[0]
@api.multi
def _create_history(self, vals):
self.ensure_one()

View File

@ -28,7 +28,6 @@ class DocumentPageHistory(models.Model):
_name = "document.page.history"
_description = "Document Page History"
_order = 'id DESC'
_rec_name = "create_date"
page_id = fields.Many2one('document.page', 'Page', ondelete='cascade')
summary = fields.Char('Summary', index=True)

View File

@ -1,10 +1,7 @@
<?xml version="1.0"?>
<odoo>
<data>
<menuitem name="Pages"
id="menu_wiki"
parent="knowledge.menu_document"
sequence="20" />
<!-- wiki tree view -->
<record id="view_wiki_tree_children" model="ir.ui.view">
@ -15,8 +12,8 @@
<field name="arch" type="xml">
<tree string="Document Page">
<field name="name"/>
<field name="write_uid"/>
<field name="write_date"/>
<field name="content_uid"/>
<field name="content_date"/>
</tree>
</field>
</record>
@ -30,8 +27,8 @@
<field name="name"/>
<field name="parent_id"/>
<field name="create_uid" invisible="1"/>
<field name="write_uid"/>
<field name="write_date"/>
<field name="content_uid"/>
<field name="content_date"/>
</tree>
</field>
</record>
@ -50,8 +47,8 @@
<field name="parent_id" string="Category" context="{'default_type':'category'}"/>
</group>
<group>
<field name="write_uid" readonly="1"/>
<field name="write_date" readonly="1"/>
<field name="content_uid"/>
<field name="content_date"/>
<field name="menu_id" readonly="1" attrs="{'invisible': [('menu_id','=',False)]}"/>
</group>
</group>
@ -59,8 +56,8 @@
<page name="content" string="Content">
<label for="summary" class="oe_edit_only" />
<field name="summary" placeholder="eg: Changed ... for ..." class="oe_edit_only" />
<label for="content" class="oe_edit_only" />
<field name="content" widget="html" placeholder="e.g. Once upon a time..." options="{'safe': True}"/>
<label for="content" class="oe_edit_only"/>
<field name="content" widget="html" placeholder="e.g. Once upon a time..." required="1" options="{'safe': True}"/>
</page>
<page name="history" string="History">
<field name="history_ids">
@ -89,7 +86,7 @@
<form string="Document Page">
<field name="type" invisible="1"/>
<h1><field name="name" placeholder="Name"/></h1>
<field name="content" class="oe_view_only" options='{"safe": True}'/>
<field name="content" class="oe_view_only" required="1" options='{"safe": True}'/>
</form>
</field>
</record>
@ -100,72 +97,19 @@
<field name="model">document.page</field>
<field name="arch" type="xml">
<search string="Document Page">
<field name="name" string="Content"
filter_domain="['|', ('name','ilike',self), ('content','ilike',self)]"/>
<field name="write_uid"/>
<field name="name" string="Content" filter_domain="['|', ('name','ilike',self), ('content','ilike',self)]"/>
<field name="parent_id"/>
<field name="create_uid"/>
<field name="content_uid"/>
<group expand="0" string="Group By...">
<filter string="Document Type" context="{'group_by':'parent_id'}" />
<filter string="Category" context="{'group_by':'parent_id'}" />
<filter string="Author" context="{'group_by':'create_uid'}" />
<filter string="Last Contributor" context="{'group_by':'write_uid'}" />
<filter string="Last Contributor" context="{'group_by':'content_uid'}" />
</group>
</search>
</field>
</record>
<!-- Category Views -->
<record id="view_category_form" model="ir.ui.view">
<field name="name">document.page.category.form</field>
<field name="model">document.page</field>
<field name="arch" type="xml">
<form string="Category">
<sheet>
<field name="type" invisible="1"/>
<h1><field name="name" placeholder="Name"/></h1>
<group>
<group>
<field name="parent_id" string="Category"
context="{'default_type':'category'}"/>
</group>
<group>
<field name="write_uid"
groups="base.group_no_one"/>
<field name="write_date"
groups="base.group_no_one"/>
<field name="menu_id"
groups="base.group_no_one"/>
</group>
</group>
<notebook>
<page string="Template" name="template">
<field name="template" placeholder="e.g. Once upon a time..." />
</page>
<page string="Documents" name="documents">
<field name="content" widget="html" class="oe_view_only" options='{"safe": True}' />
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="view_category_tree" model="ir.ui.view">
<field name="name">document.page.category.tree</field>
<field name="model">document.page</field>
<field name="arch" type="xml">
<tree string="Categories">
<field name="name"/>
<field name="parent_id"/>
<field name="create_uid" invisible="1"/>
<field name="write_uid"/>
<field name="write_date"/>
</tree>
</field>
</record>
<!-- page action -->
<record id="action_page" model="ir.actions.act_window">
@ -183,135 +127,35 @@
</p>
</field>
</record>
<record id="action_page_view_tree" model="ir.actions.act_window.view">
<field name="sequence" eval="0" />
<field name="view_mode">tree</field>
<field name="view_id" ref="view_wiki_tree"/>
<field name="act_window_id" ref="action_page"/>
</record>
<record id="action_page_view_form" model="ir.actions.act_window.view">
<field name="sequence" eval="5" />
<field name="view_mode">form</field>
<field name="view_id" ref="view_wiki_form"/>
<field name="act_window_id" ref="action_page"/>
</record>
<menuitem id="menu_wiki"
name="Pages"
parent="knowledge.menu_document"
sequence="20" />
<menuitem id="menu_page"
parent="menu_wiki"
name="Pages"
action="action_page"
sequence="10" />
name="Pages"
parent="menu_wiki"
action="action_page"
sequence="10" />
<record id="action_category" model="ir.actions.act_window">
<field name="name">Category</field>
<field name="res_model">document.page</field>
<field name="domain">[('type','=','category')]</field>
<field name="context">{'default_type': 'category'}</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_category_tree"/>
<field name="search_view_id" ref="view_wiki_filter"/>
</record>
<record id="action_category_view_tree" model="ir.actions.act_window.view">
<field name="sequence" eval="0" />
<field name="view_mode">tree</field>
<field name="view_id" ref="view_category_tree"/>
<field name="act_window_id" ref="action_category"/>
</record>
<record id="action_category_view_form" model="ir.actions.act_window.view">
<field name="sequence" eval="5" />
<field name="view_mode">form</field>
<field name="view_id" ref="view_category_form"/>
<field name="act_window_id" ref="action_category"/>
</record>
<menuitem id="menu_category"
parent="menu_wiki"
name="Categories"
action="action_category"
sequence="20"/>
<!-- History Tree view -->
<record model="ir.ui.view" id="view_wiki_history_tree">
<field name="name">document.page.history.tree</field>
<field name="model">document.page.history</field>
<field name="arch" type="xml">
<tree string="Document History">
<field name="id"/>
<field name="page_id"/>
<field name="summary"/>
<field name="create_uid"/>
<field name="create_date"/>
</tree>
</field>
</record>
<!-- History Search view -->
<record id="view_wiki_history_filter" model="ir.ui.view">
<field name="name">document.page.history.search</field>
<field name="model">document.page.history</field>
<field name="arch" type="xml">
<search string="Document Page History">
<field name="page_id"/>
<field name="content"/>
<field name="create_uid"/>
<group expand="0" string="Group By...">
<filter name="group_author" string="Author" context="{'group_by':'create_uid'}" />
</group>
</search>
</field>
</record>
<!-- History Form view -->
<record model="ir.ui.view" id="wiki_history_form">
<field name="name">document.page.history.form</field>
<field name="model">document.page.history</field>
<field name="arch" type="xml">
<form string="Document Page History">
<sheet>
<h1><field name="page_id"/></h1>
<group>
<group>
<field name="create_uid" readonly="1"/>
<field name="create_date" readonly="1"/>
</group>
</group>
<notebook>
<page name="content" string="Content">
<label for="summary"/>
<field name="summary" placeholder="eg: Changed ... for ..."/>
<label for="content"/>
<field name="content" widget="html" placeholder="e.g. Once upon a time..." options="{'safe': True}"/>
</page>
<page name="diff" string="Changes">
<field name="diff" widget="html" style="overflow-x: scroll" />
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<!-- History Action -->
<record model="ir.actions.act_window" id="action_history">
<field name="name">Page history</field>
<field name="res_model">document.page.history</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_page_history"
parent="menu_wiki"
name="Pages history"
action="action_history"
sequence="30"
groups="base.group_no_one" />
<act_window
id="action_related_page_history"
context="{'search_default_page_id': [active_id], 'default_page_id': active_id}"
domain="[('page_id','=',active_id)]"
name="Page History"
res_model="document.page.history"
src_model="document.page"/>
<act_window
id="action_related_page_create_menu"

View File

@ -0,0 +1,90 @@
<?xml version="1.0"?>
<odoo>
<data>
<!-- Category Views -->
<record id="view_category_form" model="ir.ui.view">
<field name="name">document.page.category.form</field>
<field name="model">document.page</field>
<field name="arch" type="xml">
<form string="Category">
<sheet>
<field name="type" invisible="1"/>
<h1><field name="name" placeholder="Name"/></h1>
<group>
<group>
<field name="parent_id" string="Category" context="{'default_type':'category'}"/>
</group>
<group>
<field name="write_uid" groups="base.group_no_one"/>
<field name="write_date" groups="base.group_no_one"/>
<field name="menu_id" groups="base.group_no_one"/>
</group>
</group>
<notebook>
<page string="Template" name="template">
<field name="template" placeholder="e.g. Once upon a time..." />
</page>
<page string="Documents" name="documents">
<field name="content" widget="html" class="oe_view_only" options='{"safe": True}' />
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<record id="view_category_tree" model="ir.ui.view">
<field name="name">document.page.category.tree</field>
<field name="model">document.page</field>
<field name="arch" type="xml">
<tree string="Categories">
<field name="name"/>
<field name="parent_id"/>
<field name="create_uid" invisible="1"/>
<field name="write_uid"/>
<field name="write_date"/>
</tree>
</field>
</record>
<!-- category Action -->
<record id="action_category" model="ir.actions.act_window">
<field name="name">Category</field>
<field name="res_model">document.page</field>
<field name="domain">[('type','=','category')]</field>
<field name="context">{'default_type': 'category'}</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="view_category_tree"/>
<field name="search_view_id" ref="view_wiki_filter"/>
</record>
<record id="action_category_view_tree" model="ir.actions.act_window.view">
<field name="sequence" eval="0" />
<field name="view_mode">tree</field>
<field name="view_id" ref="view_category_tree"/>
<field name="act_window_id" ref="action_category"/>
</record>
<record id="action_category_view_form" model="ir.actions.act_window.view">
<field name="sequence" eval="5" />
<field name="view_mode">form</field>
<field name="view_id" ref="view_category_form"/>
<field name="act_window_id" ref="action_category"/>
</record>
<menuitem id="menu_category"
parent="menu_wiki"
name="Categories"
action="action_category"
sequence="20"/>
</data>
</odoo>

View File

@ -0,0 +1,90 @@
<?xml version="1.0"?>
<odoo>
<data>
<!-- History Tree view -->
<record model="ir.ui.view" id="view_wiki_history_tree">
<field name="name">document.page.history.tree</field>
<field name="model">document.page.history</field>
<field name="arch" type="xml">
<tree string="Document History">
<field name="id"/>
<field name="page_id"/>
<field name="summary"/>
<field name="create_uid"/>
<field name="create_date"/>
</tree>
</field>
</record>
<!-- History Search view -->
<record id="view_wiki_history_filter" model="ir.ui.view">
<field name="name">document.page.history.search</field>
<field name="model">document.page.history</field>
<field name="arch" type="xml">
<search string="Document Page History">
<field name="page_id"/>
<field name="content"/>
<field name="create_uid"/>
<group expand="0" string="Group By...">
<filter name="group_author" string="Author" context="{'group_by':'create_uid'}" />
</group>
</search>
</field>
</record>
<!-- History Form view -->
<record model="ir.ui.view" id="wiki_history_form">
<field name="name">document.page.history.form</field>
<field name="model">document.page.history</field>
<field name="arch" type="xml">
<form string="Document Page History">
<sheet>
<h1><field name="page_id"/></h1>
<group>
<group>
<field name="create_uid" readonly="1"/>
<field name="create_date" readonly="1"/>
</group>
</group>
<notebook>
<page name="content" string="Content">
<label for="summary"/>
<field name="summary" placeholder="eg: Changed ... for ..."/>
<label for="content"/>
<field name="content" widget="html" placeholder="e.g. Once upon a time..." options="{'safe': True}"/>
</page>
<page name="diff" string="Changes">
<field name="diff" widget="html" style="overflow-x: scroll" />
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<!-- History Action -->
<record model="ir.actions.act_window" id="action_history">
<field name="name">Page history</field>
<field name="res_model">document.page.history</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_page_history"
parent="menu_wiki"
name="Pages history"
action="action_history"
sequence="30"
groups="base.group_no_one" />
<act_window id="action_related_page_history"
context="{'search_default_page_id': [active_id], 'default_page_id': active_id}"
domain="[('page_id','=',active_id)]"
name="Page History"
res_model="document.page.history"
src_model="document.page"/>
</data>
</odoo>

View File

@ -34,14 +34,20 @@ class DocumentPageApproval(models.Model):
)
approved_date = fields.Datetime(
compute='_compute_approved_info',
string="Approved Date"
'Approved Date',
related='history_head.approved_date',
store=True,
index=True,
readonly=True,
)
approved_uid = fields.Many2one(
'res.users',
compute='_compute_approved_info',
string="Approved By",
'Approved by',
related='history_head.approved_uid',
store=True,
index=True,
readonly=True,
)
approval_required = fields.Boolean(
@ -61,6 +67,10 @@ class DocumentPageApproval(models.Model):
compute='_compute_is_approval_required',
)
am_i_approver = fields.Boolean(
compute='_compute_am_i_approver'
)
approver_group_ids = fields.Many2many(
'res.groups',
string='Approver groups',
@ -73,15 +83,6 @@ class DocumentPageApproval(models.Model):
string='Has changes pending approval'
)
@api.multi
@api.depends('history_ids')
def _compute_approved_info(self):
"""Return the approved date of a document."""
for page in self:
if page.history_ids:
page.approved_date = page.history_ids[0].approved_date
page.approved_uid = page.history_ids[0].approved_uid
@api.multi
@api.depends('approval_required', 'parent_id.is_approval_required')
def _compute_is_approval_required(self):
@ -102,6 +103,30 @@ class DocumentPageApproval(models.Model):
res = res | page.parent_id.approver_group_ids
page.approver_group_ids = res
@api.multi
@api.depends('is_approval_required', 'approver_group_ids')
def _compute_am_i_approver(self):
"""Check if the current user can approve changes to this page."""
for rec in self:
rec.am_i_approver = rec.can_user_approve_this_page(self.env.user)
@api.multi
def can_user_approve_this_page(self, user):
"""Check if a user can approve this page."""
self.ensure_one()
# if it's not required, anyone can approve
if not self.is_approval_required:
return True
# to approve, you must have approver rights
approver_group_id = self.env.ref(
'document_page_approval.group_document_approver_user')
if approver_group_id not in user.groups_id:
return False
# and belong to at least one of the approver_groups (if any is set)
if not self.approver_group_ids:
return True
return len(user.groups_id & self.approver_group_ids) > 0
@api.multi
def _compute_has_changes_pending_approval(self):
history = self.env['document.page.history']

View File

@ -40,11 +40,13 @@ class DocumentPageHistoryWorkflow(models.Model):
readonly=True,
)
approved_date = fields.Datetime("Approved Date")
approved_date = fields.Datetime(
'Approved Date',
)
approved_uid = fields.Many2one(
'res.users',
"Approved By"
'Approved by',
)
is_approval_required = fields.Boolean(
@ -52,8 +54,13 @@ class DocumentPageHistoryWorkflow(models.Model):
string="Approval required",
)
am_i_owner = fields.Boolean(compute='_compute_am_i_owner')
am_i_approver = fields.Boolean(compute='_compute_am_i_approver')
am_i_owner = fields.Boolean(
compute='_compute_am_i_owner'
)
am_i_approver = fields.Boolean(
related='page_id.am_i_approver'
)
page_url = fields.Text(
compute='_compute_page_url',
@ -92,6 +99,8 @@ class DocumentPageHistoryWorkflow(models.Model):
'approved_uid': self.env.uid
})
for rec in self:
# Trigger computed field update
rec.page_id._compute_history_head()
# Notify state change
rec.message_post(
subtype='mt_comment',
@ -125,29 +134,6 @@ class DocumentPageHistoryWorkflow(models.Model):
for rec in self:
rec.am_i_owner = (rec.create_uid == self.env.user)
@api.multi
def _compute_am_i_approver(self):
"""Check if the current user can approve the page."""
for rec in self:
rec.am_i_approver = rec.can_user_approve_this_page(self.env.user)
@api.multi
def can_user_approve_this_page(self, user):
"""Check if a user can approve this page."""
self.ensure_one()
# if it's not required, anyone can approve
if not self.is_approval_required:
return True
# to approve, you must have approver rights
approver_group_id = self.env.ref(
'document_page_approval.group_document_approver_user')
if approver_group_id not in user.groups_id:
return False
# and belong to at least one of the approver_groups (if any is set)
if not self.page_id.approver_group_ids:
return True
return len(user.groups_id & self.page_id.approver_group_ids) > 0
@api.multi
def _compute_page_url(self):
"""Compute the page url."""

View File

@ -1,5 +1,7 @@
<?xml version="1.0"?>
<odoo>
<!-- History Form View -->
<record id="wiki_history_form_inherit" model="ir.ui.view">
<field name="name">document.page.history.form</field>
<field name="model">document.page.history</field>
@ -46,6 +48,7 @@
</field>
</record>
<!-- Page Form View -->
<record id="wiki_form_inherit" model="ir.ui.view">
<field name="name">document.page.form</field>
<field name="model">document.page</field>
@ -73,11 +76,11 @@
</div>
</field>
<field name="write_uid" position="after">
<field name="content_uid" position="after">
<field name="approved_uid"/>
</field>
<field name="write_date" position="replace">
<field name="content_date" position="replace">
<field name="approved_date"/>
</field>
@ -94,6 +97,7 @@
</field>
</record>
<!-- Page Menu Form View -->
<record id="view_wiki_menu_form_inherit" model="ir.ui.view">
<field name="name">document.page.form</field>
<field name="model">document.page</field>
@ -108,6 +112,7 @@
</field>
</record>
<!-- Catgory Form View -->
<record id="view_category_form_inherit" model="ir.ui.view">
<field name="name">document.page.category.form</field>
<field name="model">document.page</field>
@ -121,6 +126,7 @@
</field>
</record>
<!-- History Tree view -->
<record id="view_wiki_history_tree_inherit" model="ir.ui.view">
<field name="name">document.page.history.tree</field>
<field name="model">document.page.history</field>
@ -149,6 +155,18 @@
<field name="page_id" position="before">
<field name="state"/>
</field>
<field name="create_uid" position="after">
<filter name="draft" string="Draft" domain="[('state','=','draft')]"/>
<filter name="pending" string="Pending Approval" domain="[('state','=','to approve')]"/>
<filter name="approved" string="Approved" domain="[('state','=','approved')]"/>
<filter name="cancelled" string="Cancelled" domain="[('state','=','cancelled')]"/>
</field>
<filter name="group_author" position="before">
<filter name="group_state" string="State" context="{'group_by':'state'}" />
</filter>
<filter name="group_author" position="after">
<filter name="group_approver" string="Approver" context="{'group_by':'approved_uid'}" />
</filter>
</field>
</record>
@ -162,9 +180,9 @@
</record>
<menuitem id="menu_page_change_requests"
parent="document_page.menu_wiki"
name="Change Requests"
action="action_change_requests"
sequence="25"
groups="document_page.group_document_editor" />
name="Change Requests"
parent="document_page.menu_wiki"
action="action_change_requests"
sequence="25"
groups="document_page.group_document_editor" />
</odoo>