From 6c339b386b3425da875e48d377e9fff424072ab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= Date: Fri, 20 Jun 2025 15:00:54 +0800 Subject: [PATCH 1/4] 1 --- attendance_iot/controllers/kaoqin_test.py | 3 +- .../static/src/xml/preview_many2one.xml | 2 +- .../controllers/applet_attendance.py | 67 +++++++++++-------- 3 files changed, 41 insertions(+), 31 deletions(-) diff --git a/attendance_iot/controllers/kaoqin_test.py b/attendance_iot/controllers/kaoqin_test.py index 0c45f1ad3..befd9a558 100644 --- a/attendance_iot/controllers/kaoqin_test.py +++ b/attendance_iot/controllers/kaoqin_test.py @@ -76,8 +76,7 @@ class BusController(Controller): if not iot_device: request.env(user=SUPERUSER_ID)["attendance.iot"].create({'name': sn}) iot_users = request.env(user=SUPERUSER_ID)['attendance.iot.user'].search([('employee_id', '=', employee.id)]) - employee.write({'image_1920': urllib.parse.unquote(vl_photo)}) - # 2025-06-17 08:35:41,017 12200 WARNING 2561223 odoo.http: 该文件无法作为图像文件解码。 + employee.write({'image_1920': base64.b64encode(urllib.parse.unquote(vl_photo))}) if not iot_users: request.env(user=SUPERUSER_ID)['attendance.iot.user'].create({ 'employee_id': employee.id, diff --git a/preview_easy/static/src/xml/preview_many2one.xml b/preview_easy/static/src/xml/preview_many2one.xml index f14fd1496..89e5c2ffb 100644 --- a/preview_easy/static/src/xml/preview_many2one.xml +++ b/preview_easy/static/src/xml/preview_many2one.xml @@ -54,7 +54,7 @@ - + + + + + + + + + + \ No newline at end of file diff --git a/oo_list_manager/static/src/views/list/list_renderer.js b/oo_list_manager/static/src/views/list/list_renderer.js new file mode 100644 index 000000000..01f08b46b --- /dev/null +++ b/oo_list_manager/static/src/views/list/list_renderer.js @@ -0,0 +1,147 @@ +/** @odoo-module **/ + +import {ListRenderer} from "@web/views/list/list_renderer"; +import {patch} from "@web/core/utils/patch"; +import {loadJS, loadCSS} from "@web/core/assets"; +import {ListRendererCust} from "@tree_view_advanced_filter/tree_view_advanced_filter/tree" + +patch(ListRenderer.prototype, { + setup() { + super.setup(); + if(this.isX2Many) { + this.props.ooManagerSerialNum = true; + } + }, + + getActiveColumns(list) { + if (this.props.ooManagerColumns) { + const columns = this.allColumns.filter((col) => { + if (list.isGrouped && col.widget === "handle") { + return false; // no handle column if the list is grouped + } + const mColumn = this.props.ooManagerColumns.find(item => item.id === col.id) + if (mColumn) { + return mColumn.visibility; + } + if (col.optional && !this.optionalActiveFields[col.name]) { + return false; + } + if (this.evalColumnInvisible(col.column_invisible)) { + return false; + } + return true; + }); + + columns.sort((x, y) => { + const seqX = this.props.ooManagerColumns.find(item => item.id === x.id)?.seq || 0; + const seqY = this.props.ooManagerColumns.find(item => item.id === y.id)?.seq || 0; + return seqX - seqY; + }); + + return columns + + } else { + return super.getActiveColumns(list); + } + }, + + freezeColumnWidths() { + super.freezeColumnWidths(); + const table = this.tableRef.el; + const headers = [...table.querySelectorAll("thead th:not(.o_list_actions_header)")]; + + headers.forEach((th, index) => { + th.style.minWidth = `${Math.floor(this.columnWidths[index])}px`; + }); + }, + + /** + * 宽度 + * @param allowedWidth + * @returns {*} + */ + computeColumnWidthsFromContent(allowedWidth) { + const columnWidths = super.computeColumnWidthsFromContent(allowedWidth); + if (!this.props.ooManagerColumns) return columnWidths; + const table = this.tableRef.el; + + // Toggle a className used to remove style that could interfere with the ideal width + // computation algorithm (e.g. prevent text fields from being wrapped during the + // computation, to prevent them from being completely crushed) + table.classList.add("o_list_computing_widths"); + + const headers = [...table.querySelectorAll("thead th")]; + + headers.forEach((th, index) => { + const id = th.getAttribute('data-id'); + const mColumn = this.props.ooManagerColumns.find(item => item.id === id) + if (mColumn && mColumn.width) { + columnWidths[index] = mColumn.width; + } + }); + + // We are no longer computing widths, so restore the normal style + table.classList.remove("o_list_computing_widths"); + return columnWidths; + }, + + /** + * 样式 + * @param column + * @returns {string} + */ + getColumnStyle(column) { + if (!this.props.ooManagerColumns) return ''; + const mColumn = this.props.ooManagerColumns.find(item => item.id === column.id); + if (mColumn && mColumn.color) { + return 'color: ' + mColumn.color; + } else { + return ''; + } + }, + + _renderSearchPanel: async function () { + if (this.isX2Many) { + return ListRendererCust._renderSearchPanel.call(this); + } + if (!this.props.archInfo.advanced_filter) { + $('.o_filter_box').remove(); + } else { + await loadJS("/tree_view_advanced_filter/static/src/libs/daterangepicker.min.js"); + await loadCSS("/tree_view_advanced_filter/static/src/libs/daterangepicker.css"); + await loadJS("/tree_view_advanced_filter/static/src/libs/moment/moment.min.js"); + var List = this.props.list; + const bm_params = List.model.__bm_load_params__; + const rootRef = this.rootRef.el + const tableRef = this.tableRef.el; + tableRef.removeAttribute('style') + const columns = this.getActiveColumns(this.props.list); + + var $tr1 = $('', {class: 'o_filter_box'}).append(columns.map(columns => this._renderHeaderCellSearch(columns))); + // 添加行号占位td + $tr1.prepend($('').addClass('web_list_num')); + if (this.hasSelectors) { + $tr1.prepend($('').addClass('o_list_record_selector')); + } + + if (this.isStudioEditable || this.displayOptionalFields) { + $tr1.append($('').addClass('o_list_record_selector')); + } + + if ($(tableRef).find('.search_td').length) { + $(tableRef).find('.search_td').parent().replaceWith($tr1) + } else { + $tr1.insertAfter($(tableRef).find('tr')[0]); + } + + rootRef.querySelectorAll('thead tr td.search_td input').forEach((a) => a.addEventListener('keyup', this._onfilter.bind(this))); + rootRef.querySelectorAll('.search_button').forEach((a) => a.addEventListener('click', this._onSearch.bind(this))); + rootRef.querySelectorAll('.remove_button').forEach((a) => a.addEventListener('click', this._onRemove.bind(this))); + rootRef.querySelectorAll('thead tr td').forEach((a) => a.addEventListener('keypress', this._onKeyPress.bind(this))); + } + } +}) + +ListRenderer.props.push('ooManagerColumns?') +ListRenderer.props.push('ooManagerFilter?') +ListRenderer.props.push('ooManagerSerialNum?') diff --git a/oo_list_manager/static/src/views/list/list_renderer.xml b/oo_list_manager/static/src/views/list/list_renderer.xml new file mode 100644 index 000000000..4f4c4eac3 --- /dev/null +++ b/oo_list_manager/static/src/views/list/list_renderer.xml @@ -0,0 +1,57 @@ + + + + + + column.id + getColumnStyle(column) + + + + + # + + + + + + + + + + + + getColumnStyle(column) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file