ljm 修改备份
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
'author': 'zxltwins<email:444713077@qq.com>',
|
||||
'website': "www.odoo.com",
|
||||
'version': '17.0',
|
||||
"depends": ["base", 'sale'],
|
||||
"depends": ["base",'sale'],
|
||||
"external_dependencies": {"python": ["mammoth"]},
|
||||
"data": [
|
||||
'security/ir.model.access.csv',
|
||||
@@ -22,7 +22,9 @@
|
||||
],
|
||||
'web.assets_backend': [
|
||||
'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': [
|
||||
|
||||
|
||||
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);
|
||||
@@ -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>
|
||||
@@ -8,8 +8,10 @@
|
||||
<field name="arch" type="xml">
|
||||
<xpath expr="//field[@name='partner_id']" position="after">
|
||||
<field name="attachment_ids" widget="preview_many2many"/>
|
||||
<!-- <field name="attachment_ids" widget="many2many_tags"/> -->
|
||||
</xpath>
|
||||
</field>
|
||||
</record>
|
||||
</data>
|
||||
|
||||
</odoo>
|
||||
@@ -35,11 +35,11 @@ class YuthonHrEmployeeWizard(models.Model):
|
||||
|
||||
def employee_user_data(self, row):
|
||||
employee_name = self.env['hr.employee'].search([('name', '=', row[0].value)])
|
||||
date1 = pd.to_datetime(row[1].value, unit='d', origin='1899-12-30')
|
||||
month2 = row[2].value
|
||||
# date1 = pd.to_datetime(row[1].value, unit='d', origin='1899-12-30')
|
||||
# month2 = row[2].value
|
||||
employee_date = {
|
||||
'open_start_time': date1,
|
||||
'interrupt_work_month': month2,
|
||||
'work_email': row[1].value,
|
||||
# 'interrupt_work_month': month2,
|
||||
}
|
||||
if employee_name:
|
||||
employee_name.write(employee_date)
|
||||
|
||||
@@ -33,14 +33,15 @@
|
||||
<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">
|
||||
<h1 class="d-flex flex-row align-items-center">
|
||||
<field name="name" placeholder="资产名称" />
|
||||
<field name="name" placeholder="资产名称"/>
|
||||
</h1>
|
||||
<h2>
|
||||
<field name="referred_id" placeholder="地段" />
|
||||
<field name="referred_id" placeholder="地段"/>
|
||||
</h2>
|
||||
</div>
|
||||
<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>
|
||||
@@ -75,7 +76,7 @@
|
||||
<field name="is_done_merge" invisible="1"/>
|
||||
</group>
|
||||
</group>
|
||||
<group col="2">
|
||||
<group>
|
||||
<group>
|
||||
<field name="life_timer"/>
|
||||
<field name="effective_date"/>
|
||||
@@ -86,17 +87,15 @@
|
||||
<field name="end_date"/>
|
||||
</group>
|
||||
</group>
|
||||
<group col="3">
|
||||
<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="meter_id" invisible="not is_meter"/>
|
||||
<field name="is_message_fee"/>
|
||||
</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"/>
|
||||
</group>
|
||||
</group>
|
||||
@@ -171,7 +170,7 @@
|
||||
<field name="water_meter_ids">
|
||||
<tree editable="bottom">
|
||||
<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="standard"/>
|
||||
<field name="installation_date"/>
|
||||
|
||||
@@ -111,7 +111,7 @@ class PropertyLeaseContract(models.Model):
|
||||
legal_entity_id = fields.Many2one('ir.attachment', string="法人身份证")
|
||||
power_attorney_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="安全生产责任书")
|
||||
contract_time = fields.Date(string="合同签订日期")
|
||||
handover_time = fields.Date(string="交接日期")
|
||||
|
||||
@@ -23,8 +23,10 @@
|
||||
<field name="arch" type="xml">
|
||||
<form string="物业合同管理">
|
||||
<header>
|
||||
<button name="action_generate_rental_charges" class="oe_link btn btn-primary" type="object" string="生成租金费用"/>
|
||||
<button name="action_generate_administrative_expenses" class="oe_link btn btn-primary" type="object" string="生成管理费用"/>
|
||||
<button name="action_generate_rental_charges" class="oe_link btn btn-primary" type="object"
|
||||
string="生成租金费用"/>
|
||||
<button name="action_generate_administrative_expenses" class="oe_link btn btn-primary" type="object"
|
||||
string="生成管理费用"/>
|
||||
</header>
|
||||
<sheet>
|
||||
<group>
|
||||
@@ -33,27 +35,28 @@
|
||||
<notebook>
|
||||
<page string="物业列表">
|
||||
<field name="lease_ids" string=" ">
|
||||
<tree editable="bottom">
|
||||
<field name="lease_id" column_invisible="1"/>
|
||||
<field name="address_id"/>
|
||||
<field name="property_area"/>
|
||||
<field name="evaluate_unit_price"/>
|
||||
</tree>
|
||||
<tree editable="bottom">
|
||||
<field name="lease_id" column_invisible="1"/>
|
||||
<field name="address_id"/>
|
||||
<field name="property_area"/>
|
||||
<field name="evaluate_unit_price"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
<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=" ">
|
||||
<tree editable="bottom">
|
||||
<field name="breakdown_id" column_invisible="1"/>
|
||||
<field name="charges"/>
|
||||
<field name="unit_price"/>
|
||||
<field name="monthly_amount"/>
|
||||
<field name="start_data"/>
|
||||
<field name="end_data"/>
|
||||
<field name="month_number"/>
|
||||
<field name="period_rent"/>
|
||||
</tree>
|
||||
<tree editable="bottom">
|
||||
<field name="breakdown_id" column_invisible="1"/>
|
||||
<field name="charges"/>
|
||||
<field name="unit_price"/>
|
||||
<field name="monthly_amount"/>
|
||||
<field name="start_data"/>
|
||||
<field name="end_data"/>
|
||||
<field name="month_number"/>
|
||||
<field name="period_rent"/>
|
||||
</tree>
|
||||
</field>
|
||||
</page>
|
||||
<page string="其他费用">
|
||||
@@ -73,7 +76,7 @@
|
||||
<field name="card_id"/>
|
||||
<field name="legal_entity_id"/>
|
||||
<field name="confirmation_transaction_id"/>
|
||||
<field name="handover_time"/>
|
||||
<field name="handover_time"/>
|
||||
</group>
|
||||
<group>
|
||||
<field name="power_attorney_id"/>
|
||||
@@ -108,8 +111,8 @@
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
<field name="contract_time" invisible="1"/>
|
||||
<field name="property_documents_ids" widget="many2many_tags" invisible="1">
|
||||
<field name="contract_time" invisible="1"/>
|
||||
<field name="property_documents_ids" widget="many2many_tags" invisible="1">
|
||||
<tree>
|
||||
<field name="name"/>
|
||||
</tree>
|
||||
@@ -138,7 +141,7 @@
|
||||
日
|
||||
</div>
|
||||
<field name="first_pay"/>
|
||||
<field name="total_area" />
|
||||
<field name="total_area"/>
|
||||
<field name="expected_reminders"/>
|
||||
<field name="contract_type"/>
|
||||
</group>
|
||||
@@ -155,7 +158,7 @@
|
||||
<field name="first_years_begin"/>
|
||||
<field name="increments_every_few_years"/>
|
||||
<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_price" invisible="increment_method != 'increment_price'"/>
|
||||
<field name="increment_amount" invisible="increment_method != 'increment_amount'"/>
|
||||
@@ -220,6 +223,24 @@
|
||||
</field>
|
||||
</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">
|
||||
<field name="name">租赁合同审批</field>
|
||||
<field name="res_model">property.lease.contract</field>
|
||||
|
||||
@@ -91,7 +91,6 @@ class PropertyContractWizard(models.Model):
|
||||
'lessee_id':lessee_id.id,
|
||||
'percentage_liquidated_damages':percentage_liquidated_damages.id,
|
||||
}
|
||||
|
||||
property_contract_id = self.env['property.lease.contract'].create(contract_date)
|
||||
management_list = []
|
||||
management_list.append((0, 0, {
|
||||
|
||||
@@ -20,7 +20,10 @@ class YuthonWillTask(models.Model):
|
||||
task_content = fields.Text(string='任务内容')
|
||||
remarks = fields.Text(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='用户')
|
||||
user_role_ids = fields.Many2many('soong.user.role', 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())
|
||||
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)
|
||||
employee_id = fields.Many2one('hr.employee', string='司机')
|
||||
|
||||
|
||||
def read_number(self):
|
||||
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):
|
||||
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)]):
|
||||
if not employee_id.wecom_userid:
|
||||
raise UserError("请同步{}的企业微信".format(employee_id.name))
|
||||
@@ -85,7 +88,7 @@ class YuthonWillTask(models.Model):
|
||||
data_name = "事项名称: " + self.task_content + '\n'
|
||||
data_start_time = '开始时间:' + str(self.start_time + timedelta(hours=8)) + '\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 = 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,
|
||||
@@ -109,7 +112,7 @@ class YuthonWillTask(models.Model):
|
||||
|
||||
def button_add_comment_cancel(self):
|
||||
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)]):
|
||||
if not employee_id.wecom_userid:
|
||||
raise UserError("请同步{}的企业微信".format(employee_id.name))
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<field name='users_ids' widget="many2many_tags" optional="hide"/>
|
||||
<field name='user_role_ids' widget="many2many_tags" 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'/>
|
||||
<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'"/>
|
||||
|
||||
Reference in New Issue
Block a user