diff --git a/cr_m2o_faster/__init__.py b/cr_m2o_faster/__init__.py
new file mode 100644
index 000000000..40a96afc6
--- /dev/null
+++ b/cr_m2o_faster/__init__.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-
diff --git a/cr_m2o_faster/__manifest__.py b/cr_m2o_faster/__manifest__.py
new file mode 100644
index 000000000..c353e0614
--- /dev/null
+++ b/cr_m2o_faster/__manifest__.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+{
+ 'name': 'Faster Many2one',
+ 'summary': 'Faster Many2one',
+ 'description': """
+ """,
+ "version": "17.0",
+ "author": "Croissant",
+ "license": "OPL-1",
+ 'depends': ['web'],
+ 'images': [
+ 'static/description/banner.png',
+ ],
+ 'assets': {
+ 'web.assets_backend': [
+ 'cr_m2o_faster/static/src/views/fields/many2one/*',
+ # 'cr_m2o_faster/static/src/views/fields/many2many/*',
+ ],
+ },
+ 'installable': True,
+}
diff --git a/cr_m2o_faster/static/description/1.png b/cr_m2o_faster/static/description/1.png
new file mode 100644
index 000000000..f872b6918
Binary files /dev/null and b/cr_m2o_faster/static/description/1.png differ
diff --git a/cr_m2o_faster/static/description/banner.png b/cr_m2o_faster/static/description/banner.png
new file mode 100644
index 000000000..70fa07b2c
Binary files /dev/null and b/cr_m2o_faster/static/description/banner.png differ
diff --git a/cr_m2o_faster/static/description/icon.png b/cr_m2o_faster/static/description/icon.png
new file mode 100644
index 000000000..2daa800a7
Binary files /dev/null and b/cr_m2o_faster/static/description/icon.png differ
diff --git a/cr_m2o_faster/static/description/index.html b/cr_m2o_faster/static/description/index.html
new file mode 100644
index 000000000..e56881f32
--- /dev/null
+++ b/cr_m2o_faster/static/description/index.html
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+ Many2one Show More
+
+
+
Many2one字段一键直达更多。
+
+
+
+
+
+
+
+
+
+
+ Description
+
+
+
+
+
+
+
+
It provides a convenient way to quickly click on show more .
+
+
它提供了一种便捷的方式,快速点击更多。
+

+
+
+
+
+
+
+
+
+
+
+ Support
+
+
+
If there are any errors or issues, you will receive 60 days of free support.
+
如果出现任何错误或问题,您将获得60天的免费支持。
+
+
If you have any questions or need support, please contact me
+
如有任何问题或需要支持,请联系我
+
croissant_cr@163.com
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cr_m2o_faster/static/src/views/fields/many2many/many2many_field.js b/cr_m2o_faster/static/src/views/fields/many2many/many2many_field.js
new file mode 100644
index 000000000..d6d96f2ef
--- /dev/null
+++ b/cr_m2o_faster/static/src/views/fields/many2many/many2many_field.js
@@ -0,0 +1,36 @@
+/** @odoo-module **/
+import {patch} from "@web/core/utils/patch";
+import {Many2manyField} from "@web/views/fields/many2one/many2one_field";
+import {useSelectCreate} from "@web/views/fields/relational_utils";
+
+import { _t } from "@web/core/l10n/translation";
+import { sprintf } from "@web/core/utils/strings";
+
+patch(Many2manyField.prototype, {
+ setup(...args) {
+ super.setup(...args)
+ let self = this;
+ this.selectCreate = useSelectCreate({
+ resModel:this.relation,
+ activeActions: this.state.activeActions,
+ onSelected: (resId) => {
+ const resIds = Array.isArray(resId) ? resId : [resId];
+ const values = resIds.map((id) => ({id}));
+ return self.update(values);
+ },
+ onCreateEdit: ({context}) => this.openMany2X({context}),
+ onUnselect: this.update,
+ });
+ },
+ onMoreBtnClick() {
+ const domain = this.getDomain();
+ let dynamicFilters = [];
+ const title = sprintf(_t("Search: %s"), this.props.string);
+ this.selectCreate({
+ domain,
+ context: this.context,
+ filters: dynamicFilters,
+ title,
+ });
+ }
+});
diff --git a/cr_m2o_faster/static/src/views/fields/many2many/many2many_field.xml b/cr_m2o_faster/static/src/views/fields/many2many/many2many_field.xml
new file mode 100644
index 000000000..e3b555dce
--- /dev/null
+++ b/cr_m2o_faster/static/src/views/fields/many2many/many2many_field.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/cr_m2o_faster/static/src/views/fields/many2one/many2one_field.js b/cr_m2o_faster/static/src/views/fields/many2one/many2one_field.js
new file mode 100644
index 000000000..51a8c8f02
--- /dev/null
+++ b/cr_m2o_faster/static/src/views/fields/many2one/many2one_field.js
@@ -0,0 +1,36 @@
+/** @odoo-module **/
+import {patch} from "@web/core/utils/patch";
+import {Many2OneField} from "@web/views/fields/many2one/many2one_field";
+import {useSelectCreate} from "@web/views/fields/relational_utils";
+
+import { _t } from "@web/core/l10n/translation";
+import { sprintf } from "@web/core/utils/strings";
+
+patch(Many2OneField.prototype, {
+ setup(...args) {
+ super.setup(...args)
+ let self = this;
+ this.selectCreate = useSelectCreate({
+ resModel:this.relation,
+ activeActions: this.state.activeActions,
+ onSelected: (resId) => {
+ const resIds = Array.isArray(resId) ? resId : [resId];
+ const values = resIds.map((id) => ({id}));
+ return self.update(values);
+ },
+ onCreateEdit: ({context}) => this.openMany2X({context}),
+ onUnselect: this.update,
+ });
+ },
+ onMoreBtnClick() {
+ const domain = this.getDomain();
+ let dynamicFilters = [];
+ const title = sprintf(_t("Search: %s"), this.props.string);
+ this.selectCreate({
+ domain,
+ context: this.context,
+ filters: dynamicFilters,
+ title,
+ });
+ }
+});
diff --git a/cr_m2o_faster/static/src/views/fields/many2one/many2one_field.xml b/cr_m2o_faster/static/src/views/fields/many2one/many2one_field.xml
new file mode 100644
index 000000000..96a5228f0
--- /dev/null
+++ b/cr_m2o_faster/static/src/views/fields/many2one/many2one_field.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/soong_workflow/__manifest__.py b/soong_workflow/__manifest__.py
index ffe235fda..9e11e45f0 100644
--- a/soong_workflow/__manifest__.py
+++ b/soong_workflow/__manifest__.py
@@ -28,7 +28,6 @@
"views/soong_workflow_entrust_views.xml",
"views/soong_workflow_inspector_views.xml",
"views/soong_workflow_log_views.xml",
- 'wizard/approval_notice_wizard_views.xml',
"wizard/soong_workflow_comment_wizard_view.xml",
"templates/soong_workflow_templates.xml",
"views/menuitem.xml",
diff --git a/soong_workflow/models/soong_user_role.py b/soong_workflow/models/soong_user_role.py
index 7f1fda689..ccdc6be2e 100644
--- a/soong_workflow/models/soong_user_role.py
+++ b/soong_workflow/models/soong_user_role.py
@@ -48,7 +48,7 @@ class YuthonUserRole(models.Model):
'thtjbb': '天河投资本部',
}
- @api.depends('name','yuthon_company')
+ @api.depends('name', 'yuthon_company')
def _compute_display_name(self):
company_mapping = self._get_company_mapping()
for record in self:
diff --git a/soong_workflow/security/ir.model.access.csv b/soong_workflow/security/ir.model.access.csv
index a9574ac1a..e13aae623 100644
--- a/soong_workflow/security/ir.model.access.csv
+++ b/soong_workflow/security/ir.model.access.csv
@@ -20,7 +20,6 @@ access_soong_approval_users,soong_approval_users,model_soong_approval_users,soon
access_soong_note,soong_note,model_soong_note,soong_workflow.group_soong_workflow_user,1,1,1,1
access_soong_approval_group,soong_approval_group,model_soong_approval_group,soong_workflow.group_soong_workflow_user,1,1,1,1
-access_soong_approval_notice_wizard,soong_approval_notice_wizard,model_soong_approval_notice_wizard,base.group_user,1,1,1,1
access_soong_workflow_log_user,soong_workflow_log_user,model_soong_workflow_log,soong_workflow.group_soong_workflow_user,1,1,1,1
access_soong_workflow_comment_wizard_user,soong_workflow_comment_wizard_user,model_soong_workflow_comment_wizard,soong_workflow.group_soong_workflow_user,1,1,1,1
diff --git a/soong_workflow/wizard/__init__.py b/soong_workflow/wizard/__init__.py
index e66025961..578afc0b5 100644
--- a/soong_workflow/wizard/__init__.py
+++ b/soong_workflow/wizard/__init__.py
@@ -1,8 +1,6 @@
# -*- coding: utf-8 -*-
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-
-from . import approval_notice_wizard
from . import soong_workflow_comment_wizard
diff --git a/soong_workflow/wizard/approval_notice_wizard.py b/soong_workflow/wizard/approval_notice_wizard.py
deleted file mode 100644
index f556f0d9d..000000000
--- a/soong_workflow/wizard/approval_notice_wizard.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# -*- coding: utf-8 -*-
-from odoo import api, fields, models, tools, _
-from datetime import datetime, date, time, timedelta
-from odoo.tools.safe_eval import safe_eval
-from odoo.exceptions import ValidationError, UserError
-import logging
-
-_logger = logging.getLogger(__name__)
-
-class SoongApprovalNoticeWizard(models.TransientModel):
- _name = 'soong.approval.notice.wizard'
- _description = """ 审批意见弹窗 """
-
- # approval_res_id = fields.Char(string="审批明细行")
- # approval_res_model = fields.Char(string="审批明细行")
- approval_notice_state = fields.Selection([
- ('0', '不分类'),
- ('1', '审批通过'),
- ('2', '审批拒绝'),
- ], string='意见类型', default='0')
- approval_user_notice = fields.Many2one('soong.note', string='审批意见')
- # approval_user_sign = fields.Binary(string="审批签署", copy=False)
-
- def confirm(self):
- self.ensure_one()
- active_model = self.env.context.get("active_model")
- active_id = self.env.context.get("active_id")
- self.env["soong.approval.users"].create({
- 'res_model_id': self.env['ir.model']._get(active_model).id,
- 'res_id': active_id,
- 'approval_user_notice': self.approval_user_notice.name,
- 'approval_user_id': self.env.user.id,
- 'approval_user_datetime': fields.datetime.now(),
- # 'approval_user_sign': self.approval_user_sign,
- 'approval_notice_state': self.approval_notice_state,
- })
- wkf_btn_obj = self.env["soong.workflow.node.button"]
- btn_rec = wkf_btn_obj.search([("btn_key", "=", self.env.context.get("btn_key", False))])
- if btn_rec:
- # todo 更改业务数据的状态,成品不建议这样玩
- try:
- obj = self.env[active_model].browse(active_id)
- if obj.exists():
- if self.approval_notice_state == '1':
- obj.write({'statu': 'done'})
- elif self.approval_notice_state == '2':
- obj.write({'statu': 'stop'})
- except Exception as e:
- # todo 可以记录一下日志,但用处不大
- pass
- btn_rec.link_id.trigger_link()
diff --git a/soong_workflow/wizard/approval_notice_wizard_views.xml b/soong_workflow/wizard/approval_notice_wizard_views.xml
deleted file mode 100644
index 256841804..000000000
--- a/soong_workflow/wizard/approval_notice_wizard_views.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
- 审批意见弹窗
- soong.approval.notice.wizard
-
-
-
-
-
- 审批意见弹窗
- ir.actions.act_window
- soong.approval.notice.wizard
- form
- new
-
- {"default_approval_notice_state": '0'}
-
-
-
- 审批通过弹窗
- ir.actions.act_window
- soong.approval.notice.wizard
- form
- new
-
- {"default_approval_notice_state": '1'}
-
-
-
- 审批拒绝弹窗
- ir.actions.act_window
- soong.approval.notice.wizard
- form
- new
-
- {"default_approval_notice_state": '2'}
-
-
-
\ No newline at end of file
diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard.py b/soong_workflow/wizard/soong_workflow_comment_wizard.py
index 8455b71f6..f4d0bd129 100644
--- a/soong_workflow/wizard/soong_workflow_comment_wizard.py
+++ b/soong_workflow/wizard/soong_workflow_comment_wizard.py
@@ -5,6 +5,11 @@ from odoo import fields, models, api
from odoo.exceptions import UserError, ValidationError
+class SoongApprovalNoticeWizard(models.TransientModel):
+ _name = "soong.approval.notice.wizard"
+ _description = "Soong Workflow Comment Wizard"
+
+
class SoongWorkflowCommentWizard(models.TransientModel):
_name = "soong.workflow.comment.wizard"
_description = "Soong Workflow Comment Wizard"
@@ -23,42 +28,18 @@ class SoongWorkflowCommentWizard(models.TransientModel):
trans_link_id = fields.Many2one('trans.link', string='转交节点')
return_link_id = fields.Many2one('trans.link', string='退回节点')
- send_type = fields.Selection([('send', '分发'), ('super', '督办')], default='send', string="动作类型")
- department_id = fields.Many2one('hr.department', string="承办部门")
- start_date = fields.Date(string="开始日期", default=fields.Date.today())
- end_date = fields.Date(string="结束日期")
-
- department_ids = fields.Many2many('hr.department', string='部门范围')
- employee_ids = fields.Many2many('hr.employee', string='人员范围')
- users_role_ids = fields.Many2many('soong.user.role', string='角色范围')
- approval_users_ids = fields.Many2many('res.users', string="传阅/督办人员", compute="compute_approval_users_ids", store=True)
+ employee_ids = fields.Many2many('hr.employee', 'employee_ids_rel',
+ 'custom_id', 'employee_id',
+ string="传阅人员", store=True)
+ circulated_employee_ids = fields.Many2many('hr.employee', 'circulated_employee_rel',
+ 'custom_id', 'employee_id',
+ string="传阅人员", store=True)
+ supervising_employee_ids = fields.Many2many('hr.employee', 'supervising_employee_rel',
+ 'custom_id', 'employee_id',
+ string="督办人员", store=True)
is_automatic = fields.Boolean('是否自动识别')
- @api.depends('department_ids', 'employee_ids', 'users_role_ids')
- def compute_approval_users_ids(self):
- department_users_list = []
- users_role_list = []
- for users in self:
- if users.department_ids:
- for depart in users.department_ids:
- department_users_data = users.env['hr.employee'].search([('department_id', '=', depart.id.origin)])
- department_users_list = [de.user_id.id for de in department_users_data]
- if depart.child_ids:
- for child in depart.child_ids:
- department_child_users_data = users.env['hr.employee'].search(
- [('department_id', '=', child.id.origin)])
- department_users_list += [de.user_id.id for de in department_child_users_data]
- employee_users_list = users.employee_ids.user_id.ids
- if users.users_role_ids:
- for user_id in users.users_role_ids:
- user_role_data = users.env['hr.employee'].search(
- ['|', ('user_role_id', '=', user_id.id.origin), ('user_role_ids', '=', user_id.id.origin)])
- users_role_list = [ro.user_id.id for ro in user_role_data]
- publish_user_list = department_users_list + employee_users_list + users_role_list
- false_none_list = [x for x in publish_user_list if x != False]
- users.approval_users_ids = [(6, 0, list(set(false_none_list)))]
-
@api.onchange('record_id')
def _onchange_record_id(self):
record_id = self.env[self.res_model].search([('id', '=', self.res_id)])
@@ -115,4 +96,4 @@ class SoongWorkflowCommentWizard(models.TransientModel):
if self.node_btn_name == '加签':
record_id.approval_sign_ids = self.approval_users_ids
- return self.node_btn_id.with_context(cx).run()
+ return self.node_btn_id.with_context(cx).run()
\ No newline at end of file
diff --git a/soong_workflow/wizard/soong_workflow_comment_wizard_view.xml b/soong_workflow/wizard/soong_workflow_comment_wizard_view.xml
index 03a106f68..234ceaadc 100644
--- a/soong_workflow/wizard/soong_workflow_comment_wizard_view.xml
+++ b/soong_workflow/wizard/soong_workflow_comment_wizard_view.xml
@@ -8,7 +8,7 @@
form
-
hr.leave.batch.form
hr.leave.batch
@@ -31,15 +25,12 @@
-
-
-
-
@@ -54,12 +45,8 @@
-
-
-
-
@@ -72,8 +59,6 @@
-
-
-
-
-
+
+
@@ -105,7 +89,6 @@
-
hr.leave.batch
@@ -125,7 +108,6 @@
-
我的休假
hr.leave.batch
@@ -139,10 +121,8 @@
id="hr_holidays.hr_leave_menu_my"
parent="hr_holidays.menu_hr_holidays_my_leaves"
action="hr_leave_batch_action_my"
- sequence="2"
- />
+ sequence="2"/>
-
所有休息时间
hr.leave.batch
@@ -156,8 +136,7 @@
id="hr_holidays.menu_open_department_leave_approve"
parent="hr_holidays.menu_hr_holidays_management"
action="hr_leave_batch_action_all"
- sequence="1"
- />
+ sequence="1"/>
diff --git a/yuthon_holiday/views/假期前端修改.xml b/yuthon_holiday/views/假期前端修改.xml
deleted file mode 100644
index 9cb105523..000000000
--- a/yuthon_holiday/views/假期前端修改.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/yuthon_hr_attendance/models/yuthon_duty_arrangement.py b/yuthon_hr_attendance/models/yuthon_duty_arrangement.py
index 0dcde4d31..4938d7b0f 100644
--- a/yuthon_hr_attendance/models/yuthon_duty_arrangement.py
+++ b/yuthon_hr_attendance/models/yuthon_duty_arrangement.py
@@ -11,8 +11,8 @@ class YuthonDutyArrangement(models.Model):
employee_id = fields.Many2one('hr.employee', string='员工',
domain=lambda self: [('department_id.name', '=', '仓储组')])
- start_time = fields.Datetime(string="开始时间")
- end_time = fields.Datetime(string="结束时间")
+ start_time = fields.Date(string="开始日期")
+ end_time = fields.Date(string="结束日期")
remind = fields.Selection([('fifteen', '提醒-15分钟'), ('thirty', '提醒-30分钟'), ('one_hour', '提醒-1小时'),
('two_hour', '提醒-2小时')], string='提醒')
remarks = fields.Text(string='备注')
diff --git a/源码/源码.js b/源码/源码.js
new file mode 100644
index 000000000..199e503db
--- /dev/null
+++ b/源码/源码.js
@@ -0,0 +1,23 @@
+import {Component, markup, useState} from "@odoo/owl";
+// odoo\addons\web\static\src\views\view_dialogs\select_create_dialog.js
+export class SelectCreateDialog extends Component {
+ setup() {
+ this.viewService = useService("view");
+ this.dialogService = useService("dialog");
+ this.state = useState({ resIds: [] });
+ // ℹ️ `_t` can only be inlined directly inside JS template literals
+ // after Babel has been updated to version 2.12.
+ const translatedText = _t("No records found!");
+ this.busy = false; // flag used to ensure we only call once the onSelected/onUnselect props
+ this.baseViewProps = {
+ display: { searchPanel: true }, // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ editable: false, // readonly
+ noBreadcrumbs: true,
+ noContentHelp: markup(`${escape(translatedText)}
`),
+ showButtons: false,
+ selectRecord: (resId) => this.select([resId]),
+ onSelectionChanged: (resIds) => {
+ this.state.resIds = resIds;
+ },
+ };
+ }
\ No newline at end of file
diff --git a/源码/源码.py b/源码/源码.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/源码/源码.xml b/源码/源码.xml
new file mode 100644
index 000000000..f3cea9089
--- /dev/null
+++ b/源码/源码.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+