原始需求:
车辆编号: | 001 | 牌照: | 沪A7868 |
维护保养日期: | 2019/6/1 | 类型: | 保养 | 费用(元): | 800 |
保养时公里数: | 32323 | 备注: | |
新增数据模型
models目录新建car_maintenance.py数据模型文件,代码如下:
from odoo import fields, modelsclass NebulaCarMaintenance(models.Model): # 车辆保养 _name = "nebula.car.maintenance" _description = "车辆保养" _order = 'name' active = fields.Boolean('是否归档', size=2, default=True) date_docket = fields.Datetime('单据日期', required=True, readonly=True, index=True, default=fields.Datetime.now) name = fields.Char('保养简情', size=30) car_name = fields.Many2one('nebula.car', string='车辆编号', index=True, size=8, copy=False) user_id = fields.Many2one('res.users', string='创建人', index=True, readonly=True, default=lambda self: self.env.user) license_plate = fields.Char('车辆牌照', related='car_name.license_plate', store=True) Maintenance_type = fields.Selection([('Minor', '小保'), ('Major', '大保'), ('Other', '其它'), ], default='Minor', string='保养类型') order_date_begin = fields.Datetime('预约开始时间') order_date_end = fields.Datetime('预约结束时间') actual_date_begin = fields.Datetime('实际开始时间') actual_date_end = fields.Datetime('实际结束时间') cost = fields.Float('费用') maintain = fields.Integer(string='保养时公里数', size=8) note = fields.Text('备注')
将该文件名添加到models目录下__init__.py文件中,之前已经有演示。
相关说明:
date_docket:记录单据创建日期,自动获取当前时间。
user_id:记录单据创建人信息,自动获取当前用户。
car_name:选择或新建车辆。
license_plate:在car_name选择后,自动匹配该车辆编号的牌照号。
store属性为True的时候会同时保存该字段到车辆保养表中。
设置访问权限
在security目录下的ir.model.access.csv新增一行权限记录。
access_nebula_car_maintenance,nebula.car.maintenance,model_nebula_car_maintenance,group_peijia_manager,1,1,1,1
创建视图层
在views目录新增car_maintenance_views.xml文件,先用默认方式展示即可,待模块加载成功后再逐步修改和完善文件,内容如下:
<?xml version="1.0" encoding="utf-8"?><odoo> <act_windowid="peijia.action_car_maintenance_views"name="车辆保养" res_model="nebula.car.maintenance" view_mode="tree,form" /></odoo>
修改peijia目录下__manifest__.py文件中data段,在views/car_type_views.xml前新增views/car_maintenance_views.xml文件名。
在views目录下car_views.xml文件,新增一个二级菜单车辆,</odoo>前添加菜单指向车辆保养子模块,并且把车辆管理菜单挪到车辆位置,代码:
<menuitem id="menu_peijia_car_data" name="车辆" sequence="30" parent="menu_peijia_root"/><menuitem id="menu_car_maintenance_views" name ="车辆保养" parent="menu_peijia_car_data" sequence="110" action="peijia.action_car_maintenance_views"/>
截图:
这里注意,笔者车辆管理菜单移了位置。
重启后,更新陪驾模块,查看是否已经有相关菜单和界面。继续修改视图层。
完善视图层
将car_maintenance_views文件中act_window段删除,修改如下:
<?xml version="1.0" encoding="utf-8"?><odoo> <data> <recordmodel="ir.ui.view"id="peijia.form_car_maintenance_views"> <fieldname="name">peijia.car.maintenance.form</field> <fieldname="model">nebula.car.maintenance</field> <fieldname="arch"type="xml"> <formstring="表单"> <sheet> <divclass="oe_button_box"name="button_box"/> <groupname="group_top"> <groupname="group_left"> <fieldname="active"/> <fieldname="name"/> <fieldname="car_name"/> <fieldname="license_plate"/> </group> <groupname="group_right"> <fieldname="Maintenance_type"/> <fieldname="order_date_begin"/> <fieldname="order_date_end"/> <fieldname="actual_date_begin"/> <fieldname="actual_date_end"/> <fieldname="cost"/> <fieldname="maintain"/> </group> <fieldname="note"/> <fieldname="date_docket"/> <fieldname="user_id"/> </group> </sheet> </form> </field> </record> <recordmodel="ir.ui.view"id="peijia.search_car_maintenance_views"> <fieldname="name">peijia.car.maintenance.search</field> <fieldname="model">nebula.car.maintenance</field> <fieldname="arch"type="xml"> <search> <fieldname="car_name"/> <fieldname="license_plate"/> <fieldname="Maintenance_type"/> </search> </field> </record> <recordmodel="ir.ui.view"id="peijia.tree_car_maintenance_views"> <fieldname="name">peijia.car.maintenance.tree</field> <fieldname="model">nebula.car.maintenance</field> <fieldname="priority">1</field> <fieldname="arch"type="xml"> <treestring="列表"> <fieldname="active"/> <fieldname="name"/> <fieldname="car_name"/> <fieldname="license_plate"/> <fieldname="Maintenance_type"/> <fieldname="order_date_begin"/> <fieldname="order_date_end"/> <fieldname="actual_date_begin"/> <fieldname="actual_date_end"/> </tree> </field> </record> <recordmodel="ir.actions.act_window"id="peijia.action_car_maintenance_views"> <fieldname="name">车辆保养</field> <fieldname="res_model">nebula.car.maintenance</field> <fieldname="view_mode">tree,form</field> </record> </data></odoo>
日历视图层
一些数据,我们通过日历视图来看会非常直观,而且可以通过日历视图进行拖拽重新安排时间,使用起来非常方便。
基本日历属性如下:
ldate_start:开始的日期(必填)
ldate_end:结束的日期(选填)
lcolor:用于为一组日历条目着色的字段
lmode:日历的默认显示模式
我们以车辆保养为例,逐步说明。
1、重新设置相关时间字段
from datetime import timedeltafrom odoo import fields, models, api
order_date_begin = fields.Datetime('预约开始时间', required=True)duration = fields.Integer('占用时间', default=12)order_date_end = fields.Datetime('预约结束时间', store=True, compute='_get_end_date', inverse='_set_end_date')省略部分代码
2、设置时间联动参数
@api.depends('order_date_begin', 'duration')def _get_end_date(self): for r in self: if not (r.order_date_begin and r.duration): r.order_date_end = r.order_date_begin continue duration = timedelta(days=r.duration, seconds=-1) r.order_date_end = r.order_date_begin + durationdef _set_end_date(self): for r in self: if not (r.order_date_begin and r.order_date_end): continue r.duration = (r.order_date_end - r.order_date_begin).days + 1
3、在视图适当位置插入日历视图
<recordmodel="ir.ui.view"id="peijia.calendar_car_maintenance_views"> <fieldname="name">peijia.car.maintenance.calendar</field> <fieldname="model">nebula.car.maintenance</field> <fieldname="arch"type="xml"> <calendarstring="车辆预约保养" date_start="order_date_begin" date_stop="order_date_end" color="user_id"> <fieldname="Maintenance_type"/> <fieldname="car_name"/> <fieldname="license_plate"/> </calendar> </field></record><recordmodel="ir.actions.act_window"id="peijia.action_car_maintenance_views"> <fieldname="name">车辆保养</field> <fieldname="res_model">nebula.car.maintenance</field> <fieldname="view_mode">tree,form,calendar</field></record>
界面展示
列表效果:
表单效果:
日历效果: