上班时间: | 7:00:00 | 每节课小时数: | 3 |
下班时间: | 23:00:00 | 教练员每课时工资: | 50 |
| 每小时收费(自): | 80 |
每小时收费(手): | 100 |
每小时收费(自驾): | 60 |
新增数据模型
models目录新建system_info.py数据模型文件,代码如下:# -*- coding: utf-8 -*-from odoo import fields, models, apiclass SystemInfo(models.Model): _name = "nebula.system.info" _description = "公司费用" _order = 'name' active = fields.Boolean('是否启用', default=True) name = fields.Char('费用名称', size=30, index=True) start_time = fields.Float('上班时间', default=0.0, digits=(4, 2)) end_time = fields.Float('下班时间', default=0.0, digits=(4, 2)) hours_hour = fields.Integer('每节课小时数', default=3) wager_hour = fields.Integer('每小时工资', default=50) note = fields.Text('备注') order_line = fields.One2many('nebula.charge.line', 'order_id', string='每小时费用', auto_join=True) _sql_constraints = [('check_uniq_name', 'unique(name)', '不允许费用名称同名')]class ChargeLine(models.Model): _name = 'nebula.charge.line' _description = '费用明细' @api.model def _select_auto_type(self): records = self.env['nebula.auto.type'].search([]) return [(r.name, r.name_type) for r in records] name = fields.Selection(selection='_select_auto_type', required=True, string='排档类') charge_hour = fields.Integer('每小时收费', default=70) order_id = fields.Many2one('nebula.system.info', string='费用明细行', required=True, ondelete='cascade', index=True, copy=False)
ondelete='cascade':主表删除,明细表也删除。auto_join=True:允许ORM在数据查询是使用SQL的join(拼接,级联)功能。如果使用它,那么访问权限规则将被忽略,并且权限规则不允许访问的关联记录,用户也可以访问,因此这种情况下的SQL查询将会更快更高效。order_line = fields.One2many('nebula.charge.line', 'order_id', string='每小时费用', auto_join=True)order_id = fields.Many2one('nebula.system.info', string='费用明细行', required=True, ondelete='cascade', index=True, copy=True) order_line和order_id成对出现。主表字段必须有order_line字段,One2Many表示一对多,多表是 nebula.charge.line。明细表必须有order_id字段。Many2one表示多对一,对应唯一表是nebula.system.info。将该文件名添加到models目录下__init__.py文件中,之前已经有演示。设置访问权限
在security目录下的ir.model.access.csv新增两行权限记录。access_nebula_system_info,nebula.system.info,model_nebula_system_info,group_peijia_manager,1,1,1,1access_nebula_charge_line,nebula.charge.line,model_nebula_charge_line,group_peijia_manager,1,1,1,1
创建视图层
在views目录新增system_info_views.xml文件,先用默认方式展示即可,待模块加载成功后再逐步修改和完善文件,内容如下:<?xml version="1.0" encoding="utf-8"?><odoo> <act_windowid="peijia.action_system_info_views"name="公司费用信息" res_model="nebula.system.info" view_mode="tree,form" /></odoo>
修改peijia目录下__manifest__.py文件中data段,在views/car_type_views.xml前新增views/system_info_views.xml文件名。在views目录下car_views.xml文件,前高级资料下的三级菜单位置添加菜单指向公司费用子模块,代码:< menuitemid="menu_system_info_views"name="公司费用信息" parent="menu_peijia_adv_data"sequence="120" action="peijia.action_system_info_views"/>
重启后,更新陪驾模块,查看是否已经有相关菜单和界面。这个子模块有主从表,所以需要大量改动,让我们继续修改视图层。几个概念讲解
主从表:简单解释,一个学校有很多班级,每个班级有很多学生。班级表(主表):班级号是主键,有班级号、班级名称、班级信息等。学员表(主表):学员学号是主键,有学员学号、姓名、年龄、性别等信息。排名表(从表):学生学号+班级号是主键,每个学生在每个班有班级排名。学生学号和班级号在排名表中被称为外键。主键:是由一个或一组字段组成,这些字段的值对每条记录来说必须是唯一的。每张表必须由一个主键,并且主键值不能为空。外键:如果表中的一个字段是另一个表的主键字段,那么这个字段在本表中被称为外键。完善视图层
将system_info_views.xml文件中act_window段删除,修改如下:<?xml version="1.0" encoding="utf-8"?><odoo> <data> <recordmodel="ir.ui.view"id="peijia.form_system_info_views"> <fieldname="name">peijia.system.info.form</field> <fieldname="model">nebula.system.info</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="start_time"widget="float_time"/> <fieldname="end_time"widget="float_time"/> </group> <groupname="group_right"> <fieldname="hours_hour"/> <fieldname="wager_hour"/> <fieldname="note"/> </group> </group> <notebookcolspan="4"> <pagestring="费用明细"name="order_lines"autofocus="autofocus"> <formstring="费用明细"> <sheet> <fieldname="order_line"colspan="4"nolabel="1"/> </sheet> </form> </page> </notebook> </sheet> </form> </field> </record> <recordmodel="ir.ui.view"id="peijia.tree_system_info_views"> <fieldname="name">peijia.system.info.tree</field> <fieldname="model">nebula.system.info</field> <fieldname="priority">1</field> <fieldname="arch"type="xml"> <treestring="列表"> <fieldname="active"/> <fieldname="name"/> <fieldname="note"/> </tree> </field> </record> <recordmodel="ir.actions.act_window"id="peijia.action_system_info_views"> <fieldname="name">公司费用</field> <fieldname="res_model">nebula.system.info</field> <fieldname="view_mode">tree,form</field> </record> </data></odoo>
另外为子表在views目录下新建视图文件system_info_lines_views.xml,并将该文件名添加到__manifest__.py的data段里面。代码如下:
<?xml version="1.0" encoding="utf-8"?><odoo> <data> <recordmodel="ir.ui.view"id="peijia.form_charge_line_views"> <fieldname="name">peijia.charge.lines.form</field> <fieldname="model">nebula.charge.line</field> <fieldname="arch"type="xml"> <formstring="表单"> <sheet> <divclass="oe_button_box"name="button_box"/> <group> <fieldname="name"/> <fieldname="charge_hour"/> </group> </sheet> </form> </field> </record> <recordmodel="ir.ui.view"id="peijia.tree_charge_line_views"> <fieldname="name">peijia.charge.lines.tree</field> <fieldname="model">nebula.charge.line</field> <fieldname="priority">1</field> <fieldname="arch"type="xml"> <treestring="列表"> <fieldname="name"/> <fieldname="charge_hour"/> </tree> </field> </record> <recordmodel="ir.actions.act_window"id="peijia.action_charge_line_views"> <fieldname="name">公司费用</field> <fieldname="res_model">nebula.charge.line</field> <fieldname="view_mode">tree,form</field> </record> </data></odoo>
__manifest__.py文件data段截图如下:界面展示