2015-12-04 35 views
0

我被要求爲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() 

雖然解決方法的實際工作,我想知道,如果這是太多了。有沒有更簡單的方法來實現標籤搜索?或者,是否有可用於此目的的模塊?

回答

0

我想出了最好的可能解決方案。在Odoo Development Essentials這本書中,解釋了域表達式中的'in'運算符在左邊是「多對多」字段時表現不同。在這種情況下,('A', 'in', B)的語義變爲「如果B是由A引用的記錄的ID之一,則保留ID爲B的記錄」。換句話說,表達式應該是相反的。有了這些知識,您可以分兩步執行標籤搜索:

  1. 查找與當前查詢匹配的標籤。
  2. 在域名錶達式中使用其標識,如('attachment_ids', 'in', id)

使用此策略,您不需要額外的字段只是爲了支持搜索。

(Man ... Odoo development is ... challenge)

0

不知道這個模塊存在的社區,

但最好從odoo實施指南看,你做havw是完全正確的。如果您想要推進css造型和可重複使用的因素,您想要爲標籤使用額外的模型。你會在v9中看到這個東西已經完成了

第二個想法是,如果你認爲這些標籤只是提供信息,那麼你可以創建文本字段並存儲逗號分隔的值,而你的幫助器方法可以很容易地用逗號分割或連接。爲什麼這個想法。因爲這將大大減少數據庫IO的標籤evrytime你讀附件和事實,即ir.attachment鏈接到所有模型記錄,在所有想法消除表將是非常好的性能,因爲Python代碼更快然後數據庫IO。

收藏分享

+0

謝謝您的回答。我等待回覆,因爲我想確保這不會增加討論。正如您所看到的,我發現了一個最佳解決方案,不需要額外的字段來支持搜索。 –