odoo

Packer.Odoo.10---Chapter 7

2017-10-13  本文已影响153人  F4A3

ORM应用逻辑-业务处理

创建一个向导

任务向导表单
{
    'name': 'To-do Tasks Management Assistant',
    'description': 'Mass edit your To-Do backlog.',
    'author': 'Xer',
    'depends': ['todo_user'],
    'data': ['views/todo_wizard_view.xml'],
}

别忘记创建todo_wizard/__init__.py.进行导包操作

from . import models

向导模型

class TodoWizard(models.TransientModel):
    _name = 'todo.wizard'
    _description = 'To-do Mass Assignment'
    task_ids = fields.Many2many('todo.task', string='Tasks')
    new_deadline = fields.Date('Deadline to Set')
    new_user_id = fields.Many2one('res.users', string='Responsible to Set')

注:别忘记添加__init__.py.加入代码from . import todo_wizard_model

向导表单

<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
    <record id="To-do Task Wizard" model="ir.ui.view">
        <field name="name">To-do Task Wizard</field>
        <field name="model">todo.wizard</field>
        <field name="arch" type="xml">
            <form>
                <div class="oe_right">
                    <button type="object" name="do_count_tasks"
                            string="Count" />
                    <button type="object" name="do_populate_tasks"
                            string="Get All"/>
                </div>
                <field name="task_ids">
                    <tree>
                        <field name="name"/>
                        <field name="user_id"/>
                        <field name="date_deadline"/>
                    </tree>
                </field>
                <gropu>
                    <group><field name="new_user_id"/></group>
                    <group><field name="new_deadline"/></group>
                </gropu>
                <footer>
                    <button type="object" name="do_mass_update"
                            string="Mass Update" class="oe_highlight"
                            attrs="{'invisible':[('new_deadline','=',False),
                            ('new_user_id','=',False)]}"/>
                    <button special="cancel" string="Cancel"/>
                </footer>
            </form>
        </field>
    </record>
    <!--more button action-->
    <act_window id="todo_app.action_todo_wizard"
                name="To-Do Tasks Wizard"
                src_model="todo.task" res_model="todo.wizard"
                view_mode="form" target="new" multi="True"/>
</odoo>

<act_window>这个动作把打开向导视图添加到todo.task表单视图中的More 按钮中.设置target="new"能够打开一个新的窗口.
另外在确定按钮Mass Update 设置了额外的属性,只有选择了新的截止日期或者新的任务负责人才会显示这个按钮。

向导的业务逻辑

    @api.multi
    def do_mass_update(self):
        self.ensure_one()
        if not (self.new_deadline or self.new_user_id):
            raise exceptions.ValidationError('No data to update!')
        _logger.debug('Mass update on Todo Tasks %s', self.task_ids.ids)
        vals = {}
        if self.new_deadline:
            vals['date_deadline'] = self.new_deadline
        if self.new_user_id:
            vals['user_id'] = self.new_user_id
        if vals:
            self.task_ids.write(vals)
        return True

我们的代码只需要对向导的一个实例进行处理,使用
self.ensure_one() 来保证是单例.
处理逻辑:

日志

import logging
_logger = logging.getLogger(__name__)

_logger.debug('A DEBUG message')
_logger.info('An INFO message')
_logger.warning('A WARNING message')
_logger.error('An ERROR message')

异常处理

from odoo import exceptions
raise exceptions.Warning('Warning message')
raise exceptions.ValidationError('Not valid message')

Odoo中,我们可以使用抛出警告类来实现用户界面的弹出窗口。编辑Count按钮的逻辑

    @api.multi
    def do_count_tasks(self):
        Task = self.env['todo.task']
        count = Task.search_count([('is_done', '=', False)])
        raise exceptions.Warning(
            'There are %d active tasks.' %count
        )

向导视图中的帮助动作

    @api.multi
    def _reopen_form(self):
        self.ensure_one()
        return {
            'type': 'ir.actions.act_window',
            'res_model': self._name,
            'res_id': self.id,
            'view_type': 'form',
            'view_mode': 'form',
            'target': 'new'
        }
    @api.multi
    def do_populate_tasks(self):
        self.ensure_one()
        Task = self.env['todo.task']
        open_tasks = Task.search([('is_done', '=', False)])
        self.task_ids = open_tasks
        return self._reopen_form()

使用ORM API

装饰器

return {
          'warning' : {
          'title' : 'Warning!',
           'message' : 'You have benn warned'}
}

重写ORM的默认方法

    @api.model
    def create(self, vals):
        # Code before create: can use the `vals` dict
        new_record = super(TodoTask, self).create(vals)
        # Code after create: can use the `new_record` created
        return new_record
    @api.model
    def write(self, vals):
        # Code before write: can use the `self` dict, with the old vals
        super(TodoTask, self).create(vals)
        # Code after write: can use `self`, with the updated vals
        return True

RPC,网页前端相关的方法。

Shell 命令

shell界面

服务器环境

刚才的shell界面提供的self 关联了res.users这个用户模型.我们知道,在Odoo中self一般代表了一个记录集。而记录集通常携带着当前的上下文环境信息。可以通过self.env来获取当前的上下文环境.

self的env环境信息 通过env获取模型记录集

改变环境的执行状态

ref获取记录

事务及底层SQL

fetchall使用

使用记录集

下面我们来扩展ORM的常用方法的实现。首先使用shell 命令来交互式的进行记录集(recordsets)的讲解。

查询模型

search跟browse方法

单例

单例记录集直接获取name字段
记录集有个 ensure_one() 方法可以来确认当前记录集是否为单例,如果记录集里有多条记录,这个方法就会抛出异常

记录的写入操作。

修改记录字段值 create方法 unlink方法
-write() : 更新记录的字段 write方法 copy方法

使用时间跟日期

日期格式

记录集操作

例子 image.png

操纵数据集

使用关系型字段

直接获取关联模型 空记录集返回False
上一篇下一篇

猜你喜欢

热点阅读