Odoo 9 form view пользовательский метод сохранения

Мы пытаемся реализовать индивидуальное решение типа резервирования в нашей установке 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 экземпляры. Есть ли способ сделать это?


person matthewlehew    schedule 18.07.2016    source источник
comment
вы должны показать свой код и текущую попытку, чтобы мы могли вам помочь   -  person danidee    schedule 18.07.2016
comment
Отличный момент @danidee. Теперь он добавлен, и я должен добавить, поскольку вчера вечером мы решили второй вопрос.   -  person matthewlehew    schedule 18.07.2016
comment
вы пытаетесь изменить количество записей в выпадающем списке поля many2one ‹field name = slot_id /›?   -  person Charif DZ    schedule 19.07.2016


Ответы (1)


используйте поле выбора и установите для свойства store значение False

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

это довольно просто, в случае '1' отображается во внешнем интерфейсе для пользователя, но на заднем конце возвращаемое значение является целым числом 1, и когда вы устанавливаете store в False, вы говорите odoo не сохранять значение в базе данных (его, вероятно, следует использовать только для отображения информации пользователю или формирования какого-либо расчета или логики)

person danidee    schedule 19.07.2016
comment
Мы отвлеклись, и этот проект был приостановлен, но я наконец смог его протестировать. Спасибо за четкий и лаконичный ответ. - person matthewlehew; 21.10.2016