Мы пытаемся реализовать индивидуальное решение типа резервирования в нашей установке Odoo 9. Решение включает модель Reservation
и модель Session
. Одна из функций Reservation
- работать как ассоциативный контейнер для Sessions
. Модель Session
имеет поле Many2one
, которое связывает ее с моделью Reservation
.
На данный момент у нас есть определенные модели и стандартный вид формы, который позволяет нам создать новое бронирование. Однако мы хотим, чтобы представление включало раскрывающийся виджет, который позволяет нам выбирать количество сопутствующих сеансов, и мы хотим, чтобы функция сохранения резервирования создавала соответствующее количество сеансов.
При реализации этого мы боремся за две части:
Как мы можем добавить виджет (раскрывающееся меню с номерами 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. Поле Many2one
в модели Reservation
- это текущее средство, с помощью которого пользователь может выбрать, сколько сеансов зарезервировать. Мы переопределили команду создания по умолчанию, чтобы создать количество сеансов на основе значения поля ResNumber
.
Однако мы хотим полностью удалить модель ResNumber
. Хранить это число в таблице не рекомендуется, поскольку его можно получить с помощью альтернативного запроса. Что мы хотим сделать, так это включить поле в представление формы для модели Reservation
с выбором номера, а затем отбросить значение, как только будут созданы Session
экземпляры. Есть ли способ сделать это?