我被要求爲Odoo中的附件開發標籤系統。Odoo - 爲附件實現標籤系統
雖然對於附件我找到了this standard module(稱爲文檔管理系統),但我沒有發現對標籤管理有用的東西。因此,我開發了我自己的自定義模塊,其中附件(由核心ir.attachment
模型表示)已被擴展爲具有與tag
模型的Many2many關係,該模型反過來表示...標籤,並且具有代表實際標籤文本內容的tag
字段。
然後我一直在努力通過標籤搜索...
基於A OP B
表達,其中A
是模特的現場,OP
是操作員(例如=
)和B
(通常)Odoo搜索的看法是搜索的術語(但它可以是任何Python表達式)。
的這裏的問題是,搜索項必須用相關對象的領域(即標籤),不與附件本身的領域進行比較。
所以我想出了一個解決方法。我已經擴展了附件模型:
- 一個計算炭字段稱爲
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()
雖然解決方法的實際工作,我想知道,如果這是太多了。有沒有更簡單的方法來實現標籤搜索?或者,是否有可用於此目的的模塊?
謝謝您的回答。我等待回覆,因爲我想確保這不會增加討論。正如您所看到的,我發現了一個最佳解決方案,不需要額外的字段來支持搜索。 –