Category: Python

Odoo 引入CSS及JavaScript

在module/view下创建一个新的XML

<?xml version="1.0" encoding="utf-8"?>
<odoo>
        <template id="assets_backend" name="web_kanban assets" inherit_id="web.assets_backend">
            <xpath expr="//script[last()]" position="inside">
                <link rel="stylesheet" href="/web_kanban/static/src/less/kanban_dashboard.less"/>
                <link rel="stylesheet" href="/web_kanban/static/src/less/kanban_view.less"/>

                <script type="text/javascript" src="/web_kanban/static/src/js/kanban_record.js"></script>
                <script type="text/javascript" src="/web_kanban/static/src/js/kanban_relational.js"></script>
                <script type="text/javascript" src="/web_kanban/static/src/js/kanban_quick_create.js"></script>
                <script type="text/javascript" src="/web_kanban/static/src/js/kanban_column.js"></script>
                <script type="text/javascript" src="/web_kanban/static/src/js/kanban_view.js"></script>
                <script type="text/javascript" src="/web_kanban/static/src/js/kanban_widgets.js"></script>
                <script type="text/javascript" src="/web_kanban/static/src/js/compatibility.js"></script>
            </xpath>
        </template>
</odoo>

引入XML至__manifest__.py文件

{
    'data':['views/resources.xml']
}

Odoo 常用技巧

View

隐藏Field

<field name="currency_id" invisible="True"/>
<field name="currency_id" invisible="1"/>

在某种条件下隐藏

<field name="expense_description" attrs="{'invisible':[('expense_audit','!=','1')]}" />

隐藏label

<field name="description" widget="html" nolabel="True"/>
<field name="description" widget="html" nolabel="1"/>

只读 readonly

<field name="budget_id" readonly="True"/>

条件 domain

<field name="product_id" domain="[('pro_type','=','rests')]"/>

设定值 eval

<field name="fill_date" eval="datetime.now()" readonly="True"/>

表单传值 context (default_ 开始代表直接赋值过去)

<button class="oe_stat_button" name="%(budget_review_action)d" type="action" icon="fa-calendar-check-o" attrs="{'invisible':[('state','!=','check')]}" context="{'default_budget_id': id, 'default_contract_area': square, 'default_contract_price': total_price, 'default_start_date': start_date, 'default_end_date': end_date}" string="创建审核单"/>a

Widget

many2one widget (default)

  •  no_quick_create - remove the Create and edit... option.
  •  no_create_edit - remove the Create "search_value" option.
  •  no_create - no_quick_create and no_create_edit combined.
  •  no_open - in read mode: do not render as a link.
<field name="field_name" options="{'no_quick_create': True, 'no_create_edit' : True}"/>

many2many widget (default)

  • no_create - remove the Create button.
<field name="field_name" options="{'no_create': True}"/>

many2many_tags widget

  • no_quick_create - remove the Create and edit... option.
  • no_create_edit - remove the Create "search_value" option.
  • no_create - no_quick_create and no_create_edit together.
<field name="field_name" widget="many2many_tags" options="{'no_create_edit': True}"/>

one2many tree

  • create - remove the Create button.
  • edit - remove the Edit button.
  • delete - remove the Delete button.
<field name="basic_incidentals" mode="tree" nolabel="1">
   <tree create="false" edit="false" delete="false">
      <field name="name"/>
      <field name="model"/>
      <field name="specifications"/>
      <field name="price" invisible="True"/>
      <field name="number" invisible="True"/>
      <field name="unit" invisible="True"/>
      <field name="total_price" invisible="True"/>
      <field name="remarks" invisible="True"/>
   </tree>
</field>

Fields

生成一个动态的Selection,比如当前时间的前后5年!

import datetime
year = fields.Selection(string=u'年度', selection=[(num, str(num)) for num in range((datetime.datetime.now().year - 5), (datetime.datetime.now().year + 5))])

Odoo Environment(env)

Environment

environment是Odoo中操作DB的总句柄,可以通过下面几种方式获得:

对于继承了Model的类来说可以通过如下方式

self.env['modelname']

在请求Controller可以通过

request.env()

通过模型类或者模型对象获取

cls.env
product.env

一些常用上下文参数

# 当前用户
self.env.user
# 当前用户id
self.env.uid
#当前语言代码
self.env.lang
#当前数据库连接
self.env.cr

使用例子

# 利用 env[model] 获取模型类对象
self.env['ir.model'].search([('state', '!=', 'manual')])
# 利用 env.cr 执行sql语句
self.env.cr.execute(query, (value,))

Odoo 使用 ir.sequence 生成序列号

在Odoo里面,默认提供了ir.sequence这样一个模块,他的作用就是一个序号生成器。在这次的项目中刚好用到了,这里就记录一下。

创建序号

打开 data/data.xml 写入如下代码:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
   <data noupdate="True">
      <record id="contract_number" model="ir.sequence">
         <field name="name">预算编号</field>
         <field name="code">budget.number</field>
         <field name="prefix">HT%(year)s%(month)s%(day)s</field>
         <field name="suffix">号</field>
         <field name="padding">1</field>
      </record>
   </data>
</odoo>

参数说明:

  • name - 名字,随便叫什么都行
  • code - 调用生成编码的 Key,需保证唯一性
  • prefix - 前缀,可以是固定的字面量也可以是组合参数
  • padding - 序列递增的位数

调用

data/data.xml加入到__manifest__.py的data列表中。

budget_num = fields.Char(string=u'预算编号', copy=False, readonly=True, default=lambda x: _('New'))

@api.model
def create(self, vals):
	""" 保存方法重写 """
	if not vals.get('name', False) or vals['name'] == _('New'):
		vals['budget_num'] = self.env['ir.sequence'].next_by_code('budget.number')
	return super(Budget, self).create(vals)

Odoo 赋值 One2Many

many2many

  • (0,0,{values})  根据values里面的信息新建一个记录。
  • (1,ID,{values})  更新id=ID的记录(写入values里面的数据)
  • (2,ID)  删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)
  • (3,ID)  切断主从数据的链接关系但是不删除这个数据
  • (4,ID)  为id=ID的数据添加主从链接关系。
  • (5)  删除所有的从数据的链接关系就是向所有的从数据调用(3,ID)
  • (6,0,[IDs])  用IDs里面的记录替换原来的记录(就是先执行(5)再执行循环IDs执行(4,ID))

例子[(6, 0, [8, 5, 6, 4])] 设置 many2many to ids [8, 5, 6, 4]

one2many

  • (0, 0,{ values })  根据values里面的信息新建一个记录。
  • (1,ID,{values})  更新id=ID的记录(对id=ID的执行write 写入values里面的数据)
  • (2,ID)  删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)
new_lines = self.env['test.person']
data = {
    'name' = 'joy',
    'age' = 10
}
new_line = new_lines.new(data)
new_lines += new_line
self.one2many_name += new_lines