wiggin's Blog


  • 首页

  • 标签

  • 分类

非常时期,在家充电的免费资源

Posted on 2020-02-03 | In 清单

喜马拉雅APP:免费领取29天VIP会员

如何获取:下面链接中输入手机号,接收验证码领取,下载喜马拉雅APP使用

  • 领取14天链接
  • 领取15天链接

得到APP:免费听书两个月VIP

如何获取:打开得到APP——我的——卡券——兑换卡券——输入“平平安安”

电子图书免费读(电脑在线阅读)

  • 机械工业出版社
  • 清华大学出版社,2月16日前
  • 北京外国语大学外语在线学习平台
  • 全国报刊索引,2月29日前,免费注册后,每个帐号每天可下载全文内容100次,50幅图片(图片库)

Odoo一个简单的Client Action示例

Posted on 2019-07-31 | In Odoo

总览

这个示例将创建一个菜单,点击触发一个客户端动作,关联js定义的对象,显示相应模板

这个示例包括下面三个文件
mark

  • 模板文件static/src/xml/client_action.xml
    • 定义模板HelloJS显示<div>Display HelloJS</div>
  • JS文件static/src/js/client_action.js
    • 定义对象HomePage继承于web.AbstractAction
    • 对象中调用HelloJS模板
    • 对象中定义init方法和start方法
    • 将HomePage对象注册为动作:HelloJS_tag
  • 视图文件views/client_action.xml
    • 继承web.assets_backend加载JS文件
    • 定义客户端动作关联HelloJS_tag
    • 定义显示的菜单关联客户端动作

示例文件内容

1、定义模板文件static/src/xml/client_action.xml

1
2
3
4
5
6
<?xml version="1.0"  encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="HelloJS">
<div>Display HelloJS</div>
</t>
</templates>

2、定义JS文件static/src/js/client_action.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
odoo.define('hello.js', function (require) {
"use strict";

var Widget = require('web.Widget');
var core = require('web.core');
var utils = require('web.utils');
var AbstractAction = require('web.AbstractAction');

var HomePage = AbstractAction.extend({
template: "HelloJS",

init: function (parent) {
this._super(parent);
console.log("Hello JS, I'm inside of init.");
},

start: function () {
console.log("Hello JS, I'm inside of start.");
},
});

core.action_registry.add('HelloJS_tag', HomePage);

return HomePage;
});

3、创建视图文件views/client_action.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<data>

<template id="assets_backend" name="petstore"
inherit_id="web.assets_backend">
<xpath expr="." position="inside">
<script type="text/javascript"
src="demo_client_action/static/src/js/client_action.js">
</script>
</xpath>
</template>

<record id="hellojs_id" model="ir.actions.client">
<field name="name">HelloJS</field>
<field name="tag">HelloJS_tag</field>
</record>

<menuitem id="hellojs_menu"
name="HelloJS"
action="hellojs_id"/>
</data>
</odoo>

4、在__manifest__.py文件中引入XML文件

1
2
3
4
5
6
'qweb': [
'static/src/xml/client_action_template.xml'
],
'data': [
'views/client_action.xml'
],

如何将console.log的内容导出到文件中

Posted on 2019-07-30 | In Web

在Chrome浏览器的Console控制台中,使用console.log()命令可以输出js变量或字符串,但如何将这些输出保存到文件中呢

使用log4b.js可以实现输出保存到文件,这个功能可用于在console中使用xpath获取页面内容并保存到文件

步骤

1、载入log4b

js原生的console.log()无法输出到文件,下载log4b.js文件,复制log4b.js的内容到console中执行

2、创建log4b对象

在console中执行

var Log4b = new log4b();

3、输出内容

使用Log4b.log()替代console.log()来输出内容

4、导出到文件

使用Log4b.downloadLog()可以下载由Log4b.log()输出的内容

log4b使用

log4b方法

getLog: get log show on the console tab
downloadLog: download the log
clear: clear all saved log
log:    write log
lines: get how many lines of log
search: search a string

log4b配置

self.realTimeLoggingOn = true; // log in real time (forwards to console.log)
self.useTimestamps = false; // insert a timestamp in front of each log
self.recordLogs = true; // set to false after you're done debugging to avoid the log eating up memory
self.maxLines = 2500; // if autoTrim is true, this many most recent lines are saved
self.lineMaxChars = 1500; // if one log is max than lineMaxChars, it will be cut
self.logFilename = 'log4b.txt'; // filename of log downloaded with downloadLog()
self.lineBreak = '\n\n';

参考

https://segmentfault.com/a/1190000009426931

Odoo交互式命令行shell

Posted on 2019-07-25 | In Odoo

Odoo shell是一个交互式命令行工具,它类似Python shell或Django shell一样,可以在开发过程中调试Odoo内置对象和API函数,比如:测试对象有哪些属性和方法,或是测试API调用的返回是否达到预期

在命令行输入下面指令即可启动Odoo shell:

python3 odoo-bin shell -c odoofile/odoo.conf -d test

shell类型

Odoo shell有下面几种类型

  • ipython(需安装ipython)
  • ptpython
  • bpython
  • python,默认使用python(无法按上输入历史命令,推荐使用ipython)

通过参数shell-interface可以指定shell类型,如下所示使用ipython启动shell

python3 odoo-bin shell -c odoofile/odoo.conf --shell-interface ipython -d test

shell变量

shell启动后提供以下几个变量

  • env: odoo.api.Environment对象
  • odoo: odoo模块
  • openerp: odoo模块
  • self: res.user(1,)记录

shell操作

1、获取模型列表

registry是Odoo实例维护的信息中心,通过env.registry获取

env.registry.models可以获取当前Odoo实例的模型列表,返回ModelClass和Model字典键值对

2、查看常用模型

示例:product.product是ModelClass,odoo.api.product.product是Model

1) 获取model的两种方式

  • env.registry.models.get(‘product.product’)
  • env[‘product.product’]

2) 访问基类

odoo.api.product.product 的基类可以通过env.registry.get('product.product').__bases__访问

3、操作记录集

  • 查询产品env['product.product'].search([])
  • 遍历产品名称rec.name
  • 修改产品属性rec.write()

Odoo为序列号管理增加快捷生成日期范围

Posted on 2019-07-24 | In Odoo

实现目标

实现后效果如图所示,增加了范围类型、范围开始日期、范围结束日期和一个生成按钮

mark

开发步骤

1、开发前找到修改目标

首先激活开发者模式,通过菜单Settings | Technical | Sequences进入序列编辑界面,通过菜单Open Developer Tools | Edit View: Form查看表单视图,得到需要修改的模型为ir.sequence,视图为base.sequence_view(为了排除翻译导致的名称不一致,这里菜单名和截图使用英文的)

mark

2、创建模块

进入自己的模块目录中,使用脚手架生成模块结构

cd C:/Project/odoo12-x64/source\odoo\custom-addons
C:\Project\venv\odoo12\Scripts\python.exe C:/Project/odoo12-x64/source/odoo-bin scaffold myapp_sequence

mark

3、继承序列模型,添加设置日期范围的字段

1
2
3
4
5
6
7
8
9
10
#models/models.py

from odoo import models, fields, api
class IrSequence(models.Model):
_inherit = 'ir.sequence'

range_type = fields.Selection(selection=[('day','Day'),('week','Week'),('month','Month')],
string='范围类型')
range_from = fields.Date(string='范围开始日期')
range_to = fields.Date(string='范围结束日期')

4、继承序列表单视图,添加字段和按钮

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!-- views/views.xml -->
<odoo>
<data>
<record model="ir.ui.view" id="sequence_view_inherit">
<field name="name">Sequences Inherit</field>
<field name="model">ir.sequence</field>
<field name="inherit_id" ref="base.sequence_view"/>
<field name="arch" type="xml">
<field name="use_date_range" position="after">
<field name="range_type" attrs="{'invisible': [('use_date_range', '=', False)]}"/>
<button name="create_range" type="object" string="创建日期范围" class="oe_edit_only oe_highlight" attrs="{'invisible': [('use_date_range', '=', False)]}"/>
</field>
<field name="number_next_actual" position="after">
<field name="range_from" attrs="{'invisible': [('use_date_range', '=', False)]}"/>
<field name="range_to" attrs="{'invisible': [('use_date_range', '=', False)]}"/>
</field>
</field>
</record>
</data>
</odoo>

其中

class="oe_edit_only oe_highlight" 表示按钮编辑时可见

attrs="{'invisible': [('use_date_range', '=', False)]}" 表示字段use_date_range为False时隐藏

5、为按钮添加事件函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#models/models.py

import datetime, calendar
from odoo.exceptions import UserError

#在class IrSequence中添加函数
def get_date_range_list(self, start_date, end_date, flags='day'):
result = []
result.append(start_date)
if flags == 'day':
for n in range(int((end_date - start_date).days - 1)):
compute_date = start_date + datetime.timedelta(days=n + 1)
result.append(compute_date)
elif flags == 'week':
for n in range(int((end_date - start_date).days - 1)):
compute_date = start_date + datetime.timedelta(days=n + 1)
if compute_date.weekday() != calendar.MONDAY:
continue
result.append(compute_date)
elif flags == 'month':
for n in range(int((end_date - start_date).days - 1)):
compute_date = start_date + datetime.timedelta(days=n + 1)
if compute_date.day != 1:
continue
result.append(compute_date)
result.append(end_date)
return result

@api.multi
def create_range(self, values):
self.ensure_one()
if not self.range_type or not self.range_from or not self.range_to:
raise UserError('请填写必要的参数(范围类型/范围开始日期/范围结束日期)')
if self.range_from > self.range_to:
raise UserError('范围开始时间不能大于结束时间')
self.date_range_ids.unlink()
date_range = self.get_date_range_list(self.range_from, self.range_to, self.range_type)
print(date_range)
date_range_pair = list(dict(zip(date_range[:-1], date_range[1:])).items())

for date_from ,date_to in date_range_pair:
values = {'number_next_actual': 1, 'date_from':date_from.strftime('%Y-%m-%d'), 'date_to':date_to.strftime('%Y-%m-%d'), 'sequence_id': self.id}
self.date_range_ids.create(values)

6、安装并使用模块

从应用中安装这个模块,进入序列号编辑表单,选择范围类型,范围开始日期和结束日期,点击创建日期范围,将清除之前的日期范围,按照规则重新创建日期范围

123…7

wiggin

31 posts
9 categories
7 tags
RSS
© 2025 wiggin
Powered by Hexo
|
Theme — NexT.Gemini v5.1.4
本站访客数: