ODOO 官方建议模块骨架 ,
-
在addons/<my_module_name>/下结构如下:
文件夹权限755 文件权限644
__openerp__.py 相关属性:
# name 模块名字
# summary 简短介绍
# description 详细描述
# author 作者
# website 模块网站
# category 模块分类
# version 模块版本号
# license 模块版本信息 默认是 AGPL-3
# depends 模块依赖
# data 模块必须加载的数据文件
# demo 示例数据
# installabel 默认为True 可安装
# auto_install 默认是False 如果设为True 就根据依赖模块,依赖装了,这个模块就安装
# application 默认是 False 如果设为True 就成为应用模块
安装自定义模块
服务启动配置文件 addons-path 加入自己的定义容器目录 如 myaddons
addons-path=addons,myaddons
更新模块服务列表,然后找到去安装
模块文件夹管理
# data 放 demo 和 data xml
# models 放模型定义
# controllers http 路径控制
# views 放网页视图和模板
# static 放网页的资源,里面还有css, js ,img, lib 等
#
-
自动定的模块tech_demo
我们在ODOO文件夹下,新增addons_demo文件夹,如addons_demo/tech_demo下结构如下:
* __init__.py 内容如下(把模型导入到应用)
from . import models
* __manifest__.py 内容如下(erp本身的配置)
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'tech_demo',
'version': '1.0',
'category': 'test',
'sequence': 8,
'summary': '',
'description': "",
'website': '',
'depends': [ ],
'data': [
'views/tech_student_views.xml',
'views/tech_teacher_views.xml'
],
'demo': [],
'css': [],
'installable': True,
'application': True,
'auto_install': False,
}
-
在models文件夹下,新建tech_demo.py
*tech_demo.py 内容如下(模型)
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, tools, models
from odoo.tools.translate import _
class tech_student(models.Model):
_name="tech.student"
_description=""
def _selection(self):
team = self.env['crm.team'].sudo()._get_default_team_id(user_id=self.env.uid)
return self._stage_find(team_id=team.id, domain=[('fold', '=', False)]).id
@api.multi
def _compute_attachment_number(self):
"""附件上传"""
attachment_data = self.env['ir.attachment'].read_group([('res_model', '=', 'tech.student'), ('res_id', ' in ', self.ids)], ['res_id'], ['res_id'])
if len(attachment_data)>0:
attachment = dict((data['res_id'], data['res_id_count']) for data in attachment_data)
for expense in self:
expense.attachment_number = attachment.get(expense.id, 0)
@api.multi
def action_get_attachment_view(self):
"""附件上传动作视图"""
self.ensure_one()
res = self.env['ir.actions.act_window'].for_xml_id('base', 'action_attachment')
if res:
res['domain'] = [('res_model', '=', 'tech.student'), ('res_id', ' in ', self.ids)]
res['context'] = {'default_res_model': 'tech.student', 'default_res_id': self.id}
return res
# 增加附件上传功能
attachment_number = fields.Integer(compute='_compute_attachment_number', string ='附件数量')
name = fields.Char(u'名字')
age = fields.Integer(u'年龄')
sex = fields.Selection([('1',u'男'),('2',u'女')], string=u'性别')
address = fields.Char(u'住址')
phone = fields.Char(u'电话')
email = fields.Char(u'电子邮箱')
desc = fields.Text(u'描述')
document = fields.Html(u'文档')
sequence = fields.Integer(default=0,string=u'序号')
perc_complete = fields.Float(u'% 万年收入', (3, 2))
# Date fields:
date_effective = fields.Date(u'出生日期')
date_changed = fields.Datetime(u'修改日期')
# Other fields:
fold = fields.Boolean(default=True, help=u"是否转正")
image = fields.Binary(u'个人照片')
-
在views文件夹下,新建tech_student_views.xml
<?xml version="1.0"?>
<odoo>
<!-- tech.student views -->
<record id="tech_student_form" model="ir.ui.view">
<field name="name">tech.student.form</field>
<field name="model">tech.student</field>
<field name="arch" type="xml">
<form string="学生信息">
<sheel>
<label for="name"></label>
<div class="oe_button_box" name="button_box">
<button name="action_get_attachment_view" class="oe_stat_button" icon="fa-book" type="object">
<field name="attachment_number" widget="statinfo" string="附件上传"/>
</button>
</div>
<group>
<group string="基本信息">
<field name="name"/>
<field name="age"/>
<field name="sex"/>
<field name="address"/>
<field name="phone"/>
<field name="email"/>
</group>
<group string="联系信息">
<field name="sequence"/>
<field name="perc_complete"/>
<field name="date_effective"/>
<field name="date_changed"/>
<field name="fold"/>
<field name="image"/>
</group>
</group>
<group string="备注信息">
<field name="document"/>
<field name="desc" />
</group>
</sheel>
</form>
</field>
</record>
<record id="tech_student_tree" model="ir.ui.view">
<field name="name">tech.student.tree</field>
<field name="model">tech.student</field>
<field name="arch" type="xml">
<tree string="Tech Student">
<field name="sequence"/>
<field name="phone"/>
<field name="name"/>
<field name="age"/>
<field name="sex"/>
<field name="address"/>
<field name="email"/>
</tree>
</field>
</record>
<record id="tech_student_action" model="ir.actions.act_window">
<field name="name">学生</field>
<field name="res_model">tech.student</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem id="menu_tech" name="学校管理" />
<menuitem id="menu_tech_stu" name="师生管理" parent="menu_tech"/>
<menuitem id="menu_tech_student" name="学生列表" parent="menu_tech_stu" action="tech_student_action"/>
</odoo>
然后重新启动ODOO11的服务,可以查看结果