Odoo - 为附件实现标签系统

时间:2015-12-04 10:36:08

标签: python tags openerp attachment

我被要求在Odoo中为附件开发标签系统。

对于我发现this standard module(称为文档管理系统)的附件,我没有找到任何对标记管理有用的内容。

因此,我开发了自己的自定义模块,其中附件(由核心ir.attachment模型表示)已经扩展为具有tag模型的Many2many关系,而后者又代表。 ..标记,并有一个tag字段,表示实际标记的文本内容。

然后我一直在用标签搜索......

Odoo搜索视图基于A OP B表达式,其中A是模型的字段,OP是运算符(例如=)和B(通常)是搜索的术语(但它可以是任何Python表达式)。

这里的问题是搜索的术语必须与相关对象的字段(即标签)进行比较,与附件本身的字段进行比较。< / p>

所以我想出了一个解决方法。我用附件扩展了附件模型:

  • 一个名为tags计算字段字段,其中包含关联的自定义搜索方法_search_tags
  • 一个名为found_by_tag
  • 的布尔字段
每次执行搜索时都会调用

_search_tags,其作用是根据搜索的术语将标记found_by_tag设置为正确的值。

因此,搜索视图的表达式变为[('found_by_tag', '=', True)]

这是Python代码中的相关部分:

# Attachments
class attachment(models.Model):
 _inherit = 'ir.attachment'

 # Tag management
 tag_ids = fields.Many2many('attachmentssample.tag', string = 'Tags')
 tags = fields.Text(compute = '_compute_tags', search = '_search_tags')
 found_by_tag = fields.Boolean()

 @api.one
 @api.depends('tag_ids')
 def _compute_tags(self):
  tags = ''
  for tag in self.tag_ids:
   tags += tag.tag + ','
  self.tags = tags

 def _search_tags(self, operator, value):
  attachments = self.search([])
  for attachment in attachments:
   attachment.checkIfRelevantFor(value)
  return [('found_by_tag', '=', True)]

 def checkIfRelevantFor(self, search_tag):
  relevant = False
  for tag in self.tag_ids:
   if tag.tag == search_tag:
    relevant = True
  if relevant:
   self.found_by_tag = True
  else:
   self.found_by_tag = False

# Tags
class tag(models.Model):
 _name = 'attachmentssample.tag'

 tag = fields.Char()

虽然解决方法确实有效,但我想知道这是否过多。有没有更简单的方法来实现标签搜索?或者,是否有可用于此目的的模块?

2 个答案:

答案 0 :(得分:0)

不确定社区上是否存在此模块,

但是从理想的odoo实施指南来看,你所做的事情是完全正确的。如果您认为要提升css样式和可重用性因素,则需要使用额外的标签模型。您将在v9中看到这些内容已经完成

第二个想法,如果您认为这些标签只是提供信息,那么您可以只创建文本字段并存储逗号分隔的值,并且您的帮助方法可以通过逗号轻松拆分或连接。为什么这个想法。因为这会大大减少db IO标签evrytime你读取附件和ir.attachment链接到所有模型记录的事实,所有想法消除表对性能都很好,因为python代码比db IO快。

Bests

答案 1 :(得分:0)

我提出了最好的可能解决方案。在书Odoo Development Essentials中,解释了当左侧是&#34; to-many&#34;时,域表达式中的'in'运算符的行为会有所不同。领域。在这种情况下,('A', 'in', B)的语义变为&#34;如果B是A&#34;所引用的记录的ID之一,则将记录保留为ID B.换句话说,应该反过来阅读表达式。有了这些知识,您可以按标签分两步执行搜索:

  1. 找到与当前查询匹配的标记。
  2. ('attachment_ids', 'in', id)等域名表达中使用其ID。
  3. 使用此策略,您不需要其他字段来支持搜索。

    (男人...... Odoo的发展是......具有挑战性)