!12685 添加功能

Merge pull request !12685 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2026-08-20 09:05:31 +00:00
committed by Gitee
6 changed files with 98 additions and 1 deletions
+1 -1
View File
@@ -15,7 +15,7 @@
'author': 'pengyuthon',
'version': '17.0.2.2.2',
'license': 'LGPL-3',
'depends': ['base', 'web', 'hr', 'documents', 'sh_backmate_theme_adv_enterprise'],
'depends': ['base', 'web', 'hr', 'documents'],
'data': [
'security/ai_security.xml',
'security/ir.model.access.csv',
+1
View File
@@ -0,0 +1 @@
from . import models
+27
View File
@@ -0,0 +1,27 @@
{
'name': 'Yuthon Datetime Rounding',
'version': '17.0.1.0.0',
'category': 'Technical',
'summary': '时间选择器默认分钟精确(rounding=1),可用系统参数 yuthon_datetime.rounding 调整',
'description': """
Yuthon Datetime Rounding
========================
Odoo 时间选择器(DateTimePicker)默认 rounding=5(分钟只能选 0/5/10/.../55),
导致"选05变04"之类的分钟精度困惑。
本模块把默认改为分钟精确(rounding=1):
- 全局默认值:系统参数 yuthon_datetime.rounding(1=分钟精确,5=每5分钟,15=每15分钟...),
修改后重新登录或刷新页面生效;
- 视图里字段若显式配置 options="{'rounding': N}",则以视图设置为准(不会被覆盖)。
""",
'depends': ['web'],
'data': [],
'assets': {
'web.assets_backend': [
'yuthon_datetime_rounding/static/src/js/datetime_picker.js',
],
},
'installable': True,
'application': False,
'auto_install': False,
}
@@ -0,0 +1 @@
from . import ir_http
@@ -0,0 +1,17 @@
# -*- coding: utf-8 -*-
"""把系统参数 yuthon_datetime.rounding 注入前端 session_info,供 JS 读取。"""
from odoo import models
class IrHttp(models.AbstractModel):
_inherit = 'ir.http'
def get_session_info(self):
res = super().get_session_info()
try:
rounding = int(self.env['ir.config_parameter'].get_param(
'yuthon_datetime.rounding', '1') or '1')
except Exception:
rounding = 1
res['yuthon_datetime_rounding'] = rounding
return res
@@ -0,0 +1,51 @@
/** @odoo-module **/
import { patch } from "@web/core/utils/patch";
import { DateTimePicker } from "@web/core/datetime/datetime_picker";
// yuthon_datetime_rounding v2(Odoo 16 / 17 通用)
// ---------------------------------------------------------------------------
// 目的:Odoo 时间选择器(DateTimePicker)默认 rounding=5(分钟只能选 0/5/10/.../55),
// 导致"选05变04 / 选00变59"这类分钟精度困惑。
// 本补丁把"未显式配置 rounding 的字段"默认改为分钟精确(rounding=1):
// - 全局默认值来自系统参数 yuthon_datetime.rounding(1=分钟精确,5=每5分钟,15=每15分钟...),
// 修改后重新登录或刷新页面(session_info 刷新)生效;
// - 视图里字段显式配置 options="{'rounding': N}" 且 N 非 5 时,尊重视图设置(不覆盖)。
// 实现双保险:① 基类 setup 前修正 props.rounding,让基类初始计算即用新值;
// ② setup 后按需重算 availableMinutes,兼容基类内部实现差异。
// ---------------------------------------------------------------------------
function getForcedRounding() {
const raw = odoo.session_info && odoo.session_info.yuthon_datetime_rounding;
const n = parseInt(raw, 10);
return Number.isFinite(n) && n > 0 ? n : 1;
}
function buildMinutes(step) {
const all = Array.from({ length: 60 }, (_, i) => [i, String(i).padStart(2, "0")]);
return step === 1 ? all : all.filter(([m]) => !(m % step));
}
patch(DateTimePicker.prototype, {
setup() {
const wasDefault =
this.props.rounding === undefined || this.props.rounding === 5;
if (wasDefault) {
this.props.rounding = getForcedRounding();
}
super.setup();
if (wasDefault && this.props.rounding > 0) {
this.availableMinutes = buildMinutes(this.props.rounding);
}
},
onPropsUpdated(props) {
if (typeof super.onPropsUpdated === "function") {
super.onPropsUpdated(props);
}
const isDefault =
props.rounding === undefined || props.rounding === 5;
if (isDefault && this.props.rounding > 0) {
this.availableMinutes = buildMinutes(this.props.rounding);
}
},
});