ljm 修改备份

This commit is contained in:
李鹏宇
2025-01-02 11:16:24 +08:00
parent c96c060bd6
commit 55c7ee26e4
14 changed files with 320 additions and 50 deletions
+4 -2
View File
@@ -11,7 +11,7 @@
'author': 'zxltwins<email:444713077@qq.com>', 'author': 'zxltwins<email:444713077@qq.com>',
'website': "www.odoo.com", 'website': "www.odoo.com",
'version': '17.0', 'version': '17.0',
"depends": ["base", 'sale'], "depends": ["base",'sale'],
"external_dependencies": {"python": ["mammoth"]}, "external_dependencies": {"python": ["mammoth"]},
"data": [ "data": [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
@@ -22,7 +22,9 @@
], ],
'web.assets_backend': [ 'web.assets_backend': [
'preview_easy/static/src/js/qweb.js', 'preview_easy/static/src/js/qweb.js',
'preview_easy/static/src/xml/qweb.xml' 'preview_easy/static/src/js/preview_many2one.js',
'preview_easy/static/src/xml/qweb.xml',
'preview_easy/static/src/xml/preview_many2one.xml',
], ],
'web.assets_frontend': [ 'web.assets_frontend': [
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

@@ -0,0 +1,148 @@
/** @odoo-module **/
import { registry } from "@web/core/registry";
import { FileInput } from "@web/core/file_input/file_input";
import { useSelectCreate } from "@web/views/fields/relational_utils";
import { many2OneField, Many2OneField } from "@web/views/fields/many2one/many2one_field";
export class PreviewMany2OneField extends Many2OneField {
static template = "preview_easy.Many2OneField";
static components = {
...Many2OneField.components,
FileInput
};
static props = {
...Many2OneField.props,
acceptedFileExtensions: { type: String, optional: true },
showSelectBtn: { type: Boolean, optional: true },
previewType: { type: String, optional: true },
previewString: { type: String, optional: true },
className: { type: String, optional: true },
};
setup() {
super.setup();
const isToMany = false;
this.selectCreate = useSelectCreate({
resModel: this.relation,
activeActions: {create: false, },
onSelected: (resId) => {
const resIds = Array.isArray(resId) ? resId : [resId];
const values = resIds.map((id) => ({ id }));
return this.update(values);
},
onCreateEdit: ({ context }) => this.openMany2X({ context }),
onUnselect: isToMany ? undefined : () => this.update(),
});
}
async onFileUploaded(files) {
for (const file of files) {
if (file.error) {
return this.notification.add(file.error, {
title: _t("Uploading error"),
type: "danger",
});
}
await this.update([{id: file.id, display_name: file.filename}]);
}
}
async onFileRemove(deleteId) {
await this.update(false);
}
get uploadText() {
return this.props.record.fields[this.props.name].string;
}
// 获取文件
getFile() {
const jsonData = {
id: Math.floor(Math.random() * 1000 * 1000 * 1000),
jsonrpc: "2.0",
method: "call",
params: {
args: [
[this.resId],
["id", "name", "mimetype"]
],
kwargs: {
context: this.context,
},
method: "read",
model: this.relation,
}
};
let file;
$.ajax({
url: "/web/dataset/call_kw/ir.attachment/read",
method: "POST",
dataType: 'json',
async: false, // 设置为同步请求
beforeSend: (xhr) => {xhr.setRequestHeader('Content-Type', 'application/json');},
data : JSON.stringify(jsonData),
success: (result) => {
file = result.result[0];
}
})
return file;
}
getUrl(id) {
return "/web/content/" + id + "?download=true";
}
preview_Obj(id, name) {
var winStr = 'height=600,width=1000,top=' + (screen.height - 600) / 2 + ',left=' + (screen.width - 1000) / 2 + ',toolbar=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=no,location=no';
var newWin = window.open('/web/content/preview/'+ id , name, winStr);
newWin.focus();
}
getExtension(file) {
return file.name.replace(/^.*\./, "");
}
async onExternalBtnClick() {
const domain = this.getDomain();
this.selectCreate({
domain,
context: this.props.record.context,
filters: [],
title: "Search",
});
}
get documentsInstalled() {
try {
const result = $.ajax({
url: "/web/document_module/installed",
type: "POST",
async: false, // 设置为 false 表示同步请求
contentType: "application/json",
data: "{}"
});
return result?.responseJSON?.result?.installed;
} catch (error) {
console.error('Error fetching document installed status:', error);
return false; // 或者其他默认值
}
}
}
export const previewMany2OneField = {
...many2OneField,
component: PreviewMany2OneField,
extractProps({ attrs, context, decorations, options, string }, dynamicInfo) {
const result = many2OneField.extractProps.apply(this, arguments);
return {
...result,
acceptedFileExtensions: options.accepted_file_extensions,
showSelectBtn: options.show_select_btn === undefined ? true : options.show_select_btn,
previewType: options.preview_type,
previewString: options.preview_string,
className: attrs.class,
};
},
};
registry.category("fields").add("preview_many2one", previewMany2OneField);
+5
View File
@@ -0,0 +1,5 @@
.o_field_preview_many2many {
.oe_add {
}
}
@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates xml:space="preserve">
<t t-name="preview_easy.Many2OneField">
<t t-if="props.readonly">
<t t-call="preview_easy.Many2OneFieldPreview"/>
</t>
<t t-else="">
<!-- 如果存在文件显示预览按钮,如果不存在文件,显示上传选择按钮 -->
<t t-if="resId">
<div class="oe_add">
<t t-call="preview_easy.Many2OneFieldPreview"/>
<FileInput
acceptedFileExtensions="props.acceptedFileExtensions"
multiUpload="true"
onUpload.bind="onFileUploaded"
resModel="props.record.resModel"
resId="props.record.resId or 0"
>
<button class="btn btn-secondary o_attach" data-tooltip="Attach">
<span class="fa fa-paperclip" aria-label="Attach"/>
<t t-esc="uploadText"/>
</button>
</FileInput>
<button t-if="documentsInstalled and props.showSelectBtn" class="btn btn-secondary o_attach" t-on-click="onExternalBtnClick" data-tooltip="Attach">
<i class="fa fa-folder-open-o"/>
选择文件
</button>
</div>
</t>
<t t-else="">
<div class="oe_add">
<FileInput
acceptedFileExtensions="props.acceptedFileExtensions"
multiUpload="true"
onUpload.bind="onFileUploaded"
resModel="props.record.resModel"
resId="props.record.resId or 0"
>
<button class="btn btn-secondary o_attach" data-tooltip="Attach">
<span class="fa fa-paperclip" aria-label="Attach"/>
<t t-esc="uploadText"/>
</button>
</FileInput>
<button t-if="documentsInstalled and props.showSelectBtn" class="btn btn-secondary o_attach" t-on-click="onExternalBtnClick" data-tooltip="Attach">
<i class="fa fa-folder-open-o"/>
选择文件
</button>
</div>
</t>
</t>
</t>
<t t-name="preview_easy.Many2OneFieldPreview" owl="1">
<t t-set="editable" t-value="!props.readonly"/>
<t t-set="file" t-value="getFile()"/>
<!-- 预览按钮 -->
<t t-if="props.previewType and props.previewType === 'button'">
<button class="btn btn-secondary o_attach" t-on-click.stop="() => this.preview_Obj()" data-tooltip="Attach">
<i class="fa fa-eye"/>
<span t-if="props.previewString" t-out="props.previewString"/>
<span t-else="" t-out="'预览文件'"/>
</button>
</t>
<t t-else="">
<div t-attf-class="o_attachment o_attachment_many2many #{ editable ? 'o_attachment_editable' : '' } #{upload ? 'o_attachment_uploading' : ''}" t-att-title="file.name">
<div class="o_attachment_wrap">
<t t-set="ext" t-value="getExtension(file)"/>
<t t-set="url" t-value="getUrl(file.id)"/>
<div class="o_image_box float-start" t-att-data-tooltip="'Preview ' + file.name">
<span class="o_image o_hover" t-on-click.stop="() => this.preview_Obj(file.id,file.name)" t-att-data-mimetype="file.mimetype" t-att-data-ext="ext" role="img"/>
</div>
<div class="caption">
<a class="ml4" t-att-data-tooltip="'Download ' + file.name" t-att-href="getUrl(file.id)"><t t-esc='file.name'/></a>
</div>
<div class="caption small">
<a class="ml4 small text-uppercase" t-att-href="getUrl(file.id)"><b><t t-esc='ext'/></b></a>
<div t-if="editable" class="progress o_attachment_progress_bar">
<div class="progress-bar progress-bar-striped active" style="width: 100%">Uploading</div>
</div>
</div>
<div class="o_attachment_uploaded"><i class="text-success fa fa-check" role="img" aria-label="Uploaded" title="Uploaded"/></div>
<div t-if="editable" class="o_attachment_delete" t-on-click.stop="() => this.onFileRemove(file.id)"><span class="text-white" role="img" aria-label="Delete" title="Delete">×</span></div>
</div>
</div>
</t>
</t>
</templates>
+2
View File
@@ -8,8 +8,10 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="after"> <xpath expr="//field[@name='partner_id']" position="after">
<field name="attachment_ids" widget="preview_many2many"/> <field name="attachment_ids" widget="preview_many2many"/>
<!-- <field name="attachment_ids" widget="many2many_tags"/> -->
</xpath> </xpath>
</field> </field>
</record> </record>
</data> </data>
</odoo> </odoo>
@@ -35,11 +35,11 @@ class YuthonHrEmployeeWizard(models.Model):
def employee_user_data(self, row): def employee_user_data(self, row):
employee_name = self.env['hr.employee'].search([('name', '=', row[0].value)]) employee_name = self.env['hr.employee'].search([('name', '=', row[0].value)])
date1 = pd.to_datetime(row[1].value, unit='d', origin='1899-12-30') # date1 = pd.to_datetime(row[1].value, unit='d', origin='1899-12-30')
month2 = row[2].value # month2 = row[2].value
employee_date = { employee_date = {
'open_start_time': date1, 'work_email': row[1].value,
'interrupt_work_month': month2, # 'interrupt_work_month': month2,
} }
if employee_name: if employee_name:
employee_name.write(employee_date) employee_name.write(employee_date)
+11 -12
View File
@@ -33,14 +33,15 @@
<div class="row justify-content-between position-relative w-100 m-0 mb-2"> <div class="row justify-content-between position-relative w-100 m-0 mb-2">
<div class="col-6 oe_title mw-75 ps-0 pe-2"> <div class="col-6 oe_title mw-75 ps-0 pe-2">
<h1 class="d-flex flex-row align-items-center"> <h1 class="d-flex flex-row align-items-center">
<field name="name" placeholder="资产名称" /> <field name="name" placeholder="资产名称"/>
</h1> </h1>
<h2> <h2>
<field name="referred_id" placeholder="地段" /> <field name="referred_id" placeholder="地段"/>
</h2> </h2>
</div> </div>
<div class="col-6 o_employee_avatar m-0 p-0"> <div class="col-6 o_employee_avatar m-0 p-0">
<field name="image_1920" widget="image" class="oe_avatar" optional="{'preview_image': 'image_128'}" /> <field name="image_1920" widget="image" class="oe_avatar"
optional="{'preview_image': 'image_128'}"/>
</div> </div>
</div> </div>
</div> </div>
@@ -75,7 +76,7 @@
<field name="is_done_merge" invisible="1"/> <field name="is_done_merge" invisible="1"/>
</group> </group>
</group> </group>
<group col="2"> <group>
<group> <group>
<field name="life_timer"/> <field name="life_timer"/>
<field name="effective_date"/> <field name="effective_date"/>
@@ -86,17 +87,15 @@
<field name="end_date"/> <field name="end_date"/>
</group> </group>
</group> </group>
<group col="3"> <group>
<group>
<field name="is_electricity_meter"/>
<field name="electricity_id" invisible="not is_electricity_meter"/>
</group>
<group> <group>
<field name="is_electricity_meter"/>
<field name="is_meter"/> <field name="is_meter"/>
<field name="meter_id" invisible="not is_meter"/> <field name="is_message_fee"/>
</group> </group>
<group> <group>
<field name="is_message_fee"/> <field name="electricity_id" invisible="not is_electricity_meter"/>
<field name="meter_id" invisible="not is_meter"/>
<field name="message_standard_id" invisible="not is_message_fee"/> <field name="message_standard_id" invisible="not is_message_fee"/>
</group> </group>
</group> </group>
@@ -171,7 +170,7 @@
<field name="water_meter_ids"> <field name="water_meter_ids">
<tree editable="bottom"> <tree editable="bottom">
<field name="yuthon_property_id" column_invisible="1"/> <field name="yuthon_property_id" column_invisible="1"/>
<field name="property_meter_water_id" /> <field name="property_meter_water_id"/>
<field name="rate"/> <field name="rate"/>
<field name="standard"/> <field name="standard"/>
<field name="installation_date"/> <field name="installation_date"/>
@@ -111,7 +111,7 @@ class PropertyLeaseContract(models.Model):
legal_entity_id = fields.Many2one('ir.attachment', string="法人身份证") legal_entity_id = fields.Many2one('ir.attachment', string="法人身份证")
power_attorney_id = fields.Many2one('ir.attachment', string="授权委托书") power_attorney_id = fields.Many2one('ir.attachment', string="授权委托书")
handle_cards_id = fields.Many2one('ir.attachment', string="经办人身份证") handle_cards_id = fields.Many2one('ir.attachment', string="经办人身份证")
confirmation_transaction_id = fields.Many2one('ir.attachment', string="成交确认书)") confirmation_transaction_id = fields.Many2one('ir.attachment', string="成交确认书")
responsibility_book_id = fields.Many2one('ir.attachment', string="安全生产责任书") responsibility_book_id = fields.Many2one('ir.attachment', string="安全生产责任书")
contract_time = fields.Date(string="合同签订日期") contract_time = fields.Date(string="合同签订日期")
handover_time = fields.Date(string="交接日期") handover_time = fields.Date(string="交接日期")
@@ -23,8 +23,10 @@
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="物业合同管理"> <form string="物业合同管理">
<header> <header>
<button name="action_generate_rental_charges" class="oe_link btn btn-primary" type="object" string="生成租金费用"/> <button name="action_generate_rental_charges" class="oe_link btn btn-primary" type="object"
<button name="action_generate_administrative_expenses" class="oe_link btn btn-primary" type="object" string="生成管理费用"/> string="生成租金费用"/>
<button name="action_generate_administrative_expenses" class="oe_link btn btn-primary" type="object"
string="生成管理费用"/>
</header> </header>
<sheet> <sheet>
<group> <group>
@@ -33,27 +35,28 @@
<notebook> <notebook>
<page string="物业列表"> <page string="物业列表">
<field name="lease_ids" string=" "> <field name="lease_ids" string=" ">
<tree editable="bottom"> <tree editable="bottom">
<field name="lease_id" column_invisible="1"/> <field name="lease_id" column_invisible="1"/>
<field name="address_id"/> <field name="address_id"/>
<field name="property_area"/> <field name="property_area"/>
<field name="evaluate_unit_price"/> <field name="evaluate_unit_price"/>
</tree> </tree>
</field> </field>
</page> </page>
<page string="租金明细"> <page string="租金明细">
<button name="action_generate_details" class="oe_link btn btn-primary" type="object" string="生成明细"/> <button name="action_generate_details" class="oe_link btn btn-primary" type="object"
string="生成明细"/>
<field name="breakdown_ids" string=" "> <field name="breakdown_ids" string=" ">
<tree editable="bottom"> <tree editable="bottom">
<field name="breakdown_id" column_invisible="1"/> <field name="breakdown_id" column_invisible="1"/>
<field name="charges"/> <field name="charges"/>
<field name="unit_price"/> <field name="unit_price"/>
<field name="monthly_amount"/> <field name="monthly_amount"/>
<field name="start_data"/> <field name="start_data"/>
<field name="end_data"/> <field name="end_data"/>
<field name="month_number"/> <field name="month_number"/>
<field name="period_rent"/> <field name="period_rent"/>
</tree> </tree>
</field> </field>
</page> </page>
<page string="其他费用"> <page string="其他费用">
@@ -73,7 +76,7 @@
<field name="card_id"/> <field name="card_id"/>
<field name="legal_entity_id"/> <field name="legal_entity_id"/>
<field name="confirmation_transaction_id"/> <field name="confirmation_transaction_id"/>
<field name="handover_time"/> <field name="handover_time"/>
</group> </group>
<group> <group>
<field name="power_attorney_id"/> <field name="power_attorney_id"/>
@@ -108,8 +111,8 @@
</group> </group>
</group> </group>
<group> <group>
<field name="contract_time" invisible="1"/> <field name="contract_time" invisible="1"/>
<field name="property_documents_ids" widget="many2many_tags" invisible="1"> <field name="property_documents_ids" widget="many2many_tags" invisible="1">
<tree> <tree>
<field name="name"/> <field name="name"/>
</tree> </tree>
@@ -138,7 +141,7 @@
日 日
</div> </div>
<field name="first_pay"/> <field name="first_pay"/>
<field name="total_area" /> <field name="total_area"/>
<field name="expected_reminders"/> <field name="expected_reminders"/>
<field name="contract_type"/> <field name="contract_type"/>
</group> </group>
@@ -155,7 +158,7 @@
<field name="first_years_begin"/> <field name="first_years_begin"/>
<field name="increments_every_few_years"/> <field name="increments_every_few_years"/>
<field name="admin_id" invisible="1"/> <field name="admin_id" invisible="1"/>
<field name="increment_method"/> <field name="increment_method"/>
<field name="increment_percentage" invisible="increment_method != 'percentage'"/> <field name="increment_percentage" invisible="increment_method != 'percentage'"/>
<field name="increment_price" invisible="increment_method != 'increment_price'"/> <field name="increment_price" invisible="increment_method != 'increment_price'"/>
<field name="increment_amount" invisible="increment_method != 'increment_amount'"/> <field name="increment_amount" invisible="increment_method != 'increment_amount'"/>
@@ -220,6 +223,24 @@
</field> </field>
</record> </record>
<!-- <record id="property_lease_contract_search" model="ir.ui.view">-->
<!-- <field name="name">property.lease.contract.search</field>-->
<!-- <field name="model">property.lease.contract.type</field>-->
<!-- <field name="arch" type="xml">-->
<!-- <search>-->
<!-- 所属公司,权属人,片区,物业信息-->
<!-- <field name="company_id"/> 禁用company_id -->
<!-- <field name="company_id"/>-->
<!-- <field name="company_id"/>-->
<!-- <searchpanel>-->
<!-- <field name="decision_type_id"/>-->
<!-- <field name="decision_type_id"/>-->
<!-- <field name="decision_type_id"/>-->
<!-- </searchpanel>-->
<!-- </search>-->
<!-- </field>-->
<!-- </record>-->
<record id="property_lease_contract_action" model="ir.actions.act_window"> <record id="property_lease_contract_action" model="ir.actions.act_window">
<field name="name">租赁合同审批</field> <field name="name">租赁合同审批</field>
<field name="res_model">property.lease.contract</field> <field name="res_model">property.lease.contract</field>
@@ -91,7 +91,6 @@ class PropertyContractWizard(models.Model):
'lessee_id':lessee_id.id, 'lessee_id':lessee_id.id,
'percentage_liquidated_damages':percentage_liquidated_damages.id, 'percentage_liquidated_damages':percentage_liquidated_damages.id,
} }
property_contract_id = self.env['property.lease.contract'].create(contract_date) property_contract_id = self.env['property.lease.contract'].create(contract_date)
management_list = [] management_list = []
management_list.append((0, 0, { management_list.append((0, 0, {
+8 -5
View File
@@ -20,7 +20,10 @@ class YuthonWillTask(models.Model):
task_content = fields.Text(string='任务内容') task_content = fields.Text(string='任务内容')
remarks = fields.Text(string='备注') remarks = fields.Text(string='备注')
creation_time = fields.Date(string='创建时间') creation_time = fields.Date(string='创建时间')
employee_ids = fields.Many2many('hr.employee', string='人员', default=lambda self: self.env.user.employee_id) employee_ids = fields.Many2many('hr.employee', 'will_task_employee_rel', 'custom_id', 'employee_id',
string='人员', default=lambda self: self.env.user.employee_id)
employee_ids2 = fields.Many2many('hr.employee', 'will_task_employee_rel2',
'custom_id', 'employee_id', string='司机', store=True)
users_ids = fields.Many2many('res.users', string='用户') users_ids = fields.Many2many('res.users', string='用户')
user_role_ids = fields.Many2many('soong.user.role', string='角色') user_role_ids = fields.Many2many('soong.user.role', string='角色')
task_time_ids = fields.Many2many('yuthon.task.time', string='提醒') task_time_ids = fields.Many2many('yuthon.task.time', string='提醒')
@@ -28,7 +31,7 @@ class YuthonWillTask(models.Model):
start_time = fields.Datetime(string='开始时间', default=fields.Date.today()) start_time = fields.Datetime(string='开始时间', default=fields.Date.today())
end_time = fields.Datetime(string='结束时间', default=lambda self: datetime.combine(datetime.now().date(), time(11, 0, 0))) end_time = fields.Datetime(string='结束时间', default=lambda self: datetime.combine(datetime.now().date(), time(11, 0, 0)))
state = fields.Selection([('will', '待办'), ('done', '已办'), ('cancel', '取消')], default='will', string='状态', store=True) state = fields.Selection([('will', '待办'), ('done', '已办'), ('cancel', '取消')], default='will', string='状态', store=True)
employee_id = fields.Many2one('hr.employee', string='司机')
def read_number(self): def read_number(self):
return self.search_count([('state', '=', 'will'), ('users_ids', 'in', self.env.user.id)]) return self.search_count([('state', '=', 'will'), ('users_ids', 'in', self.env.user.id)])
@@ -77,7 +80,7 @@ class YuthonWillTask(models.Model):
def add_comment(self): def add_comment(self):
self.ensure_one() self.ensure_one()
employee_list = [i.id for i in self.employee_ids] + [self.employee_id.id] employee_list = [i.id for i in self.employee_ids] + [i.id for i in self.employee_ids2]
for employee_id in self.env['hr.employee'].search([('id', 'in', employee_list)]): for employee_id in self.env['hr.employee'].search([('id', 'in', employee_list)]):
if not employee_id.wecom_userid: if not employee_id.wecom_userid:
raise UserError("请同步{}的企业微信".format(employee_id.name)) raise UserError("请同步{}的企业微信".format(employee_id.name))
@@ -85,7 +88,7 @@ class YuthonWillTask(models.Model):
data_name = "事项名称: " + self.task_content + '\n' data_name = "事项名称: " + self.task_content + '\n'
data_start_time = '开始时间:' + str(self.start_time + timedelta(hours=8)) + '\n' data_start_time = '开始时间:' + str(self.start_time + timedelta(hours=8)) + '\n'
data_user_ids = '参与人: ' + ', '.join(self.employee_ids.mapped('name')) + '\n' data_user_ids = '参与人: ' + ', '.join(self.employee_ids.mapped('name')) + '\n'
data_employee_id = ('司机:' + self.employee_id.name) if self.employee_id.name else ('') + '\n' data_employee_id = ('司机:' + ', '.join(self.employee_ids2.mapped('name')) + '\n') if self.employee_ids2 else ''
data_nota = ('备注:' + self.remarks) if self.remarks else ('') + '\n' data_nota = ('备注:' + self.remarks) if self.remarks else ('') + '\n'
data = data_name + data_start_time + data_user_ids + data_nota + data_employee_id data = data_name + data_start_time + data_user_ids + data_nota + data_employee_id
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='task', user_id=employee_id.wecom_userid, self.sudo().env["wecom.apps"].sync_send_message_textcard(category='task', user_id=employee_id.wecom_userid,
@@ -109,7 +112,7 @@ class YuthonWillTask(models.Model):
def button_add_comment_cancel(self): def button_add_comment_cancel(self):
self.write({'state': 'cancel'}) self.write({'state': 'cancel'})
employee_list = [i.id for i in self.employee_ids] + [self.employee_id.id] employee_list = [i.id for i in self.employee_ids] + [i.id for i in self.employee_ids2]
for employee_id in self.env['hr.employee'].search([('id', 'in', employee_list)]): for employee_id in self.env['hr.employee'].search([('id', 'in', employee_list)]):
if not employee_id.wecom_userid: if not employee_id.wecom_userid:
raise UserError("请同步{}的企业微信".format(employee_id.name)) raise UserError("请同步{}的企业微信".format(employee_id.name))
@@ -20,7 +20,7 @@
<field name='users_ids' widget="many2many_tags" optional="hide"/> <field name='users_ids' widget="many2many_tags" optional="hide"/>
<field name='user_role_ids' widget="many2many_tags" optional="hide"/> <field name='user_role_ids' widget="many2many_tags" optional="hide"/>
<field name='yuthon_company' optional="hide"/> <field name='yuthon_company' optional="hide"/>
<field name='employee_id' domain="[('user_role_ids.name', 'in', ['司机'])]"/> <field name='employee_ids2' widget="many2many_tags" domain="[('user_role_ids.name', 'in', ['司机'])]"/>
<field name='state'/> <field name='state'/>
<button name="button_add_comment" string="提醒" type="object" class="oe_highlight" invisible="state == 'cancel'"/> <button name="button_add_comment" string="提醒" type="object" class="oe_highlight" invisible="state == 'cancel'"/>
<button name="button_add_comment_cancel" string="取消" type="object" class="oe_highlight" invisible="state == 'cancel'"/> <button name="button_add_comment_cancel" string="取消" type="object" class="oe_highlight" invisible="state == 'cancel'"/>