Tagged: odoo

Odoo开发之开发者模式

--dev <feature,feature,...,feature>

  • all  以下功能全部激活
  • xml  直接从xml文件中读取模板。而不是从数据库。
  • reload  更新python文件时重新启动服务器(需要watchdog包)
  • qweb: break in the evaluation of qweb template when a node contains t-debug='debugger'
  • (i)p(u)db: start the chosen python debugger in the code when an unexpected error is raised before logging and returning the error.

官方帮助:https://www.odoo.com/documentation/10.0/reference/cmdline.html

pip install watchdog
python odoo-bin -c dev.conf --dev all

Odoo 12 企业版开发环境搭建

基础环境请参阅:Odoo 10.0 64位 绿色版

目录结构

创建适用于odoo12的配置文件

python source\odoo-bin --save --stop-after-init

创建数据库及用户

-- 创建用户
CREATE USER xxx WITH PASSWORD 'xxxxxx';
-- 创建数据库yyy并指定所有者为xxx
CREATE DATABASE yyy OWNER xxx;
-- 对数据库yyy的全部操作权限赋给用户xxx,否则xxx仅仅能登录控制台,没有不论什么数据库的操作权限
GRANT ALL PRIVILEGES ON DATABASE yyy to xxx;
-- 删除数据库yyy
DROP DATABASE yyy;
-- 删除用户xxx
DROP USER XXX;

PyCharm启动设置

Odoo Widget 颜色的使用

Tree视图定义行的颜色

<record id="purchase_order_tree" model="ir.ui.view">
	<field name="name">purchase.order.tree</field>
	<field name="model">purchase.order</field>
	<field name="arch" type="xml">
		<tree decoration-bf="message_unread==True" decoration-muted="state=='cancel'" decoration-info="state in ('wait','confirmed')" string="Purchase Order">
			<field name="message_unread" invisible="1"/>
			<field name="name" string="Reference"/>
			<field name="date_order" />
			<field name="partner_id"/>
			<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}"/>
			<field name="date_planned" invisible="context.get('quotation_only', False)"/>
			<field name="origin"/>
			<field name="amount_untaxed" sum="Total Untaxed amount" string="Untaxed" widget="monetary"/>
			<field name="amount_total" sum="Total amount" widget="monetary"/>
			<field name="currency_id" invisible="1"/>
			<field name="state"/>
			<field name="invoice_status" invisible="not context.get('show_purchase', True)"/>
		</tree>
	</field>
</record>

Kanban组件

color值为0~9

<li><ul class="oe_kanban_colorpicker" data-field="color"/></li>

示例:

<record id="view_forum_post_kanban" model="ir.ui.view">
	<field name="name">forum.post.kanban</field>
	<field name="model">forum.post</field>
	<field name="arch" type="xml">
		<kanban default_group_by="documentation_stage_id" >
			<field name="documentation_stage_id"/>
			<field name="create_uid"/>
			<field name="color"/>
			<templates>
			<t t-name="kanban-box">
				<div t-attf-class="oe_kanban_color_#{kanban_getcolor(record.color.raw_value)} oe_kanban_card oe_kanban_global_click">
					<div class="o_dropdown_kanban dropdown" groups="base.group_user">
						<ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
							<li t-if="widget.editable"><a type="edit">Edit Post</a></li>
							<li t-if="widget.deletable"><a type="delete">Delete</a></li>
							<li><ul class="oe_kanban_colorpicker" data-field="color"/></li>
						</ul>
					</div>
				</div>
			</t>
			</templates>
		</kanban>
	</field>
</record>

Many2many_tag widget

值范围:1~12

<field name="about_place_route" widget="many2many_tags" options="{'color_field': 'color', 'no_open':True,'no_create':1,'no_create_edit':1}" />


啊啊

Odoo 打印开发

一、声明报告Actions

参考链接:QWeb Reports

<report
        id="budget_report"
        model="budget.budget"
        report_type="qweb-pdf"
        string="Budget Report"
        name="contract_manager.budget_report_template"
        file="contract_manager.budget_report_template"
        paperformat="budget_print_format"
        menu="True"
/>

定义纸张

参考链接:Paper Format

<record id="budget_print_format" model="report.paperformat">
	<field name="name">Budget Print format</field>
	<field name="format">A4</field>
	<field name="orientation">Landscape</field> <!--方向-->
	<field name="margin_top">3</field>
	<field name="margin_bottom">3</field>
	<field name="margin_left">3</field>
	<field name="margin_right">3</field>
	<field name="header_line" eval="False" />
	<field name="header_spacing">3</field>
	<field name="dpi">90</field>
</record>

定义模板

<template id="report_invoice">
    <t t-call="report.html_container">
        <t t-foreach="docs" t-as="o">
            <t t-call="report.external_layout">
                <div class="page">
                    <h2>Report title</h2>
                    <p>This object's name is <span t-field="o.name"/></p>
                </div>
            </t>
        </t>
    </t>
</template>

调用report.external_layout将在报告上添加默认的页眉和页脚,正文将是其中的<div class="page">

报告中可以访问的一些特定变量,主要是:

  • docs  当前报告的数据记录集
  • doc_ids 记录的id列表
  • doc_model docs记录的模型
  • time 来自Python标准库的引用
  • user res.user用户打印报告的记录
  • res_company 当前user的公司

自定义报告

使用自定义报告需要具有一个默认的 get_html 函数,如果你希望在模板中包含更多的内容(例如,其他模型记录)来自定义报告,则可以定义此模型,覆盖函数并在字典中传递对象:

report.module.report_name render_html docargs

from odoo import api, models

class ParticularReport(models.AbstractModel):
    _name = 'report.module.report_name'
    @api.model
    def render_html(self, docids, data=None):
        report_obj = self.env['report']
        report = report_obj._get_report_from_name('module.report_name')
        docargs = {
            'doc_ids': docids,
            'doc_model': report.model,
            'docs': self,
        }
        return report_obj.render('module.report_name', docargs)

docker 快速部署Odoo环境

写在前面

经常需要将开发的项目部署到测试服务器上以便客户可以看到,但之前都是安装环境这样的方式,不适合快速搭建。

安装Docker及docker-compose

yum install -y docker docker-compose

systemctl enable docker # 开机自动启动docker
systemctl start docker # 启动docker
systemctl restart docker # 重启dokcer
systemctl stop docker

# 验证docker是否安装成功
docker run --rm hello-world

设置Docker 加速

阿里云:https://cr.console.aliyun.com/#/accelerator

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://wkumpv63.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

使用docker-compose.yml运行容器

目录结构:
配置文件(docker-compose.yml):

version: '2'
services:
  web:
    image: odoo:10.0
    depends_on:
      - db
    ports:
      - "80:8069"
    volumes:
      - odoo-web-data:/var/lib/odoo
      - ./config:/etc/odoo
      - ./addons:/mnt/extra-addons
  db:
    image: postgres:10
    restart: always
    environment:
      - POSTGRES_USER=odoo
      - POSTGRES_PASSWORD=odoo
      - PGDATA=/var/lib/postgresql/data/pgdata
    volumes:
      - odoo-db-data:/var/lib/postgresql/data/pgdata
volumes:
  odoo-web-data:
  odoo-db-data:

odoo配置文件:

[options]
addons_path = /mnt/extra-addons,/usr/lib/python2.7/dist-packages/odoo/addons
;data_dir = /var/lib/odoo
admin_passwd = admin
csv_internal_sep = ,
db_maxconn = 64
db_name = False
db_template = template1
dbfilter = .*
debug_mode = False
email_from = False
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
limit_request = 8192
limit_time_cpu = 60
limit_time_real = 120
list_db = True
log_db = False
log_handler = [':INFO']
log_level = info
logfile = None
longpolling_port = 8072
max_cron_threads = 2
osv_memory_age_limit = 1.0
osv_memory_count_limit = False
smtp_password = False
smtp_port = 25
smtp_server = localhost
smtp_ssl = False
smtp_user = False
workers = 0
xmlrpc = True
xmlrpc_interface =
xmlrpc_port = 8069
xmlrpcs = True
xmlrpcs_interface =
xmlrpcs_port = 8071

启动命令

docker-compose up -d
docker-compose stop
# 停止某一个容器
docker ps -a # 查看当前所有容器
docker stop <CONTAINER ID or NAMES>
docker start <CONTAINER ID or NAMES>
docker restart <CONTAINER ID or NAMES>

PostgreSQL 管理

docker仓库:https://hub.docker.com/_/postgres/

docker exec -tiu postgres <postgres_container_name> psql
docker exec -ti <postgres_container_name> psql -U <postgres_user>
# 推荐使用如下方式,它不会干扰主容器
docker run -it --link <postgres_container_name>:postgres --rm postgres sh -c 'exec psql -h "$POSTGRES_PORT_5432_TCP_ADDR" -p "$POSTGRES_PORT_5432_TCP_PORT" -U <postgres_user>'

备份\删除数据库\恢复

# To backup
docker exec -u <your_postgres_user> <postgres_container_name> pg_dump -Fc <database_name_here> > db.dump

# To drop db
docker exec -u <your_postgres_user> <postgres_container_name> psql -c 'DROP DATABASE <your_db_name>'

# To restore
docker exec -i -u <your_postgres_user> <postgres_container_name> pg_restore -C -d postgres < db.dump

Odoo 容器参数说明

服务器的默认配置文件位于(/etc/odoo/odoo.conf),若你有一个自定义的配置文件位于(/path/to/config/odoo.conf),那么你的运行命令就该是如下这样。

docker run -v /path/to/config:/etc/odoo -p 8069:8069 --name odoo --link db:db -t odoo

当然,你也可以直接指定内联的Odoo参数,这些参数必须在前面加上 --,如下所示:

docker run -p 8069:8069 --name odoo --link db:db -t odoo --db-filter=odoo_db_.*

当然,运行Odoo,大部分时候是需要运行我们自己开发的模块,在docker中运行的时候,我们可以使用如下方式将其加载。

docker run -v /path/to/addons:/mnt/extra-addons -p 8069:8069 --name odoo --link db:db -t odoo

升级docker版本

docker run --volumes-from old-odoo -p 8070:8069 --name new-odoo --link db:db -t odoo

防火墙设置(不需要设置)

firewall-cmd --zone=public --add-port=8069/tcp --permanent
firewall-cmd --reload

Docker 维护命令

# 查看容器信息
docker info

# 查看镜像列表
docker images

# 启动、停止
docker stop <id/container_name>
docker start <id/container_name>
docker kill <id/container_name>

# 查看正在运行的容器
docker ps -a

# 查看容器日志
docker logs <id/container_name>

# 实时查看日志输出
docker logs -f <id/container_name> (类似 tail -f) (带上时间戳-t)

# 启动容器以后台方式运行(更通用的方式)
docker run -d -it image_name

# 显示一个运行的容器里面的进程信息
docker top Name/ID  

# 移除镜像
docker stop <id/container_name>
docker rm  <id/container_name> 

# 完全删除镜像
docker rmi <id> 

# 制作镜像(根据容器id来创建新的镜像
docker commit 93639a83a38e  wsl/javaweb:0.1