1.创建模块
- 创建模块目录 ,在根目录下创建模块目录,此处为my-modules
- 创建模块 ,在Pycharm的命令行终端使用Odoo的scaffold命令设置一个基本模块,此处为Academy
python odoo-bin scaffold Academy my-modules
没有错误信息则创建成功,可以查看my-modules目录下多了Academy模块
2.安装模块
- 添加模块路径 ,在odoo.conf下的addons_path参数值中添加新的模块目录键值对addons_path=./addons,./my-modules,如果使用命令启动,则为–addons-path addons,my-modules
- 启动服务 ,在Pycharm中启动或使用命令启动,然后通过http://localhost:8069/登录访问Odoo
- 激活开发者模式 ,右击左上角,打开设置页面,拉到最后,看到开发者工具,激活开发者模式
- 安装模块 ,右击左上角,打开应用页面,此时在开发者模式中,能看到顶部菜单多了很多选项,点击“刷新本地模块列表”,点击更新。在搜索框中移除“应用”搜索关键字,输入Academy,搜索Academy模块,然后点击安装,完成Academy模块安装
3.Hello, world
- 编写接口 ,在my-modules/academy/controllers/controllers.py文件下的编写代码,以生成可访问的接口
# -*- coding: utf-8 -*-
from odoo import http
class Academy(http.Controller):
@http.route('/academy/academy/', auth='public')
def index(self, **kw):
return "Hello, world"
- 访问接口 ,重启Odoo服务,即可使用地址访问接口并返回Hello, world
http://localhost:8069/academy/academy/
4.模板文件
- 模板文件 ,使用模板文件显示Teachers数据,在模板文件my-modules/academy/view/template.xml中添加内容
<odoo>
<template id="index">
<title>Academy</title>
<t t-foreach="teachers" t-as="teacher">
<p><t t-esc="teacher"/></p>
</t>
</template>
</odoo>
- 修改接口 ,修改my-modules/academy/controllers/controllers.py文件的接口,主要是index方法,其它接口只是用于测试,非必要
# -*- coding: utf-8 -*-
from odoo import http
import json
from odoo import api
import logging
_logger = logging.getLogger(__name__)
class Academy(http.Controller):
@http.route('/academy/academy/', auth='public')
def index(self, **kw):
return http.request.render('academy.index', {
'teachers': ["Diana Padilla", "Jody Caroll", "Lester Vaughn"],
})
# # 返回字符串
# @http.route('/academy/hello/', auth='public')
# def hello(self, **kw):
# name = kw.get('name')
# if name:
# return 'Hello ' + name
# return 'Hello World'
#
# # 返回json数据
# @http.route('/academy/getTeachers', type='http', auth='public')
# def getTeachers(self):
# list = ["Diana Padilla", "Jody Caroll", "Lester Vaughn"]
# dic = {}
# dic['teachers'] = list
# return json.dumps(dic)
#
# # 接收json参数
# # 参数格式data = {"params": dict(key="value")}
# @http.route(['/academy/getTeacherByName'], type='json', auth='public', methods=['POST'])
# def getTeacherByName(self, **kw):
# _logger.info("window下可以使用curl测试命令:")
# _logger.info("curl http://localhost:8069/openacademy/getSessionById -X POST -d \"{\\\"params\\\":{\\\"name\\\": \\\"Manson\\\"}}\" --header \"Content-Type: application/json\"")
# _logger.info(kw)
# teachers = ["Diana Padilla", "Jody Caroll", "Lester Vaughn"]
# name= kw.get('name', False)
# if name:
# teachers = [name]
# return json.dumps(teachers)
#
# # 查询数据库
# @http.route('/academy/getTeacherName/', auth='public')
# def getTeacherName(self, **kw):
# sql = "select name from academy_teachers"
# # 方式一,直接查询数据库
# db = psycopg2.connect(database="odoo", user="root", password="admin", host="127.0.0.1", port="5432")
# vals = db.cursor()
# vals.execute(sql)
# dicts = vals.fetchall()
# # 方式二,使用api查询
# http.request.env.cr.execute(sql)
# dicts = http.request.env.cr.dictfetchall()
# return json.dumps(dicts)
- 更新模块 ,修改完成后重启服务并更新Academy模块,需要在应用中搜索Academy模块并更新
- 访问接口 ,此时使用地址访问接口并返回模板数据
http://localhost:8069/academy/academy/
5.存储数据
- 创建模型 ,修改my-modules/academy/models/models.py文件,添加名为Teachers的模型
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class Teachers(models.Model):
_name = 'academy.teachers'
name = fields.Char()
- 添加权限 ,修改my-modules/academy/__manifest__.py,将权限文件引入,主要是取消security/ir.model.access.csv的注释
- 修改权限 ,修改my-modules/academy/security/ir.model.access.csv,添加对teachers模型的读权限
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_academy_teachers,access_academy_teachers,model_academy_teachers,,1,0,0,0
- 添加样例数据 ,修改my-modules/academy/demo/demo.xml,添加一些teachers模型的样例数据
<odoo>
<data>
<record id="padilla" model="academy.teachers">
<field name="name">Diana Padilla</field>
</record>
<record id="carroll" model="academy.teachers">
<field name="name">Jody Carroll</field>
</record>
<record id="vaughn" model="academy.teachers">
<field name="name">Lester Vaughn</field>
</record>
</data>
</odoo>
- 修改接口 ,修改controller.py文件的接口,以查询teachers模型的数据
# -*- coding: utf-8 -*-
from odoo import http
class Academy(http.Controller):
@http.route('/academy/academy/', auth='public')
def index(self, **kw):
Teachers = http.request.env['academy.teachers']
return http.request.render('academy.index', {
'teachers': Teachers.search([])
})
- 修改模板 ,修改template.xml文件,以输出teachers模型的数据
<odoo>
<template id="index">
<title>Academy</title>
<t t-foreach="teachers" t-as="teacher">
<p><t t-esc="teacher.id"/> <t t-esc="teacher.name"/></p>
</t>
</template>
</odoo>
- 查看结果 ,启动服务并更新模块,然后使用地址访问接口
http://localhost:8069/academy/academy/
此时,已经在Postgresql中创建了数据库表academy_teachers并插入了demo中定义的记录
6.访问模块
- 创建菜单 ,为模块创建菜单,修改my-modules/academy/view/views.xml
<odoo>
<record id="action_academy_teachers" model="ir.actions.act_window">
<field name="name">Academy teachers</field>
<field name="res_model">academy.teachers</field>
</record>
<menuitem sequence="0" id="menu_academy" name="Academy"/>
<menuitem id="menu_academy_content" parent="menu_academy"
name="Academy Content"/>
<menuitem id="menu_academy_content_teachers"
parent="menu_academy_content"
action="action_academy_teachers"/>
</odoo>
- 查看结果 ,启动服务并更新模块,然后就可以看到Academy模块的菜单并访问其内容
现在可以看到只可以查看Teachers模块的数据,如果想要增删改查,则修改权限文件即可,将文件中的0改为1,然后重启并更新模块,再次访问即可看到多出了操作增删改的按钮
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_academy_teachers,access_academy_teachers,model_academy_teachers,,1,1,1,1
6.其它相关文章
1.Odoo13创建报表
https://blog.youkuaiyun.com/u010520912/article/details/103497489