docker中odoo自建bug-manage模块学习笔记

案例来自《odoo快速入门与实战》第六章,本文章仅记录学习过程

一、使用脚手架创建新模块

1.进入odoo交互命令模式

docker exec -ti -u root odoo /bin/bash

2.执行创建项目命令

odoo scaffold bug-manage /mnt/extra-addons

3.远程通过PyCharm打开项目

可以看到项目模块基本结构
在这里插入图片描述

4.修改_manifest_.py文件

在这里插入图片描述
按照需求修改相应参数,其他参数不变,使用默认值即可

二、安装和更新模块

1.安装

安装新模块在前端完成,登录odoo系统
(1)进入开发者模式:设置——》激活开发者模式
(2)点击更新应用列表后点击更新
(3)搜索“bug”,点击安装(坑:要叉掉“应用”,因为这里是内置应用,直接搜索自己创建的是搜索不到的,下面会更改这个配置)
在这里插入图片描述
后续对模块进行修改,只需要先更新应用列表,再升级即可。

2.更新

通过一个为bug管理系统添加图标这个小例子查看升级的功能
1.在bug-manage项目下面创建路径/static/description,将图标放在改路径下(http://fontawesome.dashgame.com或者https://www.iconfont.cn/中找)
2.重启odoo,并刷新模块,即可看到图标
在这里插入图片描述

三、模型

1.基本概念

模型用于描述业务对象,如:订单、凭证等,通过继承odoo模板的python类进行增强扩展实现。创建了模型后,odoo会通过ORM引擎在数据库自动建表。

2.创建模型

我们的模型

功能:维护bug列表,每个bug均包括描述信息和是否完成的标注,后续慢慢添加一些bug关闭等功能

基本操作
1.bug模型

在models文件夹中创建bug.py文件,代码如下:

# -*- coding: utf-8 -*-

from odoo import models, fields, api


class bug(models.Model):
    # 类的唯一标志字段,其他类可以通过此字段引用本类
    _name = 'bm.bug'
    # 类似于标签
    _description = 'bug'

    # 该字段是特殊字段,name作为标题,required=True表示为必输字段
    name = fields.Char('bug简述', required=True)
    # 文本字段,size定义其长度为150
    detail = fields.Text(size=150)
    # 布尔字段,定义bug是否关闭
    is_closed = fields.Boolean('是否关闭')
    # 关闭理由,Selection可完成列表效果,第一个参数为列表内元素,第二个string属性用于定义字段标签
    close_reason = fields.Selection([('changed', '已修改'), ('cannot', '无法修改'), ('delay', '推迟')], string='关闭理由')
    # 允许选择用户作为bug负责人,多对一关系
    user_id = fields.Many2one('res.users', string='负责人')
    # 允许选择多个关注者,多对多关系
    follower_id = fields.Many2many('res.partner', string='关注者')

常用属性:

  • string:前端界面看到的字段名称
  • required:是否必须
  • help:前端作为提示信息
  • index:布尔类型,默认为False,是否创建索引
    一些保留字段:
    id、create_date、create_uid、write_date、write_uid、_last_update
    注意:name是模型里的特殊字段,在默认情况下该字段值可用在搜索和引用时代表一行记录(不太清楚明白)
2.模型继承(follower.py)
继承的基本概念:
  • 传统继承
  • 委派
    在这里插入图片描述
    选择第一种方式来继承使用res.partner类,仍在models文件夹下建立类follower.py
follower.py代码
# -*- coding: utf-8 -*-

from odoo import models, fields, api


class follower(models.Model):
    _inherit = 'res.partner'
    bug_ids = fields.Many2many('bm.bug', string='bug')

可以知道:

  • 这里的bug_ids与bug类中follower_id是对应的
  • 扩展字段的逻辑是未修改的属性都会保留,这里相当于res.partner上增加了bug_ids字段
在models/init.py引入
# -*- coding: utf-8 -*-

from . import bugs
from . import follower

3.视图

视图:前端界面,通过xml文件定义

3.1新增菜单

建立views/bugs.xml

<odoo>
  <data>

    <!-- actions opening views on models -->
      <!-- 窗口动作,将模型的数据展示出来-->
    <record model="ir.actions.act_window" id="bug-manage.action_window">
      <field name="name">bug-manage window</field>
        <!--类的唯一标志字段-->
      <field name="res_model">bm.bug</field>
      <field name="view_mode">tree,form</field>
    </record>
	
	<!-- 多级菜单-->
    <!-- Top menu item -->
    <menuitem name="bug管理系统" id="bug-manage.menu_root"/>

    <!-- menu categories -->
    <menuitem name="bug管理" id="bug-manage.menu_1" parent="bug-manage.menu_root"/>
    <!-- 最后一级菜单通过action调用了上面定义的窗口动作-->
    <menuitem name="bug列表" id="bug-manage.menu_1_list" parent="bug-manage.menu_1" action="bug-manage.action_window"/>

  </data>
</odoo>

配置视图文件,在__manifest__.py文件增加配置:

    'data': [
        # 'security/ir.model.access.csv',
        'views/views.xml',
        'views/templates.xml',
        'views/bugs.xml'
    ],

注意:

  1. xml是按顺序解析的,因此动作定义必须出现在菜单前
  2. 向该模型新增窗口动作记录,model属性标示为窗口动作、id必须唯一
  3. 字段列表中res_model代表视图取数据的模型;view_mode代表按顺序展示的视图类型
  4. 最后一级菜单通过action调用了上面定义的窗口动作
  5. 必须修改_manifest.py配置文件,才可以看到视图

重启odoo,更新后可以看到以下视图效果:
在这里插入图片描述

3.2创建列表视图

因为name是特殊字段,可用来代表一条记录。但是我们还需要添加更多字段信息,即创建自己的列表视图(list/tree)
在窗口动作的定义前加入:

<!-- explicit list view definition -->
    <!--明确的列表视图的定义-->
    <record model="ir.ui.view" id="bug-manage.list">
      <field name="name">bug列表</field>
      <field name="model">bm.bug</field>
      <field name="arch" type="xml">
        <tree>
          <field name="name"/>
          <field name="is_closed"/>
          <field name="user_id"/>
        </tree>
      </field>
    </record>

升级模块后可以看到列表已经出现了定义的三个字段:
在这里插入图片描述
点击创建,可以看到自动出现的表单:
在这里插入图片描述
接下来,对这个默认表单重新设计

3.3业务文档表单视图

普通表单视图与刚刚的列表视图很相似,只是将与互换,然后加上

和两个元素

还是在views/bugs.xml添加(刚刚的列表视图之后,窗口动作之前):

    <record model="ir.ui.view" id="bug-manage.form">
      <field name="name">bug表单</field>
      <field name="model">bm.bug</field>
      <field name="arch" type="xml">
        <form>
          <!--出现在表单上方,name对应未来后台方法-->
          <header>
            <button name="do_close" type="object" string="关闭bug"/>
          </header>
          <!--表单主体部分-->
          <sheet>
            <group name="group_top" col="2">
              <group name="group_left">
                <field name="name"/>
                <field name="user_id"/>
                <field name="is_closed"/>
              </group>
              <group name="group_right">
                <field name="close_reason"/>
                <field name="follower_id"/>
              </group>
            </group>
            <notebook>
              <page string="详细内容">
                <field name="detail"/>
              </page>
            </notebook>
          </sheet>
        </form>
      </field>
    </record>

在这里插入图片描述

3.4搜索视图

还是在views/bugs.xml添加(刚刚的表单视图之后,窗口动作之前):

    <record model="ir.ui.view" id="bug-manage.search">
      <field name="name">bug搜索</field>
      <field name="model">bm.bug</field>
      <field name="arch" type="xml">
        <search>
          <field name="name"/>
          <field name="is_closed"/>
          <field name="user_id"/>
        </search>
      </field>
    </record>

搜索视图一般会与预定义筛选条件一起使用,这部分结合后端视图一起介绍

3.5视图继承(关注者继承"res.partner")

关注者是在"res.partner"模型的基础上增加bug列表(bug_id)字段,所以关注者的视图也继承自“res.partner”的视图进行修改。
步骤

  1. 确定具体继承自哪一视图:进入设置|用户界面|视图,记住外部ID,继承修改的时候一定要使用它
    在这里插入图片描述
  2. 找到具体锚点,确定bug_ids要加到哪里,通常是找一个有name属性的元素。这里我们以元素为锚点

新建views/follower.xml,具体代码:
在这里插入图片描述
还需要一个菜单进入表单视图
在这里插入图片描述
在__manifest__.py文件引入本文件

更新可以看到如下画面:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值