当前位置:首页>python>中篇Python(ODOO)篇 第三章 ODOO项目开发(三)添加基础部分模块 9.车辆保养

中篇Python(ODOO)篇 第三章 ODOO项目开发(三)添加基础部分模块 9.车辆保养

  • 2026-10-11 08:43:30
中篇Python(ODOO)篇 第三章 ODOO项目开发(三)添加基础部分模块 9.车辆保养

原始需求:

车辆编号:

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>

界面展示

列表效果:

表单效果:

日历效果:

最新文章

随机文章