2016-07-18 54 views
0

我們正在嘗試在我們的Odoo 9安裝中實現自定義預留類型的解決方案。該解決方案包括Reservation模型和Session模型。 Reservation的功能之一是作爲Sessions的關聯容器進行操作。 Session型號的Many2one字段將其鏈接到Reservation型號。Odoo 9表單視圖自定義保存方法

在這一點上,我們有定義的模型和一個標準的形式視圖,允許我們創建一個新的預留。但是,我們希望視圖包含一個允許我們選擇伴隨會話數量的下拉小部件,我們希望預留保存功能可以創建適當數量的會話。

有兩個部分我們掙扎在執行本:

  • 我們怎麼能包括實際上不依賴於模型領域的小部件(用數字1-8下拉菜單)?只要下一點提到的命令被執行,該值就會被釋放。

  • 是否有辦法來覆蓋標準的保存功能來執行自定義代碼(創建對應於自定義窗口小部件的價值會話的數量和標準值預先填充它們),還是我們必須創建一個完全自定義操作並隱藏窗體視圖上的默認保存按鈕? 我們已經知道了這一點,就像你在代碼中看到的一樣。

我們不需要任何人來爲我們編寫了這一點,但因爲我們是新來的適當的方法大方向指點我們的平臺將是巨大的。

編輯:

下面是相關的代碼,我們有這麼遠:

models.py

class ResNumber(models.Model): 
    _name = 'restest.res_num' 
    name = fields.Char(string="Number to book", required=True) 
    num = fields.Integer(string="Number", required=True) 

class Reservation(models.Model): 
    _name = 'restest.reservations' 
    name = fields.Char(string="Title", required=True) 
    num_booked = fields.Many2one('restest.res_num', ondelete='set null', string="Number to book") 
    slot_id = fields.Many2one('restest.slots', ondelete='set null', string="Slot ID") 
    session_ids = fields.One2many('restest.sessions', 'reservation_id', string="Session IDs") 
    customer = fields.Many2one('res.partner', ondelete='set null', string="Customer") 

    @api.model 
    def create(self, vals): 
     res_id = super(Reservation, self).create(vals) 
     numValue = res_id.num_booked.num 
     resIdValue = res_id.id 
     start = 1 
     while start <= numValue: 
      self.env['restest.sessions'].create({'name': start, 'reservation_id': resIdValue}) 
      start = start + 1 
     return res_id 

class Session(models.Model): 
    _name = 'restest.sessions' 
    name = fields.Char(string="Title", required=True) 
    reservation_id = fields.Many2one('restest.reservations', ondelete='set null', string ="Reservation ID") 

views.xml

<record model="ir.ui.view" id="reservation_create_view"> 
      <field name="name">reservation.form</field> 
      <field name="model">restest.reservations</field> 
      <field name="arch" type="xml"> 
       <form string="Make a Reservation"> 
        <sheet> 
         <group> 
          <field name="name"/> 
          <field name="slot_id"/> 
          <field name="num_booked"/> 
         </group> 
        </sheet> 
       </form> 
      </field> 
     </record> 

     <record model="ir.actions.act_window" id="make_res_action"> 
      <field name="name">Make a Reservation</field> 
      <field name="res_model">restest.reservations</field> 
      <field name="view_type">form</field> 
      <field name="view_mode">form</field> 
      <field name="view_id" ref="reservation_create_view"/> 
     </record> 

defaultData.xml

<?xml version="1.0" encoding="utf-8"?> 
    <openerp> 
    <record id="first_cat" model="restest.res_num"> 
     <field name="name">1</field> 
     <field name="num">1</field> 
    </record> 
    <record id="second_cat" model="restest.res_num"> 
     <field name="name">2</field> 
     <field name="num">2</field> 
    </record> 
    <record id="third_cat" model="restest.res_num"> 
     <field name="name">3</field> 
     <field name="num">3</field> 
    </record> 
    <record id="fourth_cat" model="restest.res_num"> 
     <field name="name">4</field> 
     <field name="num">4</field> 
    </record> 
</openerp> 

所以這裏的測試實現是非常簡單的。我們創建了ResNumber模型,並預填了1-4個條目。 Reservation模型中的Many2one字段是用戶可以選擇要保留多少個會話的當前方式。我們覆蓋默認的create命令,根據ResNumber字段的值創建會話數量。

但是,我們想要的是完全刪除ResNumber模型。將該數字存儲在表中是不好的數據庫慣例,因爲它可以通過替代查詢來派生。我們想要做的是在Reservation型號的表格視圖中包含一個字段,並選擇編號,然後在創建Session實例後立即丟棄該值。有沒有辦法做到這一點?

+0

你應該顯示你的代碼和當前的嘗試,所以我們可以幫你 – danidee

+0

偉大的觀點@dani DEE。現在已經添加了,我應該在昨天晚上添加我們已經解決了第二個問題。 – matthewlehew

+0

您是否正在嘗試更改many2one字段的下拉框中的記錄數? – Cherif

回答

1

使用選擇場和商店屬性設置爲False

fields.Selection([(1, '1'), 
        (2, '2'), 
        (3, '3'), 
        (4, '4')], string='ResNumber' store=False) 

這是很簡單的,在顯示在前端用戶的'1'的情況,但在後端的價值返回的是整數1,並且當您將store設置爲False時,您告訴odoo不要將該值存儲在db中(它應該可能僅用於向用戶顯示信息或形成某種計算或邏輯)

+0

我們受到了阻撓,這個項目被擱置了,但我終於可以測試出來了。感謝您提供清晰簡潔的答案。 – matthewlehew