计算字段、关联字段,对象修改时自动变更保存(当 store=True 时),当 store=False 时,默认不支持过滤和分组
7.0中非计算字段、关联字段只读时无法修改保存的问题暂未解决

示例代码: 

class dispatch_work_order(osv.osv):
   
_name="dispatch.work_order"
   
_description="工单"
    _order = "id
asc"
        
   
def _get_bill_month(self, cr, uid, ids, field_name, arg,
context=None):
        res =
{}
        if context is
None:
           
context = {}
        DATETIME_FORMAT =
"%Y-%m-%d"
        for rec in
self.browse(cr, uid, ids,
context=context):
           
billdate = datetime.datetime.strptime(rec.bill_date,
DATETIME_FORMAT)
           
res[rec.id] = billdate.strftime('%Y') + '-' +
billdate.strftime('%m')
       
return res
   
   
def _get_done_month(self, cr, uid, ids, field_name, arg,
context=None):
        res =
{}
        if context is
None:
           
context = {}
        DATETIME_FORMAT =
"%Y-%m-%d"
        for rec in
self.browse(cr, uid, ids,
context=context):
           
if
rec.done_date:
               
donedate = datetime.datetime.strptime(rec.done_date,
DATETIME_FORMAT)
               
res[rec.id] = donedate.strftime('%Y') + '-' +
donedate.strftime('%m')
       
return res

_columns={
       
"name":fields.char("服务单号",size=64, select=True, required=True,
readonly=True),
       
"bill_date":fields.date("开单日期", select=True, required=True,
readonly=True),
       
'bill_month':fields.function(_get_bill_month, method=True, type='char',
size=10, string = u'开单月份', store=True,
invisible=True),
       
"customer":fields.many2one("dispatch.customer","客户", select=True, required=True,
readonly=True, states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"mobile":fields.char("手机",size=64,required=True, readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"phone":fields.char("电话",size=64, readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"area":fields.many2one("dispatch.area","区域",required=True, readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
'workload':fields.related('area', 'workload', string=u'分值',
type='float', readonly=True,
store=True),
       
'travelling_expenses':fields.related('area', 'travelling_expenses',
string=u'交通费', type='float', readonly=True,
store=True),
       
"address":fields.char("客户地址", size=200, readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"buy_date":fields.date("购机日期", readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"brand":fields.many2one("dispatch.brand","品牌型号", readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
    
"description_of_fault":fields.char("故障描述", size=500, readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"note":fields.char("备注", size=500, readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"client_source":fields.many2one("dispatch.client_source","客户来源", readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"warranty_type":fields.many2one("dispatch.warranty_type","保修类型", readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"appointment_date":fields.date("预约日期", readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"appointment_time":fields.selection([("morning","上午"),("afternoon","下午"),("evening","晚上"),],"预约时段",
translate=True,  readonly=True, states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"repair_method":fields.many2one("dispatch.repair_method","维修方式", readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"series_number":fields.char("序列号",size=64, readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"buy_address":fields.many2one("dispatch.buy_address","购机地点", readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"service_card":fields.many2one("dispatch.service_card","服务卡", readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
'service_card_remaining_times':fields.related('service_card', 'remaining_times',
string=u'卡余次数', type='integer', readonly=True,
store=True),
       
"engineer":fields.many2one("hr.employee","工程师",readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
'department':fields.related('engineer', 'department_id', string=u'部门',
type='many2one', relation='hr.department', readonly=True,
store=True),
       
"state":fields.selection([
           
("draft","已接单"),
           
("dealing","已派工"),
           
("done","已完工"),
           
("reply","已交单"),
           
("visit","已回访"),],"状态",
readonly=True),
       
"check_result":fields.char("检测结果", size=500, readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"measure":fields.char("处理措施", size=500, readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"service_time_1":fields.datetime("服务开始时间", readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"service_time_2":fields.datetime("服务结束时间", readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"amount":fields.float("实收费用",digits=(7,2), readonly=True,
states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"state_use_card":fields.selection([
           
("0","不扣卡"),
           
("1","需扣卡"),],"扣卡", readonly=True, states={'draft':[('readonly',False)],
'dealing':[('readonly',False)]}),
       
"visit_time":fields.datetime("回访时间",
readonly=True),
       
"evaluate":fields.selection([
           
("very_satisfied","非常满意"),
           
("satisfied","满意"),
           
("discontent","不满"),
           
("very_discontent","非常不满"),],"客户评价"),
       
"customer_feedback":fields.char("客户反馈",
size=500),
       
"reduce":fields.boolean("已扣卡",
readonly=True),
       
"done_date":fields.date("完工日期",
readonly=True),
       
'done_month':fields.function(_get_done_month, method=True, type='char',
size=10, string = u'完工月份', store=True,
invisible=True),
       
'create_uid': fields.many2one('res.users', u"创建用户", invisible=False,
readonly=True), #需要在记录中读取该字段或者在视图中显示该字段时,对象中必须包含
   
}
   
dispatch_work_order()

class lx_purchase_order(osv.osv):

    def _get_order(self, cr, uid, ids,
context=None):
        result =
{}
        for line in
self.pool.get('lx.purchase.order.line').browse(cr, uid, ids,
context=context):
           
result[line.order_id.id] = True
       
return result.keys()

    def _amount_all(self, cr, uid, ids, field_name,
arg, context=None):
        res =
{}
        for order in self.browse(cr,
uid, ids,
context=context):
           
res[order.id] =
{
               
"amount_total":
0.0,
               
}
            val =
0.0
            for
line in
order.order_line:
               
val+=
line.subtotal
           
res[order.id]['amount_total']=val
       
return res

_name='lx.purchase.order'
   
_description=u"lx采购单"
   
_columns={
       
'name':fields.char(u'单号',size=64,required=True,
readonly=True),
        'create_uid':
fields.many2one('res.users', u"创建用户", invisible=False, readonly=True),
#需要在记录中读取该字段或者在视图中显示该字段时,对象中必须包含
       
'employee_id':fields.many2one('hr.employee',u'员工',required=True, readonly=True,
states={'draft':[('readonly',False)]}),
       
'department_id':fields.many2one('hr.department',u'部门',required=True,select=True,
readonly=True,
states={'draft':[('readonly',False)]}),
       
'date':fields.date(u'日期',select=True, readonly=True,
states={'draft':[('readonly',False)]}),
       
'supplier':fields.char(u'供应商',size=64,required=True, readonly=True,
states={'draft':[('readonly',False)]}),
       
'state': fields.selection([('draft', u'草稿'),('confirmed', u'已确认')], u'状态',
readonly=True),
       
'note':fields.text(u'备注', readonly=True,
states={'draft':[('readonly',False)]}),
       
'order_line':fields.one2many('lx.purchase.order.line','order_id',u'采购单明细',
readonly=True,
states={'draft':[('readonly',False)]}),
       
'amount_total': fields.function(_amount_all, digits=(18, 2),
string=u'合计',
                                       
store={
                                           
'lx.purchase.order.line': (_get_order, None,
10),
                                           
}, multi='sums'),
   
}

lx_purchase_order()

class lx_purchase_order_line(osv.osv):

    def _amount_line(self, cr, uid, ids, prop, arg,
context=None):
       
res={}
        for line in
self.browse(cr,uid,ids,context=context):
           
a=self.read(cr,uid,line.id,["price","product_qty"])
           
res[line.id]=a["price"]*a["product_qty"]
       
return res

_name='lx.purchase.order.line'
   
_description=u"lx采购单明细"
   
_columns={
       
'order_id':fields.many2one('lx.purchase.order',u'采购单ID',select=True,
ondelete='cascade'),
       
'product':fields.char(u'产品',size=128,required=True),
       
'price':fields.float(u'价格', digits_compute =
dp.get_precision('lx_purchase_price'),
required=True),
       
'product_qty':fields.integer(u'数量',required=True),
       
'unit':
fields.char(u'计量单位',size=6),
       
'subtotal':fields.function(_amount_line, string=u'小计', digits=(18,
2)),
    }
lx_purchase_order_line()

openerp学习笔记 计算字段、关联字段(7.0中非计算字段、关联字段只读时无法修改保存的问题暂未解决)的更多相关文章

  1. openerp学习笔记 视图样式(表格行颜色、按钮,字段只读、隐藏,按钮状态、类型、图标、权限,group边距,聚合[合计、平均],样式)

    表格行颜色:             <tree string="请假单列表" colors="red:state == 'refuse';blue:state = ...

  2. openerp学习笔记 统计、分析、报表(过滤条件向导、分组报表、图形分析、比率计算、追加视图排序)

    待解决:图形中当改变分组时,图例不正确            存储比率计算时,分组合计不正确 wizard:过滤条件向导,用于输入过滤条件 wizard/sale_chart.py # -*- cod ...

  3. Javascript高级编程学习笔记(75)—— 表单(3)表单字段

    表单字段 表单作为web应用中不可或缺的一部分,当然也是可以使用原生的 DOM 元素来访问的 除了标准的访问方式之外,每个表单都拥有一个 elements 属性,该属性保存着该表单所有 表单元素 的集 ...

  4. openerp学习笔记 跟踪状态,记录日志,发送消息

    跟踪状态基础数据: kl_qingjd/kl_qingjd_data.xml <?xml version="1.0"?><openerp>    <d ...

  5. openerp学习笔记 对象间关系【多对一(一对一)、一对多(主细结构)、多对多关系、自关联关系(树状结构)】

    1.多对一(一对一)关系:采购单与供应商之间的关系 'partner_id':fields.many2one('res.partner', 'Supplier', required=True, sta ...

  6. openerp学习笔记 对象继承,对象初始化数据

    1.对象继承     _inherit = "product.product" 继承产品对象,给产品对象添加字段或方法,不需要设置 _name._table 等属性     注意: ...

  7. OpenCV学习笔记(一)——OpenCV3.1.0+VS2015开发环境配置

    摘要: 由于最近AR(增强现实)这个概念非常火爆,各种基于AR的应用及游戏逐渐面向大众,而在AR中最重要的两个技术就是跟踪识别和增强渲染,其中跟踪识别是通过OpenCV这个开源的计算机视觉库来实现的, ...

  8. openerp学习笔记 计算字段支持搜索

    示例1: # -*- encoding: utf-8 -*-import poolerimport loggingimport netsvcimport toolslogger = netsvc.Lo ...

  9. openerp学习笔记 视图中字段只变化(on_change)联动其他字段值、选择和过滤

    1.修改产品数量时,自动计算产品销售金额.销售成本和销售利润<field name="num" on_change="on_change_product(produ ...

随机推荐

  1. Photoshop笔记一

    Photoshop界面认识 Photoshop界面认识 区域划分 工作 (快捷键) 功能键 常用键: 新建图层 剪切并原位粘贴 建立图层组合 合并图层 课程练习讲解 区域划分

  2. 《Cortex-M0权威指南》之Cortex-M0编程入门

    转载请注明来源:cuixiaolei的技术博客 嵌入式系统编程入门 微控制器是如何启动的 为了保存编译号的二进制程序代码,大多数的现代微控制器都会包含片上flash存储器.有些微控制器还可能有一个独立 ...

  3. Oracle基础<1>--数据库设计

    一:为什么需要使用数据库设计 数据库设计可以使数据库通过健壮的数据库结构  高效并且健康  的进行工作. 二.数据库设计原则 (数据库设计.系统设计.架构设计) 1.熟悉需求 保证之后需求的变更 不会 ...

  4. 非常棒的 「Sublime Text 配色/主题」与「编程字体」

    *标有 CT 的是配色 **主题中调用的字体和相配套的Sublime主程序图标可访问GitHub获取 Afterglow https://github.com/YabataDesign/aftergl ...

  5. asp.net MVC EF Where 过滤条件怎么写

    做.Net开发的肯定都知道.Net Sql语句有个SqlParameter 一般用来做过滤判断逻辑写,那么到了EF 了还有这样的写法嘛?答案肯定是有的了,这里我只是把最粗糙和简单的写法罗列一些,具体封 ...

  6. MSI安装程序在Win8/Win10及以上系统中DLL安装问题

    报的错误是: There is a problem with this Windows Installer package. A DLL required for this install to co ...

  7. subilme增加对markdown的高亮支持

    sublime2对markdown原生主题支持都没有, 需要通过插件补充 1.插件安装 通过Package Control安装下列插件: Markdown Extended Monokai Exten ...

  8. VHDL操作运算符的优先级顺序

           

  9. 【SNMP】SNMP概述

    SNMP概述 SNMP(Simple Network Management Protocol,简单网络管理协议)是目前UDP/IP网络中应用最为广泛的网络管理协议,它提供了一个管理框架来监控和维护互联 ...

  10. 使用Eclipse maven构建springmvc项目

    Eclipse maven构建springmvc项目 Listener 监听器 架构 使用Log4J监控系统日志邮件警报 2014-12-16 13:09:16 控制器在完成逻辑处理后,通常会产生一些 ...