Compare commits
2 Commits
feature/优化
...
feature/还原
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fbf86a69e3 | ||
|
|
f3ec784383 |
@@ -10,9 +10,9 @@
|
|||||||
""",
|
""",
|
||||||
'category': 'sf',
|
'category': 'sf',
|
||||||
'website': 'https://www.sf.jikimo.com',
|
'website': 'https://www.sf.jikimo.com',
|
||||||
'depends': ['web', 'purchase', 'base_setup'],
|
'depends': ['web', 'purchase'],
|
||||||
'data': [
|
'data': [
|
||||||
'views/bye_odoo.xml',
|
|
||||||
],
|
],
|
||||||
'demo': [
|
'demo': [
|
||||||
],
|
],
|
||||||
@@ -23,8 +23,6 @@
|
|||||||
'web.assets_backend': [
|
'web.assets_backend': [
|
||||||
'jikimo_frontend/static/src/fields/custom_many2many_checkboxes/*',
|
'jikimo_frontend/static/src/fields/custom_many2many_checkboxes/*',
|
||||||
'jikimo_frontend/static/src/fields/Many2OneRadioField/*',
|
'jikimo_frontend/static/src/fields/Many2OneRadioField/*',
|
||||||
# 移除odoo相关标识
|
|
||||||
'jikimo_frontend/static/src/bye_odoo/*',
|
|
||||||
'jikimo_frontend/static/src/scss/custom_style.scss',
|
'jikimo_frontend/static/src/scss/custom_style.scss',
|
||||||
# 'jikimo_frontend/static/src/views/list_nums/list_nbCols.js',
|
# 'jikimo_frontend/static/src/views/list_nums/list_nbCols.js',
|
||||||
'jikimo_frontend/static/src/views/list_nums/list_nums.xml',
|
'jikimo_frontend/static/src/views/list_nums/list_nums.xml',
|
||||||
@@ -38,7 +36,6 @@
|
|||||||
# 'jikimo_frontend/static/src/list/custom_import.js',
|
# 'jikimo_frontend/static/src/list/custom_import.js',
|
||||||
# 'jikimo_frontend/static/src/list/custom_width.js',
|
# 'jikimo_frontend/static/src/list/custom_width.js',
|
||||||
'jikimo_frontend/static/src/views/list_nums/extent_purchase.xml',
|
'jikimo_frontend/static/src/views/list_nums/extent_purchase.xml',
|
||||||
'jikimo_frontend/static/src/css/list_border_styles.css',
|
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<odoo>
|
|
||||||
<data>
|
|
||||||
<record id="partner_demo_company" model="res.partner">
|
|
||||||
<field name="name">JKM</field>
|
|
||||||
<field name="street">B-25</field>
|
|
||||||
<field name="city">USA</field>
|
|
||||||
<!-- Use the correct reference or actual ID for the country -->
|
|
||||||
<field name="country_id" ref="base.bd"/>
|
|
||||||
<field name="zip">1229</field>
|
|
||||||
<field name="phone">+8801-712901764</field>
|
|
||||||
<field name="email">info@kolpolok.com</field>
|
|
||||||
<field name="website">www.kolpoloktechnologies.com</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="demo_company" model="res.company">
|
|
||||||
<field name="name">Custom</field>
|
|
||||||
<field name="logo" type="base64" file="kolpolok_custom_title_and_favicon/static/src/img/favicon.ico"/>
|
|
||||||
<field name="favicon" type="base64" file="kolpolok_custom_title_and_favicon/static/src/img/favicon.ico"/>
|
|
||||||
<field name="partner_id" ref="partner_demo_company"/>
|
|
||||||
</record>
|
|
||||||
</data>
|
|
||||||
</odoo>
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
/** @odoo-module **/
|
|
||||||
import { UserMenu } from "@web/webclient/user_menu/user_menu";
|
|
||||||
import { patch } from "@web/core/utils/patch";
|
|
||||||
import { registry } from "@web/core/registry";
|
|
||||||
const userMenuRegistry = registry.category("user_menuitems");
|
|
||||||
|
|
||||||
|
|
||||||
patch(UserMenu.prototype, "legion_hide_odoo.UserMenu", {
|
|
||||||
setup() {
|
|
||||||
this._super.apply(this, arguments);
|
|
||||||
userMenuRegistry.remove("documentation");
|
|
||||||
userMenuRegistry.remove("support");
|
|
||||||
userMenuRegistry.remove("odoo_account");
|
|
||||||
},
|
|
||||||
|
|
||||||
});
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
/** @odoo-module **/
|
|
||||||
|
|
||||||
import { WebClient } from "@web/webclient/webclient";
|
|
||||||
import { patch } from "web.utils";
|
|
||||||
|
|
||||||
patch(WebClient.prototype, "kolpolok_custom_title_and_favicon.WebClient", {
|
|
||||||
setup() {
|
|
||||||
this._super();
|
|
||||||
this.title.setParts({ zopenerp: "JIKIMO" });
|
|
||||||
},
|
|
||||||
});
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
.o_list_renderer .o_list_table tbody > tr > td:not(.o_list_record_selector):not(.o_handle_cell):not(.o_list_button):not(.o_list_record_remove){
|
|
||||||
border:1px solid #dee2e6 !important;
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -4,207 +4,59 @@ import {patch} from '@web/core/utils/patch';
|
|||||||
// import { Dialog } from "@web/core/dialog/dialog";
|
// import { Dialog } from "@web/core/dialog/dialog";
|
||||||
import {_t} from "@web/core/l10n/translation";
|
import {_t} from "@web/core/l10n/translation";
|
||||||
import {FormStatusIndicator} from "@web/views/form/form_status_indicator/form_status_indicator";
|
import {FormStatusIndicator} from "@web/views/form/form_status_indicator/form_status_indicator";
|
||||||
import {ListRenderer} from "@web/views/list/list_renderer";
|
|
||||||
|
|
||||||
import {Field} from "@web/views/fields/field";
|
|
||||||
|
|
||||||
var Dialog = require('web.Dialog');
|
var Dialog = require('web.Dialog');
|
||||||
// var {patch} = require("web.utils") 这句话也行
|
// var {patch} = require("web.utils") 这句话也行
|
||||||
const filedRequiredList = {
|
|
||||||
// 设备大模块
|
|
||||||
'control_system_id': { multiple: false, noLabel: false },
|
|
||||||
'workbench_L': { multiple: true, noLabel: false },
|
|
||||||
'number_of_axles': { multiple: true, noLabel: false },
|
|
||||||
'x_axis': { multiple: true, noLabel: false },
|
|
||||||
'number_of_knife_library': { multiple: false, noLabel: false },
|
|
||||||
'brand_id': { multiple: false, noLabel: false },
|
|
||||||
'type_id': { multiple: false, noLabel: false },
|
|
||||||
'taper_type_id': { multiple: false, noLabel: false },
|
|
||||||
'eq_maintenance_id': { multiple: false, noLabel: false },
|
|
||||||
'overhaul_id': { multiple: false, noLabel: false },
|
|
||||||
'overhaul_period': { multiple: false, noLabel: false },
|
|
||||||
'maintenance_equipment_category_id': { multiple: false, noLabel: false },
|
|
||||||
'maintenance_type': { multiple: false, noLabel: false },
|
|
||||||
|
|
||||||
// 销售大模块
|
|
||||||
'partner_id': { multiple: false, noLabel: false },
|
|
||||||
'validity_date': { multiple: false, noLabel: false },
|
|
||||||
'vat': { multiple: false, noLabel: false },
|
|
||||||
'phone': { multiple: false, noLabel: false },
|
|
||||||
'mobile': { multiple: false, noLabel: false },
|
|
||||||
'email': { multiple: false, noLabel: false },
|
|
||||||
'category_id': { multiple: false, noLabel: false },
|
|
||||||
'radio_field_1_person': { multiple: false, noLabel: true },
|
|
||||||
|
|
||||||
// 采购大模块
|
|
||||||
'date_order': { multiple: false, noLabel: false },
|
|
||||||
'picking_type_id': { multiple: false, noLabel: false },
|
|
||||||
|
|
||||||
// 制造大模块
|
|
||||||
'production_line_id': { multiple: false, noLabel: false },
|
|
||||||
'date_approve': { multiple: false, noLabel: false },
|
|
||||||
'date_planned_start': { multiple: false, noLabel: false },
|
|
||||||
'date_planned_finished': { multiple: false, noLabel: false },
|
|
||||||
}
|
|
||||||
const tableRequiredList = [
|
|
||||||
'product_template_id', 'product_uom_qty', 'price_unit','product_id','product_qty',
|
|
||||||
'name', 'fault_type', 'maintenance_standards', 'Period'
|
|
||||||
]
|
|
||||||
|
|
||||||
patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
|
patch(FormStatusIndicator.prototype, 'jikimo_frontend.FormStatusIndicator', {
|
||||||
// 你可以重写或者添加一些方法和属性
|
// 你可以重写或者添加一些方法和属性
|
||||||
async _onDiscardChanges() {
|
async _onDiscardChanges() {
|
||||||
// var self = this;
|
// var self = this;
|
||||||
Dialog.confirm(this, _t("Are you sure you want to discard changes?"), {
|
Dialog.confirm(this, _t("Are you sure you want to discard changes?"), {
|
||||||
title: _t("Discard Changes"),
|
title: _t("Discard Changes"),
|
||||||
|
|
||||||
// confirm_callback: function () {
|
// confirm_callback: function () {
|
||||||
// self.model.discardChanges(self.handle);
|
// self.model.discardChanges(self.handle);
|
||||||
// },
|
// },
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
async discard() {
|
async discard() {
|
||||||
// if (window.confirm("Are you sure you want to discard changes?")) {
|
// if (window.confirm("Are you sure you want to discard changes?")) {
|
||||||
// await this.props.discard();
|
// await this.props.discard();
|
||||||
// }
|
// }
|
||||||
// const result = await this._confirmDiscardChange();
|
// const result = await this._confirmDiscardChange();
|
||||||
await this._confirmDiscardChange();
|
await this._confirmDiscardChange();
|
||||||
await this.props.discard();
|
await this.props.discard();
|
||||||
},
|
},
|
||||||
|
|
||||||
_confirmDiscardChange() {
|
_confirmDiscardChange(){
|
||||||
var self = this;
|
var self = this;
|
||||||
var def = new Promise(function (resolve, reject) {
|
var def = new Promise(function (resolve, reject) {
|
||||||
var message = _t("请确认是否要舍弃之前的更改?");
|
var message = _t("请确认是否要舍弃之前的更改?");
|
||||||
var dialog = Dialog.confirm(self, message, {
|
var dialog = Dialog.confirm(self, message, {
|
||||||
title: _t("Warning"),
|
title: _t("Warning"),
|
||||||
confirm_callback: resolve.bind(self, true),
|
confirm_callback: resolve.bind(self, true),
|
||||||
cancel_callback: reject,
|
cancel_callback: reject,
|
||||||
});
|
});
|
||||||
dialog.on('closed', self, reject);
|
dialog.on('closed', self, reject);
|
||||||
});
|
});
|
||||||
return def;
|
return def;
|
||||||
},
|
},
|
||||||
|
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
patch(Field.prototype, 'jikimo_frontend.Field', {
|
|
||||||
setup() {
|
|
||||||
owl.onMounted(this.setRequired);
|
|
||||||
return this._super(...arguments);
|
|
||||||
},
|
|
||||||
setRequired() {
|
|
||||||
const id = this.props.id
|
|
||||||
const isRequired = filedRequiredList[id]
|
|
||||||
if(id == 'number_of_axles') {
|
|
||||||
console.log(isRequired)
|
|
||||||
}
|
|
||||||
if(isRequired) {
|
|
||||||
let dom;
|
|
||||||
dom = $(`label[for=${id}]`)
|
|
||||||
if(isRequired.multiple && dom.length > 1) {
|
|
||||||
dom = dom.eq(-1)
|
|
||||||
dom = dom.parent().parent().next().find('label')
|
|
||||||
}
|
|
||||||
if(isRequired.noLabel) {
|
|
||||||
dom = dom.parent().parent()
|
|
||||||
}
|
|
||||||
let t = dom.html()
|
|
||||||
t = '<i class="c* r" style="color: red;margin-left: -4px">*</i>' + t
|
|
||||||
dom.html(t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
patch(ListRenderer.prototype, 'jikimo_frontend.ListRenderer', {
|
|
||||||
setup(){
|
|
||||||
owl.onMounted(() => {
|
|
||||||
this.activeElement = this.uiService.activeElement;
|
|
||||||
this.setRequired()
|
|
||||||
})
|
|
||||||
return this._super(...arguments);
|
|
||||||
},
|
|
||||||
setRequired() {
|
|
||||||
this.allColumns.forEach(_ => {
|
|
||||||
if( tableRequiredList.indexOf(_.name) >= 0 ) {
|
|
||||||
const dom = $(`th[data-name=${_.name}]`)
|
|
||||||
dom.addClass('addRequired')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
try {
|
|
||||||
const dom = this.tableRef.el
|
|
||||||
if(dom ) {
|
|
||||||
const tfoot = $(dom).children('tfoot')
|
|
||||||
const tbooy = $(dom).children('tbody')
|
|
||||||
if(tfoot.length) {
|
|
||||||
const tfoot_tr = tfoot.children().eq(0)
|
|
||||||
const tbody_tr = tbooy.children().eq(0)
|
|
||||||
if(tfoot_tr.children().length < tbody_tr.children().length) {
|
|
||||||
tfoot_tr.prepend('<td class="prepend">')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.log(e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
$(function () {
|
$(function (){
|
||||||
document.addEventListener('click', function () {
|
document.addEventListener('click', function () {
|
||||||
const dom = $('.o_form_status_indicator_buttons ')
|
const dom = $('.o_form_status_indicator_buttons ')
|
||||||
if (dom) {
|
if(dom) {
|
||||||
const dom1 = dom.children().eq(0)
|
const dom1 = dom.children().eq(0)
|
||||||
const dom2 = dom.children().eq(1)
|
const dom2 = dom.children().eq(1)
|
||||||
if (!dom1.text()) {
|
if(!dom1.text()) {
|
||||||
dom1.append('保存')
|
dom1.append('保存')
|
||||||
dom2.append('取消')
|
dom2.append('取消')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
function customRequired() {
|
|
||||||
let timer = null
|
|
||||||
let timer_count = 0
|
|
||||||
clearInterval(timer)
|
|
||||||
timer = setInterval(() => {
|
|
||||||
timer_count++
|
|
||||||
const dom = $('.custom_required')
|
|
||||||
let tableDom = $('.table_custom_required')
|
|
||||||
if (tableDom.length) {
|
|
||||||
tableDom = tableDom.eq(0).parents('tr').children('.table_custom_required')
|
|
||||||
tableDom.each(function () {
|
|
||||||
const i = $(this).index()
|
|
||||||
const requiredDom = $(this).parents('table').find('thead').find('th').eq(i).find('span').eq(0)
|
|
||||||
const t = requiredDom.text().replace('*', '')
|
|
||||||
requiredDom.html('<i style="color: red;margin-left: -4px">*</i>' + t)
|
|
||||||
})
|
|
||||||
clearInterval(timer)
|
|
||||||
}
|
|
||||||
if (dom.length) {
|
|
||||||
dom.each(function () {
|
|
||||||
const requiredDom = $(this).parent().prev().find('label')
|
|
||||||
let t = requiredDom.html()
|
|
||||||
if (t && t.indexOf('c*') < 0) {
|
|
||||||
t = '<i class="c*" style="color: red;margin-left: -4px">*</i>' + t
|
|
||||||
}
|
|
||||||
requiredDom.html(t)
|
|
||||||
})
|
|
||||||
clearInterval(timer)
|
|
||||||
}
|
|
||||||
if (timer_count == 20) {
|
|
||||||
clearInterval(timer)
|
|
||||||
}
|
|
||||||
}, 500)
|
|
||||||
}
|
|
||||||
|
|
||||||
var currentUrl = location.href
|
|
||||||
const listenerUrl = setInterval(() => {
|
|
||||||
const isChange = currentUrl != location.href
|
|
||||||
if (isChange) {
|
|
||||||
currentUrl = location.href
|
|
||||||
customRequired()
|
|
||||||
}
|
|
||||||
}, 500)
|
|
||||||
customRequired()
|
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -3,15 +3,6 @@
|
|||||||
import { registry } from "@web/core/registry";
|
import { registry } from "@web/core/registry";
|
||||||
import { url } from "@web/core/utils/urls";
|
import { url } from "@web/core/utils/urls";
|
||||||
import { ImageField, imageCacheKey } from '@web/views/fields/image/image_field';
|
import { ImageField, imageCacheKey } from '@web/views/fields/image/image_field';
|
||||||
import { isBinarySize } from "@web/core/utils/binary";
|
|
||||||
export const fileTypeMagicWordMap = {
|
|
||||||
"/": "jpg",
|
|
||||||
R: "gif",
|
|
||||||
i: "png",
|
|
||||||
P: "svg+xml",
|
|
||||||
};
|
|
||||||
|
|
||||||
const placeholder = "/web/static/img/placeholder.png";
|
|
||||||
|
|
||||||
export class CustomImageField extends ImageField {
|
export class CustomImageField extends ImageField {
|
||||||
setup() {
|
setup() {
|
||||||
@@ -22,7 +13,7 @@ export class CustomImageField extends ImageField {
|
|||||||
getUrl(previewFieldName) {
|
getUrl(previewFieldName) {
|
||||||
console.log('8888888888886666666666666666666')
|
console.log('8888888888886666666666666666666')
|
||||||
if (this.state.isValid && this.props.value) {
|
if (this.state.isValid && this.props.value) {
|
||||||
if (isBinarySize(this.props.value) || this.props.value.length < 50) {
|
if (1) {
|
||||||
if (!this.rawCacheKey) {
|
if (!this.rawCacheKey) {
|
||||||
this.rawCacheKey = this.props.record.data.__last_update;
|
this.rawCacheKey = this.props.record.data.__last_update;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ div:has(.o_required_modifier) > label::before {
|
|||||||
color: red !important;
|
color: red !important;
|
||||||
padding: 0 4px !important;
|
padding: 0 4px !important;
|
||||||
vertical-align: top !important;
|
vertical-align: top !important;
|
||||||
font-size: unset !important;
|
font-size: 1.5rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.my-image div {
|
.my-image div {
|
||||||
@@ -79,9 +79,9 @@ td.o_required_modifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.oe_kanban_card.kanban_color_1 {
|
.oe_kanban_card.kanban_color_1 {
|
||||||
background-color: #fff !important;
|
background-color: #27FEA9 !important;
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
color: #777;
|
color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.oe_kanban_card.kanban_color_3 {
|
.oe_kanban_card.kanban_color_3 {
|
||||||
@@ -135,7 +135,7 @@ td.o_required_modifier {
|
|||||||
.text-truncate {
|
.text-truncate {
|
||||||
overflow: unset !important;
|
overflow: unset !important;
|
||||||
text-overflow: unset !important;
|
text-overflow: unset !important;
|
||||||
//white-space: nowrap!important;
|
white-space: nowrap!important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.o_list_renderer .o_list_table tbody > tr > td:not(.o_list_record_selector):not(.o_handle_cell):not(.o_list_button):not(.o_list_record_remove) {
|
.o_list_renderer .o_list_table tbody > tr > td:not(.o_list_record_selector):not(.o_handle_cell):not(.o_list_button):not(.o_list_record_remove) {
|
||||||
@@ -325,7 +325,7 @@ div[class="o_content o_component_with_search_panel"] .show_state span {
|
|||||||
|
|
||||||
div:has(.o_required_modifier) > label::before {
|
div:has(.o_required_modifier) > label::before {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
left: 24px;
|
left: -3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
//.o_form_view .o_form_label {
|
//.o_form_view .o_form_label {
|
||||||
@@ -383,9 +383,7 @@ div:has(.o_required_modifier) > label::before {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.oe_kanban_details li.o_text_overflow {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.o_stock_kanban .o_kanban_card_content {
|
.o_stock_kanban .o_kanban_card_content {
|
||||||
.row {
|
.row {
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -403,92 +401,3 @@ div:has(.o_required_modifier) > label::before {
|
|||||||
.o_list_table_ungrouped {
|
.o_list_table_ungrouped {
|
||||||
min-width: 1089px;
|
min-width: 1089px;
|
||||||
}
|
}
|
||||||
// 加工能力\冷却方式 竖列展示改为横列展示
|
|
||||||
.processingMethod {
|
|
||||||
.o_cell.flex-grow-1.flex-sm-grow-0 {
|
|
||||||
width: 100%!important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@media (min-width: 576px) {
|
|
||||||
.o_inner_group.processingMethod {
|
|
||||||
grid-template-columns: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置所有表格序号列padding为0
|
|
||||||
.o_form_view .o_notebook > .tab-content > .tab-pane > :first-child:not(.o_group) .o_field_x2many.o_field_x2many_list tr > :first-child, .o_form_view .o_notebook > .tab-content > .tab-pane > :first-child.o_invisible_modifier + .o_field_widget .o_field_x2many.o_field_x2many_list tr > :first-child {
|
|
||||||
padding: 0;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置剩余number类型数据表格列 left
|
|
||||||
.o_list_renderer .o_list_table thead .o_list_number_th {
|
|
||||||
text-align:left;
|
|
||||||
}
|
|
||||||
.o_list_renderer .o_list_table tbody > tr > td:not(.o_list_record_selector).o_list_number {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
.o_list_renderer .flex-row-reverse {
|
|
||||||
flex-direction: unset!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.o_list_renderer .flex-row-reverse > .text-end {
|
|
||||||
text-align: left!important;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 设置modal弹窗样式
|
|
||||||
.modal.o_technical_modal {
|
|
||||||
.modal-lg {
|
|
||||||
@media (min-width: 992px) {
|
|
||||||
max-width: 1200px;
|
|
||||||
}
|
|
||||||
@media (min-width: 576px) {
|
|
||||||
.o_form_view .o_inner_group {
|
|
||||||
grid-template-columns: auto;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更改表格底部按钮样式
|
|
||||||
.o_list_renderer .o_field_x2many_list_row_add a,.treeHeaderBtn,.o_x2m_control_panel .o_cp_buttons .btn{
|
|
||||||
display: inline-block;
|
|
||||||
margin: 5px 0;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #71639e;
|
|
||||||
border: 1px solid #71639e;
|
|
||||||
padding: 0.2rem 0.6rem;
|
|
||||||
font-size: 1.08333333rem;
|
|
||||||
border-radius: 0.25rem;
|
|
||||||
transition: all .3s;
|
|
||||||
}
|
|
||||||
.o_list_renderer .o_field_x2many_list_row_add a:hover,.treeHeaderBtn:hover,.o_x2m_control_panel .o_cp_buttons .btn:hover{
|
|
||||||
background: #71639e;
|
|
||||||
color: #fff
|
|
||||||
}
|
|
||||||
|
|
||||||
// 修改时间输入框宽度
|
|
||||||
.o_datepicker_input.o_input.datetimepicker-input {
|
|
||||||
width: 200px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.o_form_view .o_form_editable .o_row > .o_field_widget, .o_form_view .o_form_editable .o_row > .o_field_widget.o_field_float_time {
|
|
||||||
width: auto !important;
|
|
||||||
flex: unset;
|
|
||||||
}
|
|
||||||
.addRequired {
|
|
||||||
padding-left: calc(0.3rem + 2px)!important;
|
|
||||||
}
|
|
||||||
.addRequired:before {
|
|
||||||
content: '*';
|
|
||||||
color: red;
|
|
||||||
position: absolute;
|
|
||||||
left: 0;
|
|
||||||
top: 50%;
|
|
||||||
transform: translateY(-50%);
|
|
||||||
}
|
|
||||||
.o_list_renderer .o_list_table tfoot .o_list_number {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
.row_no {
|
.row_no {
|
||||||
width: 35px !important;
|
width: 3.2% !important;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<odoo>
|
|
||||||
<data>
|
|
||||||
|
|
||||||
<!-- 修改页面头部图标及文字 -->
|
|
||||||
<template id="favicon_icon" inherit_id="web.layout" name="Web layout">
|
|
||||||
<!-- change the title with reliance partner -->
|
|
||||||
<xpath expr="//head//title" position="before">
|
|
||||||
<title t-esc="'JIKIMO'"/>
|
|
||||||
</xpath>
|
|
||||||
<!-- change the default favicon icon with -->
|
|
||||||
<xpath expr="//head//link[@rel='shortcut icon']" position="replace">
|
|
||||||
<link type="image/x-icon" rel="shortcut icon" href="/jikimo_frontend/static/src/img/jikimo-logo.ico"/>
|
|
||||||
</xpath>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<!-- hide 登录页面 powerd by odoo 及管理数据库 -->
|
|
||||||
<template id="login_page_layout" inherit_id="web.login_layout" name="Login Page Layout">
|
|
||||||
<xpath expr="//div[@class='card-body']//div[last()]" position="replace"></xpath>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<!-- 隐藏odoo版本信息 -->
|
|
||||||
<record id="jikimo_res_config_settings_view_form" model="ir.ui.view">
|
|
||||||
<field name="name">jikimo.res.config.settings.view.form.inherit.base.setup</field>
|
|
||||||
<field name="model">res.config.settings</field>
|
|
||||||
<field name="inherit_id" ref="base_setup.res_config_settings_view_form"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<xpath expr="//div[@id='about']" position="replace">
|
|
||||||
</xpath>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
|
|
||||||
</data>
|
|
||||||
</odoo>
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from . import models
|
|
||||||
from odoo import api, SUPERUSER_ID
|
|
||||||
|
|
||||||
|
|
||||||
def uninstall_hook(cr, registry):
|
|
||||||
# 使用cr来执行数据库操作
|
|
||||||
with api.Environment.manage():
|
|
||||||
env = api.Environment(cr, SUPERUSER_ID, {})
|
|
||||||
# 执行数据清理操作
|
|
||||||
access_rights = env['access.right'].search([])
|
|
||||||
access_rights.unlink()
|
|
||||||
followers = env['mail.followers'].search([('res_model', '=', 'access.right')])
|
|
||||||
followers.unlink()
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
{
|
|
||||||
'name': '机企猫 隐藏项目',
|
|
||||||
'version': '16.0.1.0.0',
|
|
||||||
'category': 'Extra Tools, Productivity',
|
|
||||||
'summary': """ Can hide options from user """,
|
|
||||||
'description': """ By using this module we can hide the options like create,
|
|
||||||
delete,export,and archive/un archive in the model which we want. Here we
|
|
||||||
are also able to select the user groups except Administrator which we want
|
|
||||||
to apply the above hiding functionality """,
|
|
||||||
'author': '机企猫-MGW',
|
|
||||||
'company': '机企猫',
|
|
||||||
'depends': ['base_setup', 'mail'],
|
|
||||||
'data': [
|
|
||||||
'security/security.xml',
|
|
||||||
'security/ir.model.access.csv',
|
|
||||||
'views/model_access_rights_views.xml',
|
|
||||||
],
|
|
||||||
'assets': {
|
|
||||||
'web.assets_backend': [
|
|
||||||
'jikimo_hide_options/static/src/js/form_controller.js',
|
|
||||||
'jikimo_hide_options/static/src/js/list_controller.js',
|
|
||||||
'jikimo_hide_options/static/src/js/kanban_controller.js'
|
|
||||||
]
|
|
||||||
},
|
|
||||||
'images': ['static/description/banner.jpg'],
|
|
||||||
'license': 'LGPL-3',
|
|
||||||
'installable': True,
|
|
||||||
'auto_install': False,
|
|
||||||
'application': False,
|
|
||||||
'uninstall_hook': 'uninstall_hook',
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from . import model_access_rights
|
|
||||||
from . import models
|
|
||||||
|
|
||||||
@@ -1,107 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from odoo import api, fields, models, _
|
|
||||||
|
|
||||||
|
|
||||||
class ModelAccessRights(models.Model):
|
|
||||||
"""This class is used to detect, which all options want to hide from the
|
|
||||||
specified group and model"""
|
|
||||||
_name = 'access.right'
|
|
||||||
_inherit = 'mail.thread'
|
|
||||||
_description = 'Manage Modules Access Control'
|
|
||||||
_rec_name = 'model_id'
|
|
||||||
|
|
||||||
model_id = fields.Many2one('ir.model', ondelete='cascade', required=True,
|
|
||||||
help="select the model")
|
|
||||||
groups_id = fields.Many2one('res.groups', required=True,
|
|
||||||
help="select the group")
|
|
||||||
is_delete = fields.Boolean(string="Delete", help="hide the delete option")
|
|
||||||
is_export = fields.Boolean(string="Export",
|
|
||||||
help="hide the 'Export All'"
|
|
||||||
" option from list view")
|
|
||||||
is_create_or_update = fields.Boolean(string="Create/Update",
|
|
||||||
help="hide the create option from list"
|
|
||||||
" as well as form view")
|
|
||||||
is_archive = fields.Boolean(string="Archive/UnArchive",
|
|
||||||
help="hide the archive option")
|
|
||||||
|
|
||||||
@api.model
|
|
||||||
def hide_buttons(self):
|
|
||||||
"""This function contains a query that detects which all options want
|
|
||||||
to hide, in which model,and to which user groups"""
|
|
||||||
access_right_rec = self.sudo().search_read([], ['model_id', 'is_delete',
|
|
||||||
'is_export',
|
|
||||||
'is_create_or_update',
|
|
||||||
'is_archive',
|
|
||||||
'groups_id'])
|
|
||||||
for dic in access_right_rec:
|
|
||||||
model = self.env['ir.model'].sudo().browse(dic['model_id'][0]).model
|
|
||||||
group_name = self.env['ir.model.data'].sudo().search([
|
|
||||||
('model', '=', 'res.groups'),
|
|
||||||
('res_id', '=', dic['groups_id'][0])
|
|
||||||
]).name
|
|
||||||
|
|
||||||
module_name = self.env['ir.model.data'].sudo().search([
|
|
||||||
('model', '=', 'res.groups'),
|
|
||||||
('res_id', '=', dic['groups_id'][0])
|
|
||||||
]).module
|
|
||||||
dic.update({
|
|
||||||
'model': model,
|
|
||||||
'group_name': group_name,
|
|
||||||
'module': module_name
|
|
||||||
})
|
|
||||||
return access_right_rec
|
|
||||||
# @api.model
|
|
||||||
# def hide_buttons(self):
|
|
||||||
# """This function contains a query that detects which all options want
|
|
||||||
# to hide, in which model,and to which user groups"""
|
|
||||||
# access_right_rec = self.sudo().search_read([], ['model_id', 'is_delete',
|
|
||||||
# 'is_export',
|
|
||||||
# 'is_create_or_update',
|
|
||||||
# 'is_archive',
|
|
||||||
# 'groups_id'])
|
|
||||||
# for dic in access_right_rec:
|
|
||||||
# model = self.env['ir.model'].sudo().browse(dic['model_id']).model
|
|
||||||
# group_name = self.env['ir.model.data'].sudo().search([
|
|
||||||
# ('model', '=', 'res.groups'),
|
|
||||||
# ('res_id', '=', dic['groups_id'])
|
|
||||||
# ]).name
|
|
||||||
# module_name = self.env['ir.model.data'].sudo().search([
|
|
||||||
# ('model', '=', 'res.groups'),
|
|
||||||
# ('res_id', '=', dic['groups_id'])
|
|
||||||
# ]).module
|
|
||||||
# dic.update({
|
|
||||||
# 'model': model,
|
|
||||||
# 'group_name': group_name,
|
|
||||||
# 'module': module_name
|
|
||||||
# })
|
|
||||||
# return access_right_rec
|
|
||||||
|
|
||||||
|
|
||||||
# class AccessRightCleanup(models.Model):
|
|
||||||
# _name = 'access.right.cleanup' # 定义一个新的模型名
|
|
||||||
# _description = 'Access Right Cleanup'
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# @api.model
|
|
||||||
# def _module_uninstall(self):
|
|
||||||
# """在模块卸载时执行清理操作"""
|
|
||||||
# super(AccessRightCleanup, self)._module_uninstall()
|
|
||||||
# # 这里执行你的清理逻辑
|
|
||||||
#
|
|
||||||
# # 获取access.right模型的所有记录
|
|
||||||
# access_rights = self.env['access.right'].search([])
|
|
||||||
# for access_right in access_rights:
|
|
||||||
# # 删除access.right模型的所有记录
|
|
||||||
# access_right.unlink()
|
|
||||||
#
|
|
||||||
# # 查找所有关联到access.right模型的关注者记录
|
|
||||||
# followers = self.env['mail.followers'].search([('res_model', '=', 'access.right')])
|
|
||||||
# for follower in followers:
|
|
||||||
# # 删除关注者记录
|
|
||||||
# follower.unlink()
|
|
||||||
#
|
|
||||||
# # # 示例:删除自定义数据表(确保先检查外键约束等)
|
|
||||||
# # self.env.cr.execute('DROP TABLE IF EXISTS access_right CASCADE;')
|
|
||||||
#
|
|
||||||
# # 其他清理工作...
|
|
||||||
@@ -1,353 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
from collections import defaultdict
|
|
||||||
from operator import attrgetter
|
|
||||||
from odoo import api, _
|
|
||||||
from odoo.exceptions import UserError
|
|
||||||
from odoo.models import BaseModel, _unlink, LOG_ACCESS_COLUMNS, \
|
|
||||||
INSERT_BATCH_SIZE, SQL_DEFAULT
|
|
||||||
# from odoo.tools import OrderedSet, split_every, attrgetter, clean_context
|
|
||||||
from odoo.tools import OrderedSet, split_every, clean_context
|
|
||||||
|
|
||||||
|
|
||||||
@api.model
|
|
||||||
def _create(self, data_list):
|
|
||||||
""" Create records from the stored field values in ``data_list``. """
|
|
||||||
assert data_list
|
|
||||||
cr = self.env.cr
|
|
||||||
|
|
||||||
# insert rows in batches of maximum INSERT_BATCH_SIZE
|
|
||||||
ids = [] # ids of created records
|
|
||||||
other_fields = OrderedSet() # non-column fields
|
|
||||||
|
|
||||||
for data_sublist in split_every(INSERT_BATCH_SIZE, data_list):
|
|
||||||
stored_list = [data['stored'] for data in data_sublist]
|
|
||||||
fnames = sorted({name for stored in stored_list for name in stored})
|
|
||||||
|
|
||||||
columns = []
|
|
||||||
rows = [[] for _ in stored_list]
|
|
||||||
for fname in fnames:
|
|
||||||
field = self._fields[fname]
|
|
||||||
if field.column_type:
|
|
||||||
columns.append(fname)
|
|
||||||
for stored, row in zip(stored_list, rows):
|
|
||||||
if fname in stored:
|
|
||||||
colval = field.convert_to_column(stored[fname], self,
|
|
||||||
stored)
|
|
||||||
if field.translate is True and colval:
|
|
||||||
if 'en_US' not in colval.adapted:
|
|
||||||
colval.adapted['en_US'] = next(
|
|
||||||
iter(colval.adapted.values()))
|
|
||||||
row.append(colval)
|
|
||||||
else:
|
|
||||||
row.append(SQL_DEFAULT)
|
|
||||||
else:
|
|
||||||
other_fields.add(field)
|
|
||||||
|
|
||||||
if field.type == 'properties':
|
|
||||||
# force calling fields.create for properties field because
|
|
||||||
# we might want to update the parent definition
|
|
||||||
other_fields.add(field)
|
|
||||||
|
|
||||||
if not columns:
|
|
||||||
# manage the case where we create empty records
|
|
||||||
columns = ['id']
|
|
||||||
for row in rows:
|
|
||||||
row.append(SQL_DEFAULT)
|
|
||||||
|
|
||||||
header = ", ".join(f'"{column}"' for column in columns)
|
|
||||||
template = ", ".join("%s" for _ in rows)
|
|
||||||
cr.execute(
|
|
||||||
f'INSERT INTO "{self._table}" ({header}) VALUES {template} RETURNING "id"',
|
|
||||||
[tuple(row) for row in rows],
|
|
||||||
)
|
|
||||||
ids.extend(id_ for id_, in cr.fetchall())
|
|
||||||
|
|
||||||
# put the new records in cache, and update inverse fields, for many2one
|
|
||||||
#
|
|
||||||
# cachetoclear is an optimization to avoid modified()'s cost until other_fields are processed
|
|
||||||
cachetoclear = []
|
|
||||||
records = self.browse(ids)
|
|
||||||
inverses_update = defaultdict(list) # {(field, value): ids}
|
|
||||||
common_set_vals = set(
|
|
||||||
LOG_ACCESS_COLUMNS + [self.CONCURRENCY_CHECK_FIELD, 'id',
|
|
||||||
'parent_path'])
|
|
||||||
for data, record in zip(data_list, records):
|
|
||||||
data['record'] = record
|
|
||||||
# DLE P104: test_inherit.py, test_50_search_one2many
|
|
||||||
vals = dict(
|
|
||||||
{k: v for d in data['inherited'].values() for k, v in d.items()},
|
|
||||||
**data['stored'])
|
|
||||||
set_vals = common_set_vals.union(vals)
|
|
||||||
for field in self._fields.values():
|
|
||||||
if field.type in ('one2many', 'many2many'):
|
|
||||||
self.env.cache.set(record, field, ())
|
|
||||||
elif field.related and not field.column_type:
|
|
||||||
self.env.cache.set(record, field,
|
|
||||||
field.convert_to_cache(None, record))
|
|
||||||
# DLE P123: `test_adv_activity`, `test_message_assignation_inbox`, `test_message_log`, `test_create_mail_simple`, ...
|
|
||||||
# Set `mail.message.parent_id` to False in cache so it doesn't do the useless SELECT when computing the modified of `child_ids`
|
|
||||||
# in other words, if `parent_id` is not set, no other message `child_ids` are impacted.
|
|
||||||
# + avoid the fetch of fields which are False. e.g. if a boolean field is not passed in vals and as no default set in the field attributes,
|
|
||||||
# then we know it can be set to False in the cache in the case of a create.
|
|
||||||
elif field.name not in set_vals and not field.compute:
|
|
||||||
self.env.cache.set(record, field,
|
|
||||||
field.convert_to_cache(None, record))
|
|
||||||
for fname, value in vals.items():
|
|
||||||
field = self._fields[fname]
|
|
||||||
if field.type in ('one2many', 'many2many'):
|
|
||||||
cachetoclear.append((record, field))
|
|
||||||
else:
|
|
||||||
cache_value = field.convert_to_cache(value, record)
|
|
||||||
self.env.cache.set(record, field, cache_value)
|
|
||||||
if field.type in ('many2one', 'many2one_reference') and \
|
|
||||||
self.pool.field_inverses[field]:
|
|
||||||
inverses_update[(field, cache_value)].append(record.id)
|
|
||||||
|
|
||||||
for (field, value), record_ids in inverses_update.items():
|
|
||||||
field._update_inverses(self.browse(record_ids), value)
|
|
||||||
|
|
||||||
# update parent_path
|
|
||||||
records._parent_store_create()
|
|
||||||
|
|
||||||
# protect fields being written against recomputation
|
|
||||||
protected = [(data['protected'], data['record']) for data in data_list]
|
|
||||||
with self.env.protecting(protected):
|
|
||||||
# mark computed fields as todo
|
|
||||||
records.modified(self._fields, create=True)
|
|
||||||
|
|
||||||
if other_fields:
|
|
||||||
# discard default values from context for other fields
|
|
||||||
others = records.with_context(clean_context(self._context))
|
|
||||||
for field in sorted(other_fields, key=attrgetter('_sequence')):
|
|
||||||
field.create([
|
|
||||||
(other, data['stored'][field.name])
|
|
||||||
for other, data in zip(others, data_list)
|
|
||||||
if field.name in data['stored']
|
|
||||||
])
|
|
||||||
|
|
||||||
# mark fields to recompute
|
|
||||||
records.modified([field.name for field in other_fields],
|
|
||||||
create=True)
|
|
||||||
|
|
||||||
# if value in cache has not been updated by other_fields, remove it
|
|
||||||
for record, field in cachetoclear:
|
|
||||||
if self.env.cache.contains(record,
|
|
||||||
field) and not self.env.cache.get(
|
|
||||||
record, field):
|
|
||||||
self.env.cache.remove(record, field)
|
|
||||||
|
|
||||||
# check Python constraints for stored fields
|
|
||||||
records._validate_fields(
|
|
||||||
name for data in data_list for name in data['stored'])
|
|
||||||
records.check_access_rule('create')
|
|
||||||
# This is used to restrict the access right to create a record
|
|
||||||
current_model_id = self.env['ir.model'].sudo().search(
|
|
||||||
[('model', '=', self._name)]).id
|
|
||||||
# access_right_rec = self.env['access.right'].sudo().search_read(
|
|
||||||
# [('model_id', '=', current_model_id)],
|
|
||||||
# ['model_id', 'is_create_or_update',
|
|
||||||
# 'groups_id'])
|
|
||||||
# if access_right_rec and not self.env.is_admin():
|
|
||||||
# for rec in access_right_rec:
|
|
||||||
# group_name = self.env['ir.model.data'].sudo().search([
|
|
||||||
# ('model', '=', 'res.groups'),
|
|
||||||
# ('res_id', '=', rec['groups_id'][0])
|
|
||||||
# ]).name
|
|
||||||
# module_name = self.env['ir.model.data'].sudo().search([
|
|
||||||
# ('model', '=', 'res.groups'),
|
|
||||||
# ('res_id', '=', rec['groups_id'][0])
|
|
||||||
# ]).module
|
|
||||||
# group = module_name + "." + group_name
|
|
||||||
# if self.env.user.has_group(group):
|
|
||||||
# if rec['is_create_or_update']:
|
|
||||||
# raise UserError('You are restricted from performing this'
|
|
||||||
# ' operation. Please contact the'
|
|
||||||
# ' administrator.')
|
|
||||||
# 检查 'access.right' 模型是否存在于环境中
|
|
||||||
if 'access.right' in self.env:
|
|
||||||
access_right_rec = self.env['access.right'].sudo().search_read(
|
|
||||||
[('model_id', '=', current_model_id)],
|
|
||||||
['model_id', 'is_create_or_update', 'groups_id']
|
|
||||||
)
|
|
||||||
|
|
||||||
# 如果找到相关记录,并且当前用户不是管理员
|
|
||||||
if access_right_rec and not self.env.is_admin():
|
|
||||||
for rec in access_right_rec:
|
|
||||||
# 获取与权限相关的用户组信息
|
|
||||||
group_data = self.env['ir.model.data'].sudo().search_read(
|
|
||||||
[('model', '=', 'res.groups'), ('res_id', '=', rec['groups_id'][0])],
|
|
||||||
['name', 'module']
|
|
||||||
)
|
|
||||||
|
|
||||||
# 如果找到了用户组数据
|
|
||||||
if group_data:
|
|
||||||
group_name = group_data[0]['name']
|
|
||||||
module_name = group_data[0]['module']
|
|
||||||
group_xml_id = f"{module_name}.{group_name}"
|
|
||||||
|
|
||||||
# 检查当前用户是否属于该组
|
|
||||||
if self.env.user.has_group(group_xml_id):
|
|
||||||
# 如果该用户组被限制创建或更新操作
|
|
||||||
if rec['is_create_or_update']:
|
|
||||||
raise UserError(
|
|
||||||
_("You are restricted from performing this operation. Please contact the administrator."))
|
|
||||||
else:
|
|
||||||
# 如果 'access.right' 模型不存在,可以在这里定义备选逻辑
|
|
||||||
# 例如,记录日志、发送通知或者简单地跳过这部分逻辑
|
|
||||||
pass
|
|
||||||
|
|
||||||
return records
|
|
||||||
|
|
||||||
|
|
||||||
@api.model
|
|
||||||
def unlink(self):
|
|
||||||
""" unlink()
|
|
||||||
|
|
||||||
Deletes the records in ``self``.
|
|
||||||
|
|
||||||
:raise AccessError: if the user is not allowed to delete all the given records
|
|
||||||
:raise UserError: if the record is default property for other records
|
|
||||||
"""
|
|
||||||
if not self:
|
|
||||||
return True
|
|
||||||
|
|
||||||
self.check_access_rights('unlink')
|
|
||||||
self.check_access_rule('unlink')
|
|
||||||
|
|
||||||
from odoo.addons.base.models.ir_model import MODULE_UNINSTALL_FLAG
|
|
||||||
for func in self._ondelete_methods:
|
|
||||||
# func._ondelete is True if it should be called during uninstallation
|
|
||||||
if func._ondelete or not self._context.get(MODULE_UNINSTALL_FLAG):
|
|
||||||
func(self)
|
|
||||||
|
|
||||||
# TOFIX: this avoids an infinite loop when trying to recompute a
|
|
||||||
# field, which triggers the recomputation of another field using the
|
|
||||||
# same compute function, which then triggers again the computation
|
|
||||||
# of those two fields
|
|
||||||
for field in self._fields.values():
|
|
||||||
self.env.remove_to_compute(field, self)
|
|
||||||
|
|
||||||
self.env.flush_all()
|
|
||||||
|
|
||||||
cr = self._cr
|
|
||||||
Data = self.env['ir.model.data'].sudo().with_context({})
|
|
||||||
Defaults = self.env['ir.default'].sudo()
|
|
||||||
Property = self.env['ir.property'].sudo()
|
|
||||||
Attachment = self.env['ir.attachment'].sudo()
|
|
||||||
ir_property_unlink = Property
|
|
||||||
ir_model_data_unlink = Data
|
|
||||||
ir_attachment_unlink = Attachment
|
|
||||||
|
|
||||||
# mark fields that depend on 'self' to recompute them after 'self' has
|
|
||||||
# been deleted (like updating a sum of lines after deleting one line)
|
|
||||||
with self.env.protecting(self._fields.values(), self):
|
|
||||||
self.modified(self._fields, before=True)
|
|
||||||
for sub_ids in cr.split_for_in_conditions(self.ids):
|
|
||||||
records = self.browse(sub_ids)
|
|
||||||
|
|
||||||
# Check if the records are used as default properties.
|
|
||||||
refs = [f'{self._name},{id_}' for id_ in sub_ids]
|
|
||||||
if Property.search(
|
|
||||||
[('res_id', '=', False), ('value_reference', 'in', refs)],
|
|
||||||
limit=1):
|
|
||||||
raise UserError(
|
|
||||||
_('Unable to delete this document because it is used as a default property'))
|
|
||||||
|
|
||||||
# Delete the records' properties.
|
|
||||||
ir_property_unlink |= Property.search([('res_id', 'in', refs)])
|
|
||||||
|
|
||||||
query = f'DELETE FROM "{self._table}" WHERE id IN %s'
|
|
||||||
cr.execute(query, (sub_ids,))
|
|
||||||
|
|
||||||
# Removing the ir_model_data reference if the record being deleted
|
|
||||||
# is a record created by xml/csv file, as these are not connected
|
|
||||||
# with real database foreign keys, and would be dangling references.
|
|
||||||
#
|
|
||||||
# Note: the following steps are performed as superuser to avoid
|
|
||||||
# access rights restrictions, and with no context to avoid possible
|
|
||||||
# side-effects during admin calls.
|
|
||||||
data = Data.search(
|
|
||||||
[('model', '=', self._name), ('res_id', 'in', sub_ids)])
|
|
||||||
ir_model_data_unlink |= data
|
|
||||||
|
|
||||||
# For the same reason, remove the defaults having some of the
|
|
||||||
# records as value
|
|
||||||
Defaults.discard_records(records)
|
|
||||||
|
|
||||||
# For the same reason, remove the relevant records in ir_attachment
|
|
||||||
# (the search is performed with sql as the search method of
|
|
||||||
# ir_attachment is overridden to hide attachments of deleted
|
|
||||||
# records)
|
|
||||||
query = 'SELECT id FROM ir_attachment WHERE res_model=%s AND res_id IN %s'
|
|
||||||
cr.execute(query, (self._name, sub_ids))
|
|
||||||
ir_attachment_unlink |= Attachment.browse(
|
|
||||||
row[0] for row in cr.fetchall())
|
|
||||||
|
|
||||||
# invalidate the *whole* cache, since the orm does not handle all
|
|
||||||
# changes made in the database, like cascading delete!
|
|
||||||
self.env.invalidate_all(flush=False)
|
|
||||||
if ir_property_unlink:
|
|
||||||
ir_property_unlink.unlink()
|
|
||||||
if ir_model_data_unlink:
|
|
||||||
ir_model_data_unlink.unlink()
|
|
||||||
if ir_attachment_unlink:
|
|
||||||
ir_attachment_unlink.unlink()
|
|
||||||
# DLE P93: flush after the unlink, for recompute fields depending on
|
|
||||||
# the modified of the unlink
|
|
||||||
self.env.flush_all()
|
|
||||||
# auditing: deletions are infrequent and leave no trace in the database
|
|
||||||
_unlink.info('User #%s deleted %s records with IDs: %r', self._uid,
|
|
||||||
self._name, self.ids)
|
|
||||||
# This is used to restrict the access right to unlink a record
|
|
||||||
current_model_id = self.env['ir.model'].sudo().search(
|
|
||||||
[('model', '=', self._name)]).id
|
|
||||||
# access_right_rec = self.env['access.right'].sudo().search_read(
|
|
||||||
# [('model_id', '=', current_model_id)], ['model_id', 'is_delete',
|
|
||||||
# 'groups_id'])
|
|
||||||
# if access_right_rec and not self.env.is_admin():
|
|
||||||
# for rec in access_right_rec:
|
|
||||||
# group_name = self.env['ir.model.data'].sudo().search([
|
|
||||||
# ('model', '=', 'res.groups'),
|
|
||||||
# ('res_id', '=', rec['groups_id'][0])
|
|
||||||
# ]).name
|
|
||||||
# module_name = self.env['ir.model.data'].sudo().search([
|
|
||||||
# ('model', '=', 'res.groups'),
|
|
||||||
# ('res_id', '=', rec['groups_id'][0])
|
|
||||||
# ]).module
|
|
||||||
# group = module_name + "." + group_name
|
|
||||||
# if self.env.user.has_group(group):
|
|
||||||
# if rec['is_delete']:
|
|
||||||
# raise UserError(_('You are restricted from performing this'
|
|
||||||
# ' operation. Please contact the'
|
|
||||||
# ' administrator.'))
|
|
||||||
# 检查 'access.right' 模型是否存在于环境中
|
|
||||||
if 'access.right' in self.env:
|
|
||||||
# current_model_id = self.env['ir.model'].sudo().search([('model', '=', self._name)]).id
|
|
||||||
access_right_rec = self.env['access.right'].sudo().search_read(
|
|
||||||
[('model_id', '=', current_model_id)], ['model_id', 'is_delete', 'groups_id']
|
|
||||||
)
|
|
||||||
|
|
||||||
if access_right_rec and not self.env.is_admin():
|
|
||||||
for rec in access_right_rec:
|
|
||||||
group_data = self.env['ir.model.data'].sudo().search_read(
|
|
||||||
[('model', '=', 'res.groups'), ('res_id', '=', rec['groups_id'][0])],
|
|
||||||
['name', 'module']
|
|
||||||
)
|
|
||||||
|
|
||||||
if group_data:
|
|
||||||
group_name = group_data[0]['name']
|
|
||||||
module_name = group_data[0]['module']
|
|
||||||
group_xml_id = f"{module_name}.{group_name}"
|
|
||||||
|
|
||||||
if self.env.user.has_group(group_xml_id) and rec['is_delete']:
|
|
||||||
raise UserError(
|
|
||||||
_('You are restricted from performing this operation. Please contact the administrator.'))
|
|
||||||
else:
|
|
||||||
# 如果 'access.right' 模型不存在,可以在这里定义备选逻辑
|
|
||||||
pass
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
BaseModel._create = _create
|
|
||||||
BaseModel.unlink = unlink
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
|
|
||||||
access_access_right,access.access.right,model_access_right,jikimo_hide_options.model_access_rights_groups_configure_model_access,1,1,1,1
|
|
||||||
|
@@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--Add a group named Configure Model Access in res.groups-->
|
|
||||||
<odoo>
|
|
||||||
<record id="model_access_rights_groups_configure_model_access" model="res.groups">
|
|
||||||
<field name="name">配置隐藏项目</field>
|
|
||||||
<field name="category_id" ref="base.module_category_usability"/>
|
|
||||||
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
|
|
||||||
</record>
|
|
||||||
</odoo>
|
|
||||||
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 310 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 576 B |
|
Before Width: | Height: | Size: 733 B |
|
Before Width: | Height: | Size: 911 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 673 B |
|
Before Width: | Height: | Size: 878 B |
|
Before Width: | Height: | Size: 653 B |
|
Before Width: | Height: | Size: 905 B |
|
Before Width: | Height: | Size: 839 B |
|
Before Width: | Height: | Size: 427 B |
|
Before Width: | Height: | Size: 627 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 988 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 589 B |
|
Before Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 967 B |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 228 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 237 KiB |
|
Before Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 95 KiB |
|
Before Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 219 KiB |
|
Before Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 20 KiB |
@@ -1,596 +0,0 @@
|
|||||||
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;">
|
|
||||||
<!-- TITLE BAR -->
|
|
||||||
<div class="d-flex align-items-center justify-content-between"
|
|
||||||
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
|
|
||||||
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" style="width: 42px; height: 42px;" />
|
|
||||||
<div>
|
|
||||||
<div
|
|
||||||
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
|
|
||||||
class="mr-2">
|
|
||||||
<i class="fa fa-check mr-1"></i>Community
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
style="color: #875A7B; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
|
|
||||||
class="mr-2">
|
|
||||||
<i class="fa fa-check mr-1"></i>Enterprise
|
|
||||||
</div>
|
|
||||||
<div
|
|
||||||
style="color: #017E84; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
|
|
||||||
class="mr-2">
|
|
||||||
<i class="fa fa-check mr-1"></i>Odoo.sh
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF TITLE BAR -->
|
|
||||||
<div class="container">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-12 col-md-12 col-lg-12">
|
|
||||||
<!-- APP HERO -->
|
|
||||||
<h1 style="color: #FFFFFF; font-weight: bolder; font-size: 50px; text-align: center; margin-top: 50px;">
|
|
||||||
Hide Create|Delete|Archive|Export Options - Model Wise</h1>
|
|
||||||
<p style="color:#FFFFFF; padding: 8px 15px; text-align: center; font-size: 24px;">Hide Create, Delete, Archive, Export Options in Models</p>
|
|
||||||
<!-- END OF APP HERO -->
|
|
||||||
<img src="assets/screenshots/hero.gif" class="img-responsive"
|
|
||||||
style="width: 100%; margin-left: auto; margin-right: auto;" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- NAVIGATION SECTION -->
|
|
||||||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px; margin-top: 300px;">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mr-2"
|
|
||||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
|
|
||||||
<img src="assets/misc/compass.png" />
|
|
||||||
</div>
|
|
||||||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Explore This
|
|
||||||
Module</h2>
|
|
||||||
</div>
|
|
||||||
<div class="row my-4" style="font-family: 'Montserrat', sans-serif;">
|
|
||||||
<div class="col-sm-12 col-md-6 my-3">
|
|
||||||
<a href="#overview">
|
|
||||||
<div class="d-flex justify-content-between align-items-center"
|
|
||||||
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
|
|
||||||
<div>
|
|
||||||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Overview</span>
|
|
||||||
<span
|
|
||||||
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">Learn
|
|
||||||
more about this
|
|
||||||
module</span>
|
|
||||||
</div>
|
|
||||||
<img src="assets/misc/right-arrow.png" width="36" height="36" />
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-12 col-md-6 my-3">
|
|
||||||
<a href="#features">
|
|
||||||
<div class="d-flex justify-content-between align-items-center"
|
|
||||||
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
|
|
||||||
<div>
|
|
||||||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Features</span>
|
|
||||||
<span
|
|
||||||
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
|
|
||||||
features of this
|
|
||||||
module</span>
|
|
||||||
</div>
|
|
||||||
<img src="assets/misc/right-arrow.png" width="36" height="36" />
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-12 col-md-6 my-3">
|
|
||||||
<a href="#screenshots">
|
|
||||||
<div class="d-flex justify-content-between align-items-center"
|
|
||||||
style="background-color: #f5f5f5; padding: 30px; width: 100%;">
|
|
||||||
<div>
|
|
||||||
<span style="color: #714B67; font-size: 24px; font-weight: 500; display: block;">Screenshots</span>
|
|
||||||
<span
|
|
||||||
style="color: #714B67; font-size: 16px; font-weight: 400; color:#282F33; display: block;">View
|
|
||||||
screenshots of this
|
|
||||||
module</span>
|
|
||||||
</div>
|
|
||||||
<img src="assets/misc/right-arrow.png" width="36" height="36" />
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF NAVIGATION SECTION -->
|
|
||||||
|
|
||||||
<!-- OVERVIEW SECTION -->
|
|
||||||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="overview">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mr-2"
|
|
||||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
|
|
||||||
<img src="assets/misc/pie-chart.png" />
|
|
||||||
</div>
|
|
||||||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Overview
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
|
|
||||||
<div class="col-sm-12 py-4">
|
|
||||||
By using this module we can hide the options like create,delete,export,and archive/un archive in the model
|
|
||||||
which we want. Here we are also able to select the user groups except Administrator which we want to apply the
|
|
||||||
above hiding functionality </div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF OVERVIEW SECTION -->
|
|
||||||
|
|
||||||
<!-- FEATURES SECTION -->
|
|
||||||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="features">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mr-2"
|
|
||||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
|
|
||||||
<img src="assets/misc/features.png" />
|
|
||||||
</div>
|
|
||||||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Features
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div class="row" style="font-family: 'Montserrat', sans-serif; font-weight: 400; font-size: 14px; line-height: 200%;">
|
|
||||||
<div class="col-sm-12 col-md-6">
|
|
||||||
<div class="d-flex align-items-center" style="margin-top: 40px; margin-bottom: 40px">
|
|
||||||
<img src="assets/misc/check-box.png" class="mr-2" />
|
|
||||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Easily hide the options like Create,Delete,Export and Archive/UnArchive</span>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
|
|
||||||
<img src="assets/misc/check-box.png" class="mr-2" />
|
|
||||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Can hide the options for specific model</span>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
|
|
||||||
<img src="assets/misc/check-box.png" class="mr-2" />
|
|
||||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Can hide the options for specific user group</span>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex align-items-center" style="margin-top: 30px; margin-bottom: 30px">
|
|
||||||
<img src="assets/misc/check-box.png" class="mr-2" />
|
|
||||||
<span style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">No additional configuration needed</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF FEATURES SECTION -->
|
|
||||||
|
|
||||||
<!-- SCREENSHOTS SECTION -->
|
|
||||||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;" id="screenshots">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mr-2"
|
|
||||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
|
|
||||||
<img src="assets/misc/pictures.png" />
|
|
||||||
</div>
|
|
||||||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Screenshots
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-12">
|
|
||||||
|
|
||||||
<div style="display: block; margin: 30px auto;">
|
|
||||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Go to Settings > Users and there you can see the Configure Model Access, by enabling that
|
|
||||||
option and refresh the page, you can see a new menu named 'Restrict Access Rights'</h3>
|
|
||||||
<img src="assets/screenshots/model_access_right_01.png" class="img-thumbnail">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="display: block; margin: 30px auto;">
|
|
||||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> User in the Purchase module</h3>
|
|
||||||
<img src="assets/screenshots/model_access_right_02.png" class="img-thumbnail">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="display: block; margin: 30px auto;">
|
|
||||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">Select the Model, Groups and the options which we want to hide</h3>
|
|
||||||
<img src="assets/screenshots/model_access_right_03.png" class="img-thumbnail">
|
|
||||||
</div>
|
|
||||||
<div style="display: block; margin: 30px auto;">
|
|
||||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> We can see Create option is hidden in purchase.order to those who are User
|
|
||||||
in purchase module</h3>
|
|
||||||
<img src="assets/screenshots/model_access_right_04.png" class="img-thumbnail">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="display: block; margin: 30px auto;">
|
|
||||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;">User in Project module</h3>
|
|
||||||
<img src="assets/screenshots/model_access_right_05.png" class="img-thumbnail">
|
|
||||||
</div>
|
|
||||||
<div style="display: block; margin: 30px auto;">
|
|
||||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> By default, we can see Export and Archive/UnArchive options</h3>
|
|
||||||
<img src="assets/screenshots/model_access_right_06.png" class="img-thumbnail">
|
|
||||||
</div>
|
|
||||||
<div style="display: block; margin: 30px auto;">
|
|
||||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Select the options which we want to hide</h3>
|
|
||||||
<img src="assets/screenshots/model_access_right_07.png" class="img-thumbnail">
|
|
||||||
</div>
|
|
||||||
<div style="display: block; margin: 30px auto;">
|
|
||||||
<h3 style="font-family: 'Montserrat', sans-serif; font-size: 18px; font-weight: bold;"> Export and Archive/UnArchive functionality are hidden</h3>
|
|
||||||
<img src="assets/screenshots/model_access_right_08.png" class="img-thumbnail">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF SCREENSHOTS SECTION -->
|
|
||||||
<!-- RELATED PRODUCTS -->
|
|
||||||
<div class="d-flex align-items-center"
|
|
||||||
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mr-2"
|
|
||||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
|
|
||||||
<img src="assets/misc/categories.png"/>
|
|
||||||
</div>
|
|
||||||
<h2 class="mt-2"
|
|
||||||
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
|
|
||||||
Related
|
|
||||||
Products
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-12">
|
|
||||||
<div id="demo1" class="row carousel slide" data-ride="carousel">
|
|
||||||
<!-- The slideshow -->
|
|
||||||
<div class="carousel-inner" style="padding: 30px;">
|
|
||||||
<div class="carousel-item" style="min-height: 198.656px;">
|
|
||||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
|
|
||||||
style="float:left">
|
|
||||||
<a href="https://apps.odoo.com/apps/modules/16.0/openai_odoo_base/"
|
|
||||||
target="_blank">
|
|
||||||
<div style="border-radius:10px">
|
|
||||||
<img class="img img-responsive center-block"
|
|
||||||
style="border-radius: 0px;"
|
|
||||||
src="assets/modules/1.png">
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
|
|
||||||
style="float:left">
|
|
||||||
<a href="https://apps.odoo.com/apps/modules/16.0/woo_commerce/"
|
|
||||||
target="_blank">
|
|
||||||
<div style="border-radius:10px">
|
|
||||||
<img class="img img-responsive center-block"
|
|
||||||
style="border-radius: 0px;"
|
|
||||||
src="assets/modules/l2.png">
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
|
|
||||||
style="float:left">
|
|
||||||
<a href="https://apps.odoo.com/apps/modules/16.0/shopify_odoo_connector/"
|
|
||||||
target="_blank">
|
|
||||||
<div style="border-radius:10px">
|
|
||||||
<img class="img img-responsive center-block"
|
|
||||||
style="border-radius: 0px;"
|
|
||||||
src="assets/modules/l3.png">
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="carousel-item active"
|
|
||||||
style="min-height: 198.656px;">
|
|
||||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
|
|
||||||
style="float:left">
|
|
||||||
<a href="https://apps.odoo.com/apps/modules/16.0/hr_zk_attendance/"
|
|
||||||
target="_blank">
|
|
||||||
<div style="border-radius:10px">
|
|
||||||
<img class="img img-responsive center-block"
|
|
||||||
style="border-radius: 0px;"
|
|
||||||
src="assets/modules/l4.png">
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
|
|
||||||
style="float:left">
|
|
||||||
<a href="https://apps.odoo.com/apps/modules/16.0/whatsapp_redirect/"
|
|
||||||
target="_blank">
|
|
||||||
<div style="border-radius:10px">
|
|
||||||
<img class="img img-responsive center-block"
|
|
||||||
style="border-radius: 0px;"
|
|
||||||
src="assets/modules/l5.png">
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
|
|
||||||
style="float:left">
|
|
||||||
<a href="https://apps.odoo.com/apps/modules/16.0/openai_website_product_media/"
|
|
||||||
target="_blank">
|
|
||||||
<div style="border-radius:10px">
|
|
||||||
<img class="img img-responsive center-block"
|
|
||||||
style="border-radius: 0px;"
|
|
||||||
src="assets/modules/l6.png">
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- Left and right controls -->
|
|
||||||
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
|
|
||||||
style="width:35px; color:#000"> <span
|
|
||||||
class="carousel-control-prev-icon"><i
|
|
||||||
class="fa fa-chevron-left"
|
|
||||||
style="font-size:24px"></i></span>
|
|
||||||
</a> <a class="carousel-control-next" href="#demo1"
|
|
||||||
data-slide="next" style="width:35px; color:#000">
|
|
||||||
<span class="carousel-control-next-icon"><i
|
|
||||||
class="fa fa-chevron-right"
|
|
||||||
style="font-size:24px"></i></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF RELATED PRODUCTS -->
|
|
||||||
|
|
||||||
<!-- OUR SERVICES -->
|
|
||||||
|
|
||||||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mr-2"
|
|
||||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
|
|
||||||
<img src="assets/misc/star.png" />
|
|
||||||
</div>
|
|
||||||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="container my-5">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
|
|
||||||
Odoo
|
|
||||||
Customization</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
|
|
||||||
Odoo
|
|
||||||
Implementation</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
|
|
||||||
Odoo
|
|
||||||
Support</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
|
|
||||||
Hire
|
|
||||||
Odoo
|
|
||||||
Developer</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
|
|
||||||
Odoo
|
|
||||||
Integration</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
|
|
||||||
Odoo
|
|
||||||
Migration</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
|
|
||||||
Odoo
|
|
||||||
Consultancy</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
|
|
||||||
Odoo
|
|
||||||
Implementation</h6>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
|
|
||||||
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
|
|
||||||
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
|
|
||||||
</div>
|
|
||||||
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
|
|
||||||
Odoo
|
|
||||||
Licensing Consultancy</h6>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- END OF OUR SERVICES -->
|
|
||||||
|
|
||||||
<!-- OUR INDUSTRIES -->
|
|
||||||
|
|
||||||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mr-2"
|
|
||||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
|
|
||||||
<img src="assets/misc/corporate.png" />
|
|
||||||
</div>
|
|
||||||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our
|
|
||||||
Industries
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="container my-5">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
|
|
||||||
Trading
|
|
||||||
</h5>
|
|
||||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
|
|
||||||
Easily procure
|
|
||||||
and
|
|
||||||
sell your products</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
|
|
||||||
POS
|
|
||||||
</h5>
|
|
||||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
|
|
||||||
Easy
|
|
||||||
configuration
|
|
||||||
and convivial experience</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
|
|
||||||
Education
|
|
||||||
</h5>
|
|
||||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
|
|
||||||
A platform for
|
|
||||||
educational management</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px"
|
|
||||||
width="48px">
|
|
||||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
|
|
||||||
Manufacturing
|
|
||||||
</h5>
|
|
||||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
|
|
||||||
Plan, track and
|
|
||||||
schedule your operations</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
|
|
||||||
E-commerce & Website
|
|
||||||
</h5>
|
|
||||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
|
|
||||||
Mobile
|
|
||||||
friendly,
|
|
||||||
awe-inspiring product pages</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
|
|
||||||
Service Management
|
|
||||||
</h5>
|
|
||||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
|
|
||||||
Keep track of
|
|
||||||
services and invoice</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
|
|
||||||
Restaurant
|
|
||||||
</h5>
|
|
||||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
|
|
||||||
Run your bar or
|
|
||||||
restaurant methodically</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-3">
|
|
||||||
<div class="my-4 d-flex flex-column justify-content-center"
|
|
||||||
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
|
|
||||||
<img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px">
|
|
||||||
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
|
|
||||||
Hotel Management
|
|
||||||
</h5>
|
|
||||||
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
|
|
||||||
An
|
|
||||||
all-inclusive
|
|
||||||
hotel management application</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- END OF OUR INDUSTRIES -->
|
|
||||||
|
|
||||||
<!-- SUPPORT -->
|
|
||||||
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
|
|
||||||
<div class="d-flex justify-content-center align-items-center mr-2"
|
|
||||||
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
|
|
||||||
<img src="assets/misc/customer-support.png" />
|
|
||||||
</div>
|
|
||||||
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support
|
|
||||||
</h2>
|
|
||||||
</div>
|
|
||||||
<div class="container mt-5">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-12 col-md-6">
|
|
||||||
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
|
|
||||||
<div class="mr-4"
|
|
||||||
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
|
|
||||||
<img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h4>Need Help?</h4>
|
|
||||||
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p>
|
|
||||||
<a href="mailto:odoo@cybrosys.com">
|
|
||||||
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
|
|
||||||
odoo@cybrosys.com</p>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-12 col-md-6">
|
|
||||||
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
|
|
||||||
<div class="mr-4"
|
|
||||||
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
|
|
||||||
<img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<h4>WhatsApp</h4>
|
|
||||||
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
|
|
||||||
<a href="https://api.whatsapp.com/send?phone=918606827707">
|
|
||||||
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068
|
|
||||||
27707</p>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
|
|
||||||
<img src="assets/misc/logo.png" width="144" height="31"
|
|
||||||
style="width:144px; height: 31px; margin-top: 40px;" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- END OF SUPPORT -->
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
/** @odoo-module */
|
|
||||||
/**
|
|
||||||
* This file will used to hide the selected options from the form view
|
|
||||||
*/
|
|
||||||
import { FormController} from "@web/views/form/form_controller";
|
|
||||||
import { patch} from "@web/core/utils/patch";
|
|
||||||
var rpc = require('web.rpc');
|
|
||||||
const { onWillStart} = owl;
|
|
||||||
patch(FormController.prototype, 'jikimo_hide_options/static/src/js/form_controller.js.FormController', {
|
|
||||||
/**
|
|
||||||
* This function will used to hide the selected options from the form view
|
|
||||||
*/
|
|
||||||
setup() {
|
|
||||||
this._super();
|
|
||||||
onWillStart(async () => {
|
|
||||||
var self = this
|
|
||||||
var result;
|
|
||||||
await rpc.query({
|
|
||||||
model: 'access.right',
|
|
||||||
method: 'hide_buttons',
|
|
||||||
}).then(function(data) {
|
|
||||||
result = data;
|
|
||||||
});
|
|
||||||
for (var i = 0; i < result.length; i++) {
|
|
||||||
var group = result[i].module + "." + result[i].group_name
|
|
||||||
if (self.props.resModel == result[i].model) {
|
|
||||||
if (await self.user.hasGroup(group)) {
|
|
||||||
if (!this.user.isAdmin) {
|
|
||||||
if (result[i].is_create_or_update) {
|
|
||||||
self.canCreate = false
|
|
||||||
}
|
|
||||||
if (result[i].is_delete) {
|
|
||||||
this.archInfo.activeActions.delete = false
|
|
||||||
}
|
|
||||||
if (result[i].is_archive) {
|
|
||||||
self.archiveEnabled = false
|
|
||||||
} else {
|
|
||||||
self.archiveEnabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/** @odoo-module */
|
|
||||||
/**
|
|
||||||
* This file will used to hide the selected options from the list view
|
|
||||||
*/
|
|
||||||
import { KanbanController } from '@web/views/kanban/kanban_controller';
|
|
||||||
import { patch} from "@web/core/utils/patch";
|
|
||||||
var rpc = require('web.rpc');
|
|
||||||
const {onWillStart} = owl;
|
|
||||||
patch(KanbanController.prototype, 'jikimo_hide_options/static/src/js/list_controller.js.KanbanController', {
|
|
||||||
/**
|
|
||||||
* This function will used to hide the selected options from the Kanban view
|
|
||||||
*/
|
|
||||||
setup() {
|
|
||||||
this._super();
|
|
||||||
onWillStart(async () => {
|
|
||||||
var self = this
|
|
||||||
var result;
|
|
||||||
await rpc.query({
|
|
||||||
model: 'access.right',
|
|
||||||
method: 'hide_buttons',
|
|
||||||
}).then(function(data) {
|
|
||||||
result = data;
|
|
||||||
});
|
|
||||||
for (var i = 0; i < result.length; i++) {
|
|
||||||
var group = result[i].module + "." + result[i].group_name
|
|
||||||
if (self.props.resModel == result[i].model) {
|
|
||||||
if (await self.model.user.hasGroup(group)) {
|
|
||||||
if (!self.model.user.isAdmin) {
|
|
||||||
if (result[i].is_create_or_update) {
|
|
||||||
self.props.archInfo.activeActions.create=false
|
|
||||||
self.props.archInfo.activeActions.edit=false
|
|
||||||
}
|
|
||||||
if (result[i].is_delete) {
|
|
||||||
self.props.archInfo.activeActions.delete=false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
/** @odoo-module */
|
|
||||||
/**
|
|
||||||
* This file will used to hide the selected options from the list view
|
|
||||||
*/
|
|
||||||
import { ListController} from '@web/views/list/list_controller';
|
|
||||||
import { patch} from "@web/core/utils/patch";
|
|
||||||
var rpc = require('web.rpc');
|
|
||||||
const {onWillStart} = owl;
|
|
||||||
patch(ListController.prototype, 'jikimo_hide_options/static/src/js/list_controller.js.ListController', {
|
|
||||||
/**
|
|
||||||
* This function will used to hide the selected options from the list view
|
|
||||||
*/
|
|
||||||
setup() {
|
|
||||||
this._super();
|
|
||||||
onWillStart(async () => {
|
|
||||||
var self = this
|
|
||||||
var result;
|
|
||||||
await rpc.query({
|
|
||||||
model: 'access.right',
|
|
||||||
method: 'hide_buttons',
|
|
||||||
}).then(function(data) {
|
|
||||||
result = data;
|
|
||||||
});
|
|
||||||
for (var i = 0; i < result.length; i++) {
|
|
||||||
var group = result[i].module + "." + result[i].group_name
|
|
||||||
if (self.props.resModel == result[i].model) {
|
|
||||||
if (await self.userService.hasGroup(group)) {
|
|
||||||
if (!this.userService.isAdmin) {
|
|
||||||
if (result[i].is_create_or_update) {
|
|
||||||
self.activeActions.create = false;
|
|
||||||
}
|
|
||||||
if (result[i].is_export) {
|
|
||||||
self.isExportEnable = false
|
|
||||||
self.isExportEnable = false
|
|
||||||
}
|
|
||||||
if (result[i].is_delete) {
|
|
||||||
self.activeActions.delete = false;
|
|
||||||
}
|
|
||||||
if (result[i].is_archive) {
|
|
||||||
self.archiveEnabled = false;
|
|
||||||
} else {
|
|
||||||
self.archiveEnabled = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<odoo>
|
|
||||||
<!-- Action for the menu Restrict Model Access-->
|
|
||||||
<record id="access_right_action" model="ir.actions.act_window">
|
|
||||||
<field name="name">隐藏项目</field>
|
|
||||||
<field name="res_model">access.right</field>
|
|
||||||
<field name='view_mode'>tree,form</field>
|
|
||||||
</record>
|
|
||||||
<!-- Tree view for the model access.right-->
|
|
||||||
<record id="access_right_view_tree" model="ir.ui.view">
|
|
||||||
<field name="name">access.right.view.tree</field>
|
|
||||||
<field name="model">access.right</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<tree>
|
|
||||||
<field name="model_id" string="模型"/>
|
|
||||||
<field name="groups_id" string="用户组"/>
|
|
||||||
<field name="is_delete" string="删除"/>
|
|
||||||
<field name="is_export" string="导出"/>
|
|
||||||
<field name="is_create_or_update" string="创建或更新"/>
|
|
||||||
<field name="is_archive" string="归档"/>
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
<!-- Form view for the model access.right-->
|
|
||||||
<record id="access_right_view_form" model="ir.ui.view">
|
|
||||||
<field name="name">access.right.view.form</field>
|
|
||||||
<field name="model">access.right</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<form>
|
|
||||||
<sheet>
|
|
||||||
<group>
|
|
||||||
<group>
|
|
||||||
<field name="model_id" string="模型"/>
|
|
||||||
<field name="groups_id" string="用户组"/>
|
|
||||||
</group>
|
|
||||||
<group>
|
|
||||||
<field name="is_delete" string="删除"/>
|
|
||||||
<field name="is_export" string="导出"/>
|
|
||||||
<field name="is_create_or_update" string="创建或更新"/>
|
|
||||||
<field name="is_archive" string="归档"/>
|
|
||||||
</group>
|
|
||||||
</group>
|
|
||||||
</sheet>
|
|
||||||
<div class="oe_chatter">
|
|
||||||
<field name="message_follower_ids"/>
|
|
||||||
<field name="message_ids"/>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
<!-- Creating a menu named Restrict Model Access-->
|
|
||||||
<menuitem id="access_right_menu"
|
|
||||||
name="隐藏项目"
|
|
||||||
parent="base.menu_administration"
|
|
||||||
action="access_right_action"
|
|
||||||
sequence="6"
|
|
||||||
groups="jikimo_hide_options.model_access_rights_groups_configure_model_access"/>
|
|
||||||
</odoo>
|
|
||||||
@@ -263,8 +263,6 @@ class QualityCheck(models.Model):
|
|||||||
picture = fields.Binary('Picture', attachment=True)
|
picture = fields.Binary('Picture', attachment=True)
|
||||||
additional_note = fields.Text(
|
additional_note = fields.Text(
|
||||||
'Additional Note', help="Additional remarks concerning this check.")
|
'Additional Note', help="Additional remarks concerning this check.")
|
||||||
report_result = fields.Char('检测结果', readonly=True)
|
|
||||||
report_pdf = fields.Binary('检测报告', readonly=True)
|
|
||||||
|
|
||||||
def _compute_alert_count(self):
|
def _compute_alert_count(self):
|
||||||
alert_data = self.env['quality.alert'].read_group([('check_id', 'in', self.ids)], ['check_id'], ['check_id'])
|
alert_data = self.env['quality.alert'].read_group([('check_id', 'in', self.ids)], ['check_id'], ['check_id'])
|
||||||
@@ -410,5 +408,3 @@ class QualityAlert(models.Model):
|
|||||||
domain = [('team_ids', '=', False)]
|
domain = [('team_ids', '=', False)]
|
||||||
stage_ids = stages._search(domain, order=order, access_rights_uid=SUPERUSER_ID)
|
stage_ids = stages._search(domain, order=order, access_rights_uid=SUPERUSER_ID)
|
||||||
return stages.browse(stage_ids)
|
return stages.browse(stage_ids)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -9,10 +9,8 @@ access_quality_point_user,quality.point,quality.model_quality_point,quality.grou
|
|||||||
access_quality_point_test_type_user,quality.point.test_type,quality.model_quality_point_test_type,quality.group_quality_user,1,0,0,0
|
access_quality_point_test_type_user,quality.point.test_type,quality.model_quality_point_test_type,quality.group_quality_user,1,0,0,0
|
||||||
access_quality_check_stock_user,quality.check,quality.model_quality_check,stock.group_stock_user,1,1,1,0
|
access_quality_check_stock_user,quality.check,quality.model_quality_check,stock.group_stock_user,1,1,1,0
|
||||||
access_stock_lot_user,stock.lot,stock.model_stock_lot,quality.group_quality_user,1,0,0,0
|
access_stock_lot_user,stock.lot,stock.model_stock_lot,quality.group_quality_user,1,0,0,0
|
||||||
|
|
||||||
access_stock_pack_user,stock.move.line,stock.model_stock_move_line,quality.group_quality_user,1,0,0,0
|
access_stock_pack_user,stock.move.line,stock.model_stock_move_line,quality.group_quality_user,1,0,0,0
|
||||||
access_stock_picking_group_quality_user,stock_picking_group_quality_user,stock.model_stock_picking,quality.group_quality_user,1,0,0,0
|
access_stock_picking,stock.move.line,stock.model_stock_picking,quality.group_quality_user,1,0,0,0
|
||||||
|
|
||||||
access_quality_alert_team_manager,quality.alert.team,quality.model_quality_alert_team,quality.group_quality_manager,1,1,1,1
|
access_quality_alert_team_manager,quality.alert.team,quality.model_quality_alert_team,quality.group_quality_manager,1,1,1,1
|
||||||
access_quality_check_manager,quality.check,quality.model_quality_check,quality.group_quality_manager,1,1,1,1
|
access_quality_check_manager,quality.check,quality.model_quality_check,quality.group_quality_manager,1,1,1,1
|
||||||
access_quality_alert_manager,quality.alert,quality.model_quality_alert,quality.group_quality_manager,1,1,1,1
|
access_quality_alert_manager,quality.alert,quality.model_quality_alert,quality.group_quality_manager,1,1,1,1
|
||||||
|
|||||||
|
@@ -32,9 +32,7 @@
|
|||||||
<field name="tag_ids"/>
|
<field name="tag_ids"/>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<strong>
|
<strong><field name="product_tmpl_id"/></strong>
|
||||||
<field name="product_tmpl_id"/>
|
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<field name="display_name"/>
|
<field name="display_name"/>
|
||||||
@@ -67,28 +65,20 @@
|
|||||||
<field name="company_id" invisible="1"/>
|
<field name="company_id" invisible="1"/>
|
||||||
<field name="product_id" invisible="1"/>
|
<field name="product_id" invisible="1"/>
|
||||||
<div class="oe_button_box">
|
<div class="oe_button_box">
|
||||||
<button name="action_see_check" type="object" attrs="{'invisible': [('check_id', '=', False)]}"
|
<button name="action_see_check" type="object" attrs="{'invisible': [('check_id', '=', False)]}" class="oe_stat_button" icon="fa-check-square-o">
|
||||||
class="oe_stat_button" icon="fa-check-square-o">
|
|
||||||
<div class="o_field_widget o_stat_info">
|
<div class="o_field_widget o_stat_info">
|
||||||
<span class="o_stat_value">
|
<span class="o_stat_value"><field name="check_id" readonly="1"/></span>
|
||||||
<field name="check_id" readonly="1"/>
|
|
||||||
</span>
|
|
||||||
<span class="o_stat_text">Quality Check</span>
|
<span class="o_stat_text">Quality Check</span>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_title">
|
<div class="oe_title"><h1><field name="name" readonly="1"/></h1></div>
|
||||||
<h1>
|
|
||||||
<field name="name" readonly="1"/>
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="title"/>
|
<field name="title"/>
|
||||||
<field name="product_tmpl_id"/>
|
<field name="product_tmpl_id"/>
|
||||||
<field name="product_id" groups="product.group_product_variant"/>
|
<field name="product_id" groups="product.group_product_variant"/>
|
||||||
<field name="lot_id" context="{'default_product_id': product_id}"
|
<field name="lot_id" context="{'default_product_id': product_id}" groups="stock.group_production_lot"/>
|
||||||
groups="stock.group_production_lot"/>
|
|
||||||
<field name="picking_id"/>
|
<field name="picking_id"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
@@ -154,25 +144,25 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="quality_alert_view_pivot" model="ir.ui.view">
|
<record id="quality_alert_view_pivot" model="ir.ui.view">
|
||||||
<field name="name">quality.alert.view.pivot</field>
|
<field name="name">quality.alert.view.pivot</field>
|
||||||
<field name="model">quality.alert</field>
|
<field name="model">quality.alert</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<pivot string="Quality Alert Analysis" sample="1">
|
<pivot string="Quality Alert Analysis" sample="1">
|
||||||
<field name="stage_id" type="col"/>
|
<field name="stage_id" type="col"/>
|
||||||
<field name="team_id" type="row"/>
|
<field name="team_id" type="row"/>
|
||||||
</pivot>
|
</pivot>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="quality_alert_view_graph" model="ir.ui.view">
|
<record id="quality_alert_view_graph" model="ir.ui.view">
|
||||||
<field name="name">quality.alert.view.graph</field>
|
<field name="name">quality.alert.view.graph</field>
|
||||||
<field name="model">quality.alert</field>
|
<field name="model">quality.alert</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<graph string="Quality Alert Analysis" sample="1">
|
<graph string="Quality Alert Analysis" sample="1">
|
||||||
<field name="reason_id"/>
|
<field name="reason_id"/>
|
||||||
<field name="stage_id"/>
|
<field name="stage_id"/>
|
||||||
</graph>
|
</graph>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="quality_alert_view_calendar" model="ir.ui.view">
|
<record id="quality_alert_view_calendar" model="ir.ui.view">
|
||||||
@@ -196,8 +186,7 @@
|
|||||||
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
|
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
|
||||||
<field name="domain">[('team_id', '=', active_id)]</field>
|
<field name="domain">[('team_id', '=', active_id)]</field>
|
||||||
<field name="context">{'default_team_id': active_id,
|
<field name="context">{'default_team_id': active_id,
|
||||||
'search_default_team_id': [active_id]}
|
'search_default_team_id': [active_id]}</field>
|
||||||
</field>
|
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="quality_alert_action_check" model="ir.actions.act_window">
|
<record id="quality_alert_action_check" model="ir.actions.act_window">
|
||||||
@@ -206,7 +195,7 @@
|
|||||||
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
|
<field name="view_mode">kanban,tree,form,pivot,graph,calendar</field>
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p class="o_view_nocontent_smiling_face">
|
<p class="o_view_nocontent_smiling_face">
|
||||||
Create a new quality alert
|
Create a new quality alert
|
||||||
</p>
|
</p>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -223,35 +212,24 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- QUALITY.CHECK -->
|
<!-- QUALITY.CHECK -->
|
||||||
<record id="quality_check_view_form" model="ir.ui.view">
|
<record id="quality_check_view_form" model="ir.ui.view">
|
||||||
<field name="name">quality.check.view.form</field>
|
<field name="name">quality.check.view.form</field>
|
||||||
<field name="model">quality.check</field>
|
<field name="model">quality.check</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<form>
|
<form>
|
||||||
<header>
|
<header>
|
||||||
<button name="do_pass" type="object" class="btn-primary"
|
<button name="do_pass" type="object" class="btn-primary" attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Pass" data-hotkey="q"/>
|
||||||
attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Pass" data-hotkey="q"/>
|
<button name="do_pass" type="object" attrs="{'invisible': [('quality_state', '!=', 'fail')]}" groups="quality.group_quality_manager" string="Pass" data-hotkey="q"/>
|
||||||
<button name="do_pass" type="object" attrs="{'invisible': [('quality_state', '!=', 'fail')]}"
|
<button name="do_fail" type="object" class="btn-primary" attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Fail" data-hotkey="w"/>
|
||||||
groups="quality.group_quality_manager" string="Pass" data-hotkey="q"/>
|
<button name="do_fail" type="object" attrs="{'invisible': [('quality_state', '!=', 'pass')]}" groups="quality.group_quality_manager" string="Fail" data-hotkey="w"/>
|
||||||
<button name="do_fail" type="object" class="btn-primary"
|
<button name="do_measure" type="object" attrs="{'invisible': ['|', ('test_type', '!=', 'measure'), ('quality_state', '!=', 'none')]}" string="Measure" data-hotkey="v"/>
|
||||||
attrs="{'invisible': [('quality_state', '!=', 'none')]}" string="Fail" data-hotkey="w"/>
|
<button name="do_alert" type="object" attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'pass')]}" string="Create Alert" data-hotkey="g"/>
|
||||||
<button name="do_fail" type="object" attrs="{'invisible': [('quality_state', '!=', 'pass')]}"
|
<button name="do_alert" type="object" class="btn-primary" attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'fail')]}" string="Create Alert" data-hotkey="g"/>
|
||||||
groups="quality.group_quality_manager" string="Fail" data-hotkey="w"/>
|
|
||||||
<button name="do_measure" type="object"
|
|
||||||
attrs="{'invisible': ['|', ('test_type', '!=', 'measure'), ('quality_state', '!=', 'none')]}"
|
|
||||||
string="Measure" data-hotkey="v"/>
|
|
||||||
<button name="do_alert" type="object"
|
|
||||||
attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'pass')]}"
|
|
||||||
string="Create Alert" data-hotkey="g"/>
|
|
||||||
<button name="do_alert" type="object" class="btn-primary"
|
|
||||||
attrs="{'invisible': ['|', ('alert_ids', '!=', []), ('quality_state', '!=', 'fail')]}"
|
|
||||||
string="Create Alert" data-hotkey="g"/>
|
|
||||||
<field name="quality_state" widget="statusbar"/>
|
<field name="quality_state" widget="statusbar"/>
|
||||||
</header>
|
</header>
|
||||||
<sheet>
|
<sheet>
|
||||||
<div class="oe_button_box" name="button_box">
|
<div class="oe_button_box" name="button_box">
|
||||||
<button name="action_see_alerts" icon="fa-bell" type="object" class="oe_stat_button"
|
<button name="action_see_alerts" icon="fa-bell" type="object" class="oe_stat_button" attrs="{'invisible': [('alert_count', '=', 0)]}">
|
||||||
attrs="{'invisible': [('alert_count', '=', 0)]}">
|
|
||||||
<field name="alert_count" string="Alerts" widget="statinfo"/>
|
<field name="alert_count" string="Alerts" widget="statinfo"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -264,26 +242,20 @@
|
|||||||
<field name="move_line_id" invisible="1"/>
|
<field name="move_line_id" invisible="1"/>
|
||||||
<field name="product_tracking" invisible="1"/>
|
<field name="product_tracking" invisible="1"/>
|
||||||
<field name="is_lot_tested_fractionally" invisible="1"/>
|
<field name="is_lot_tested_fractionally" invisible="1"/>
|
||||||
<field name="lot_name"
|
<field name="lot_name" attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', False), '|', ('measure_on', '!=', 'move_line'), ('move_line_id', '=', False)]}"/>
|
||||||
attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', False), '|', ('measure_on', '!=', 'move_line'), ('move_line_id', '=', False)]}"/>
|
<field name="lot_id" attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', True), ('measure_on', '!=', 'move_line')]}"/>
|
||||||
<field name="lot_id"
|
|
||||||
attrs="{'invisible': ['|', ('product_tracking', '=', 'none'), '|', ('show_lot_text', '=', True), ('measure_on', '!=', 'move_line')]}"/>
|
|
||||||
<label for="qty_line" attrs="{'invisible': [('move_line_id', '=', False)]}"/>
|
<label for="qty_line" attrs="{'invisible': [('move_line_id', '=', False)]}"/>
|
||||||
<div class="o_row" attrs="{'invisible': [('move_line_id', '=', False)]}">
|
<div class="o_row" attrs="{'invisible': [('move_line_id', '=', False)]}">
|
||||||
<field name="qty_line"/>
|
<field name="qty_line"/>
|
||||||
<field name="uom_id"/>
|
<field name="uom_id"/>
|
||||||
</div>
|
</div>
|
||||||
<label for="qty_to_test"
|
<label for="qty_to_test" attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
|
||||||
attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
|
<div class="o_row" attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
|
||||||
<div class="o_row"
|
|
||||||
attrs="{'invisible': ['|', ('move_line_id', '=', False), '|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
|
|
||||||
<field name="qty_to_test"/>
|
<field name="qty_to_test"/>
|
||||||
<field name="uom_id"/>
|
<field name="uom_id"/>
|
||||||
</div>
|
</div>
|
||||||
<label for="qty_tested"
|
<label for="qty_tested" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
|
||||||
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}"/>
|
<div class="o_row" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
|
||||||
<div class="o_row"
|
|
||||||
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '=', False)]}">
|
|
||||||
<field name="qty_tested" attrs="{'readonly': [('quality_state', '!=', 'none')]}"/>
|
<field name="qty_tested" attrs="{'readonly': [('quality_state', '!=', 'none')]}"/>
|
||||||
<field name="uom_id"/>
|
<field name="uom_id"/>
|
||||||
</div>
|
</div>
|
||||||
@@ -292,32 +264,26 @@
|
|||||||
<field name="alert_ids" invisible="1"/>
|
<field name="alert_ids" invisible="1"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="picking_id"
|
<field name="picking_id" attrs="{'invisible': [('quality_state', 'in', ('pass', 'fail')), ('picking_id', '=', False)]}"/>
|
||||||
attrs="{'invisible': [('quality_state', 'in', ('pass', 'fail')), ('picking_id', '=', False)]}"/>
|
|
||||||
<field name="point_id"/>
|
<field name="point_id"/>
|
||||||
<field string="Type" name="test_type_id" options="{'no_open': True, 'no_create': True}"
|
<field string="Type" name="test_type_id" options="{'no_open': True, 'no_create': True}" attrs="{'readonly': [('point_id', '!=', False)]}"/>
|
||||||
attrs="{'readonly': [('point_id', '!=', False)]}"/>
|
|
||||||
<field name="control_date" invisible="1"/>
|
<field name="control_date" invisible="1"/>
|
||||||
<field name="team_id"/>
|
<field name="team_id"/>
|
||||||
<field name="company_id" groups="base.group_multi_company"/>
|
<field name="company_id" groups="base.group_multi_company"/>
|
||||||
<field name="user_id" string="Control Person" invisible="1"/>
|
<field name="user_id" string="Control Person" invisible="1"/>
|
||||||
<field name="partner_id" string="Partner"
|
<field name="partner_id" string="Partner" attrs="{'invisible': [('partner_id', '=', False)]}"/>
|
||||||
attrs="{'invisible': [('partner_id', '=', False)]}"/>
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group attrs="{'invisible': [('test_type', '!=', 'picture')]}">
|
<group attrs="{'invisible': [('test_type', '!=', 'picture')]}">
|
||||||
<field name="picture" widget="image"/>
|
<field name="picture" widget="image"/>
|
||||||
</group>
|
</group>
|
||||||
<notebook>
|
<notebook>
|
||||||
<page string="Notes" name="notes">
|
<page string="Notes" name="notes">
|
||||||
<group>
|
<group>
|
||||||
<field name="report_result"/>
|
<field string="Instructions" name="note"/>
|
||||||
<field name="report_pdf" widget="pdf_viewer"/>
|
<field string="Notes" name="additional_note"/>
|
||||||
<field string="Instructions" name="note"/>
|
</group>
|
||||||
<field string="Notes" name="additional_note"/>
|
</page>
|
||||||
|
|
||||||
</group>
|
|
||||||
</page>
|
|
||||||
</notebook>
|
</notebook>
|
||||||
</sheet>
|
</sheet>
|
||||||
<div class="oe_chatter">
|
<div class="oe_chatter">
|
||||||
@@ -345,30 +311,18 @@
|
|||||||
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
|
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<strong>
|
<strong><span><t t-esc="record.name.value"/></span></strong>
|
||||||
<span>
|
|
||||||
<t t-esc="record.name.value"/>
|
|
||||||
</span>
|
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6">
|
<div class="col-6">
|
||||||
<strong>
|
<strong><span t-attf-class="float-end text-end badge #{['none'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-secondary' : ['fail'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-danger' : ['done'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-primary' : 'text-bg-success'}"><t t-esc="record.quality_state.value"/></span></strong>
|
||||||
<span t-attf-class="float-end text-end badge #{['none'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-secondary' : ['fail'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-danger' : ['done'].indexOf(record.quality_state.raw_value) > -1 ? 'text-bg-primary' : 'text-bg-success'}">
|
|
||||||
<t t-esc="record.quality_state.value"/>
|
|
||||||
</span>
|
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row text-muted">
|
<div class="row text-muted">
|
||||||
<div class="col-8">
|
<div class="col-8">
|
||||||
<span>
|
<span><t t-esc="record.product_id.value"/></span>
|
||||||
<t t-esc="record.product_id.value"/>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-4">
|
<div class="col-4">
|
||||||
<span>
|
<span><t t-esc="record.lot_id.value"/></span>
|
||||||
<t t-esc="record.lot_id.value"/>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="oe_kanban_bottom_right float-end">
|
<div class="oe_kanban_bottom_right float-end">
|
||||||
@@ -396,8 +350,7 @@
|
|||||||
<field name="user_id" string="Checked By" optional="show" widget='many2one_avatar_user'/>
|
<field name="user_id" string="Checked By" optional="show" widget='many2one_avatar_user'/>
|
||||||
<field name="point_id" optional="hide"/>
|
<field name="point_id" optional="hide"/>
|
||||||
<field name="team_id" optional="show"/>
|
<field name="team_id" optional="show"/>
|
||||||
<field name="quality_state" optional="show" widget='badge' decoration-success="quality_state == 'pass'"
|
<field name="quality_state" optional="show" widget='badge' decoration-success="quality_state == 'pass'" decoration-info="quality_state == 'none'" decoration-danger="quality_state == 'fail'"/>
|
||||||
decoration-info="quality_state == 'none'" decoration-danger="quality_state == 'fail'"/>
|
|
||||||
<field name="company_id" groups="base.main_company"/>
|
<field name="company_id" groups="base.main_company"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
@@ -415,14 +368,14 @@
|
|||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="quality_check_view_pivot" model="ir.ui.view">
|
<record id="quality_check_view_pivot" model="ir.ui.view">
|
||||||
<field name="name">quality.check.view.pivot</field>
|
<field name="name">quality.check.view.pivot</field>
|
||||||
<field name="model">quality.check</field>
|
<field name="model">quality.check</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<pivot string="Quality Check Analysis" sample="1">
|
<pivot string="Quality Check Analysis" sample="1">
|
||||||
<field name="control_date" type="col" interval="day"/>
|
<field name="control_date" type="col" interval="day"/>
|
||||||
<field name="product_id" type="row"/>
|
<field name="product_id" type="row"/>
|
||||||
</pivot>
|
</pivot>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="quality_check_view_search" model="ir.ui.view">
|
<record id="quality_check_view_search" model="ir.ui.view">
|
||||||
@@ -430,8 +383,7 @@
|
|||||||
<field name="model">quality.check</field>
|
<field name="model">quality.check</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<search>
|
<search>
|
||||||
<field name="product_id" string="Product"
|
<field name="product_id" string="Product" filter_domain="['|', ('product_id', 'ilike', self), ('lot_id', 'ilike', self)]"/>
|
||||||
filter_domain="['|', ('product_id', 'ilike', self), ('lot_id', 'ilike', self)]"/>
|
|
||||||
<field name="picking_id"/>
|
<field name="picking_id"/>
|
||||||
<field name="lot_id"/>
|
<field name="lot_id"/>
|
||||||
<field name="team_id"/>
|
<field name="team_id"/>
|
||||||
@@ -474,11 +426,10 @@
|
|||||||
</field>
|
</field>
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p class="o_view_nocontent_smiling_face">
|
<p class="o_view_nocontent_smiling_face">
|
||||||
No quality check found
|
No quality check found
|
||||||
</p>
|
</p><p>
|
||||||
<p>
|
Define Quality Control Points in order to automatically generate
|
||||||
Define Quality Control Points in order to automatically generate
|
quality checks at the right logistic operation: transfers, manufacturing orders.
|
||||||
quality checks at the right logistic operation: transfers, manufacturing orders.
|
|
||||||
</p>
|
</p>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -507,11 +458,10 @@
|
|||||||
<field name="view_mode">tree,kanban,form,pivot,graph</field>
|
<field name="view_mode">tree,kanban,form,pivot,graph</field>
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p class="o_view_nocontent_smiling_face">
|
<p class="o_view_nocontent_smiling_face">
|
||||||
No quality check found
|
No quality check found
|
||||||
</p>
|
</p><p>
|
||||||
<p>
|
Define Quality Control Points in order to automatically generate
|
||||||
Define Quality Control Points in order to automatically generate
|
quality checks at the right logistic operation: transfers, manufacturing orders.
|
||||||
quality checks at the right logistic operation: transfers, manufacturing orders.
|
|
||||||
</p>
|
</p>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -535,25 +485,17 @@
|
|||||||
<field name="inherit_id" ref="stock.product_template_form_view_procurement_button"/>
|
<field name="inherit_id" ref="stock.product_template_form_view_procurement_button"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="after">
|
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="after">
|
||||||
<button name="action_see_quality_control_points" type="object" class="oe_stat_button" icon="fa-list"
|
<button name="action_see_quality_control_points" type="object" class="oe_stat_button" icon="fa-list" attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}" groups="quality.group_quality_user">
|
||||||
attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}"
|
|
||||||
groups="quality.group_quality_user">
|
|
||||||
<field string="Quality Points" name="quality_control_point_qty" widget="statinfo"/>
|
<field string="Quality Points" name="quality_control_point_qty" widget="statinfo"/>
|
||||||
</button>
|
</button>
|
||||||
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check"
|
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check" attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']), ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}" groups="quality.group_quality_user">
|
||||||
attrs="{'invisible':['|', ('type', 'not in', ['product', 'consu']), ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}"
|
|
||||||
groups="quality.group_quality_user">
|
|
||||||
<div class="o_field_widget o_stat_info mr4">
|
<div class="o_field_widget o_stat_info mr4">
|
||||||
<span class="o_stat_text">Pass:</span>
|
<span class="o_stat_text">Pass:</span>
|
||||||
<span class="o_stat_text">Fail:</span>
|
<span class="o_stat_text">Fail:</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="o_field_widget o_stat_info">
|
<div class="o_field_widget o_stat_info">
|
||||||
<span class="o_stat_value">
|
<span class="o_stat_value"><field name="quality_pass_qty"/></span>
|
||||||
<field name="quality_pass_qty"/>
|
<span class="o_stat_value"><field name="quality_fail_qty"/></span>
|
||||||
</span>
|
|
||||||
<span class="o_stat_value">
|
|
||||||
<field name="quality_fail_qty"/>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
</xpath>
|
</xpath>
|
||||||
@@ -567,25 +509,17 @@
|
|||||||
<field name="inherit_id" ref="stock.product_form_view_procurement_button"/>
|
<field name="inherit_id" ref="stock.product_form_view_procurement_button"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="after">
|
<xpath expr="//button[@name='action_view_related_putaway_rules']" position="after">
|
||||||
<button name="action_see_quality_control_points" type="object" icon="fa-list" class="oe_stat_button"
|
<button name="action_see_quality_control_points" type="object" icon="fa-list" class="oe_stat_button" attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}" groups="quality.group_quality_user">
|
||||||
attrs="{'invisible':[('type', 'not in', ['product', 'consu'])]}"
|
|
||||||
groups="quality.group_quality_user">
|
|
||||||
<field string="Quality Points" name="quality_control_point_qty" widget="statinfo"/>
|
<field string="Quality Points" name="quality_control_point_qty" widget="statinfo"/>
|
||||||
</button>
|
</button>
|
||||||
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check"
|
<button name="action_see_quality_checks" type="object" class="oe_stat_button" icon="fa-check" groups="quality.group_quality_user" attrs="{'invisible':[ ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}" >
|
||||||
groups="quality.group_quality_user"
|
|
||||||
attrs="{'invisible':[ ('quality_pass_qty', '=', 0),('quality_fail_qty', '=', 0)]}">
|
|
||||||
<div class="o_field_widget o_stat_info mr4">
|
<div class="o_field_widget o_stat_info mr4">
|
||||||
<span class="o_stat_text">Pass:</span>
|
<span class="o_stat_text">Pass:</span>
|
||||||
<span class="o_stat_text">Fail:</span>
|
<span class="o_stat_text">Fail:</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="o_field_widget o_stat_info">
|
<div class="o_field_widget o_stat_info">
|
||||||
<span class="o_stat_value">
|
<span class="o_stat_value"><field name="quality_pass_qty"/></span>
|
||||||
<field name="quality_pass_qty"/>
|
<span class="o_stat_value"><field name="quality_fail_qty"/></span>
|
||||||
</span>
|
|
||||||
<span class="o_stat_value">
|
|
||||||
<field name="quality_fail_qty"/>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
</xpath>
|
</xpath>
|
||||||
@@ -599,8 +533,8 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//div[@name='button_box']" position="inside">
|
<xpath expr="//div[@name='button_box']" position="inside">
|
||||||
<button name="%(quality_check_action_production_lot)d" type="action"
|
<button name="%(quality_check_action_production_lot)d" type="action"
|
||||||
attrs="{'invisible': [('quality_check_qty', '=', 0)]}"
|
attrs="{'invisible': [('quality_check_qty', '=', 0)]}"
|
||||||
icon="fa-check" class="oe_stat_button" groups="quality.group_quality_user">
|
icon="fa-check" class="oe_stat_button" groups="quality.group_quality_user">
|
||||||
<field string="Quality Checks" name="quality_check_qty" widget="statinfo"/>
|
<field string="Quality Checks" name="quality_check_qty" widget="statinfo"/>
|
||||||
</button>
|
</button>
|
||||||
</xpath>
|
</xpath>
|
||||||
@@ -623,36 +557,24 @@
|
|||||||
<templates>
|
<templates>
|
||||||
<t t-name="kanban-box">
|
<t t-name="kanban-box">
|
||||||
<div t-attf-class="#{kanban_color(record.color.raw_value)}">
|
<div t-attf-class="#{kanban_color(record.color.raw_value)}">
|
||||||
<span class="oe_kanban_color_help"
|
<span class="oe_kanban_color_help" t-attf-title="In #{kanban_getcolorname(record.color.raw_value)}" role="img" t-attf-aria-label="In #{kanban_getcolorname(record.color.raw_value)}"/>
|
||||||
t-attf-title="In #{kanban_getcolorname(record.color.raw_value)}" role="img"
|
|
||||||
t-attf-aria-label="In #{kanban_getcolorname(record.color.raw_value)}"/>
|
|
||||||
<div t-attf-class="o_kanban_card_header">
|
<div t-attf-class="o_kanban_card_header">
|
||||||
<div class="o_kanban_card_header_title">
|
<div class="o_kanban_card_header_title">
|
||||||
<div class="o_primary">
|
<div class="o_primary"><field name="name"/></div>
|
||||||
<field name="name"/>
|
|
||||||
</div>
|
|
||||||
<div t-if="record.alias_name.value and record.alias_domain.value">
|
<div t-if="record.alias_name.value and record.alias_domain.value">
|
||||||
<small><i class="fa fa-envelope-o" role="img" aria-label="Domain alias"
|
<small><i class="fa fa-envelope-o" role="img" aria-label="Domain alias" title="Domain alias"></i>&nbsp; <field name="alias_id"/></small>
|
||||||
title="Domain alias"></i>&nbsp;
|
|
||||||
<field name="alias_id"/>
|
|
||||||
</small>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="container o_kanban_card_content">
|
<div class="container o_kanban_card_content">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6 o_kanban_primary_left">
|
<div class="col-6 o_kanban_primary_left">
|
||||||
<button class="btn btn-primary" name="%(quality_alert_action_team)d"
|
<button class="btn btn-primary" name="%(quality_alert_action_team)d" type="action">
|
||||||
type="action">
|
<span><field name="alert_count"/> Quality Alerts</span>
|
||||||
<span>
|
|
||||||
<field name="alert_count"/>
|
|
||||||
Quality Alerts
|
|
||||||
</span>
|
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6 o_kanban_primary_right">
|
<div class="col-6 o_kanban_primary_right">
|
||||||
<a class="oe_kanban_stock_picking_type_list"
|
<a class="oe_kanban_stock_picking_type_list" name="%(quality_check_action_team)d" type="action">
|
||||||
name="%(quality_check_action_team)d" type="action">
|
|
||||||
<field name="check_count"/>
|
<field name="check_count"/>
|
||||||
Checks In Progress
|
Checks In Progress
|
||||||
</a>
|
</a>
|
||||||
@@ -663,14 +585,11 @@
|
|||||||
<div t-if="widget.editable" role="menuitem">
|
<div t-if="widget.editable" role="menuitem">
|
||||||
<a class="dropdown-item ps-0" type="edit">Configuration</a>
|
<a class="dropdown-item ps-0" type="edit">Configuration</a>
|
||||||
</div>
|
</div>
|
||||||
<div t-if="widget.editable" role="menuitem" aria-haspopup="true"
|
<div t-if="widget.editable" role="menuitem" aria-haspopup="true" class="o_no_padding_kanban_colorpicker">
|
||||||
class="o_no_padding_kanban_colorpicker">
|
|
||||||
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
|
<ul class="oe_kanban_colorpicker" data-field="color" role="popup"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<a class="o_kanban_manage_toggle_button o_left" href="#">
|
<a class="o_kanban_manage_toggle_button o_left" href="#"><i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/></a>
|
||||||
<i class="fa fa-ellipsis-v" role="img" aria-label="Manage" title="Manage"/>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
</t>
|
</t>
|
||||||
</templates>
|
</templates>
|
||||||
@@ -696,14 +615,13 @@
|
|||||||
<label for="alias_name" string="Email Alias"/>
|
<label for="alias_name" string="Email Alias"/>
|
||||||
<div name="alias_def">
|
<div name="alias_def">
|
||||||
<field name="alias_id" class="oe_read_only oe_inline"
|
<field name="alias_id" class="oe_read_only oe_inline"
|
||||||
string="Email Alias" required="0"/>
|
string="Email Alias" required="0"/>
|
||||||
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;">
|
<div class="oe_edit_only oe_inline" name="edit_alias" style="display: inline;" >
|
||||||
<field name="alias_name" class="oe_inline"/>@
|
<field name="alias_name" class="oe_inline"/>@<field name="alias_domain" class="oe_inline" readonly="1"/>
|
||||||
<field name="alias_domain" class="oe_inline" readonly="1"/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<field name="alias_contact" class="oe_inline" groups="base.group_no_one"
|
<field name="alias_contact" class="oe_inline" groups="base.group_no_one"
|
||||||
string="Accept Emails From"/>
|
string="Accept Emails From"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="company_id" groups="base.group_multi_company"/>
|
<field name="company_id" groups="base.group_multi_company"/>
|
||||||
@@ -740,9 +658,7 @@
|
|||||||
<div t-attf-class="oe_kanban_content oe_kanban_global_click">
|
<div t-attf-class="oe_kanban_content oe_kanban_global_click">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12">
|
<div class="col-12">
|
||||||
<strong>
|
<strong><field name="name"/></strong>
|
||||||
<field name="name"/>
|
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -756,15 +672,14 @@
|
|||||||
<field name="name">Quality Overview</field>
|
<field name="name">Quality Overview</field>
|
||||||
<field name="res_model">quality.alert.team</field>
|
<field name="res_model">quality.alert.team</field>
|
||||||
<field name="view_mode">kanban,form</field>
|
<field name="view_mode">kanban,form</field>
|
||||||
<field name="view_id" ref="quality_alert_team_dashboard_view_kanban"/>
|
<field name="view_id" ref="quality_alert_team_dashboard_view_kanban" />
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p class="o_view_nocontent_empty_folder">
|
<p class="o_view_nocontent_empty_folder">
|
||||||
|
</p><p>
|
||||||
|
Quality Teams group the different quality alerts/checks
|
||||||
|
according to the roles (teams) that need them.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
</field>
|
||||||
Quality Teams group the different quality alerts/checks
|
|
||||||
according to the roles (teams) that need them.
|
|
||||||
</p>
|
|
||||||
</field>
|
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="quality_alert_team_action_config" model="ir.actions.act_window">
|
<record id="quality_alert_team_action_config" model="ir.actions.act_window">
|
||||||
@@ -801,9 +716,9 @@
|
|||||||
<field name="res_model">quality.tag</field>
|
<field name="res_model">quality.tag</field>
|
||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p class="o_view_nocontent_smiling_face">
|
<p class="o_view_nocontent_smiling_face">
|
||||||
Add a new tag
|
Add a new tag
|
||||||
</p>
|
</p>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
@@ -832,9 +747,7 @@
|
|||||||
<t t-name="kanban-box">
|
<t t-name="kanban-box">
|
||||||
<div t-attf-class="oe_kanban_global_click">
|
<div t-attf-class="oe_kanban_global_click">
|
||||||
<div>
|
<div>
|
||||||
<strong>
|
<strong><field name="name"/></strong>
|
||||||
<field name="name"/>
|
|
||||||
</strong>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</t>
|
</t>
|
||||||
@@ -850,9 +763,8 @@
|
|||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p class="o_view_nocontent_smiling_face">
|
<p class="o_view_nocontent_smiling_face">
|
||||||
Create a new quality alert stage
|
Create a new quality alert stage
|
||||||
</p>
|
</p><p>
|
||||||
<p>
|
Quality Alert stages define the different steps a quality alert should go through.
|
||||||
Quality Alert stages define the different steps a quality alert should go through.
|
|
||||||
</p>
|
</p>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -904,19 +816,9 @@
|
|||||||
<templates>
|
<templates>
|
||||||
<t t-name="kanban-box">
|
<t t-name="kanban-box">
|
||||||
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
|
<div t-attf-class="oe_kanban_card oe_kanban_global_click">
|
||||||
<div>
|
<div><strong><t t-esc="record.name.value"/></strong></div>
|
||||||
<strong>
|
<div><strong>Products :</strong> <t t-esc="record.product_ids.value"/></div>
|
||||||
<t t-esc="record.name.value"/>
|
<div><strong>Operations :</strong> <t t-esc="record.picking_type_ids.value"/></div>
|
||||||
</strong>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<strong>Products :</strong>
|
|
||||||
<t t-esc="record.product_ids.value"/>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<strong>Operations :</strong>
|
|
||||||
<t t-esc="record.picking_type_ids.value"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</t>
|
</t>
|
||||||
</templates>
|
</templates>
|
||||||
@@ -934,54 +836,39 @@
|
|||||||
<field string="Quality Checks" name="check_count" widget="statinfo"/>
|
<field string="Quality Checks" name="check_count" widget="statinfo"/>
|
||||||
</button>
|
</button>
|
||||||
<button name="action_see_spc_control" type="object" class="oe_stat_button"
|
<button name="action_see_spc_control" type="object" class="oe_stat_button"
|
||||||
attrs="{'invisible': ['|', ('check_count', '=', 0), ('test_type', '!=', 'measure')]}">
|
attrs="{'invisible': ['|', ('check_count', '=', 0), ('test_type', '!=', 'measure')]}">
|
||||||
<span class="fa fa-2x" data-icon="∑" style="padding-left: 10px;" role="img"
|
<span class="fa fa-2x" data-icon="∑" style="padding-left: 10px;" role="img" aria-label="Statistics" title="Statistics"/>
|
||||||
aria-label="Statistics" title="Statistics"/>
|
|
||||||
<div class="o_field_widget o_stat_info mr4">
|
<div class="o_field_widget o_stat_info mr4">
|
||||||
<span class="o_stat_text">AVG:</span>
|
<span class="o_stat_text">AVG:</span>
|
||||||
<span class="o_stat_text">STD:</span>
|
<span class="o_stat_text">STD:</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="o_field_widget o_stat_info">
|
<div class="o_field_widget o_stat_info">
|
||||||
<span class="o_stat_value">
|
<span class="o_stat_value"><field name="average"/></span>
|
||||||
<field name="average"/>
|
<span class="o_stat_value"><field name="standard_deviation"/></span>
|
||||||
</span>
|
|
||||||
<span class="o_stat_value">
|
|
||||||
<field name="standard_deviation"/>
|
|
||||||
</span>
|
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//page[@name='instructions']" position="after">
|
<xpath expr="//page[@name='instructions']" position="after">
|
||||||
<page string="Message If Failure" name="message_if_failure"
|
<page string="Message If Failure" name="message_if_failure"
|
||||||
attrs="{'invisible': [('test_type', 'in', ['picture', 'instructions', 'register_consumed_materials', 'print_label'])]}">
|
attrs="{'invisible': [('test_type', 'in', ['picture', 'instructions', 'register_consumed_materials', 'print_label'])]}">
|
||||||
<field name="failure_message"/>
|
<field name="failure_message"/>
|
||||||
</page>
|
</page>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//field[@name='test_type']" position="before">
|
<xpath expr="//field[@name='test_type']" position="before">
|
||||||
<field name="measure_on"/>
|
<field name="measure_on"/>
|
||||||
<field name="measure_frequency_type" string="Control Frequency"/>
|
<field name="measure_frequency_type" string="Control Frequency"/>
|
||||||
<label for="measure_frequency_value" string=""
|
<label for="measure_frequency_value" string="" attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}"/>
|
||||||
attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}"/>
|
|
||||||
<div class="o_row" attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">
|
<div class="o_row" attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">
|
||||||
<span attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">Every</span>
|
<span attrs="{'invisible': [('measure_frequency_type', '=', 'all')]}">Every </span>
|
||||||
<field name="measure_frequency_value" nolabel="1"
|
<field name="measure_frequency_value" nolabel="1" attrs="{'invisible': [('measure_frequency_type', '!=', 'random')]}"/>
|
||||||
attrs="{'invisible': [('measure_frequency_type', '!=', 'random')]}"/>
|
<label for="measure_frequency_value" string="% of Operations" attrs="{'invisible': ['|', ('measure_on', '=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
|
||||||
<label for="measure_frequency_value" string="% of Operations"
|
<label for="measure_frequency_value" string="% of Transfers" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
|
||||||
attrs="{'invisible': ['|', ('measure_on', '=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
|
<field name="measure_frequency_unit_value" string="Frequency" nolabel="1" attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')]}"/>
|
||||||
<label for="measure_frequency_value" string="% of Transfers"
|
<field name="measure_frequency_unit" attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')], 'required': [('measure_frequency_type', '=', 'periodical')]}"/>
|
||||||
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('measure_frequency_type', '!=', 'random')]}"/>
|
|
||||||
<field name="measure_frequency_unit_value" string="Frequency" nolabel="1"
|
|
||||||
attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')]}"/>
|
|
||||||
<field name="measure_frequency_unit"
|
|
||||||
attrs="{'invisible': [('measure_frequency_type', '!=', 'periodical')], 'required': [('measure_frequency_type', '=', 'periodical')]}"/>
|
|
||||||
</div>
|
</div>
|
||||||
<field name="is_lot_tested_fractionally" attrs="{'invisible': [('measure_on', '!=', 'move_line')]}"
|
<field name="is_lot_tested_fractionally" attrs="{'invisible': [('measure_on', '!=', 'move_line')]}" string="Partial Transfer Test"/>
|
||||||
string="Partial Transfer Test"/>
|
<label for="testing_percentage_within_lot" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}" string="Percentage"/>
|
||||||
<label for="testing_percentage_within_lot"
|
<div class="o_row" attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}">
|
||||||
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}"
|
|
||||||
string="Percentage"/>
|
|
||||||
<div class="o_row"
|
|
||||||
attrs="{'invisible': ['|', ('measure_on', '!=', 'move_line'), ('is_lot_tested_fractionally', '!=', True)]}">
|
|
||||||
<field name="testing_percentage_within_lot" nolabel="1"/>
|
<field name="testing_percentage_within_lot" nolabel="1"/>
|
||||||
<label for="testing_percentage_within_lot" string="%"/>
|
<label for="testing_percentage_within_lot" string="%"/>
|
||||||
</div>
|
</div>
|
||||||
@@ -990,15 +877,12 @@
|
|||||||
<label for="norm" attrs="{'invisible': [('test_type', '!=', 'measure')]}"/>
|
<label for="norm" attrs="{'invisible': [('test_type', '!=', 'measure')]}"/>
|
||||||
<div class="o_row" attrs="{'invisible': [('test_type', '!=', 'measure')]}">
|
<div class="o_row" attrs="{'invisible': [('test_type', '!=', 'measure')]}">
|
||||||
<field name="norm" attrs="{'required': [('test_type', '=', 'measure')]}"/>
|
<field name="norm" attrs="{'required': [('test_type', '=', 'measure')]}"/>
|
||||||
<field name="norm_unit" string="Unit of Measure"
|
<field name="norm_unit" string="Unit of Measure" attrs="{'required': [('test_type', '=', 'measure')]}"/>
|
||||||
attrs="{'required': [('test_type', '=', 'measure')]}"/>
|
|
||||||
</div>
|
</div>
|
||||||
<label for="tolerance_min" string="Tolerance" attrs="{'invisible': [('test_type', '!=', 'measure')]}"/>
|
<label for="tolerance_min" string="Tolerance" attrs="{'invisible': [('test_type', '!=', 'measure')]}"/>
|
||||||
<div attrs="{'invisible': [('test_type', '!=', 'measure')]}" class="o_row">
|
<div attrs="{'invisible': [('test_type', '!=', 'measure')]}" class="o_row">
|
||||||
<span>from</span>
|
<span>from </span> <field name="tolerance_min"/>
|
||||||
<field name="tolerance_min"/>
|
<span>to </span> <field name="tolerance_max"/>
|
||||||
<span>to</span>
|
|
||||||
<field name="tolerance_max"/>
|
|
||||||
</div>
|
</div>
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
@@ -1011,96 +895,95 @@
|
|||||||
<field name="search_view_id" ref="quality_point_view_search"/>
|
<field name="search_view_id" ref="quality_point_view_search"/>
|
||||||
<field name="help" type="html">
|
<field name="help" type="html">
|
||||||
<p class="o_view_nocontent_smiling_face">
|
<p class="o_view_nocontent_smiling_face">
|
||||||
No quality control point found
|
No quality control point found
|
||||||
</p>
|
</p><p>
|
||||||
<p>
|
Quality control points define the quality checks which should be
|
||||||
Quality control points define the quality checks which should be
|
performed at each operation, for your different products.
|
||||||
performed at each operation, for your different products.
|
|
||||||
</p>
|
</p>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- Menu structure-->
|
<!-- Menu structure-->
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_root"
|
id="menu_quality_root"
|
||||||
name="Quality"
|
name="Quality"
|
||||||
web_icon="quality_control,static/description/icon.svg"
|
web_icon="quality_control,static/description/icon.svg"
|
||||||
sequence="150"
|
sequence="150"
|
||||||
groups="quality.group_quality_user"/>
|
groups="quality.group_quality_user"/>
|
||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_dashboard"
|
id="menu_quality_dashboard"
|
||||||
name="Overview"
|
name="Overview"
|
||||||
action="quality_alert_team_action"
|
action="quality_alert_team_action"
|
||||||
parent="menu_quality_root"
|
parent="menu_quality_root"
|
||||||
sequence="5"/>
|
sequence="5"/>
|
||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_control"
|
id="menu_quality_control"
|
||||||
name="Quality Control"
|
name="Quality Control"
|
||||||
parent="menu_quality_root"
|
parent="menu_quality_root"
|
||||||
sequence="15"/>
|
sequence="15"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_control_points"
|
id="menu_quality_control_points"
|
||||||
name="Control Points"
|
name="Control Points"
|
||||||
parent="menu_quality_control"
|
parent="menu_quality_control"
|
||||||
action="quality_point_action"
|
action="quality_point_action"
|
||||||
groups="quality.group_quality_manager"
|
groups="quality.group_quality_manager"
|
||||||
sequence="17"/>
|
sequence="17"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_checks"
|
id="menu_quality_checks"
|
||||||
name="Quality Checks"
|
name="Quality Checks"
|
||||||
action="quality_check_action_main"
|
action="quality_check_action_main"
|
||||||
parent="menu_quality_control"
|
parent="menu_quality_control"
|
||||||
sequence="18"/>
|
sequence="18"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_alert"
|
id="menu_quality_alert"
|
||||||
name="Quality Alerts"
|
name="Quality Alerts"
|
||||||
action="quality_alert_action_check"
|
action="quality_alert_action_check"
|
||||||
parent="menu_quality_control"
|
parent="menu_quality_control"
|
||||||
sequence="20"/>
|
sequence="20"/>
|
||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_configuration"
|
id="menu_quality_configuration"
|
||||||
name="Configuration"
|
name="Configuration"
|
||||||
groups="quality.group_quality_manager"
|
groups="quality.group_quality_manager"
|
||||||
parent="menu_quality_root"
|
parent="menu_quality_root"
|
||||||
sequence="25"/>
|
sequence="25"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_config_alert_team"
|
id="menu_quality_config_alert_team"
|
||||||
name="Quality Teams"
|
name="Quality Teams"
|
||||||
action="quality_alert_team_action_config"
|
action="quality_alert_team_action_config"
|
||||||
parent="menu_quality_configuration"
|
parent="menu_quality_configuration"
|
||||||
sequence="5"/>
|
sequence="5"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_config_alert_stage"
|
id="menu_quality_config_alert_stage"
|
||||||
name="Quality Alert Stages"
|
name="Quality Alert Stages"
|
||||||
action="quality_alert_stage_action"
|
action="quality_alert_stage_action"
|
||||||
parent="menu_quality_configuration"
|
parent="menu_quality_configuration"
|
||||||
groups="base.group_no_one"
|
groups="base.group_no_one"
|
||||||
sequence="15"/>
|
sequence="15"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_config_quality_tags"
|
id="menu_config_quality_tags"
|
||||||
name="Quality Tags"
|
name="Quality Tags"
|
||||||
groups="base.group_no_one"
|
groups="base.group_no_one"
|
||||||
action="quality_tag_action"
|
action="quality_tag_action"
|
||||||
parent="menu_quality_configuration"
|
parent="menu_quality_configuration"
|
||||||
sequence="25"/>
|
sequence="25"/>
|
||||||
|
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_reporting"
|
id="menu_quality_reporting"
|
||||||
name="Reporting"
|
name="Reporting"
|
||||||
groups="quality.group_quality_manager"
|
groups="quality.group_quality_manager"
|
||||||
parent="menu_quality_root"
|
parent="menu_quality_root"
|
||||||
sequence="20"/>
|
sequence="20"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_alert_report"
|
id="menu_quality_alert_report"
|
||||||
action="quality_alert_action_report"
|
action="quality_alert_action_report"
|
||||||
parent="menu_quality_reporting"
|
parent="menu_quality_reporting"
|
||||||
sequence="6"/>
|
sequence="6"/>
|
||||||
<menuitem
|
<menuitem
|
||||||
id="menu_quality_check_report"
|
id="menu_quality_check_report"
|
||||||
action="quality_check_action_report"
|
action="quality_check_action_report"
|
||||||
parent="menu_quality_reporting"
|
parent="menu_quality_reporting"
|
||||||
sequence="5"/>
|
sequence="5"/>
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -1,3 +1,2 @@
|
|||||||
from . import models
|
from . import models
|
||||||
from . import commons
|
from . import commons
|
||||||
from . import controllers
|
|
||||||
|
|||||||
@@ -23,8 +23,6 @@
|
|||||||
'views/tool_basic_param.xml',
|
'views/tool_basic_param.xml',
|
||||||
'views/tool_menu.xml',
|
'views/tool_menu.xml',
|
||||||
'views/menu_fixture_view.xml',
|
'views/menu_fixture_view.xml',
|
||||||
'views/change_base_view.xml',
|
|
||||||
'views/Printer.xml',
|
|
||||||
|
|
||||||
],
|
],
|
||||||
'demo': [
|
'demo': [
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
from odoo import models, fields
|
|
||||||
|
|
||||||
|
|
||||||
class Printer(models.Model):
|
|
||||||
_name = 'printer'
|
|
||||||
_description = 'Printer'
|
|
||||||
|
|
||||||
name = fields.Char(string='名称', required=True)
|
|
||||||
ip_address = fields.Char(string='IP 地址', required=True)
|
|
||||||
port = fields.Integer(string='端口', default=9100)
|
|
||||||
|
|
||||||
|
|
||||||
class TableStyle(models.Model):
|
|
||||||
_name = 'table.style'
|
|
||||||
_description = '标签样式'
|
|
||||||
|
|
||||||
name = fields.Char(string='名称', required=True)
|
|
||||||
# todo
|
|
||||||
|
|
||||||
|
|
||||||
class PrinterConfiguration(models.Model):
|
|
||||||
_name = 'printer.configuration'
|
|
||||||
_description = 'Printer Configuration'
|
|
||||||
|
|
||||||
name = fields.Char(string='名称', required=True)
|
|
||||||
printer_id = fields.Many2one('printer', string='打印机')
|
|
||||||
model = fields.Many2one('ir.model', string='模型名称')
|
|
||||||
# # 其他相关字段...
|
|
||||||
@@ -1,2 +1 @@
|
|||||||
from . import common
|
from . import common
|
||||||
from . import Printer
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import time, datetime
|
import time
|
||||||
import hashlib
|
import hashlib
|
||||||
from odoo import models
|
from odoo import models
|
||||||
import socket
|
|
||||||
|
|
||||||
class Common(models.Model):
|
class Common(models.Model):
|
||||||
_name = 'sf.sync.common'
|
_name = 'sf.sync.common'
|
||||||
@@ -19,76 +19,3 @@ class Common(models.Model):
|
|||||||
'TIMESTAMP': str(timestamp),
|
'TIMESTAMP': str(timestamp),
|
||||||
'checkstr': check_sf_str}
|
'checkstr': check_sf_str}
|
||||||
return headers
|
return headers
|
||||||
|
|
||||||
def get_add_time(self, parse_time):
|
|
||||||
"""
|
|
||||||
把时间增加8小时
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
dt = datetime.datetime.strptime(parse_time, "%Y-%m-%d %H:%M:%S")
|
|
||||||
d = dt + datetime.timedelta(hours=8)
|
|
||||||
nTime = d.strftime("%Y-%m-%d %H:%M:%S")
|
|
||||||
return nTime
|
|
||||||
|
|
||||||
|
|
||||||
class PrintingUtils(models.AbstractModel):
|
|
||||||
_name = 'printing.utils'
|
|
||||||
_description = 'Utility class for printing functionalities'
|
|
||||||
|
|
||||||
def generate_zpl_code(self, code):
|
|
||||||
# 实现生成ZPL代码的逻辑
|
|
||||||
# 初始化ZPL代码字符串
|
|
||||||
zpl_code = "^XA\n"
|
|
||||||
zpl_code += "^CW1,E:SIMSUN.TTF^FS\n"
|
|
||||||
zpl_code += "^CI28\n"
|
|
||||||
|
|
||||||
# 设置二维码位置
|
|
||||||
zpl_code += "^FO50,50\n" # 调整二维码位置,使其与资产编号在同一行
|
|
||||||
zpl_code += f"^BQN,2,6^FDLM,B0093{code}^FS\n"
|
|
||||||
|
|
||||||
# 设置资产编号文本位置
|
|
||||||
zpl_code += "^FO300,60\n" # 资产编号文本的位置,与二维码在同一行
|
|
||||||
zpl_code += "^A1N,45,45^FD编码名称: ^FS\n"
|
|
||||||
|
|
||||||
# 设置{code}文本位置
|
|
||||||
# 假设{code}文本需要位于资产编号和二维码下方,中间位置
|
|
||||||
# 设置{code}文本位置并启用自动换行
|
|
||||||
zpl_code += "^FO300,120\n" # {code}文本的起始位置
|
|
||||||
zpl_code += "^FB400,4,0,L,0\n" # 定义一个宽度为500点的文本框,最多4行,左对齐
|
|
||||||
zpl_code += f"^A1N,40,40^FD{code}^FS\n"
|
|
||||||
|
|
||||||
# 在{code}文本框周围绘制线框
|
|
||||||
# 假设线框的外部尺寸为宽度500点,高度200点
|
|
||||||
# zpl_code += "^FO300,110^GB500,200,2^FS\n" # 绘制线框,边框粗细为2点
|
|
||||||
|
|
||||||
zpl_code += "^PQ1,0,1,Y\n"
|
|
||||||
zpl_code += "^XZ\n"
|
|
||||||
return zpl_code
|
|
||||||
|
|
||||||
def send_to_printer(self, host, port, zpl_code):
|
|
||||||
|
|
||||||
# 实现发送ZPL代码到打印机的逻辑
|
|
||||||
# 将ZPL代码转换为字节串
|
|
||||||
print('zpl_code', zpl_code)
|
|
||||||
zpl_bytes = zpl_code.encode('utf-8')
|
|
||||||
print(zpl_bytes)
|
|
||||||
|
|
||||||
# 创建socket对象
|
|
||||||
mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
||||||
try:
|
|
||||||
mysocket.connect((host, port)) # 连接到打印机
|
|
||||||
mysocket.send(zpl_bytes) # 发送ZPL代码
|
|
||||||
print("ZPL code sent to printer successfully.")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error with the connection: {e}")
|
|
||||||
finally:
|
|
||||||
mysocket.close() # 关闭连接
|
|
||||||
|
|
||||||
def print_qr_code(self, lot_name, host, port):
|
|
||||||
# 实现打印二维码的逻辑
|
|
||||||
# 这里需要传入 lot_name 参数,因为我们不能直接访问 self.lot_id.name
|
|
||||||
zpl_code = self.generate_zpl_code(lot_name)
|
|
||||||
# 发送ZPL代码到打印机
|
|
||||||
# host = "192.168.50.110" # 可以作为参数传入,或者在此配置
|
|
||||||
# port = 9100 # 可以作为参数传入,或者在此配置
|
|
||||||
self.send_to_printer(host, port, zpl_code)
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
from . import controllers
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
import logging
|
|
||||||
import json
|
|
||||||
import base64
|
|
||||||
from odoo import http
|
|
||||||
from odoo.http import request
|
|
||||||
|
|
||||||
|
|
||||||
class Manufacturing_Connect(http.Controller):
|
|
||||||
|
|
||||||
@http.route('/AutoDeviceApi/MachineToolGroup', type='json', auth='none', methods=['GET', 'POST'], csrf=False,
|
|
||||||
cors="*")
|
|
||||||
def get_maintenance_tool_groups_Info(self, **kw):
|
|
||||||
"""
|
|
||||||
机床刀具组接口
|
|
||||||
:param kw:
|
|
||||||
:return:
|
|
||||||
"""
|
|
||||||
logging.info('get_maintenance_tool_groups_Info:%s' % kw)
|
|
||||||
try:
|
|
||||||
datas = request.httprequest.data
|
|
||||||
ret = json.loads(datas)
|
|
||||||
# ret = json.loads(ret['result'])
|
|
||||||
logging.info('DeviceId:%s' % ret)
|
|
||||||
tool_groups = request.env['sf.tool.groups'].sudo().search([])
|
|
||||||
|
|
||||||
res = {'Succeed': True, 'Datas': []}
|
|
||||||
if tool_groups:
|
|
||||||
for item in tool_groups:
|
|
||||||
device_id = ''
|
|
||||||
for equipment_id in item.equipment_ids:
|
|
||||||
device_id = '%s,%s' % (device_id, equipment_id.name)
|
|
||||||
res['Datas'].append({
|
|
||||||
'GroupName': item.name,
|
|
||||||
'DeviceId': device_id
|
|
||||||
})
|
|
||||||
except Exception as e:
|
|
||||||
res = {'Succeed': False, 'ErrorCode': 202, 'Error': e}
|
|
||||||
logging.info('get_maintenance_tool_groups_Info error:%s' % e)
|
|
||||||
return json.JSONEncoder().encode(res)
|
|
||||||
@@ -4,4 +4,3 @@ from . import tool_base_new
|
|||||||
from . import fixture
|
from . import fixture
|
||||||
from . import functional_fixture
|
from . import functional_fixture
|
||||||
from . import tool_other_features
|
from . import tool_other_features
|
||||||
from . import basic_parameters_fixture
|
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ class MachineBrand(models.Model):
|
|||||||
active = fields.Boolean('有效', default=True)
|
active = fields.Boolean('有效', default=True)
|
||||||
|
|
||||||
|
|
||||||
# 机床
|
#机床
|
||||||
class MachineTool(models.Model):
|
class MachineTool(models.Model):
|
||||||
_name = 'sf.machine_tool'
|
_name = 'sf.machine_tool'
|
||||||
_description = '机床'
|
_description = '机床'
|
||||||
@@ -92,8 +92,7 @@ class MachineTool(models.Model):
|
|||||||
type_id = fields.Many2one('sf.machine_tool.type', '型号')
|
type_id = fields.Many2one('sf.machine_tool.type', '型号')
|
||||||
brand_id = fields.Many2one('sf.machine.brand', string='品牌')
|
brand_id = fields.Many2one('sf.machine.brand', string='品牌')
|
||||||
state = fields.Selection(
|
state = fields.Selection(
|
||||||
[("正常", "正常"), ("故障停机", "故障停机"), ("计划维保", "计划维保"), ("空闲", "空闲"),
|
[("正常", "正常"), ("故障", "故障"), ("不可用", "不可用")],
|
||||||
("封存(报废)", "封存(报废)")],
|
|
||||||
default='正常', string="机床状态")
|
default='正常', string="机床状态")
|
||||||
# 0606新增字段
|
# 0606新增字段
|
||||||
machine_tool_picture = fields.Binary('图片')
|
machine_tool_picture = fields.Binary('图片')
|
||||||
@@ -106,7 +105,6 @@ class MachineTool(models.Model):
|
|||||||
lead_screw = fields.Char('丝杆')
|
lead_screw = fields.Char('丝杆')
|
||||||
workbench_L = fields.Char('工作台长度(mm)')
|
workbench_L = fields.Char('工作台长度(mm)')
|
||||||
workbench_W = fields.Char('工作台宽度(mm)')
|
workbench_W = fields.Char('工作台宽度(mm)')
|
||||||
workbench_H = fields.Char('工作台高度(mm)')
|
|
||||||
guide_rail = fields.Char('导轨')
|
guide_rail = fields.Char('导轨')
|
||||||
machine_tool_L = fields.Char('机床长度(mm)')
|
machine_tool_L = fields.Char('机床长度(mm)')
|
||||||
machine_tool_W = fields.Char('机床宽度(mm)')
|
machine_tool_W = fields.Char('机床宽度(mm)')
|
||||||
@@ -194,7 +192,6 @@ class MachineTool(models.Model):
|
|||||||
item.lead_screw = item.type_id.lead_screw
|
item.lead_screw = item.type_id.lead_screw
|
||||||
item.workbench_L = item.type_id.workbench_L
|
item.workbench_L = item.type_id.workbench_L
|
||||||
item.workbench_W = item.type_id.workbench_W
|
item.workbench_W = item.type_id.workbench_W
|
||||||
item.workbench_H = item.type_id.workbench_H
|
|
||||||
item.guide_rail = item.type_id.guide_rail
|
item.guide_rail = item.type_id.guide_rail
|
||||||
item.machine_tool_L = item.type_id.machine_tool_L
|
item.machine_tool_L = item.type_id.machine_tool_L
|
||||||
item.machine_tool_W = item.type_id.machine_tool_W
|
item.machine_tool_W = item.type_id.machine_tool_W
|
||||||
@@ -282,7 +279,6 @@ class MachineToolType(models.Model):
|
|||||||
workpiece_load = fields.Char('工件最大负载(kg)')
|
workpiece_load = fields.Char('工件最大负载(kg)')
|
||||||
workbench_L = fields.Char('工作台长度(mm)')
|
workbench_L = fields.Char('工作台长度(mm)')
|
||||||
workbench_W = fields.Char('工作台宽度(mm)')
|
workbench_W = fields.Char('工作台宽度(mm)')
|
||||||
workbench_H = fields.Char('工作台高度(mm)')
|
|
||||||
machine_tool_L = fields.Char('机床长度(mm)')
|
machine_tool_L = fields.Char('机床长度(mm)')
|
||||||
machine_tool_W = fields.Char('机床宽度(mm)')
|
machine_tool_W = fields.Char('机床宽度(mm)')
|
||||||
machine_tool_H = fields.Char('机床高度(mm)')
|
machine_tool_H = fields.Char('机床高度(mm)')
|
||||||
@@ -298,9 +294,8 @@ class MachineToolType(models.Model):
|
|||||||
x_axis = fields.Integer('X轴')
|
x_axis = fields.Integer('X轴')
|
||||||
y_axis = fields.Integer('Y轴')
|
y_axis = fields.Integer('Y轴')
|
||||||
z_axis = fields.Integer('Z轴')
|
z_axis = fields.Integer('Z轴')
|
||||||
a_axis = fields.Char('a轴')
|
b_axis = fields.Integer('B轴')
|
||||||
b_axis = fields.Char('B轴')
|
c_axis = fields.Integer('C轴')
|
||||||
c_axis = fields.Char('C轴')
|
|
||||||
remark = fields.Char('备注')
|
remark = fields.Char('备注')
|
||||||
control_system_id = fields.Many2one('sf.machine.control_system',
|
control_system_id = fields.Many2one('sf.machine.control_system',
|
||||||
string="控制系统")
|
string="控制系统")
|
||||||
@@ -313,7 +308,7 @@ class MachineToolType(models.Model):
|
|||||||
default="", string="轴数")
|
default="", string="轴数")
|
||||||
|
|
||||||
# 1212新增字段
|
# 1212新增字段
|
||||||
|
a_axis = fields.Integer('a轴')
|
||||||
function_type = fields.Selection(
|
function_type = fields.Selection(
|
||||||
[("ZXJGZX", "钻铣加工中心"), ("CXJGZX", "车削加工中心"), ("FHJGZX", "复合加工中心")],
|
[("ZXJGZX", "钻铣加工中心"), ("CXJGZX", "车削加工中心"), ("FHJGZX", "复合加工中心")],
|
||||||
default="", string="功能类型")
|
default="", string="功能类型")
|
||||||
@@ -339,30 +334,31 @@ class MachineToolType(models.Model):
|
|||||||
straight_cutting_feed_rate = fields.Char('直线切削进给速度(mm/min)')
|
straight_cutting_feed_rate = fields.Char('直线切削进给速度(mm/min)')
|
||||||
rotary_cutting_feed_rate = fields.Char('回转切削进给速度(mm/min)')
|
rotary_cutting_feed_rate = fields.Char('回转切削进给速度(mm/min)')
|
||||||
|
|
||||||
X_precision = fields.Char('X轴定位精度(mm)')
|
X_precision = fields.Float('X轴定位精度(mm)', digits=(12, 3))
|
||||||
X_precision_repeat = fields.Char('X轴重复定位精度(mm)')
|
X_precision_repeat = fields.Float('X轴重复定位精度(mm)', digits=(12, 3))
|
||||||
Y_precision = fields.Char('Y轴定位精度(mm)')
|
Y_precision = fields.Float('Y轴定位精度(mm)', digits=(12, 3))
|
||||||
Y_precision_repeat = fields.Char('Y轴重复定位精度(mm)')
|
Y_precision_repeat = fields.Float('Y轴重复定位精度(mm)', digits=(12, 3))
|
||||||
Z_precision = fields.Char('Z轴定位精度(mm)')
|
Z_precision = fields.Float('Z轴定位精度(mm)', digits=(12, 3))
|
||||||
Z_precision_repeat = fields.Char('Z轴重复定位精度(mm)')
|
Z_precision_repeat = fields.Float('Z轴重复定位精度(mm)', digits=(12, 3))
|
||||||
a_precision = fields.Char('a轴定位精度(mm)')
|
a_precision = fields.Float('a轴定位精度(mm)', digits=(12, 3))
|
||||||
a_precision_repeat = fields.Char('a轴重复定位精度(mm)')
|
a_precision_repeat = fields.Float('a轴重复定位精度(mm)', digits=(12, 3))
|
||||||
b_precision = fields.Char('b轴定位精度(mm)')
|
b_precision = fields.Float('b轴定位精度(mm)', digits=(12, 3))
|
||||||
b_precision_repeat = fields.Char('b轴重复定位精度(mm)')
|
b_precision_repeat = fields.Float('b轴重复定位精度(mm)', digits=(12, 3))
|
||||||
c_precision = fields.Char('c轴定位精度(mm)')
|
c_precision = fields.Float('c轴定位精度(mm)', digits=(12, 3))
|
||||||
c_precision_repeat = fields.Char('c轴重复定位精度(mm)')
|
c_precision_repeat = fields.Float('c轴重复定位精度(mm)', digits=(12, 3))
|
||||||
|
|
||||||
tool_full_diameter_max = fields.Float('刀具满刀最大直径(mm)')
|
tool_full_diameter_max = fields.Float('刀具满刀最大直径(mm)')
|
||||||
tool_perimeter_diameter_max = fields.Float('刀具邻空刀最大直径(mm)')
|
tool_perimeter_diameter_max = fields.Float('刀具邻空刀最大直径(mm)')
|
||||||
T_tool_time = fields.Float('T-T换刀时间(s)', digits=(12, 1))
|
T_tool_time = fields.Integer('T-T换刀时间(s)')
|
||||||
C_tool_time = fields.Float('C-C换刀时间(s)', digits=(12, 1))
|
C_tool_time = fields.Integer('C-C换刀时间(s)')
|
||||||
|
|
||||||
jg_image_id = fields.Many2many('maintenance.equipment.image', 'jg_equipment_id', string='加工能力',
|
jg_image_id = fields.Many2many('maintenance.equipment.image', 'jg_equipment_id', string='加工能力',
|
||||||
domain="[('type', '=', '加工能力')]")
|
domain="[('type', '=', '加工能力')]")
|
||||||
lq_image_id = fields.Many2many('maintenance.equipment.image', 'lq_equipment_id', string='冷却方式',
|
lq_image_id = fields.Many2many('maintenance.equipment.image', 'lq_equipment_id', string='冷却方式',
|
||||||
domain="[('type', '=', '冷却方式')]")
|
domain="[('type', '=', '冷却方式')]")
|
||||||
|
|
||||||
# 待删除字段
|
|
||||||
|
#待删除字段
|
||||||
precision_min = fields.Float('X轴定位精度min(mm)', digits=(12, 3))
|
precision_min = fields.Float('X轴定位精度min(mm)', digits=(12, 3))
|
||||||
precision_max = fields.Float('X轴定位精度max(mm)', digits=(12, 3))
|
precision_max = fields.Float('X轴定位精度max(mm)', digits=(12, 3))
|
||||||
lead_screw = fields.Char('丝杆')
|
lead_screw = fields.Char('丝杆')
|
||||||
|
|||||||
@@ -1,286 +0,0 @@
|
|||||||
from odoo import models, fields
|
|
||||||
|
|
||||||
|
|
||||||
class BasicParametersFixture(models.Model):
|
|
||||||
_name = 'sf.fixture.materials.basic.parameters'
|
|
||||||
_description = '夹具物料基本参数'
|
|
||||||
|
|
||||||
fixture_model_id = fields.Many2one('sf.fixture.model', '夹具型号')
|
|
||||||
name = fields.Char('物料号', size=20)
|
|
||||||
length = fields.Float('长度(mm)', digits=(16, 2))
|
|
||||||
width = fields.Float('宽度(mm)', digits=(16, 2))
|
|
||||||
height = fields.Float('高度(mm)', digits=(16, 2))
|
|
||||||
diameter = fields.Float('直径(mm)', digits=(16, 2))
|
|
||||||
|
|
||||||
# '零点卡盘' 字段
|
|
||||||
weight = fields.Float('重量(mm)', digits=(16, 2))
|
|
||||||
orientation_dish_diameter = fields.Float('定位盘直径(mm)', digits=(16, 2))
|
|
||||||
clamping_diameter = fields.Float('装夹直径(mm)', digits=(16, 2))
|
|
||||||
clamping_num = fields.Selection([('1', '1'), ('2', '2'), ('4', '4'), ('6', '6'), ('8', '8')], string='装夹单元数')
|
|
||||||
chucking_power_max = fields.Float('最大夹持力(KN)', digits=(16, 2))
|
|
||||||
repeated_positioning_accuracy = fields.Char('重复定位精度(mm)', size=20)
|
|
||||||
boolean_transposing_hole = fields.Boolean('是否有转位孔')
|
|
||||||
unlocking_method = fields.Selection(
|
|
||||||
[('手动', '手动'), ('气动', '气动'), ('液压', '液压'), ('电动', '电动'), ('其他', '其他')], string='解锁方式')
|
|
||||||
boolean_chip_blowing_function = fields.Boolean('是否有吹屑功能')
|
|
||||||
carrying_capacity_max = fields.Float('最大承载重量(kg)', digits=(16, 2))
|
|
||||||
rigidity = fields.Integer('硬度HRC')
|
|
||||||
materials_model_id = fields.Many2one('sf.materials.model', '夹具材质')
|
|
||||||
machine_tool_type_id = fields.Many2one('sf.machine_tool.type', '适用机床型号')
|
|
||||||
|
|
||||||
# ’零点托盘‘ 字段
|
|
||||||
connector_diameter = fields.Selection([('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('8', '8')],
|
|
||||||
string='连接头直径(mm)')
|
|
||||||
way_to_install = fields.Selection(
|
|
||||||
[('接口式', '接口式'), ('螺栓固定', '螺栓固定'), ('磁吸式', '磁吸式'), ('其他', '其他')], string='安装方式')
|
|
||||||
type_of_drive = fields.Selection(
|
|
||||||
[('气动式', '气动式'), ('液压式', '液压式'), ('机械式', '机械式'), ('电动式', '电动式'), ('其他', '其他')],
|
|
||||||
string='驱动方式')
|
|
||||||
|
|
||||||
# ’气动夹具‘ 字段
|
|
||||||
gripper_length_min = fields.Float('夹持工件最小长度(mm)', digits=(16, 2))
|
|
||||||
gripper_width_min = fields.Float('夹持工件最小宽度(mm)', digits=(16, 2))
|
|
||||||
gripper_height_min = fields.Float('夹持工件最小高度(mm)', digits=(16, 2))
|
|
||||||
gripper_diameter_min = fields.Float('夹持工件最小直径(mm)', digits=(16, 2))
|
|
||||||
gripper_length_max = fields.Float('夹持工件最大长度(mm)', digits=(16, 2))
|
|
||||||
gripper_width_max = fields.Float('夹持工件最大宽度(mm)', digits=(16, 2))
|
|
||||||
gripper_height_max = fields.Float('夹持工件最大高度(mm)', digits=(16, 2))
|
|
||||||
gripper_diameter_max = fields.Float('夹持工件最大直径(mm)', digits=(16, 2))
|
|
||||||
rated_air_pressure = fields.Float('额定气压(Mpa)', digits=(16, 2))
|
|
||||||
interface_materials_model_id = fields.Many2one('sf.materials.model', '接口类型')
|
|
||||||
|
|
||||||
# ‘虎钳夹具' 字段
|
|
||||||
transverse_groove = fields.Float('横向配合槽n(mm)', digits=(16, 2))
|
|
||||||
longitudinal_fitting_groove = fields.Float('纵向配合槽l(mm)', digits=(16, 2))
|
|
||||||
|
|
||||||
# '磁吸夹具' 字段
|
|
||||||
height_tolerance_value = fields.Char('高度公差(mm)')
|
|
||||||
rated_adsorption_force = fields.Float('额定吸附力(N/cm²)', digits=(16, 2))
|
|
||||||
magnetic_field_height = fields.Float('磁场高度(mm)', digits=(16, 2))
|
|
||||||
magnetic_pole_plate_grinding_allowance = fields.Float('磁极板磨削余量(mm)', digits=(16, 2))
|
|
||||||
|
|
||||||
# '转接板(锁板)夹具' 字段
|
|
||||||
screw_size = fields.Float('螺牙大小(mm)', digits=(16, 2))
|
|
||||||
via_hole_diameter = fields.Float('过孔直径(mm)', digits=(16, 2))
|
|
||||||
|
|
||||||
# '三爪卡盘' 字段
|
|
||||||
mounting_hole_depth = fields.Float('安装孔深度(mm)', digits=(16, 2))
|
|
||||||
centering_diameter = fields.Float('定心直径(mm)', digits=(16, 2))
|
|
||||||
|
|
||||||
code = fields.Char('编码')
|
|
||||||
active = fields.Boolean('有效', default=True)
|
|
||||||
|
|
||||||
def _get_basic_parameters_list(self, fixture_materials_data, fixture_materials_name):
|
|
||||||
if fixture_materials_name == '零点卡盘':
|
|
||||||
return self._json_zero_chuck_param(fixture_materials_data)
|
|
||||||
elif fixture_materials_name == '零点托盘':
|
|
||||||
return self._json_zero_tray_param(fixture_materials_data)
|
|
||||||
elif fixture_materials_name == '气动夹具':
|
|
||||||
return self._json_pneumatic_fixture_param(fixture_materials_data)
|
|
||||||
elif fixture_materials_name == '虎钳夹具':
|
|
||||||
return self._json_jaw_vice_fixture_param(fixture_materials_data)
|
|
||||||
elif fixture_materials_name == '磁吸夹具':
|
|
||||||
return self._json_magnet_fixture_param(fixture_materials_data)
|
|
||||||
elif fixture_materials_name == '转接板(锁板)夹具':
|
|
||||||
return self._json_adapter_board_fixture_param(fixture_materials_data)
|
|
||||||
elif fixture_materials_name == '三爪卡盘':
|
|
||||||
return self._json_scroll_chuck_param(fixture_materials_data)
|
|
||||||
return {}
|
|
||||||
|
|
||||||
def _json_zero_chuck_param(self, obj):
|
|
||||||
"""零点卡盘:将data数据转换成list数据"""
|
|
||||||
return {'code': obj['code'],
|
|
||||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
|
||||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
|
||||||
'name': obj['name'],
|
|
||||||
'length': obj['length'],
|
|
||||||
'width': obj['width'],
|
|
||||||
'height': obj['height'],
|
|
||||||
'diameter': obj['diameter'],
|
|
||||||
'weight': obj['weight'],
|
|
||||||
'orientation_dish_diameter': obj['orientation_dish_diameter'],
|
|
||||||
'clamping_diameter': obj['clamping_diameter'],
|
|
||||||
'clamping_num': obj['clamping_num'],
|
|
||||||
'chucking_power_max': obj['chucking_power_max'],
|
|
||||||
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
|
|
||||||
'boolean_transposing_hole': obj['boolean_transposing_hole'],
|
|
||||||
'unlocking_method': obj['unlocking_method'],
|
|
||||||
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
|
|
||||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
|
||||||
'rigidity': obj['rigidity'],
|
|
||||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
|
||||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
|
||||||
'machine_tool_type_id': self.env['sf.machine_tool.type'].sudo().search(
|
|
||||||
[('code', '=', obj['machine_tool_type_id']), ('active', '=', True)]).id,
|
|
||||||
'active': obj['active']}
|
|
||||||
|
|
||||||
def _json_zero_tray_param(self, obj):
|
|
||||||
"""零点托盘:将data数据转换成list数据"""
|
|
||||||
return {'code': obj['code'],
|
|
||||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
|
||||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
|
||||||
'name': obj['name'],
|
|
||||||
'length': obj['length'],
|
|
||||||
'width': obj['width'],
|
|
||||||
'height': obj['height'],
|
|
||||||
'diameter': obj['diameter'],
|
|
||||||
'weight': obj['weight'],
|
|
||||||
'clamping_diameter': obj['clamping_diameter'],
|
|
||||||
'connector_diameter': obj['connector_diameter'],
|
|
||||||
'chucking_power_max': obj['chucking_power_max'],
|
|
||||||
'repeated_positioning_accuracy': obj['repeated_positioning_accuracy'],
|
|
||||||
'boolean_chip_blowing_function': obj['boolean_chip_blowing_function'],
|
|
||||||
'way_to_install': obj['way_to_install'],
|
|
||||||
'type_of_drive': obj['type_of_drive'],
|
|
||||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
|
||||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
|
||||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
|
||||||
'rigidity': obj['rigidity'],
|
|
||||||
'active': obj['active']}
|
|
||||||
|
|
||||||
def _json_pneumatic_fixture_param(self, obj):
|
|
||||||
"""气动夹具:将data数据转换成list数据"""
|
|
||||||
return {'code': obj['code'],
|
|
||||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
|
||||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
|
||||||
'name': obj['name'],
|
|
||||||
'length': obj['length'],
|
|
||||||
'width': obj['width'],
|
|
||||||
'height': obj['height'],
|
|
||||||
'weight': obj['weight'],
|
|
||||||
'gripper_length_min': obj['gripper_length_min'],
|
|
||||||
'gripper_width_min': obj['gripper_width_min'],
|
|
||||||
'gripper_height_min': obj['gripper_height_min'],
|
|
||||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
|
||||||
'gripper_length_max': obj['gripper_length_max'],
|
|
||||||
'gripper_width_max': obj['gripper_width_max'],
|
|
||||||
'gripper_height_max': obj['gripper_height_max'],
|
|
||||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
|
||||||
'chucking_power_max': obj['chucking_power_max'],
|
|
||||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
|
||||||
'rated_air_pressure': obj['rated_air_pressure'],
|
|
||||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
|
||||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
|
||||||
'rigidity': obj['rigidity'],
|
|
||||||
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
|
|
||||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
|
||||||
'type_of_drive': obj['type_of_drive'],
|
|
||||||
'active': obj['active']}
|
|
||||||
|
|
||||||
def _json_jaw_vice_fixture_param(self, obj):
|
|
||||||
"""虎钳夹具:将data数据转换成list数据"""
|
|
||||||
return {'code': obj['code'],
|
|
||||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
|
||||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
|
||||||
'name': obj['name'],
|
|
||||||
'length': obj['length'],
|
|
||||||
'width': obj['width'],
|
|
||||||
'height': obj['height'],
|
|
||||||
'weight': obj['weight'],
|
|
||||||
'gripper_length_min': obj['gripper_length_min'],
|
|
||||||
'gripper_width_min': obj['gripper_width_min'],
|
|
||||||
'gripper_height_min': obj['gripper_height_min'],
|
|
||||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
|
||||||
'gripper_length_max': obj['gripper_length_max'],
|
|
||||||
'gripper_width_max': obj['gripper_width_max'],
|
|
||||||
'gripper_height_max': obj['gripper_height_max'],
|
|
||||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
|
||||||
'chucking_power_max': obj['chucking_power_max'],
|
|
||||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
|
||||||
'transverse_groove': obj['transverse_groove'],
|
|
||||||
'longitudinal_fitting_groove': obj['longitudinal_fitting_groove'],
|
|
||||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
|
||||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
|
||||||
'rigidity': obj['rigidity'],
|
|
||||||
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
|
|
||||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
|
||||||
'type_of_drive': obj['type_of_drive'],
|
|
||||||
'active': obj['active']}
|
|
||||||
|
|
||||||
def _json_magnet_fixture_param(self, obj):
|
|
||||||
"""磁吸夹具:将data数据转换成list数据"""
|
|
||||||
return {'code': obj['code'],
|
|
||||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
|
||||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
|
||||||
'name': obj['name'],
|
|
||||||
'length': obj['length'],
|
|
||||||
'width': obj['width'],
|
|
||||||
'height': obj['height'],
|
|
||||||
'height_tolerance_value': obj['height_tolerance_value'],
|
|
||||||
'weight': obj['weight'],
|
|
||||||
'gripper_length_min': obj['gripper_length_min'],
|
|
||||||
'gripper_width_min': obj['gripper_width_min'],
|
|
||||||
'gripper_height_min': obj['gripper_height_min'],
|
|
||||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
|
||||||
'gripper_length_max': obj['gripper_length_max'],
|
|
||||||
'gripper_width_max': obj['gripper_width_max'],
|
|
||||||
'gripper_height_max': obj['gripper_height_max'],
|
|
||||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
|
||||||
'rated_adsorption_force': obj['rated_adsorption_force'],
|
|
||||||
'magnetic_field_height': obj['magnetic_field_height'],
|
|
||||||
'magnetic_pole_plate_grinding_allowance': obj['magnetic_pole_plate_grinding_allowance'],
|
|
||||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
|
||||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
|
||||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
|
||||||
'rigidity': obj['rigidity'],
|
|
||||||
'interface_materials_model_id': self.env['sf.materials.model'].sudo().search(
|
|
||||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
|
||||||
'type_of_drive': obj['type_of_drive'],
|
|
||||||
'active': obj['active']}
|
|
||||||
|
|
||||||
def _json_adapter_board_fixture_param(self, obj):
|
|
||||||
"""转接板(锁板)夹具:将data数据转换成list数据"""
|
|
||||||
return {'code': obj['code'],
|
|
||||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
|
||||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
|
||||||
'name': obj['name'],
|
|
||||||
'length': obj['length'],
|
|
||||||
'width': obj['width'],
|
|
||||||
'height': obj['height'],
|
|
||||||
'weight': obj['weight'],
|
|
||||||
'gripper_length_min': obj['gripper_length_min'],
|
|
||||||
'gripper_width_min': obj['gripper_width_min'],
|
|
||||||
'gripper_height_min': obj['gripper_height_min'],
|
|
||||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
|
||||||
'gripper_length_max': obj['gripper_length_max'],
|
|
||||||
'gripper_width_max': obj['gripper_width_max'],
|
|
||||||
'gripper_height_max': obj['gripper_height_max'],
|
|
||||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
|
||||||
'chucking_power_max': obj['chucking_power_max'],
|
|
||||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
|
||||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
|
||||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
|
||||||
'rigidity': obj['rigidity'],
|
|
||||||
'screw_size': obj['screw_size'],
|
|
||||||
'via_hole_diameter': obj['via_hole_diameter'],
|
|
||||||
'type_of_drive': obj['type_of_drive'],
|
|
||||||
'active': obj['active']}
|
|
||||||
|
|
||||||
def _json_scroll_chuck_param(self, obj):
|
|
||||||
"""转接板(锁板)夹具:将data数据转换成list数据"""
|
|
||||||
return {'code': obj['code'],
|
|
||||||
'fixture_model_id': self.env['sf.fixture.model'].sudo().search(
|
|
||||||
[('code', '=', obj.get('fixture_model_code'))]).id,
|
|
||||||
'name': obj['name'],
|
|
||||||
'length': obj['length'],
|
|
||||||
'width': obj['width'],
|
|
||||||
'height': obj['height'],
|
|
||||||
'diameter': obj['diameter'],
|
|
||||||
'weight': obj['weight'],
|
|
||||||
'gripper_length_min': obj['gripper_length_min'],
|
|
||||||
'gripper_width_min': obj['gripper_width_min'],
|
|
||||||
'gripper_height_min': obj['gripper_height_min'],
|
|
||||||
'gripper_diameter_min': obj['gripper_diameter_min'],
|
|
||||||
'gripper_length_max': obj['gripper_length_max'],
|
|
||||||
'gripper_width_max': obj['gripper_width_max'],
|
|
||||||
'gripper_height_max': obj['gripper_height_max'],
|
|
||||||
'gripper_diameter_max': obj['gripper_diameter_max'],
|
|
||||||
'chucking_power_max': obj['chucking_power_max'],
|
|
||||||
'carrying_capacity_max': obj['carrying_capacity_max'],
|
|
||||||
'materials_model_id': self.env['sf.materials.model'].sudo().search(
|
|
||||||
[('materials_no', '=', obj['materials_model_id']), ('active', '=', True)]).id,
|
|
||||||
'rigidity': obj['rigidity'],
|
|
||||||
'mounting_hole_depth': obj['mounting_hole_depth'],
|
|
||||||
'centering_diameter': obj['centering_diameter'],
|
|
||||||
'type_of_drive': obj['type_of_drive'],
|
|
||||||
'active': obj['active']}
|
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import logging
|
import logging
|
||||||
from urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
from odoo import fields, models, api
|
from odoo import fields, models
|
||||||
from odoo.exceptions import UserError
|
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@@ -61,14 +59,6 @@ class MrsMaterialModel(models.Model):
|
|||||||
supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商')
|
supplier_ids = fields.One2many('sf.supplier.sort', 'materials_model_id', string='供应商')
|
||||||
active = fields.Boolean('有效', default=True)
|
active = fields.Boolean('有效', default=True)
|
||||||
|
|
||||||
@api.onchange('gain_way')
|
|
||||||
def _check_gain_way(self):
|
|
||||||
if not self.gain_way:
|
|
||||||
raise UserError("请选择获取方式")
|
|
||||||
if self.gain_way in ['外协', '采购']:
|
|
||||||
if not self.supplier_ids:
|
|
||||||
raise UserError("请添加供应商")
|
|
||||||
|
|
||||||
|
|
||||||
class MrsProductionProcessCategory(models.Model):
|
class MrsProductionProcessCategory(models.Model):
|
||||||
_name = 'sf.production.process.category'
|
_name = 'sf.production.process.category'
|
||||||
@@ -90,7 +80,7 @@ class MrsProductionProcess(models.Model):
|
|||||||
code = fields.Char("编码")
|
code = fields.Char("编码")
|
||||||
name = fields.Char('名称')
|
name = fields.Char('名称')
|
||||||
remark = fields.Text("备注")
|
remark = fields.Text("备注")
|
||||||
# processing_order_ids = fields.One2many('sf.processing.order', 'production_process_id', string='工序')
|
processing_order_ids = fields.One2many('sf.processing.order', 'production_process_id', string='工序')
|
||||||
partner_process_ids = fields.Many2many('res.partner', 'process_ids', '加工工厂')
|
partner_process_ids = fields.Many2many('res.partner', 'process_ids', '加工工厂')
|
||||||
active = fields.Boolean('有效', default=True)
|
active = fields.Boolean('有效', default=True)
|
||||||
parameter_ids = fields.One2many('sf.production.process.parameter', 'process_id', string='可选参数')
|
parameter_ids = fields.One2many('sf.production.process.parameter', 'process_id', string='可选参数')
|
||||||
@@ -98,25 +88,25 @@ class MrsProductionProcess(models.Model):
|
|||||||
# workcenter_ids = fields.Many2many('mrp.workcenter', 'rel_workcenter_process', required=True)
|
# workcenter_ids = fields.Many2many('mrp.workcenter', 'rel_workcenter_process', required=True)
|
||||||
|
|
||||||
|
|
||||||
# class MrsProcessingTechnology(models.Model):
|
class MrsProcessingTechnology(models.Model):
|
||||||
# _name = 'sf.processing.technology'
|
_name = 'sf.processing.technology'
|
||||||
# _description = '加工工艺'
|
_description = '加工工艺'
|
||||||
#
|
|
||||||
# name = fields.Char('名称', index=True)
|
name = fields.Char('名称', index=True)
|
||||||
# remark = fields.Text('备注', index=True)
|
remark = fields.Text('备注', index=True)
|
||||||
# code = fields.Char("编码")
|
code = fields.Char("编码")
|
||||||
# processing_order_ids = fields.Many2many('sf.processing.order', 'sf_associated_processes',
|
processing_order_ids = fields.Many2many('sf.processing.order', 'sf_associated_processes',
|
||||||
# index=True, string='工序')
|
index=True, string='工序')
|
||||||
# active = fields.Boolean('有效', default=True)
|
active = fields.Boolean('有效', default=True)
|
||||||
|
|
||||||
|
|
||||||
# class MrsProcessingOrder(models.Model):
|
class MrsProcessingOrder(models.Model):
|
||||||
# _name = 'sf.processing.order'
|
_name = 'sf.processing.order'
|
||||||
# _description = '工序'
|
_description = '工序'
|
||||||
# sequence = fields.Integer('Sequence')
|
sequence = fields.Integer('Sequence')
|
||||||
# processing_technology_ids = fields.Many2many('sf.processing.technology', 'sf_associated_processes',
|
processing_technology_ids = fields.Many2many('sf.processing.technology', 'sf_associated_processes',
|
||||||
# index=True, string='加工工艺')
|
index=True, string='加工工艺')
|
||||||
# production_process_id = fields.Many2one('sf.production.process', string="表面工艺")
|
production_process_id = fields.Many2one('sf.production.process', string="表面工艺")
|
||||||
|
|
||||||
|
|
||||||
class SupplierSort(models.Model):
|
class SupplierSort(models.Model):
|
||||||
|
|||||||
@@ -26,65 +26,66 @@ class FixtureModel(models.Model):
|
|||||||
_name = 'sf.fixture.model'
|
_name = 'sf.fixture.model'
|
||||||
_description = "夹具型号"
|
_description = "夹具型号"
|
||||||
|
|
||||||
name = fields.Char(string="名称", size=50)
|
name = fields.Char(string="名称", size=15)
|
||||||
fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料")
|
fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料", )
|
||||||
fixture_material_type = fields.Char(string="夹具物料类型", related='fixture_material_id.name')
|
fixture_material_type = fields.Char(string="夹具物料类型", related='fixture_material_id.name', store=True)
|
||||||
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型")
|
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型")
|
||||||
brand_id = fields.Many2one('sf.machine.brand', string="品牌")
|
brand_id = fields.Many2one('sf.machine.brand', string="品牌", domain="[('tag_ids.name', 'ilike', '夹具')]")
|
||||||
model_file = fields.Binary(string="图片")
|
clamping_way = fields.Char(string="装夹方式")
|
||||||
status = fields.Boolean('状态')
|
port_type = fields.Char(string="接口类型")
|
||||||
active = fields.Boolean('有效', default=False)
|
model_file = fields.Binary(string="3D模型图")
|
||||||
|
|
||||||
|
length = fields.Char(string="长度(mm)")
|
||||||
|
width = fields.Char(string="宽度(mm)")
|
||||||
|
height = fields.Char(string="高度(mm)")
|
||||||
|
weight = fields.Char(string="重量(kg)")
|
||||||
|
clamp_workpiece_length_max = fields.Integer(string="夹持工件长度max(mm)")
|
||||||
|
clamp_workpiece_width_max = fields.Integer(string="夹持工件宽度max(mm)")
|
||||||
|
clamp_workpiece_height_max = fields.Integer(string="夹持工件高度max(mm)")
|
||||||
|
clamp_workpiece_diameter_max = fields.Float(string="夹持工件直径max(mm)")
|
||||||
|
maximum_carrying_weight = fields.Float(string="最大承载重量(kg)")
|
||||||
|
maximum_clamping_force = fields.Integer(string="最大夹持力(n)")
|
||||||
|
|
||||||
|
materials_model_id = fields.Many2one('sf.materials.model', string="材料型号")
|
||||||
|
driving_way = fields.Selection([('气动', '气动'), ('液压', '液压'), ('机械', '机械')], string="驱动方式")
|
||||||
|
apply_machine_tool_type_ids = fields.Many2many('sf.machine_tool.type', 'rel_fixture_model_machine_tool_type',
|
||||||
|
string="适用机床型号")
|
||||||
|
through_hole_size = fields.Integer(string="过孔大小[mm]")
|
||||||
|
screw_size = fields.Integer(string="螺牙大小[mm]")
|
||||||
|
active = fields.Boolean('有效', default=True)
|
||||||
|
|
||||||
|
def _get_code(self, fixture_model_type_code):
|
||||||
|
fixture_model = self.env['sf.fixture.model'].sudo().search(
|
||||||
|
[('code', 'ilike', fixture_model_type_code)],
|
||||||
|
limit=1,
|
||||||
|
order="id desc")
|
||||||
|
if not fixture_model:
|
||||||
|
num = "%03d" % 1
|
||||||
|
else:
|
||||||
|
m = int(fixture_model.code[-3:]) + 1
|
||||||
|
num = "%03d" % m
|
||||||
|
return "%s%s" % (fixture_model_type_code, num)
|
||||||
|
|
||||||
zero_chuck_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id',
|
|
||||||
string='零点卡盘基本参数')
|
|
||||||
zero_tray_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id',
|
|
||||||
string='零点托盘基本参数')
|
|
||||||
pneumatic_fixture_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id',
|
|
||||||
string='气动夹具基本参数')
|
|
||||||
jaw_vice_fixture_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id',
|
|
||||||
string='虎钳夹具基本参数')
|
|
||||||
magnet_fixture_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id',
|
|
||||||
string='磁吸夹具基本参数')
|
|
||||||
adapter_board_fixture_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id',
|
|
||||||
string='转接板(锁板)夹具基本参数')
|
|
||||||
scroll_chuck_ids = fields.One2many('sf.fixture.materials.basic.parameters', 'fixture_model_id',
|
|
||||||
string='三爪卡盘基本参数')
|
|
||||||
code = fields.Char(string='编码', readonly=True)
|
code = fields.Char(string='编码', readonly=True)
|
||||||
|
|
||||||
# def _get_code(self, fixture_model_type_code):
|
def _onchange_fixture_material_id(self, fixture_material_id):
|
||||||
# fixture_model = self.env['sf.fixture.model'].sudo().search(
|
if fixture_material_id:
|
||||||
# [('code', 'ilike', fixture_model_type_code)],
|
if fixture_material_id.name == "气动夹具":
|
||||||
# limit=1,
|
code = self._get_code("JKM-C-JJWL-QDJJ-")
|
||||||
# order="id desc")
|
elif fixture_material_id.name == "转接板(锁板)夹具":
|
||||||
# if not fixture_model:
|
code = self._get_code("JKM-C-JJWL-ZJBJJ-")
|
||||||
# num = "%03d" % 1
|
elif fixture_material_id.name == "磁吸夹具":
|
||||||
# else:
|
code = self._get_code("JKM-C-JJWL-CXJJ-")
|
||||||
# m = int(fixture_model.code[-3:]) + 1
|
elif fixture_material_id.name == "虎钳夹具":
|
||||||
# num = "%03d" % m
|
code = self._get_code("JKM-C-JJWL-HQJJ-")
|
||||||
# return "%s%s" % (fixture_model_type_code, num)
|
else:
|
||||||
#
|
code = self._get_code("JKM-C-JJWL-LDKP-")
|
||||||
# def _onchange_fixture_material_id(self, fixture_material_id):
|
return code
|
||||||
# if fixture_material_id:
|
|
||||||
# if self.fixture_material_id.name == "气动夹具":
|
@api.model_create_multi
|
||||||
# code = self._get_code("JKM-C-JJWL-QDJJ-")
|
def create(self, vals):
|
||||||
# elif self.fixture_material_id.name == "转接板(锁板)夹具":
|
obj = super(FixtureModel, self).create(vals)
|
||||||
# code = self._get_code("JKM-C-JJWL-ZJJJ-")
|
if obj.fixture_material_id:
|
||||||
# elif self.fixture_material_id.name == "磁吸夹具":
|
code = self._onchange_fixture_material_id(obj.fixture_material_id)
|
||||||
# code = self._get_code("JKM-C-JJWL-CXJJ-")
|
obj.code = code
|
||||||
# elif self.fixture_material_id.name == "虎钳夹具":
|
return obj
|
||||||
# code = self._get_code("JKM-C-JJWL-HQJJ-")
|
|
||||||
# elif self.fixture_material_id.name == "零点托盘":
|
|
||||||
# code = self._get_code("JKM-C-JJWL-LDTP-")
|
|
||||||
# elif self.fixture_material_id.name == "三爪卡盘":
|
|
||||||
# code = self._get_code("JKM-C-JJWL-SZKP-")
|
|
||||||
# else:
|
|
||||||
# code = self._get_code("JKM-C-JJWL-LDKP-")
|
|
||||||
# return code
|
|
||||||
#
|
|
||||||
# @api.model_create_multi
|
|
||||||
# def create(self, vals):
|
|
||||||
# obj = super(FixtureModel, self).create(vals)
|
|
||||||
# if obj.fixture_material_id:
|
|
||||||
# code = self._onchange_fixture_material_id(obj.fixture_material_id)
|
|
||||||
# obj.code = code
|
|
||||||
# return obj
|
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from datetime import date
|
|
||||||
from odoo import fields, models, api
|
from odoo import fields, models, api
|
||||||
from odoo.exceptions import UserError
|
|
||||||
|
|
||||||
|
|
||||||
class CuttingToolMaterial(models.Model):
|
class CuttingToolMaterial(models.Model):
|
||||||
@@ -77,8 +75,6 @@ class CuttingToolModel(models.Model):
|
|||||||
integral_coarse_medium_fine = fields.Selection([('粗', '粗'), ('中', '中'), ('精', '精')], '粗/中/精')
|
integral_coarse_medium_fine = fields.Selection([('粗', '粗'), ('中', '中'), ('精', '精')], '粗/中/精')
|
||||||
integral_run_out_accuracy_max = fields.Char('整体式刀具端跳精度max')
|
integral_run_out_accuracy_max = fields.Char('整体式刀具端跳精度max')
|
||||||
integral_run_out_accuracy_min = fields.Char('整体式刀具端跳精度min')
|
integral_run_out_accuracy_min = fields.Char('整体式刀具端跳精度min')
|
||||||
ramping_angle_ids = fields.One2many('sf.ramping.angle', 'standard_library_id', '坡铣角度',
|
|
||||||
domain=lambda self: [('standard_library_id', '=', self.id)])
|
|
||||||
|
|
||||||
fit_blade_shape_id = fields.Many2one('maintenance.equipment.image',
|
fit_blade_shape_id = fields.Many2one('maintenance.equipment.image',
|
||||||
'适配刀片形状', domain=[('type', '=', '刀片形状')])
|
'适配刀片形状', domain=[('type', '=', '刀片形状')])
|
||||||
@@ -91,8 +87,8 @@ class CuttingToolModel(models.Model):
|
|||||||
'柄部类型', domain=[('type', '=', '柄部类型')])
|
'柄部类型', domain=[('type', '=', '柄部类型')])
|
||||||
cutting_direction_ids = fields.Many2many('maintenance.equipment.image', 'cutting_direction_library_rel',
|
cutting_direction_ids = fields.Many2many('maintenance.equipment.image', 'cutting_direction_library_rel',
|
||||||
'走刀方向', domain=[('type', '=', '走刀方向')])
|
'走刀方向', domain=[('type', '=', '走刀方向')])
|
||||||
suitable_coolant_ids = fields.Many2many('maintenance.equipment.image', 'suitable_coolants_library_rel',
|
suitable_coolant_ids = fields.Many2many('maintenance.equipment.image', 'suitable_coolant_library_rel',
|
||||||
'适合冷却方式', domain=[('type', '=', '冷却方式')])
|
'适合冷却液', domain=[('type', '=', '冷却液')])
|
||||||
compaction_way_id = fields.Many2one('maintenance.equipment.image',
|
compaction_way_id = fields.Many2one('maintenance.equipment.image',
|
||||||
'压紧方式', domain=[('type', '=', '压紧方式')])
|
'压紧方式', domain=[('type', '=', '压紧方式')])
|
||||||
integral_tool_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
|
integral_tool_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
|
||||||
@@ -108,38 +104,21 @@ class CuttingToolModel(models.Model):
|
|||||||
chuck_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
|
chuck_basic_parameters_ids = fields.One2many('sf.tool.materials.basic.parameters',
|
||||||
'standard_library_id', string='夹头基本参数')
|
'standard_library_id', string='夹头基本参数')
|
||||||
cutting_speed_ids = fields.One2many('sf.cutting.speed', 'standard_library_id', string='切削速度Vc')
|
cutting_speed_ids = fields.One2many('sf.cutting.speed', 'standard_library_id', string='切削速度Vc')
|
||||||
feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(整体式刀具)')
|
feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz',
|
||||||
feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(刀片)')
|
domain=[('cutting_speed', '!=', False)])
|
||||||
|
feed_per_tooth_ids_2 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz',
|
||||||
|
domain=[('machining_method', '!=', False)])
|
||||||
|
feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz',
|
||||||
|
domain=[('cutting_speed', '!=', False)])
|
||||||
|
feed_per_tooth_ids_4 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz',
|
||||||
|
domain=[('machining_method', '!=', False)])
|
||||||
material_model_id = fields.Many2one('sf.materials.model', '材料型号')
|
material_model_id = fields.Many2one('sf.materials.model', '材料型号')
|
||||||
|
|
||||||
@api.onchange('cutting_tool_material_id')
|
|
||||||
def _get_code(self):
|
|
||||||
if self.is_cloud is False:
|
|
||||||
today = date.today().strftime("%Y%m%d")
|
|
||||||
today_code = 'T-DJWL-%s-%s' % (self.cutting_tool_material_id.code, today)
|
|
||||||
cutting_tool_model = self.search(
|
|
||||||
[('code', 'ilike', today_code), ('is_cloud', '=', False),
|
|
||||||
('active', 'in', [True, False])],
|
|
||||||
limit=1,
|
|
||||||
order="id desc")
|
|
||||||
if not cutting_tool_model:
|
|
||||||
num = "%03d" % 1
|
|
||||||
else:
|
|
||||||
m = int(today_code[-3:]) + 1
|
|
||||||
num = "%03d" % m
|
|
||||||
self.code = "%s%s" % (today_code, num)
|
|
||||||
|
|
||||||
# 适用夹头型号可以多选
|
# 适用夹头型号可以多选
|
||||||
# chuck_ids = fields.Many2many(
|
chuck_ids = fields.Many2many(
|
||||||
# 'sf.cutting_tool.standard.library',
|
|
||||||
# relation='cutting_tool_type_library_handle_chuck_rel',
|
|
||||||
# column1='model_id_1',
|
|
||||||
# column2='model_id_2',
|
|
||||||
# domain="[('cutting_tool_material_id.name', '=', '夹头')]",
|
|
||||||
# string='适用夹头型号')
|
|
||||||
|
|
||||||
chuck_id = fields.Many2one(
|
|
||||||
'sf.cutting_tool.standard.library',
|
'sf.cutting_tool.standard.library',
|
||||||
|
relation='cutting_tool_type_library_handle_chuck_rel',
|
||||||
|
column1='model_id_1',
|
||||||
|
column2='model_id_2',
|
||||||
domain="[('cutting_tool_material_id.name', '=', '夹头')]",
|
domain="[('cutting_tool_material_id.name', '=', '夹头')]",
|
||||||
string='适用夹头型号')
|
string='适用夹头型号')
|
||||||
cutter_bar_ids = fields.Many2many(
|
cutter_bar_ids = fields.Many2many(
|
||||||
@@ -159,28 +138,22 @@ class CuttingToolModel(models.Model):
|
|||||||
string='适用刀盘型号' # 使用空列表作为默认值
|
string='适用刀盘型号' # 使用空列表作为默认值
|
||||||
)
|
)
|
||||||
# 刀杆/参数
|
# 刀杆/参数
|
||||||
# blade_ids = fields.Many2many(
|
blade_ids = fields.Many2many(
|
||||||
# 'sf.cutting_tool.standard.library',
|
|
||||||
# relation='cutting_tool_type_library_pad_blade_rel',
|
|
||||||
# column1='model_id_1',
|
|
||||||
# column2='model_id_2',
|
|
||||||
# domain="[('cutting_tool_material_id.name', '=', '刀片')]",
|
|
||||||
# string='适用刀片型号' # 使用空列表作为默认值
|
|
||||||
# )
|
|
||||||
|
|
||||||
handle_id = fields.Many2one(
|
|
||||||
'sf.cutting_tool.standard.library',
|
'sf.cutting_tool.standard.library',
|
||||||
|
relation='cutting_tool_type_library_pad_blade_rel',
|
||||||
|
column1='model_id_1',
|
||||||
|
column2='model_id_2',
|
||||||
|
domain="[('cutting_tool_material_id.name', '=', '刀片')]",
|
||||||
|
string='适用刀片型号' # 使用空列表作为默认值
|
||||||
|
)
|
||||||
|
handle_ids = fields.Many2many(
|
||||||
|
'sf.cutting_tool.standard.library',
|
||||||
|
relation='cutting_tool_type_library_chuck_handle_rel',
|
||||||
|
column1='model_id_1',
|
||||||
|
column2='model_id_2',
|
||||||
domain="[('cutting_tool_material_id.name', '=', '刀柄')]",
|
domain="[('cutting_tool_material_id.name', '=', '刀柄')]",
|
||||||
string='适用刀柄型号'
|
string='适用刀柄型号'
|
||||||
)
|
)
|
||||||
# handle_ids = fields.Many2many(
|
|
||||||
# 'sf.cutting_tool.standard.library',
|
|
||||||
# relation='cutting_tool_type_library_chuck_handle_rel',
|
|
||||||
# column1='model_id_1',
|
|
||||||
# column2='model_id_2',
|
|
||||||
# domain="[('cutting_tool_material_id.name', '=', '刀柄')]",
|
|
||||||
# string='适用刀柄型号'
|
|
||||||
# )
|
|
||||||
active = fields.Boolean('有效', default=True)
|
active = fields.Boolean('有效', default=True)
|
||||||
is_cloud = fields.Boolean('云端数据', default=False)
|
is_cloud = fields.Boolean('云端数据', default=False)
|
||||||
|
|
||||||
@@ -202,12 +175,12 @@ class MaintenanceStandardImage(models.Model):
|
|||||||
image = fields.Binary(string='图文')
|
image = fields.Binary(string='图文')
|
||||||
type = fields.Selection(
|
type = fields.Selection(
|
||||||
[('加工能力', '加工能力'), ('刀尖特征', '刀尖特征'), ('柄部类型', '柄部类型'), ('走刀方向', '走刀方向'),
|
[('加工能力', '加工能力'), ('刀尖特征', '刀尖特征'), ('柄部类型', '柄部类型'), ('走刀方向', '走刀方向'),
|
||||||
('压紧方式', '压紧方式'), ('刀片形状', '刀片形状'), ('冷却方式', '冷却方式')],
|
('冷却液', '冷却液'), ('压紧方式', '压紧方式'), ('刀片形状', '刀片形状'), ('冷却方式', '冷却方式')],
|
||||||
string='特征')
|
string='特征')
|
||||||
equipment_id = fields.Many2many('maintenance.equipment', 'image_id', string='设备')
|
equipment_id = fields.Many2many('maintenance.equipment', 'image_id', string='设备')
|
||||||
equipment_lq_id = fields.Many2many('maintenance.equipment', 'image_lq_id', string='设备能力特征')
|
equipment_lq_id = fields.Many2many('maintenance.equipment', 'image_lq_id', string='设备')
|
||||||
jg_equipment_id = fields.Many2many('sf.machine_tool.type', 'jg_image_id', string='机床型号')
|
jg_equipment_id = fields.Many2many('sf.machine_tool.type', 'jg_image_id', string='机床型号')
|
||||||
lq_equipment_id = fields.Many2many('sf.machine_tool.type', 'lq_image_id', string='机床型号能力特征')
|
lq_equipment_id = fields.Many2many('sf.machine_tool.type', 'lq_image_id', string='机床型号')
|
||||||
|
|
||||||
def _get_ids(self, name_arr):
|
def _get_ids(self, name_arr):
|
||||||
ability_feature_ids = []
|
ability_feature_ids = []
|
||||||
@@ -260,90 +233,3 @@ class MaintenanceStandardImage(models.Model):
|
|||||||
else:
|
else:
|
||||||
record['image'] = ""
|
record['image'] = ""
|
||||||
return records
|
return records
|
||||||
|
|
||||||
|
|
||||||
class ToolGroups(models.Model):
|
|
||||||
_name = 'sf.tool.groups'
|
|
||||||
_description = '刀具组'
|
|
||||||
|
|
||||||
name = fields.Char('名称')
|
|
||||||
equipment_ids = fields.Many2many('maintenance.equipment', 'ref_maintenance_equipment', string='机台号')
|
|
||||||
remark = fields.Char('备注', size=50)
|
|
||||||
|
|
||||||
active = fields.Boolean(string='已归档', default=True)
|
|
||||||
|
|
||||||
# ==========机床刀具组接口==========
|
|
||||||
# def _register_tool_groups(self, obj):
|
|
||||||
# # create_url = '/AutoDeviceApi/MachineToolGroup'
|
|
||||||
# sf_sync_config = self.env['res.config.settings'].get_values()
|
|
||||||
# token = sf_sync_config['token']
|
|
||||||
# sf_secret_key = sf_sync_config['sf_secret_key']
|
|
||||||
# headers = Common.get_headers(obj, token, sf_secret_key)
|
|
||||||
# strurl = "https://x24467i973.zicp.fun/AutoDeviceApi/MachineToolGroup"
|
|
||||||
# device_id = ''
|
|
||||||
# name = None
|
|
||||||
# if obj:
|
|
||||||
# for equipment_id in obj.equipment_ids:
|
|
||||||
# device_id = '%s,%s' % (device_id, equipment_id.name)
|
|
||||||
# name = obj.name
|
|
||||||
# val = {
|
|
||||||
# 'DeviceId': device_id,
|
|
||||||
# 'GroupName': name,
|
|
||||||
# }
|
|
||||||
# kw = json.dumps(val, ensure_ascii=False)
|
|
||||||
# r = requests.post(strurl, json={}, data={'kw': kw, 'token': token}, headers=headers)
|
|
||||||
# print(r)
|
|
||||||
# ret = r.json()
|
|
||||||
# if r == 200:
|
|
||||||
# return "机床刀具组发送成功"
|
|
||||||
# else:
|
|
||||||
# raise ValidationError("机床刀具组发送失败")
|
|
||||||
|
|
||||||
# def write(self, vals):
|
|
||||||
# obj = super().write(vals)
|
|
||||||
# self._register_tool_groups(self)
|
|
||||||
# return obj
|
|
||||||
#
|
|
||||||
# @api.model_create_multi
|
|
||||||
# def create(self, vals_list):
|
|
||||||
# records = super(ToolGroups, self).create(vals_list)
|
|
||||||
# self._register_tool_groups(records)
|
|
||||||
# return records
|
|
||||||
|
|
||||||
|
|
||||||
class ToolInventory(models.Model):
|
|
||||||
_name = 'sf.tool.inventory'
|
|
||||||
_description = '功能刀具清单'
|
|
||||||
|
|
||||||
name = fields.Char('功能刀具名称', required=True)
|
|
||||||
type = fields.Char('类型')
|
|
||||||
functional_cutting_tool_model_id = fields.Many2one('sf.functional.cutting.tool.model', string='功能刀具类型')
|
|
||||||
prefix = fields.Char('前缀')
|
|
||||||
postfix = fields.Char('后缀')
|
|
||||||
diameter = fields.Float('直径(mm)')
|
|
||||||
angle = fields.Float('R角(mm)')
|
|
||||||
tool_length = fields.Float('刀具总长(mm)')
|
|
||||||
blade_length = fields.Float('避空长/刃长(mm)')
|
|
||||||
knife_head_name = fields.Char('刀头名称')
|
|
||||||
cutter_number = fields.Char('刀号')
|
|
||||||
blade_number = fields.Integer('刃数(个)')
|
|
||||||
extension = fields.Float('伸出长度(mm)')
|
|
||||||
work_material = fields.Selection([('钢', '钢'), ('铝', '铝')], string='加工材料')
|
|
||||||
life_span = fields.Float('寿命(h)')
|
|
||||||
|
|
||||||
tool_groups_id = fields.Many2one('sf.tool.groups', string='刀具组')
|
|
||||||
|
|
||||||
active = fields.Boolean('已归档', default=True)
|
|
||||||
|
|
||||||
@api.model_create_multi
|
|
||||||
def create(self, vals_list):
|
|
||||||
# 名称重复校验
|
|
||||||
name_list = []
|
|
||||||
for val in vals_list:
|
|
||||||
tool_inventory = self.search([('name', '=', val['name'])])
|
|
||||||
if tool_inventory:
|
|
||||||
name_list.append(val['name'])
|
|
||||||
if name_list:
|
|
||||||
raise UserError("功能刀具名称%s已存在,请重新输入" % name_list)
|
|
||||||
records = super(ToolInventory, self).create(vals_list)
|
|
||||||
return records
|
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
diff a/sf_base/models/tool_base_new.py b/sf_base/models/tool_base_new.py (rejected hunks)
|
|
||||||
@@ -108,6 +108,4 @@
|
|
||||||
cutting_speed_ids = fields.One2many('sf.cutting.speed', 'standard_library_id', string='切削速度Vc')
|
|
||||||
- feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz',
|
|
||||||
- domain=[('cutting_speed', '!=', False)])
|
|
||||||
- feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz',
|
|
||||||
- domain=[('cutting_speed', '!=', False)])
|
|
||||||
+ feed_per_tooth_ids = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz')
|
|
||||||
+ feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz')
|
|
||||||
|
|
||||||
@@ -6,23 +6,21 @@ class ToolMaterialsBasicParameters(models.Model):
|
|||||||
_description = '刀具物料基本参数'
|
_description = '刀具物料基本参数'
|
||||||
|
|
||||||
name = fields.Char('物料号', size=50)
|
name = fields.Char('物料号', size=50)
|
||||||
code = fields.Char('编码', size=50)
|
|
||||||
standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具标准库')
|
standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='刀具标准库')
|
||||||
cutting_tool_type = fields.Char(related='standard_library_id.cutting_tool_type', string='刀具物料类型',
|
cutting_tool_type = fields.Char(related='standard_library_id.cutting_tool_type', string='刀具物料类型',
|
||||||
store=True)
|
store=True)
|
||||||
is_cloud = fields.Boolean(related='standard_library_id.is_cloud', string='云端数据')
|
|
||||||
|
|
||||||
# 整体式刀具参数
|
# 整体式刀具参数
|
||||||
total_length = fields.Float('总长度(mm)')
|
total_length = fields.Float('总长度(mm)')
|
||||||
blade_number = fields.Selection(
|
blade_number = fields.Selection(
|
||||||
[('0', '0'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')],
|
[('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')],
|
||||||
string='刃数(个)', default='0')
|
string='刃数(个)')
|
||||||
neck_diameter = fields.Float('颈部直径(mm)')
|
neck_diameter = fields.Float('颈部直径(mm)')
|
||||||
neck_length = fields.Float('颈部长度(mm)')
|
neck_length = fields.Float('颈部长度(mm)')
|
||||||
handle_diameter = fields.Float('柄部直径(mm)')
|
handle_diameter = fields.Float('柄部直径(mm)')
|
||||||
handle_length = fields.Float('柄部长度(mm)')
|
handle_length = fields.Float('柄部长度(mm)')
|
||||||
blade_tip_diameter = fields.Integer('刀尖直径(mm)')
|
blade_tip_diameter = fields.Integer('刀尖直径(mm)')
|
||||||
blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角度)', size=20)
|
blade_tip_working_size = fields.Char('刀尖处理尺寸(R半径mm/倒角)', size=20)
|
||||||
blade_tip_taper = fields.Integer('刀尖锥度(°)')
|
blade_tip_taper = fields.Integer('刀尖锥度(°)')
|
||||||
blade_diameter = fields.Float('刃部直径(mm)')
|
blade_diameter = fields.Float('刃部直径(mm)')
|
||||||
blade_length = fields.Float('刃部长度(mm)')
|
blade_length = fields.Float('刃部长度(mm)')
|
||||||
@@ -38,23 +36,23 @@ class ToolMaterialsBasicParameters(models.Model):
|
|||||||
cutting_blade_length = fields.Float('切削刃长(mm)')
|
cutting_blade_length = fields.Float('切削刃长(mm)')
|
||||||
relief_angle = fields.Integer('后角(°)')
|
relief_angle = fields.Integer('后角(°)')
|
||||||
blade_tip_circular_arc_radius = fields.Char('刀尖圆弧半径(mm)', size=20)
|
blade_tip_circular_arc_radius = fields.Char('刀尖圆弧半径(mm)', size=20)
|
||||||
inscribed_circle_diameter = fields.Float('内接圆直径IC/D(mm)')
|
inscribed_circle_diameter = fields.Float('内接圆直径(mm)')
|
||||||
install_aperture_diameter = fields.Float('安装孔直径(mm)')
|
install_aperture_diameter = fields.Float('安装孔直径(mm)')
|
||||||
chip_breaker_groove = fields.Selection([('无', '无'), ('单面', '单面'), ('双面', '双面')],
|
chip_breaker_groove = fields.Selection([('无', '无'), ('单面', '单面'), ('双面', '双面')],
|
||||||
string='有无断屑槽')
|
string='有无断屑槽')
|
||||||
chip_breaker_type_code = fields.Char('断屑槽型代号')
|
|
||||||
blade_teeth_model = fields.Selection(
|
blade_teeth_model = fields.Selection(
|
||||||
[('无', '无'), ('V牙型', 'V牙型'), ('米制全牙型', '米制全牙型'), ('美制全牙型', '美制全牙型'),
|
[('无', '无'), ('V牙型', 'V牙型'), ('米制全牙型', '米制全牙型'), ('美制全牙型', '美制全牙型'),
|
||||||
('惠氏全牙型', '惠氏全牙型'), ('BSPT全牙型', 'BSPT全牙型'), ('NPT全牙型', 'NPT全牙型'),
|
('惠氏全牙型', '惠氏全牙型'), ('BSPT全牙型', 'BSPT全牙型'), ('NPT全牙型', 'NPT全牙型'),
|
||||||
('UNJ全牙型', 'UNJ全牙型'), ('DIN405圆牙型', 'DIN405圆牙型'), ('ACME梯形', 'ACME梯形'),
|
('UNJ全牙型', 'UNJ全牙型'), ('DIN405圆牙型', 'DIN405圆牙型'), ('ACME梯形', 'ACME梯形'),
|
||||||
('石油管螺纹刀片', '石油管螺纹刀片'), ('矮牙ACME梯形', '矮牙ACME梯形'),
|
('石油管螺纹刀片', '石油管螺纹刀片'), ('矮牙ACME梯形', '矮牙ACME梯形'),
|
||||||
('Trapeze30° 103', 'Trapeze30° 103')], string='刀片牙型', default='无')
|
('Trapeze30° 103', 'Trapeze30° 103')], string='刀片牙型', default='无')
|
||||||
blade_blade_number = fields.Selection(
|
blade_blade_number = fields.Selection([('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'),
|
||||||
[('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'),
|
('7', '7'), ('8', '8'), ('9', '9'), ('10', '10')],
|
||||||
('9', '9'), ('10', '10')],
|
string='刀片的刃数(个)')
|
||||||
string='刀片的刃数(个)', default='0')
|
|
||||||
main_included_angle = fields.Integer('主偏角(°)')
|
main_included_angle = fields.Integer('主偏角(°)')
|
||||||
top_angle = fields.Integer('顶角(°)')
|
top_angle = fields.Integer('顶角(°)')
|
||||||
|
blade_tip_dip_angle = fields.Integer('刀尖倾角(°)')
|
||||||
|
side_cutting_edge_angle = fields.Integer('侧切削角(°)')
|
||||||
thread_model = fields.Selection([('无', '无'), ('外螺纹', '外螺纹'), ('内螺纹', '内螺纹')], string='螺纹类型',
|
thread_model = fields.Selection([('无', '无'), ('外螺纹', '外螺纹'), ('内螺纹', '内螺纹')], string='螺纹类型',
|
||||||
default='无')
|
default='无')
|
||||||
thread_num = fields.Float('每英寸螺纹数(tpi)')
|
thread_num = fields.Float('每英寸螺纹数(tpi)')
|
||||||
@@ -75,8 +73,11 @@ class ToolMaterialsBasicParameters(models.Model):
|
|||||||
is_cooling_hole = fields.Boolean('有无冷却孔')
|
is_cooling_hole = fields.Boolean('有无冷却孔')
|
||||||
locating_slot_code = fields.Char('定位槽代号', size=20)
|
locating_slot_code = fields.Char('定位槽代号', size=20)
|
||||||
installing_structure = fields.Char('安装结构', size=20)
|
installing_structure = fields.Char('安装结构', size=20)
|
||||||
blade_id = fields.Many2one(
|
blade_ids = fields.Many2many(
|
||||||
'sf.cutting_tool.standard.library',
|
'sf.cutting.tool.type',
|
||||||
|
relation='basic_param_pad_blade_rel',
|
||||||
|
column1='model_id_1',
|
||||||
|
column2='model_id_2',
|
||||||
domain="[('cutting_tool_material_id.name', '=', '刀片')]",
|
domain="[('cutting_tool_material_id.name', '=', '刀片')]",
|
||||||
string='适配刀片型号' # 使用空列表作为默认值
|
string='适配刀片型号' # 使用空列表作为默认值
|
||||||
)
|
)
|
||||||
@@ -89,105 +90,295 @@ class ToolMaterialsBasicParameters(models.Model):
|
|||||||
cutter_head_diameter = fields.Float('刀盘直径(mm)')
|
cutter_head_diameter = fields.Float('刀盘直径(mm)')
|
||||||
interface_diameter = fields.Float('接口直径(mm)')
|
interface_diameter = fields.Float('接口直径(mm)')
|
||||||
# 刀柄参数
|
# 刀柄参数
|
||||||
flange_shank_length = fields.Float('法兰长(mm)')
|
flange_shank_length = fields.Float('法兰柄长(mm)')
|
||||||
flange_diameter = fields.Float('法兰直径(mm)')
|
|
||||||
fit_chuck_size = fields.Char('适配夹头尺寸')
|
|
||||||
handle_external_diameter = fields.Float('柄部外径(mm)')
|
handle_external_diameter = fields.Float('柄部外径(mm)')
|
||||||
handle_inside_diameter = fields.Float('柄部内径(mm)')
|
handle_inside_diameter = fields.Float('柄部内径(mm)')
|
||||||
dynamic_balance_class = fields.Char('动平衡等级')
|
|
||||||
min_clamping_diameter = fields.Float('最小夹持直径(mm)')
|
min_clamping_diameter = fields.Float('最小夹持直径(mm)')
|
||||||
max_clamping_diameter = fields.Float('最大夹持直径(mm)')
|
max_clamping_diameter = fields.Float('最大夹持直径(mm)')
|
||||||
clamping_mode = fields.Char('夹持方式', size=20)
|
clamping_mode = fields.Char('夹持方式', size=20)
|
||||||
max_load_capacity = fields.Float('最大负载能力(kg)')
|
max_load_capacity = fields.Float('最大负载能力(kg)')
|
||||||
taper = fields.Integer('锥度(°)')
|
taper = fields.Integer('锥度(°)')
|
||||||
shank_length = fields.Float('刀柄长度(mm)', digits=(3, 2))
|
|
||||||
shank_diameter = fields.Float('刀柄直径(mm)')
|
|
||||||
tool_changing_time = fields.Integer('换刀时间(s)')
|
tool_changing_time = fields.Integer('换刀时间(s)')
|
||||||
standard_rotate_speed = fields.Integer('标准转速(n/min)')
|
standard_rotate_speed = fields.Integer('标准转速(n/min)')
|
||||||
max_rotate_speed = fields.Integer('最大转速(n/min)')
|
max_rotate_speed = fields.Integer('最大转速(n/min)')
|
||||||
diameter_slip_accuracy = fields.Char('径跳精度(mm)', size=20)
|
diameter_slip_accuracy = fields.Char('径跳精度(mm)', size=20)
|
||||||
cooling_model = fields.Char('冷却类型', size=20)
|
cooling_model = fields.Char('冷却类型', size=20)
|
||||||
taper_shank_model = fields.Char('锥柄型号')
|
is_rough_machining = fields.Boolean('可粗加工', default=False)
|
||||||
|
is_finish_machining = fields.Boolean('可精加工', default=False)
|
||||||
is_quick_cutting = fields.Boolean('可高速切削', default=False)
|
is_quick_cutting = fields.Boolean('可高速切削', default=False)
|
||||||
|
is_drill_hole = fields.Boolean('可钻孔', default=False)
|
||||||
is_safe_lock = fields.Boolean('有无安全锁', default=False)
|
is_safe_lock = fields.Boolean('有无安全锁', default=False)
|
||||||
chuck_id = fields.Many2one(
|
|
||||||
'sf.cutting_tool.standard.library',
|
|
||||||
domain="[('cutting_tool_material_id.name', '=', '夹头')]",
|
|
||||||
string='适配夹头型号' # 使用空列表作为默认值
|
|
||||||
)
|
|
||||||
nut = fields.Char('适配锁紧螺母型号')
|
|
||||||
|
|
||||||
# 夹头参数
|
# 夹头参数
|
||||||
er_size_model = fields.Char('ER尺寸型号', size=20)
|
er_size_model = fields.Char('ER尺寸型号', size=20)
|
||||||
outer_diameter = fields.Float('外径(mm)')
|
outer_diameter = fields.Float('外径(mm)')
|
||||||
inner_diameter = fields.Float('内径(mm)')
|
inner_diameter = fields.Float('内径(mm)')
|
||||||
run_out_accuracy = fields.Char('跳动精度(mm)', size=20)
|
run_out_accuracy = fields.Char('跳动精度(mm)', size=20)
|
||||||
top_diameter = fields.Float('顶部直径(mm)')
|
top_diameter = fields.Float('顶部直径(mm)')
|
||||||
weight = fields.Float('重量(kg)')
|
weight = fields.Float('重量(kg)', size=20)
|
||||||
clamping_length = fields.Float('夹持长度(mm)')
|
clamping_length = fields.Float('夹持长度(mm)')
|
||||||
clamping_tolerance = fields.Char('夹持公差(mm)', size=20)
|
clamping_tolerance = fields.Char('夹持公差(mm)', size=20)
|
||||||
cooling_jacket = fields.Char('适用冷却套型号', size=50)
|
cooling_jacket = fields.Char('适用冷却套型号', size=50)
|
||||||
active = fields.Boolean(string='有效', default=True)
|
handle_ids = fields.Many2many(
|
||||||
|
'sf.cutting.tool.type',
|
||||||
|
relation='basic_param_chuck_handle_rel',
|
||||||
|
column1='model_id_1',
|
||||||
|
column2='model_id_2',
|
||||||
|
domain="[('cutting_tool_material_id.name', '=', '刀柄')]",
|
||||||
|
string='适用刀柄型号'
|
||||||
|
)
|
||||||
|
|
||||||
|
def _json_integral_tool_basic_param(self, obj):
|
||||||
|
integral_tool_basic_param_str = (0, '', {
|
||||||
|
'name': obj['name'],
|
||||||
|
'cutting_tool_type': obj['cutting_tool_type'],
|
||||||
|
'total_length': obj['total_length'],
|
||||||
|
'blade_diameter': obj['blade_diameter'],
|
||||||
|
'blade_length': obj['blade_length'],
|
||||||
|
'blade_number': obj['blade_number'],
|
||||||
|
'neck_length': obj['neck_length'],
|
||||||
|
'neck_diameter': obj['neck_diameter'],
|
||||||
|
'handle_diameter': obj['handle_diameter'],
|
||||||
|
'handle_length': obj['handle_length'],
|
||||||
|
'blade_tip_diameter': obj['blade_tip_diameter'],
|
||||||
|
'blade_tip_working_size': obj['blade_tip_working_size'],
|
||||||
|
'blade_tip_taper': obj['blade_tip_taper'],
|
||||||
|
'blade_helix_angle': obj['blade_helix_angle'],
|
||||||
|
'blade_width': obj['blade_width'],
|
||||||
|
'blade_depth': obj['blade_depth'],
|
||||||
|
'pitch': obj['pitch'],
|
||||||
|
'cutting_depth': obj['cutting_depth'],
|
||||||
|
})
|
||||||
|
return integral_tool_basic_param_str
|
||||||
|
|
||||||
|
def _json_blade_basic_param(self, obj):
|
||||||
|
blade_basic_param_str = (0, '', {
|
||||||
|
'name': obj['name'],
|
||||||
|
'cutting_tool_type': obj['cutting_tool_type'],
|
||||||
|
'length': obj['length'],
|
||||||
|
'thickness': obj['thickness'],
|
||||||
|
'width': obj['width'],
|
||||||
|
'cutting_blade_length': obj['cutting_blade_length'],
|
||||||
|
'relief_angle': obj['relief_angle'],
|
||||||
|
'blade_tip_circular_arc_radius': obj['blade_tip_circular_arc_radius'],
|
||||||
|
'inscribed_circle_diameter': obj['inscribed_circle_diameter'],
|
||||||
|
'install_aperture_diameter': obj['install_aperture_diameter'],
|
||||||
|
'pitch': obj['pitch'],
|
||||||
|
'chip_breaker_groove': obj['chip_breaker_groove'],
|
||||||
|
'blade_teeth_model': '无' if not obj['bladed_teeth_model'] else obj['bladed_teeth_model'],
|
||||||
|
'blade_blade_number': obj['blade_blade_number'],
|
||||||
|
'cutting_depth': obj['cutting_depth'],
|
||||||
|
'blade_width': obj['blade_width'],
|
||||||
|
'main_included_angle': obj['main_included_angle'],
|
||||||
|
'top_angle': obj['top_angle'],
|
||||||
|
'blade_tip_dip_angle': obj['blade_tip_dip_angle'],
|
||||||
|
'side_cutting_edge_angle': obj['side_cutting_edge_angle'],
|
||||||
|
'thread_model': '无' if not obj['thread_model'] else obj['thread_model'],
|
||||||
|
'thread_num': obj['thread_num'],
|
||||||
|
'blade_tip_height_tolerance': obj['blade_tip_height_tolerance'],
|
||||||
|
'inscribed_circle_tolerance': obj['inscribed_circle_tolerance'],
|
||||||
|
'thickness_tolerance': obj['thickness_tolerance'],
|
||||||
|
})
|
||||||
|
return blade_basic_param_str
|
||||||
|
|
||||||
|
def _json_cutter_arbor_basic_param(self, obj):
|
||||||
|
cutter_arbor_basic_param_str = (0, '', {
|
||||||
|
'name': obj['name'],
|
||||||
|
'cutting_tool_type': obj['cutting_tool_type'],
|
||||||
|
'height': obj['height'],
|
||||||
|
'width': obj['width'],
|
||||||
|
'total_length': obj['total_length'],
|
||||||
|
'knife_head_height': obj['knife_head_height'],
|
||||||
|
'knife_head_width': obj['knife_head_width'],
|
||||||
|
'knife_head_length': obj['knife_head_length'],
|
||||||
|
'cutter_arbor_diameter': obj['cutter_arbor_diameter'],
|
||||||
|
'main_included_angle': obj['main_included_angle'],
|
||||||
|
'relief_angle': obj['relief_angle'],
|
||||||
|
'cutting_depth': obj['cutting_depth'],
|
||||||
|
'min_machining_aperture': obj['min_machining_aperture'],
|
||||||
|
'install_blade_tip_num': obj['install_blade_tip_num'],
|
||||||
|
'cutting_blade_model': obj['cutting_blade_model'],
|
||||||
|
'is_cooling_hole': obj['is_cooling_hole'],
|
||||||
|
'locating_slot_code': obj['locating_slot_code'],
|
||||||
|
'installing_structure': obj['installing_structure'],
|
||||||
|
'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else
|
||||||
|
self.evn['sf.cutting_tool.standard.library']._get_ids(obj['blade_codes']),
|
||||||
|
'tool_shim': obj['tool_shim'],
|
||||||
|
'cotter_pin': obj['cotter_pin'],
|
||||||
|
'pressing_plate': obj['pressing_plate'],
|
||||||
|
'screw': obj['screw'],
|
||||||
|
'spanner': obj['spanner'],
|
||||||
|
})
|
||||||
|
return cutter_arbor_basic_param_str
|
||||||
|
|
||||||
|
def _json_cutter_head_basic_param(self, obj):
|
||||||
|
cutter_head_basic_param_str = (0, '', {
|
||||||
|
'name': obj['name'],
|
||||||
|
'cutting_tool_type': obj['cutting_tool_type'],
|
||||||
|
'install_blade_tip_num': obj['install_blade_tip_num'],
|
||||||
|
'blade_diameter': obj['blade_diameter'],
|
||||||
|
'cutter_head_diameter': obj['cutter_head_diameter'],
|
||||||
|
'interface_diameter': obj['interface_diameter'],
|
||||||
|
'total_length': obj['total_length'],
|
||||||
|
'blade_length': obj['blade_length'],
|
||||||
|
'cutting_depth': obj['cutting_depth'],
|
||||||
|
'main_included_angle': obj['main_included_angle'],
|
||||||
|
'installing_structure': obj['installing_structure'],
|
||||||
|
'blade_ids': [(6, 0, [])] if not obj.get('blade_codes') else
|
||||||
|
self.evn['sf.cutting_tool.standard.library']._get_ids(obj['blade_codes']),
|
||||||
|
'screw': obj['screw'],
|
||||||
|
'spanner': obj['spanner'],
|
||||||
|
'cutting_blade_model': obj['cutting_blade_model'],
|
||||||
|
'is_cooling_hole': obj['is_cooling_hole'],
|
||||||
|
'locating_slot_code': obj['locating_slot_code'],
|
||||||
|
})
|
||||||
|
return cutter_head_basic_param_str
|
||||||
|
|
||||||
|
def _json_knife_handle_basic_param(self, obj):
|
||||||
|
knife_handle_basic_param_str = (0, '', {
|
||||||
|
'name': obj['name'],
|
||||||
|
'cutting_tool_type': obj['cutting_tool_type'],
|
||||||
|
'total_length': obj['total_length'],
|
||||||
|
'flange_shank_length': obj['flange_shank_length'],
|
||||||
|
'handle_external_diameter': obj['handle_external_diameter'],
|
||||||
|
'handle_inside_diameter': obj['handle_inside_diameter'],
|
||||||
|
'min_clamping_diameter': obj['min_clamping_diameter'],
|
||||||
|
'max_clamping_diameter': obj['max_clamping_diameter'],
|
||||||
|
'clamping_mode': obj['clamping_mode'],
|
||||||
|
'max_load_capacity': obj['max_load_capacity'],
|
||||||
|
'taper': obj['taper'],
|
||||||
|
'tool_changing_time': obj['tool_changing_time'],
|
||||||
|
'standard_rotate_speed': obj['standard_rotate_speed'],
|
||||||
|
'max_rotate_speed': obj['max_rotate_speed'],
|
||||||
|
'diameter_slip_accuracy': obj['diameter_slip_accuracy'],
|
||||||
|
'cooling_model': obj['cooling_model'],
|
||||||
|
'is_rough_machining': obj['is_rough_machining'],
|
||||||
|
'is_finish_machining': obj['is_finish_machining'],
|
||||||
|
'is_quick_cutting': obj['is_quick_cutting'],
|
||||||
|
'is_drill_hole': obj['is_drill_hole'],
|
||||||
|
'is_safe_lock': obj['is_safe_lock'],
|
||||||
|
'screw': obj['screw'],
|
||||||
|
'spanner': obj['spanner'],
|
||||||
|
})
|
||||||
|
return knife_handle_basic_param_str
|
||||||
|
|
||||||
|
def _json_chuck_basic_param(self, obj):
|
||||||
|
chuck_basic_param_str = (0, '', {
|
||||||
|
'name': obj['name'],
|
||||||
|
'cutting_tool_type': obj['cutting_tool_type'],
|
||||||
|
'er_size_model': obj['er_size_model'],
|
||||||
|
'min_clamping_diameter': obj['min_clamping_diameter'],
|
||||||
|
'max_clamping_diameter': obj['max_clamping_diameter'],
|
||||||
|
'outer_diameter': obj['outer_diameter'],
|
||||||
|
'inner_diameter': obj['inner_diameter'],
|
||||||
|
'run_out_accuracy': obj['run_out_accuracy'],
|
||||||
|
'total_length': obj['total_length'],
|
||||||
|
'taper': obj['taper'],
|
||||||
|
'run_out_accuracy': obj['run_out_accuracy'],
|
||||||
|
'top_diameter': obj['top_diameter'],
|
||||||
|
'weight': obj['weight'],
|
||||||
|
'clamping_mode': obj['clamping_mode'],
|
||||||
|
'clamping_length': obj['clamping_length'],
|
||||||
|
'clamping_tolerance': obj['clamping_tolerance'],
|
||||||
|
'max_load_capacity': obj['max_load_capacity'],
|
||||||
|
'handle_ids': [(6, 0, [])] if not obj.get(
|
||||||
|
'handle_codes') else self.evn['sf.cutting_tool.standard.library']._get_ids(obj['handle_codes']),
|
||||||
|
'cooling_jacket': obj['cooling_jacket'],
|
||||||
|
})
|
||||||
|
return chuck_basic_param_str
|
||||||
|
|
||||||
|
|
||||||
class CuttingSpeed(models.Model):
|
class CuttingSpeed(models.Model):
|
||||||
_name = 'sf.cutting.speed'
|
_name = 'sf.cutting.speed'
|
||||||
_description = '切削速度Vc'
|
_description = '切削速度Vc'
|
||||||
|
|
||||||
name = fields.Char('名称')
|
|
||||||
product_template_id = fields.Many2one('product.template')
|
product_template_id = fields.Many2one('product.template')
|
||||||
standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库')
|
standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库')
|
||||||
|
|
||||||
execution_standard_id = fields.Many2one('sf.international.standards', string='执行标准', store=True)
|
execution_standard_id = fields.Many2one('sf.international.standards', string='执行标准', store=True)
|
||||||
material_code = fields.Char('材料代号')
|
material_code = fields.Char('材料代号')
|
||||||
material_name_id = fields.Many2one('sf.materials.model', '材料名称',
|
material_id = fields.Many2one('sf.materials.model', '材料名称',
|
||||||
domain="[('standards_id', '=', execution_standard_id)]")
|
domain="[('standards_id', '=', execution_standard_id)]")
|
||||||
|
slope_milling_angle = fields.Integer('坡铣角度(°)')
|
||||||
material_grade = fields.Char('材料牌号')
|
material_grade = fields.Char('材料牌号')
|
||||||
tensile_strength = fields.Char('拉伸强度 (N/mm²)')
|
tensile_strength = fields.Char('拉伸强度 (N/mm²)')
|
||||||
hardness = fields.Integer('硬度(hrc)')
|
hardness = fields.Integer('硬度(HRC)')
|
||||||
ability_feature_library = fields.Many2one('maintenance.equipment.image', '加工方式',
|
cutting_speed_n1 = fields.Char('径向切宽 ae=100%D1 ap=1*D1 切削速度Vc')
|
||||||
domain="[('type', '=', '加工能力')]")
|
cutting_speed_n2 = fields.Char('径向切宽 ae=50%D1 ap=1.5*D1 切削速度Vc')
|
||||||
cutting_width_depth_id = fields.Many2one('sf.cutting.width.depth', '切削宽度和深度')
|
cutting_speed_n3 = fields.Char('径向切宽 ae=25%D1 ap=L1max 切削速度Vc')
|
||||||
process_capability = fields.Selection([('粗加工', '粗加工'), ('精加工', '精加工')], string='粗/精加工')
|
cutting_speed_n4 = fields.Char('径向切宽 ae=15%D1 ap=L1max 切削速度Vc')
|
||||||
cutting_speed = fields.Char('切削速度', required=True)
|
cutting_speed_n5 = fields.Char('径向切宽 ae=5%D1 ap=L1max 切削速度Vc')
|
||||||
cutting_speed_max = fields.Float('最大值')
|
rough_machining = fields.Char('粗加工 Vc(m/min)')
|
||||||
cutting_speed_min = fields.Float('最小值')
|
precision_machining = fields.Char('精加工 Vc(m/min)')
|
||||||
|
|
||||||
application = fields.Selection([('主应用', '主应用'), ('次应用', '次应用')], '主/次应用')
|
application = fields.Selection([('主应用', '主应用'), ('次应用', '次应用')], '主/次应用')
|
||||||
active = fields.Boolean(string='有效', default=True)
|
|
||||||
|
def _json_cutting_speed(self, obj):
|
||||||
|
cutting_speed_str = (0, '', {
|
||||||
|
'execution_standard_id': self.env['sf.international.standards'].search(
|
||||||
|
[('code', '=', obj['execution_standard_code'])]).id,
|
||||||
|
'material_code': obj['material_code'],
|
||||||
|
'material_id': self.env['sf.materials.model'].search([('materials_no', '=', obj['material_name_code'])]).id,
|
||||||
|
'material_grade': obj['material_grade'],
|
||||||
|
'tensile_strength': obj['tensile_strength'],
|
||||||
|
'hardness': obj['hardness'],
|
||||||
|
'cutting_speed_n1': obj['cutting_speed_n1'],
|
||||||
|
'cutting_speed_n2': obj['cutting_speed_n2'],
|
||||||
|
'cutting_speed_n3': obj['cutting_speed_n3'],
|
||||||
|
'cutting_speed_n4': obj['cutting_speed_n4'],
|
||||||
|
'cutting_speed_n5': obj['cutting_speed_n5'],
|
||||||
|
'rough_machining': obj['rough_machining'],
|
||||||
|
'precision_machining': obj['precision_machining'],
|
||||||
|
'application': obj['application'],
|
||||||
|
})
|
||||||
|
return cutting_speed_str
|
||||||
|
|
||||||
|
|
||||||
class FeedPerTooth(models.Model):
|
class FeedPerTooth(models.Model):
|
||||||
_name = 'sf.feed.per.tooth'
|
_name = 'sf.feed.per.tooth'
|
||||||
_description = '每齿走刀量fz'
|
_description = '每齿走刀量fz'
|
||||||
_order = 'blade_diameter,cutting_width_depth_id,materials_type_id'
|
_order = 'machining_method desc, blade_diameter, materials_type_id'
|
||||||
|
|
||||||
name = fields.Char('名称')
|
|
||||||
product_template_id = fields.Many2one('product.template')
|
product_template_id = fields.Many2one('product.template')
|
||||||
standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库')
|
standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', string='标准库')
|
||||||
|
cutting_speed = fields.Char('径向切宽 ae(mm)')
|
||||||
|
machining_method = fields.Selection([('直铣', '直铣'), ('坡铣', '坡铣')], string='加工方式')
|
||||||
|
materials_type_id = fields.Many2one('sf.materials.model', string='材料型号')
|
||||||
blade_diameter = fields.Integer('刃部直径(mm)', readonly=True)
|
blade_diameter = fields.Integer('刃部直径(mm)', readonly=True)
|
||||||
materials_type_id = fields.Many2one('sf.materials.model', string='材料名称', readonly=True)
|
feed_per_tooth = fields.Char('每齿走刀量 (mm/z)')
|
||||||
cutting_width_depth_id = fields.Many2one('sf.cutting.width.depth', '切削宽度和深度', readonly=True)
|
|
||||||
feed_per_tooth = fields.Char('每齿走刀量 (mm/z)', size=20)
|
def _json_feed_per_tooth(self, obj):
|
||||||
active = fields.Boolean(string='有效', default=True)
|
feed_per_tooth_str = (0, '', {
|
||||||
|
'cutting_speed': obj['cutting_speed'],
|
||||||
|
'blade_diameter': obj['blade_diameter'],
|
||||||
|
'feed_per_tooth': obj['feed_per_tooth'],
|
||||||
|
})
|
||||||
|
return feed_per_tooth_str
|
||||||
|
|
||||||
|
def _json_feed_per_tooth_2(self, obj):
|
||||||
|
feed_per_tooth_2_str = (0, '', {
|
||||||
|
'machining_method': obj['machining_method'],
|
||||||
|
'materials_type_id': self.env['sf.materials.model'].search(
|
||||||
|
[('materials_no', '=', obj['materials_type_code'])]).id,
|
||||||
|
'blade_diameter': obj['blade_diameter'],
|
||||||
|
'feed_per_tooth': obj['feed_per_tooth'],
|
||||||
|
})
|
||||||
|
return feed_per_tooth_2_str
|
||||||
|
|
||||||
|
def _json_feed_per_tooth_3(self, obj):
|
||||||
|
feed_per_tooth_3_str = (0, '', {
|
||||||
|
'cutting_speed': obj['cutting_speed'],
|
||||||
|
'feed_per_tooth': obj['feed_per_tooth'],
|
||||||
|
})
|
||||||
|
return feed_per_tooth_3_str
|
||||||
|
|
||||||
|
def _json_feed_per_tooth_4(self, obj):
|
||||||
|
feed_per_tooth_4_str = (0, '', {
|
||||||
|
'machining_method': obj['machining_method'],
|
||||||
|
'materials_type_id': self.env['sf.materials.model'].search(
|
||||||
|
[('materials_no', '=', obj['materials_type_code'])]).id,
|
||||||
|
'feed_per_tooth': obj['feed_per_tooth'],
|
||||||
|
})
|
||||||
|
return feed_per_tooth_4_str
|
||||||
|
|
||||||
# @api.depends('product_template_id')
|
# @api.depends('product_template_id')
|
||||||
# def _compute_product_template_id(self):
|
# def _compute_product_template_id(self):
|
||||||
# if self.product_template_id is not None:
|
# if self.product_template_id is not None:
|
||||||
# self.blade_diameter = self.product_template_id.cutting_tool_blade_diameter
|
# self.blade_diameter = self.product_template_id.cutting_tool_blade_diameter
|
||||||
|
|
||||||
|
|
||||||
class CuttingWidthDepth(models.Model):
|
|
||||||
_name = 'sf.cutting.width.depth'
|
|
||||||
_description = '切削宽度和深度'
|
|
||||||
|
|
||||||
name = fields.Char('名称')
|
|
||||||
|
|
||||||
|
|
||||||
class RampingAngle(models.Model):
|
|
||||||
_name = 'sf.ramping.angle'
|
|
||||||
_description = '坡铣角度'
|
|
||||||
|
|
||||||
standard_library_id = fields.Many2one('sf.cutting_tool.standard.library', '刀具标准库')
|
|
||||||
|
|
||||||
name = fields.Char('坡铣角度')
|
|
||||||
|
|||||||
@@ -65,13 +65,13 @@
|
|||||||
<record id="group_plan_dispatch" model="res.groups">
|
<record id="group_plan_dispatch" model="res.groups">
|
||||||
<field name="name">计划调度岗</field>
|
<field name="name">计划调度岗</field>
|
||||||
<field name="category_id" ref="module_category_plan"/>
|
<field name="category_id" ref="module_category_plan"/>
|
||||||
<!-- <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> -->
|
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="group_plan_director" model="res.groups">
|
<record id="group_plan_director" model="res.groups">
|
||||||
<field name="name">计划总监</field>
|
<field name="name">计划总监</field>
|
||||||
<field name="category_id" ref="module_category_plan"/>
|
<field name="category_id" ref="module_category_plan"/>
|
||||||
<field name="implied_ids" eval="[(4, ref('sf_base.group_plan_dispatch'))]"/>
|
<!-- <field name="implied_ids" eval="[(4, ref('sf_base.group_plan_dispatch'))]"/>-->
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="group_purchase" model="res.groups">
|
<record id="group_purchase" model="res.groups">
|
||||||
|
|||||||
@@ -1,229 +1,54 @@
|
|||||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||||
access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,base.group_user,1,1,1,0
|
access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,base.group_user,1,1,1,1
|
||||||
access_sf_machine_tool_admin,sf_machine_tool_admin,model_sf_machine_tool,base.group_system,1,1,1,0
|
access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,base.group_user,1,1,1,1
|
||||||
access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,base.group_user,1,1,1,0
|
access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,base.group_user,1,1,1,1
|
||||||
access_sf_machine_tool_type_admin,sf_machine_tool_type_admin,model_sf_machine_tool_type,base.group_system,1,1,1,0
|
|
||||||
access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,base.group_user,1,1,1,0
|
|
||||||
access_sf_machine_brand_admin,sf_machine_brand_admin,model_sf_machine_brand,base.group_system,1,1,1,0
|
|
||||||
access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,base.group_user,1,1,1,0
|
|
||||||
access_sf_machine_brand_tags_admin,sf_machine_brand_tags_admin,model_sf_machine_brand_tags,base.group_system,1,1,1,0
|
|
||||||
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,base.group_user,1,1,1,0
|
|
||||||
access_sf_machine_control_system_admin,sf_machine_control_system_admin,model_sf_machine_control_system,base.group_system,1,1,1,0
|
|
||||||
access_sf_production_process_group_sale_director,sf_production_process_group_sale_director,model_sf_production_process,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_production_process_group_sale_salemanager,sf_production_process_group_sale_salemanager,model_sf_production_process,sf_base.group_sale_salemanager,1,0,0,0
|
|
||||||
|
|
||||||
access_sf_production_process,sf_production_process,model_sf_production_process,base.group_user,1,1,1,0
|
|
||||||
access_sf_production_process_admin,sf_production_process_admin,model_sf_production_process,base.group_system,1,1,1,0
|
|
||||||
access_sf_production_materials,sf_production_materials,model_sf_production_materials,base.group_user,1,1,1,0
|
|
||||||
access_sf_production_materials_group_sale_director,sf_production_materials_group_sale_director,model_sf_production_materials,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_production_materials_group_sale_salemanager,sf_production_materials_group_sale_salemanager,model_sf_production_materials,sf_base.group_sale_salemanager,1,0,0,0
|
|
||||||
|
|
||||||
access_sf_production_materials_admin,sf_production_materials_admin,model_sf_production_materials,base.group_system,1,1,1,0
|
|
||||||
access_sf_materials_model,sf_materials_model,model_sf_materials_model,base.group_user,1,1,1,0
|
|
||||||
access_sf_materials_model_admin,sf_materials_model_admin,model_sf_materials_model,base.group_system,1,1,1,0
|
|
||||||
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,0
|
|
||||||
access_sf_supplier_sort_admin,sf_supplier_sort_admin,model_sf_supplier_sort,base.group_system,1,1,1,0
|
|
||||||
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,0
|
|
||||||
access_sf_production_process_parameter_group_sale_director,sf_production_process_parameter_group_sale_director,model_sf_production_process_parameter,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_production_process_parameter_group_sale_salemanager,sf_production_process_parameter_group_sale_salemanager,model_sf_production_process_parameter,sf_base.group_sale_salemanager,1,0,0,0
|
|
||||||
|
|
||||||
|
|
||||||
access_sf_production_process_parameter_group_plan_director,sf_production_process_parameter_group_plan_director,model_sf_production_process_parameter,sf_base.group_plan_director,1,0,0,0
|
|
||||||
access_sf_production_process_parameter_group_purchase_director,sf_production_process_parameter_group_purchase_director,model_sf_production_process_parameter,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
access_sf_production_process_parameter_group_sale_director,sf_production_process_parameter_group_sale_director,model_sf_production_process_parameter,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_production_process_parameter_admin,sf_production_process_parameter_admin,model_sf_production_process_parameter,base.group_system,1,1,1,0
|
|
||||||
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,base.group_user,1,1,1,0
|
|
||||||
access_sf_production_process_category_admin,sf_production_process_category_admin,model_sf_production_process_category,base.group_system,1,1,1,0
|
|
||||||
access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,base.group_user,1,1,1,0
|
|
||||||
access_sf_machine_tool_category_admin,sf_machine_tool_category_admin,model_sf_machine_tool_category,base.group_system,1,1,1,0
|
|
||||||
access_sf_cutting_tool_material,sf_cutting_tool_material,model_sf_cutting_tool_material,base.group_user,1,1,1,0
|
|
||||||
access_sf_cutting_tool_material_admin,sf_cutting_tool_material_admin,model_sf_cutting_tool_material,base.group_system,1,1,1,0
|
|
||||||
access_sf_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,base.group_user,1,1,1,0
|
|
||||||
access_sf_cutting_tool_type_admin,sf_cutting_tool_type_admin,model_sf_cutting_tool_type,base.group_system,1,1,1,0
|
|
||||||
access_sf_cutting_tool_type_group_purchase_director,sf_cutting_tool_type_group_purchase_director,model_sf_cutting_tool_type,sf_base.group_purchase_director,1,1,0,0
|
|
||||||
access_sf_cutting_tool_type_group_sale_director,sf_cutting_tool_type_group_sale_director,model_sf_cutting_tool_type,sf_base.group_sale_director,1,1,0,0
|
|
||||||
access_sf_cutting_tool_type_group_plan_director,sf_cutting_tool_type_group_plan_director,model_sf_cutting_tool_type,sf_base.group_plan_director,1,1,0,0
|
|
||||||
access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,base.group_user,1,1,1,0
|
|
||||||
access_sf_functional_cutting_tool_admin,sf_functional_cutting_tool_admin,model_sf_functional_cutting_tool,base.group_system,1,1,1,0
|
|
||||||
access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,base.group_user,1,1,1,0
|
|
||||||
access_sf_functional_cutting_tool_model_admin,sf_functional_cutting_tool_model_admin,model_sf_functional_cutting_tool_model,base.group_system,1,1,1,0
|
|
||||||
access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,base.group_user,1,1,1,0
|
|
||||||
access_sf_fixture_material_admin,sf_fixture_material_admin,model_sf_fixture_material,base.group_system,1,1,1,0
|
|
||||||
access_sf_fixture_materials_basic_parameters,sf_fixture_materials_basic_parameters,model_sf_fixture_materials_basic_parameters,base.group_user,1,1,1,0
|
|
||||||
access_sf_fixture_materials_basic_parameters_admin,sf_fixture_materials_basic_parameters_admin,model_sf_fixture_materials_basic_parameters,base.group_system,1,1,1,0
|
|
||||||
access_sf_multi_mounting_type,sf_multi_mounting_type,model_sf_multi_mounting_type,base.group_user,1,1,1,0
|
|
||||||
access_sf_multi_mounting_type_admin,sf_multi_mounting_type_admin,model_sf_multi_mounting_type,base.group_system,1,1,1,0
|
|
||||||
access_sf_fixture_model,sf_fixture_model,model_sf_fixture_model,base.group_user,1,1,1,0
|
|
||||||
access_sf_fixture_model_admin,sf_fixture_model_admin,model_sf_fixture_model,base.group_system,1,1,1,0
|
|
||||||
access_sf_functional_fixture_type,sf_functional_fixture_type,model_sf_functional_fixture_type,base.group_user,1,1,1,1
|
|
||||||
access_sf_functional_fixture_type_admin,sf_functional_fixture_type_admin,model_sf_functional_fixture_type,base.group_system,1,1,1,0
|
|
||||||
access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,base.group_user,1,1,1,0
|
|
||||||
access_sf_functional_fixture_admin,sf_functional_fixture_admin,model_sf_functional_fixture,base.group_system,1,1,1,0
|
|
||||||
access_sf_sync_common,sf_sync_common,model_sf_sync_common,base.group_user,1,1,1,0
|
|
||||||
access_sf_sync_common,sf_sync_common_admin,model_sf_sync_common,base.group_system,1,1,1,0
|
|
||||||
access_sf_international_standards,sf_international_standards,model_sf_international_standards,base.group_user,1,1,1,0
|
|
||||||
access_sf_international_standards_admin,sf_international_standards_admin,model_sf_international_standards,base.group_system,1,1,1,0
|
|
||||||
access_material_apply,material_apply,model_material_apply,base.group_user,1,1,1,0
|
|
||||||
access_material_apply_admin,material_apply_admin,model_material_apply,base.group_system,1,1,1,0
|
|
||||||
access_material_apply_group_purchase_director,material_apply_group_purchase_director,model_material_apply,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
access_material_apply_group_sale_director,material_apply_group_sale_director,model_material_apply,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_material_apply_group_plan_director,material_apply_group_plan_director,model_material_apply,sf_base.group_plan_director,1,0,0,0
|
|
||||||
access_material_apply_group_purchase_director,material_apply_group_purchase_director,model_material_apply,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
access_material_apply_group_sale_salemanager,material_apply_group_sale_salemanager,model_material_apply,sf_base.group_sale_salemanager,1,0,0,0
|
|
||||||
|
|
||||||
access_sf_cutting_tool_standard_library,sf_cutting_tool_standard_library,model_sf_cutting_tool_standard_library,base.group_user,1,1,1,0
|
|
||||||
access_sf_cutting_tool_standard_library_admin,sf_cutting_tool_standard_library_admin,model_sf_cutting_tool_standard_library,base.group_system,1,1,1,0
|
|
||||||
access_sf_tool_materials_basic_parameters,sf_tool_materials_basic_parameters,model_sf_tool_materials_basic_parameters,base.group_user,1,1,1,0
|
|
||||||
access_sf_tool_materials_basic_parameters_admin,sf_tool_materials_basic_parameters_admin,model_sf_tool_materials_basic_parameters,base.group_system,1,1,1,0
|
|
||||||
access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,1,1,1,0
|
|
||||||
access_sf_cutting_speed_admin,sf_cutting_speed_admin,model_sf_cutting_speed,base.group_system,1,1,1,0
|
|
||||||
access_sf_cutting_speed_group_purchase_director,sf_cutting_speed_group_purchase_director,model_sf_cutting_speed,sf_base.group_purchase_director,1,1,1,0
|
|
||||||
access_sf_cutting_speed_group_sale_director,sf_cutting_speed_group_sale_director,model_sf_cutting_speed,sf_base.group_sale_director,1,1,1,0
|
|
||||||
access_sf_cutting_speed_group_plan_dispatch,sf_cutting_speed_group_plan_dispatch,model_sf_cutting_speed,sf_base.group_plan_dispatch,1,0,0,0
|
|
||||||
access_sf_cutting_speed_group_plan_director,sf_cutting_speed_group_plan_director,model_sf_cutting_speed,sf_base.group_plan_director,1,1,1,0
|
|
||||||
access_sf_cutting_speed_group_quality_director,sf_cutting_speed_group_quality_director,model_sf_cutting_speed,sf_base.group_quality_director,1,1,1,0
|
|
||||||
access_sf_cutting_speed_group_quality,sf_cutting_speed_group_quality,model_sf_cutting_speed,sf_base.group_quality,1,1,1,0
|
|
||||||
access_sf_feed_per_tooth_group_purchase_director,sf_feed_per_tooth_group_purchase_director,model_sf_feed_per_tooth,sf_base.group_purchase_director,1,1,0,0
|
|
||||||
access_sf_feed_per_tooth_group_sale_director,sf_feed_per_tooth_group_sale_director,model_sf_feed_per_tooth,sf_base.group_sale_director,1,1,0,0
|
|
||||||
access_sf_feed_per_tooth_group_plan_dispatch,sf_feed_per_tooth_group_plan_dispatch,model_sf_feed_per_tooth,sf_base.group_plan_dispatch,1,0,0,0
|
|
||||||
access_sf_feed_per_tooth_group_plan_director,sf_feed_per_tooth_group_plan_director,model_sf_feed_per_tooth,sf_base.group_plan_director,1,1,0,0
|
|
||||||
access_sf_feed_per_tooth_group_sale_salemanager,sf_feed_per_tooth_group_sale_salemanager,model_sf_feed_per_tooth,sf_base.group_sale_salemanager,1,0,0,0
|
|
||||||
access_sf_feed_per_tooth_group_quality,sf_feed_per_tooth_group_quality,model_sf_feed_per_tooth,sf_base.group_quality,1,1,1,0
|
|
||||||
access_sf_feed_per_tooth_group_quality_director,sf_feed_per_tooth_group_quality_director,model_sf_feed_per_tooth,sf_base.group_quality_director,1,1,1,0
|
|
||||||
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,0
|
|
||||||
access_sf_feed_per_tooth_admin,sf_feed_per_tooth_admin,model_sf_feed_per_tooth,base.group_system,1,1,1,0
|
|
||||||
access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,base.group_user,1,1,1,1
|
|
||||||
access_sf_ramping_angle_admin,sf_ramping_angle_admin,model_sf_ramping_angle,base.group_system,1,1,1,1
|
|
||||||
access_sf_cutting_width_depth,sf_cutting_width_depth,model_sf_cutting_width_depth,base.group_user,1,1,1,1
|
|
||||||
access_sf_cutting_width_depth_admin,sf_cutting_width_depth_admin,model_sf_cutting_width_depth,base.group_system,1,1,1,1
|
|
||||||
access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_machine_brand_group_plan_director,sf_machine_brand_group_plan_director,model_sf_machine_brand,sf_base.group_plan_director,1,0,0,0
|
|
||||||
access_sf_machine_brand_group_purchase_director,sf_machine_brand_group_purchase_director,model_sf_machine_brand,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
access_sf_machine_brand_group_sale_director,sf_machine_brand_group_sale_director,model_sf_machine_brand,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,base.group_user,1,1,1,1
|
access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,base.group_user,1,1,1,1
|
||||||
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,base.group_user,1,1,1,1
|
||||||
access_sf_production_process,sf_production_process,model_sf_production_process,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_processing_order,sf_processing_order,model_sf_processing_order,base.group_user,1,1,1,1
|
||||||
access_sf_production_materials,sf_production_materials,model_sf_production_materials,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_production_process,sf_production_process,model_sf_production_process,base.group_user,1,1,1,1
|
||||||
access_sf_production_materials_group_plan_director,sf_production_materials_group_plan_director,model_sf_production_materials,sf_base.group_plan_director,1,1,0,0
|
access_sf_production_materials,sf_production_materials,model_sf_production_materials,base.group_user,1,1,1,1
|
||||||
access_sf_production_materials_group_purchase_director,sf_production_materials_group_purchase_director,model_sf_production_materials,sf_base.group_purchase_director,1,1,0,0
|
access_sf_materials_model,sf_materials_model,model_sf_materials_model,base.group_user,1,1,1,1
|
||||||
access_sf_production_materials_group_sale_director,sf_production_materials_group_sale_director,model_sf_production_materials,sf_base.group_sale_director,1,1,0,0
|
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,base.group_user,1,1,1,1
|
||||||
access_sf_materials_model,sf_materials_model,model_sf_materials_model,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,1
|
||||||
access_sf_materials_model_group_sale_salemanager,sf_materials_model_group_sale_salemanager,model_sf_materials_model,sf_base.group_sale_salemanager,1,0,0,0
|
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,1
|
||||||
access_sf_materials_model_group_sale_director,sf_materials_model_group_sale_director,model_sf_materials_model,sf_base.group_sale_director,1,0,0,0
|
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,base.group_user,1,1,1,1
|
||||||
|
access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,base.group_user,1,1,1,1
|
||||||
|
access_sf_cutting_tool_material,sf_cutting_tool_material,model_sf_cutting_tool_material,base.group_user,1,1,1,1
|
||||||
access_sf_materials_model_group_plan_director,sf_materials_model_group_plan_director,model_sf_materials_model,sf_base.group_plan_director,1,0,0,0
|
access_sf_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,base.group_user,1,1,1,1
|
||||||
access_sf_materials_model_group_purchase_director,sf_materials_model_group_purchase_director,model_sf_materials_model,sf_base.group_purchase_director,1,0,0,0
|
access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,base.group_user,1,1,1,1
|
||||||
access_sf_materials_model_group_sale_director,sf_materials_model_group_sale_director,model_sf_materials_model,sf_base.group_sale_director,1,0,0,0
|
access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,base.group_user,1,1,1,1
|
||||||
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,base.group_user,1,1,1,1
|
||||||
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_multi_mounting_type,sf_multi_mounting_type,model_sf_multi_mounting_type,base.group_user,1,1,1,1
|
||||||
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_fixture_model,sf_fixture_model,model_sf_fixture_model,base.group_user,1,1,1,1
|
||||||
access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_functional_fixture_type,sf_functional_fixture_type,model_sf_functional_fixture_type,base.group_user,1,1,1,1
|
||||||
access_sf_cutting_tool_material_group_purchase_director,sf_cutting_tool_material_group_purchase_director,model_sf_cutting_tool_material,sf_base.group_purchase_director,1,0,1,0
|
access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,base.group_user,1,1,1,1
|
||||||
access_sf_cutting_tool_material_group_sale_director,sf_cutting_tool_material_group_sale_director,model_sf_cutting_tool_material,sf_base.group_sale_director,1,0,1,0
|
access_sf_sync_common,sf_sync_common,model_sf_sync_common,base.group_user,1,1,1,1
|
||||||
access_sf_cutting_tool_material_group_plan_director,sf_cutting_tool_material_group_plan_director,model_sf_cutting_tool_material,sf_base.group_plan_director,1,0,1,0
|
access_sf_international_standards,sf_international_standards,model_sf_international_standards,base.group_user,1,1,1,1
|
||||||
access_sf_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,sf_base.group_sf_mrp_user,1,0,0,0
|
access_material_apply,material_apply,model_material_apply,base.group_user,1,1,1,1
|
||||||
access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_cutting_tool_standard_library,sf_cutting_tool_standard_library,model_sf_cutting_tool_standard_library,base.group_user,1,1,1,1
|
||||||
access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_tool_materials_basic_parameters,sf_tool_materials_basic_parameters,model_sf_tool_materials_basic_parameters,base.group_user,1,1,1,1
|
||||||
access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,1,1,1,1
|
||||||
access_sf_fixture_materials_basic_parameters,sf_fixture_materials_basic_parameters,model_sf_fixture_materials_basic_parameters,sf_base.group_sf_mrp_user,1,0,0,0
|
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,1
|
||||||
access_sf_multi_mounting_type,sf_multi_mounting_type,model_sf_multi_mounting_type,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_fixture_model,sf_fixture_model,model_sf_fixture_model,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_functional_fixture_type,sf_functional_fixture_type,model_sf_functional_fixture_type,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_sync_common,sf_sync_common,model_sf_sync_common,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_international_standards,sf_international_standards,model_sf_international_standards,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_material_apply,material_apply,model_material_apply,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_cutting_tool_standard_library_group_sf_mrp_user,sf_cutting_tool_standard_library_group_sf_mrp_user,model_sf_cutting_tool_standard_library,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_cutting_tool_standard_library_group_purchase_director,sf_cutting_tool_standard_library_group_purchase_director,model_sf_cutting_tool_standard_library,sf_base.group_purchase_director,1,0,1,0
|
|
||||||
access_sf_cutting_tool_standard_library_group_plan_director,sf_cutting_tool_standard_library_group_plan_director,model_sf_cutting_tool_standard_library,sf_base.group_plan_director,1,0,1,0
|
|
||||||
access_sf_cutting_tool_standard_library_group_sale_director,sf_cutting_tool_standard_library_group_sale_director,model_sf_cutting_tool_standard_library,sf_base.group_sale_director,1,0,1,0
|
|
||||||
access_sf_tool_groups,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_tool_materials_basic_parameters_group_sale_director,sf_tool_materials_basic_parameters_group_sale_director,model_sf_tool_materials_basic_parameters,sf_base.group_sale_director,1,0,1,0
|
|
||||||
access_sf_tool_materials_basic_parameters_group_plan_director,sf_tool_materials_basic_parameters_group_plan_director,model_sf_tool_materials_basic_parameters,sf_base.group_plan_director,1,0,1,0
|
|
||||||
access_sf_tool_materials_basic_parameters_group_purchase_director,sf_tool_materials_basic_parameters_group_purchase_director,model_sf_tool_materials_basic_parameters,sf_base.group_purchase_director,1,0,1,0
|
|
||||||
access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_cutting_speed_group_purchase,sf_cutting_speed_group_purchase,model_sf_cutting_speed,sf_base.group_purchase,1,0,0,0
|
|
||||||
access_sf_cutting_speed_group_sale_salemanager,sf_cutting_speed_group_sale_salemanager,model_sf_cutting_speed,sf_base.group_sale_salemanager,1,0,0,0
|
|
||||||
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_feed_per_tooth_group_purchase,sf_feed_per_tooth_group_purchase,model_sf_feed_per_tooth,sf_base.group_purchase,1,0,0,0
|
|
||||||
access_sf_ramping_angle,sf_ramping_angle,model_sf_ramping_angle,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_ramping_angle_group_purchase,sf_ramping_angle_group_purchase,model_sf_ramping_angle,sf_base.group_purchase,1,0,0,0
|
|
||||||
access_sf_cutting_width_depth,sf_cutting_width_depth,model_sf_cutting_width_depth,sf_base.group_sf_mrp_user,1,0,0,0
|
|
||||||
access_sf_cutting_width_depth_group_purchase,sf_cutting_width_depth_group_purchase,model_sf_cutting_width_depth,sf_base.group_purchase,1,0,0,0
|
|
||||||
access_maintenance_equipment_image,maintenance_equipment_image,model_maintenance_equipment_image,base.group_user,1,1,1,1
|
access_maintenance_equipment_image,maintenance_equipment_image,model_maintenance_equipment_image,base.group_user,1,1,1,1
|
||||||
access_purchase_order_group_purchase,access_purchase_order_group_purchase,purchase.model_purchase_order,sf_base.group_purchase,1,1,1,0
|
access_purchase_order_group_purchase,access_purchase_order_group_purchase,purchase.model_purchase_order,sf_base.group_purchase,1,1,1,0
|
||||||
|
access_purchase_order_group_purchase_director,access_purchase_order_group_purchase_director,purchase.model_purchase_order,sf_base.group_purchase_director,1,1,1,0
|
||||||
access_purchase_order_line_group_purchase,access_purchase_order_line_group_purchase,purchase.model_purchase_order_line,sf_base.group_purchase,1,1,1,0
|
access_purchase_order_line_group_purchase,access_purchase_order_line_group_purchase,purchase.model_purchase_order_line,sf_base.group_purchase,1,1,1,0
|
||||||
|
access_purchase_order_line_group_purchase_director,access_purchase_order_line_group_purchase_director,purchase.model_purchase_order_line,sf_base.group_purchase_director,1,1,1,0
|
||||||
access_spindle_taper_type,spindle_taper_type,model_spindle_taper_type,base.group_user,1,1,1,1
|
access_spindle_taper_type,spindle_taper_type,model_spindle_taper_type,base.group_user,1,1,1,1
|
||||||
access_sf_tool_groups_group_plan_dispatch,sf_tool_groups,model_sf_tool_groups,sf_base.group_plan_dispatch,1,0,0,0
|
|
||||||
access_sf_tool_groups_group_plan_director,sf_tool_groups,model_sf_tool_groups,sf_base.group_plan_director,1,1,1,0
|
|
||||||
access_sf_tool_groups_group_sf_tool_user,sf_tool_groups,model_sf_tool_groups,sf_base.group_sf_tool_user,1,1,1,1
|
|
||||||
access_purchase_order,purchase.order,purchase.model_purchase_order,sf_base.group_plan_dispatch,1,0,0,0
|
access_purchase_order,purchase.order,purchase.model_purchase_order,sf_base.group_plan_dispatch,1,0,0,0
|
||||||
access_res_partner,res.partner,base.model_res_partner,sf_base.group_plan_dispatch,1,0,0,0
|
access_res_partner,res.partner,base.model_res_partner,sf_base.group_plan_dispatch,1,0,0,0
|
||||||
access_purchase_order_line,purchase.order.line,purchase.model_purchase_order_line,sf_base.group_plan_dispatch,1,0,0,0
|
access_purchase_order_line,purchase.order.line,purchase.model_purchase_order_line,sf_base.group_plan_dispatch,1,0,0,0
|
||||||
access_account_move_line,account.move.line,account.model_account_move_line,sf_base.group_plan_dispatch,1,0,0,0
|
access_account_move_line,account.move.line,account.model_account_move_line,sf_base.group_plan_dispatch,1,0,0,0
|
||||||
|
|
||||||
access_sf_machine_tool_type_group_plan_dispatch,sf.machine_tool.type,model_sf_machine_tool_type,sf_base.group_plan_dispatch,1,0,0,0
|
|
||||||
|
|
||||||
access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_machine_tool_type,sf_machine_tool_type,model_sf_machine_tool_type,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_machine_brand_tags,sf_machine_brand_tags,model_sf_machine_brand_tags,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_production_process,sf_production_process,model_sf_production_process,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_production_materials,sf_production_materials,model_sf_production_materials,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_materials_model,sf_materials_model,model_sf_materials_model,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_production_process_category,sf_production_process_category,model_sf_production_process_category,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_cutting_tool_material,sf_cutting_tool_material,model_sf_cutting_tool_material,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_functional_cutting_tool,sf_functional_cutting_tool,model_sf_functional_cutting_tool,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_functional_cutting_tool_model,sf_functional_cutting_tool_model,model_sf_functional_cutting_tool_model,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_fixture_material,sf_fixture_material,model_sf_fixture_material,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_sf_fixture_materials_basic_parameters,sf_fixture_materials_basic_parameters,model_sf_fixture_materials_basic_parameters,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
access_mrp_production_group_sale_salemanager,mrp_production_group_sale_salemanager,mrp.model_mrp_production,sf_base.group_sale_salemanager,1,0,0,0
|
|
||||||
access_mrp_production_group_sale_director,mrp_production_group_sale_director,mrp.model_mrp_production,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_material_apply_group_plan_dispatch,material_apply,model_material_apply,sf_base.group_plan_dispatch,1,0,0,0
|
|
||||||
access_sf_machine_brand_tags_group_plan_dispatch,sf_machine_brand_tags,model_sf_machine_brand_tags,sf_base.group_plan_dispatch,1,0,0,0
|
|
||||||
access_ir_actions_act_window_group_plan_dispatch,ir.actions.act_window,base.model_ir_actions_act_window,sf_base.group_plan_dispatch,1,0,0,0
|
|
||||||
access_ir_actions_act_window_view_group_plan_dispatch,ir.actions.act_window.view,base.model_ir_actions_act_window_view,sf_base.group_plan_dispatch,1,0,0,0
|
|
||||||
access_sf_supplier_sort_group_plan_dispatch,sf.supplier.sort,model_sf_supplier_sort,sf_base.group_plan_dispatch,1,0,0,0
|
|
||||||
access_sf_international_standards_group_sale_salemanager,sf_international_standards_group_sale_salemanager,model_sf_international_standards,sf_base.group_sale_salemanager,1,0,0,0
|
|
||||||
access_sf_international_standards_group_sale_director,sf_international_standards_group_sale_director,model_sf_international_standards,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_international_standards_group_plan_director,sf_international_standards_group_plan_director,model_sf_international_standards,sf_base.group_plan_director,1,0,0,0
|
|
||||||
access_sf_international_standards_group_purchase,sf_international_standards_group_purchase,model_sf_international_standards,sf_base.group_purchase,1,0,0,0
|
|
||||||
access_sf_international_standards_group_purchase_director,sf_international_standards_group_purchase_director,model_sf_international_standards,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
access_sf_machine_brand_tags_group_sale_salemanager,sf_machine_brand_tags_group_sale_salemanager,model_sf_machine_brand_tags,sf_base.group_sale_salemanager,1,0,0,0
|
|
||||||
access_sf_machine_brand_tags_group_sale_director,sf_machine_brand_tags_group_sale_director,model_sf_machine_brand_tags,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_machine_brand_tags_group_plan_director,sf_machine_brand_tags_group_plan_director,model_sf_machine_brand_tags,sf_base.group_plan_director,1,0,0,0
|
|
||||||
access_sf_machine_brand_tags_group_purchase,sf_machine_brand_tags_group_purchase,model_sf_machine_brand_tags,sf_base.group_purchase,1,0,0,0
|
|
||||||
access_sf_machine_brand_tags_group_purchase_director,sf_machine_brand_tags_group_purchase_director,model_sf_machine_brand_tags,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
|
|
||||||
|
|
||||||
access_printer,printer,model_printer,base.group_user,1,1,1,1
|
|
||||||
access_printer_configuration,printer.configuration,model_printer_configuration,base.group_user,1,1,1,1
|
|
||||||
|
|
||||||
access_group_sf_mrp_user,sf_tool_inventory,model_sf_tool_inventory,base.group_user,1,1,1,0
|
|
||||||
access_group_sf_mrp_user_admin,sf_tool_inventory_admin,model_sf_tool_inventory,base.group_system,1,1,1,0
|
|
||||||
access_group_sf_mrp_user_group_purchase_director,sf_tool_inventory_group_purchase_director,model_sf_tool_inventory,sf_base.group_purchase_director,1,0,1,0
|
|
||||||
access_group_sf_mrp_user_group_sale_director,sf_tool_inventory_group_sale_director,model_sf_tool_inventory,sf_base.group_sale_director,1,0,1,0
|
|
||||||
access_sf_cutting_tool_material_group_plan_director,sf_tool_inventory_group_plan_director,model_sf_tool_inventory,sf_base.group_plan_director,1,0,1,0
|
|
||||||
access_group_sf_mrp_user_group_sf_mrp_user,sf_tool_inventory_group_sf_mrp_user,model_sf_tool_inventory,sf_base.group_sf_mrp_user,1,1,0,0
|
|
||||||
|
|
||||||
|
|
||||||
access_sf_fixture_material_group_purchase_director,sf_fixture_material_group_purchase_director,model_sf_fixture_material,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
access_sf_multi_mounting_type_group_purchase_director,sf_multi_mounting_type_group_purchase_director,model_sf_multi_mounting_type,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
access_sf_fixture_model_group_purchase_director,sf_fixture_model_group_purchase_director,model_sf_fixture_model,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
access_sf_fixture_materials_basic_parameters_group_purchase_director,sf_fixture_materials_basic_parameters_group_purchase_director,model_sf_fixture_materials_basic_parameters,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
access_sf_machine_tool_type_group_purchase_director,sf_machine_tool_type_group_purchase_director,model_sf_machine_tool_type,sf_base.group_purchase_director,1,0,0,0
|
|
||||||
|
|
||||||
access_sf_fixture_material_group_sale_director,sf_fixture_material_group_sale_director,model_sf_fixture_material,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_multi_mounting_type_group_sale_director,sf_multi_mounting_type_group_sale_director,model_sf_multi_mounting_type,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_fixture_model_group_sale_director,sf_fixture_model_group_sale_director,model_sf_fixture_model,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_fixture_materials_basic_parameters_group_sale_director,sf_fixture_materials_basic_parameters_group_sale_director,model_sf_fixture_materials_basic_parameters,sf_base.group_sale_director,1,0,0,0
|
|
||||||
access_sf_machine_tool_type_group_sale_director,sf_machine_tool_type_group_sale_director,model_sf_machine_tool_type,sf_base.group_sale_director,1,0,0,0
|
|
||||||
|
|
||||||
|
|||||||
|
@@ -189,6 +189,3 @@ td.o_required_modifier {
|
|||||||
flex-direction: row !important;
|
flex-direction: row !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.supplier_ids_set_css thead th[data-name=partner_id]{
|
|
||||||
width: 500px!important;
|
|
||||||
}
|
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
<odoo>
|
|
||||||
<data>
|
|
||||||
|
|
||||||
<record id="view_printer_tree" model="ir.ui.view">
|
|
||||||
<field name="name">printer.tree</field>
|
|
||||||
<field name="model">printer</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<tree string="Printer">
|
|
||||||
<field name="name"/>
|
|
||||||
<field name="ip_address"/>
|
|
||||||
<field name="port"/>
|
|
||||||
<!-- 其他字段... -->
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="view_printer_form" model="ir.ui.view">
|
|
||||||
<field name="name">printer.form</field>
|
|
||||||
<field name="model">printer</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<form string="Printer">
|
|
||||||
<sheet>
|
|
||||||
<group>
|
|
||||||
<field name="name"/>
|
|
||||||
<field name="ip_address"/>
|
|
||||||
<field name="port"/>
|
|
||||||
</group>
|
|
||||||
</sheet>
|
|
||||||
</form>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="view_printer_configuration_tree" model="ir.ui.view">
|
|
||||||
<field name="name">printer.configuration.tree</field>
|
|
||||||
<field name="model">printer.configuration</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<tree string="Printer Configuration">
|
|
||||||
<field name="name"/>
|
|
||||||
<field name="printer_id"/>
|
|
||||||
<field name="model"/>
|
|
||||||
<!-- 其他字段... -->
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record id="view_printer_configuration_form" model="ir.ui.view">
|
|
||||||
<field name="name">printer.configuration.form</field>
|
|
||||||
<field name="model">printer.configuration</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<form string="Printer Configuration">
|
|
||||||
<sheet>
|
|
||||||
<group>
|
|
||||||
<field name="name"/>
|
|
||||||
<field name="printer_id"/>
|
|
||||||
<field name="model"/>
|
|
||||||
<!-- 其他字段... -->
|
|
||||||
</group>
|
|
||||||
</sheet>
|
|
||||||
</form>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- 其他视图... -->
|
|
||||||
|
|
||||||
<record id="action_printer" model="ir.actions.act_window">
|
|
||||||
<field name="name">打印机</field>
|
|
||||||
<field name="res_model">printer</field>
|
|
||||||
<field name="view_mode">tree,form</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- Action to open the printer configuration list -->
|
|
||||||
<record id="action_printer_configuration" model="ir.actions.act_window">
|
|
||||||
<field name="name">打印配置</field>
|
|
||||||
<field name="res_model">printer.configuration</field>
|
|
||||||
<field name="view_mode">tree,form</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!-- Add a menu item for the printer configuration -->
|
|
||||||
<!-- <record id="menu_printer_configuration" model="ir.ui.menu"> -->
|
|
||||||
<!-- <field name="name">打印配置</field> -->
|
|
||||||
<!-- <field name="action" ref="action_printer_configuration"/> -->
|
|
||||||
<!-- <field name="parent_id" ref="base.menu_administration"/> -->
|
|
||||||
<!-- </record> -->
|
|
||||||
|
|
||||||
<!-- <record id="menu_printer" model="ir.ui.menu"> -->
|
|
||||||
<!-- <field name="name">打印机</field> -->
|
|
||||||
<!-- <field name="action" ref="action_printer"/> -->
|
|
||||||
<!-- <field name="parent_id" ref="menu_printer"/> -->
|
|
||||||
<!-- </record> -->
|
|
||||||
|
|
||||||
<menuitem
|
|
||||||
id="printer_main_menu"
|
|
||||||
name="打印配置"
|
|
||||||
sequence="10"
|
|
||||||
parent="base.menu_administration"/>
|
|
||||||
|
|
||||||
<menuitem
|
|
||||||
id="menu_printer"
|
|
||||||
name="打印机"
|
|
||||||
action="action_printer"
|
|
||||||
sequence="1"
|
|
||||||
parent="printer_main_menu"/>
|
|
||||||
|
|
||||||
<menuitem
|
|
||||||
id="menu_printer_configuration"
|
|
||||||
name="打印配置"
|
|
||||||
action="action_printer_configuration"
|
|
||||||
sequence="2"
|
|
||||||
parent="printer_main_menu"/>
|
|
||||||
|
|
||||||
</data>
|
|
||||||
</odoo>
|
|
||||||
@@ -98,7 +98,6 @@
|
|||||||
<field name="name" string="名称"/>
|
<field name="name" string="名称"/>
|
||||||
<field name="machine_tool_category"/>
|
<field name="machine_tool_category"/>
|
||||||
<field name="brand_id"/>
|
<field name="brand_id"/>
|
||||||
<field name="function_type"/>
|
|
||||||
<field name="machine_tool_picture" widget="image"/>
|
<field name="machine_tool_picture" widget="image"/>
|
||||||
<field name="remark"/>
|
<field name="remark"/>
|
||||||
</tree>
|
</tree>
|
||||||
@@ -123,7 +122,6 @@
|
|||||||
domain="[('tag_ids', '=', '机床')]"
|
domain="[('tag_ids', '=', '机床')]"
|
||||||
options="{'no_create': True}"/>
|
options="{'no_create': True}"/>
|
||||||
<field name="machine_tool_category" required="1"/>
|
<field name="machine_tool_category" required="1"/>
|
||||||
<field name="function_type" required="1"/>
|
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="machine_tool_picture" widget="image" nolabel="1"/>
|
<field name="machine_tool_picture" widget="image" nolabel="1"/>
|
||||||
@@ -173,10 +171,6 @@
|
|||||||
<label for="workbench_W" string="宽"/>
|
<label for="workbench_W" string="宽"/>
|
||||||
<field name="workbench_W" class="o_address_zip" required="1"
|
<field name="workbench_W" class="o_address_zip" required="1"
|
||||||
options="{'format': false}"/>
|
options="{'format': false}"/>
|
||||||
<span>&nbsp;</span>
|
|
||||||
<label for="workbench_H" string="高"/>
|
|
||||||
<field name="workbench_H" class="o_address_zip" required="1"
|
|
||||||
options="{'format': false}"/>
|
|
||||||
</div>
|
</div>
|
||||||
<field name="workpiece_load"/>
|
<field name="workpiece_load"/>
|
||||||
<label for="machine_tool_L" string="机床尺寸(mm)"/>
|
<label for="machine_tool_L" string="机床尺寸(mm)"/>
|
||||||
@@ -243,15 +237,15 @@
|
|||||||
attrs="{'invisible': [('number_of_axles', '=', '三轴')]}"
|
attrs="{'invisible': [('number_of_axles', '=', '三轴')]}"
|
||||||
options="{'format': false}"/>
|
options="{'format': false}"/>
|
||||||
<span>&nbsp;</span>
|
<span>&nbsp;</span>
|
||||||
<label for="c_axis" string="c"
|
<label for="b_axis" string="b"
|
||||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"/>
|
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"/>
|
||||||
<field name="c_axis" class="o_address_zip"
|
<field name="b_axis" class="o_address_zip"
|
||||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"
|
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴'])]}"
|
||||||
options="{'format': false}"/>
|
options="{'format': false}"/>
|
||||||
<span>&nbsp;</span>
|
<span>&nbsp;</span>
|
||||||
<label for="b_axis" string="b"
|
<label for="c_axis" string="c"
|
||||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"/>
|
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"/>
|
||||||
<field name="b_axis" class="o_address_zip"
|
<field name="c_axis" class="o_address_zip"
|
||||||
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"
|
attrs="{'invisible': [('number_of_axles', 'in', ['三轴','四轴','五轴'])]}"
|
||||||
options="{'format': false}"/>
|
options="{'format': false}"/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<odoo>
|
|
||||||
<data>
|
|
||||||
<record model="ir.ui.view" id="sf_base_res_partner_kanban_view">
|
|
||||||
<field name="name">sf.base.res.partner.kanban</field>
|
|
||||||
<field name="model">res.partner</field>
|
|
||||||
<field name="inherit_id" ref="base.res_partner_kanban_view"/>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<xpath expr="//kanban//templates//t//div//div//div//ul//li[last()]" position="after">
|
|
||||||
<li t-if="record.vat.raw_value" class="o_text_overflow"><field name="vat"/></li>
|
|
||||||
</xpath>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
</data>
|
|
||||||
</odoo>
|
|
||||||
@@ -1,61 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<data>
|
<data>
|
||||||
<!--表面工艺可选参数-->
|
|
||||||
<record model="ir.ui.view" id="mrs_production_process_parameter_tree">
|
|
||||||
<field name="model">sf.production.process.parameter</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<tree string="表面工艺可选参数" create="0" delete="0">
|
|
||||||
<field name="code"/>
|
|
||||||
<field name="name"/>
|
|
||||||
<field name="gain_way"/>
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="ir.ui.view" id="mrs_production_process_parameter_form">
|
|
||||||
<field name="model">sf.production.process.parameter</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<form string="表面工艺可选参数" create="0" delete="0">
|
|
||||||
<sheet>
|
|
||||||
<div class="oe_title">
|
|
||||||
<h1>
|
|
||||||
<field name="name" required="1" placeholder="名称"/>
|
|
||||||
</h1>
|
|
||||||
</div>
|
|
||||||
<group>
|
|
||||||
<group>
|
|
||||||
<field name="code" readonly="1"/>
|
|
||||||
<field name="process_id" readonly="1"/>
|
|
||||||
<field name="gain_way"/>
|
|
||||||
</group>
|
|
||||||
|
|
||||||
</group>
|
|
||||||
<notebook>
|
|
||||||
<page string="适用材料">
|
|
||||||
<field name="materials_model_ids" readonly="1"></field>
|
|
||||||
</page>
|
|
||||||
</notebook>
|
|
||||||
</sheet>
|
|
||||||
</form>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="ir.ui.view" id="search_mrs_production_process_parameter_view">
|
|
||||||
<field name="name">search.mrs.production.process.parameter</field>
|
|
||||||
<field name="model">sf.production.process.parameter</field>
|
|
||||||
<field name="arch" type="xml">
|
|
||||||
<search>
|
|
||||||
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
|
||||||
<field name="name" string="名称" filter_domain="[('name','ilike',self)]"/>
|
|
||||||
<field name="code" string="编码" filter_domain="[('codeNum','ilike',self)]"/>
|
|
||||||
<searchpanel class="account_root">
|
|
||||||
<field name="process_id" icon="fa-filter"/>
|
|
||||||
</searchpanel>
|
|
||||||
</search>
|
|
||||||
</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<!--加工工艺-->
|
<!--加工工艺-->
|
||||||
<!-- <record model="ir.ui.view" id="sf_processing_technology_form">-->
|
<!-- <record model="ir.ui.view" id="sf_processing_technology_form">-->
|
||||||
<!-- <field name="model">sf.processing.technology</field>-->
|
<!-- <field name="model">sf.processing.technology</field>-->
|
||||||
@@ -75,26 +20,26 @@
|
|||||||
<!-- </form>-->
|
<!-- </form>-->
|
||||||
<!-- </field>-->
|
<!-- </field>-->
|
||||||
<!-- </record>-->
|
<!-- </record>-->
|
||||||
<!-- <record model="ir.ui.view" id="sf_processing_technology_tree">-->
|
<record model="ir.ui.view" id="sf_processing_technology_tree">
|
||||||
<!-- <field name="model">sf.processing.technology</field>-->
|
<field name="model">sf.processing.technology</field>
|
||||||
<!-- <field name="arch" type="xml">-->
|
<field name="arch" type="xml">
|
||||||
<!-- <tree string="加工工艺" create="0" edit="0" delete="1">-->
|
<tree string="加工工艺" create="0" edit="0" delete="1">
|
||||||
<!-- <field name="code"/>-->
|
<field name="code"/>
|
||||||
<!-- <field name="name"/>-->
|
<field name="name"/>
|
||||||
<!-- </tree>-->
|
</tree>
|
||||||
<!-- </field>-->
|
</field>
|
||||||
<!-- </record>-->
|
</record>
|
||||||
<!-- <record model="ir.ui.view" id="search_sf_processing_technology_view">-->
|
<record model="ir.ui.view" id="search_sf_processing_technology_view">
|
||||||
<!-- <field name="name">search.sf.processing.technology.type</field>-->
|
<field name="name">search.sf.processing.technology.type</field>
|
||||||
<!-- <field name="model">sf.processing.technology</field>-->
|
<field name="model">sf.processing.technology</field>
|
||||||
<!-- <field name="arch" type="xml">-->
|
<field name="arch" type="xml">
|
||||||
<!-- <search>-->
|
<search>
|
||||||
<!-- <field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>-->
|
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
|
||||||
<!-- <field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>-->
|
<field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>
|
||||||
<!-- <filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>-->
|
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
||||||
<!-- </search>-->
|
</search>
|
||||||
<!-- </field>-->
|
</field>
|
||||||
<!-- </record>-->
|
</record>
|
||||||
|
|
||||||
<!--表面工艺类别-->
|
<!--表面工艺类别-->
|
||||||
<record model="ir.ui.view" id="sf_production_process_category_form">
|
<record model="ir.ui.view" id="sf_production_process_category_form">
|
||||||
@@ -211,7 +156,19 @@
|
|||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</page>
|
</page>
|
||||||
|
<page string="工序">
|
||||||
|
<field name='processing_order_ids' options="{'no_create':True}" widget="one2many">
|
||||||
|
<tree editable='bottom'>
|
||||||
|
<field name="sequence" widget="handle"/>
|
||||||
|
<field name="processing_technology_ids" widget="many2many_tags">
|
||||||
|
</field>
|
||||||
|
</tree>
|
||||||
|
<form>
|
||||||
|
<field name="processing_technology_ids" widget="many2many">
|
||||||
|
</field>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</page>
|
||||||
</notebook>
|
</notebook>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
@@ -231,9 +188,6 @@
|
|||||||
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
|
<field name="name" string="名称搜索" filter_domain="[('name','ilike',self)]"/>
|
||||||
<field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>
|
<field name="code" string="编码搜索" filter_domain="[('code','ilike',self)]"/>
|
||||||
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
||||||
<searchpanel>
|
|
||||||
<field name="category_id" icon="fa-building" enable_counters="1"/>
|
|
||||||
</searchpanel>
|
|
||||||
</search>
|
</search>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -269,7 +223,7 @@
|
|||||||
</group>
|
</group>
|
||||||
<notebook>
|
<notebook>
|
||||||
<page string="供应商">
|
<page string="供应商">
|
||||||
<field name='supplier_ids' class="supplier_ids_set_css">
|
<field name='supplier_ids'>
|
||||||
<tree editable='bottom'>
|
<tree editable='bottom'>
|
||||||
<field name="sequence" widget="handle" string="序号"/>
|
<field name="sequence" widget="handle" string="序号"/>
|
||||||
<field name="partner_id" string="名称"/>
|
<field name="partner_id" string="名称"/>
|
||||||
@@ -287,7 +241,7 @@
|
|||||||
<record model="ir.ui.view" id="sf_materials_model_tree">
|
<record model="ir.ui.view" id="sf_materials_model_tree">
|
||||||
<field name="model">sf.materials.model</field>
|
<field name="model">sf.materials.model</field>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<tree string="材料型号" delete="0">
|
<tree string="材料型号" delete="0">
|
||||||
<field name="materials_no"/>
|
<field name="materials_no"/>
|
||||||
<field name="materials_code"/>
|
<field name="materials_code"/>
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
@@ -396,12 +350,12 @@
|
|||||||
<field name="res_model">sf.materials.model</field>
|
<field name="res_model">sf.materials.model</field>
|
||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
</record>
|
</record>
|
||||||
<!-- <record id="sf_processing_technology" model="ir.actions.act_window">-->
|
<record id="sf_processing_technology" model="ir.actions.act_window">
|
||||||
<!-- <field name="name">加工工艺</field>-->
|
<field name="name">加工工艺</field>
|
||||||
<!-- <field name="type">ir.actions.act_window</field>-->
|
<field name="type">ir.actions.act_window</field>
|
||||||
<!-- <field name="res_model">sf.processing.technology</field>-->
|
<field name="res_model">sf.processing.technology</field>
|
||||||
<!-- <field name="view_mode">tree</field>-->
|
<field name="view_mode">tree</field>
|
||||||
<!-- </record>-->
|
</record>
|
||||||
|
|
||||||
<record id="sf_production_process_category" model="ir.actions.act_window">
|
<record id="sf_production_process_category" model="ir.actions.act_window">
|
||||||
<field name="name">表面工艺类别</field>
|
<field name="name">表面工艺类别</field>
|
||||||
@@ -409,12 +363,6 @@
|
|||||||
<field name="res_model">sf.production.process.category</field>
|
<field name="res_model">sf.production.process.category</field>
|
||||||
<field name="view_mode">tree,form</field>
|
<field name="view_mode">tree,form</field>
|
||||||
</record>
|
</record>
|
||||||
<record id="mrs_production_process_parameter_action" model="ir.actions.act_window">
|
|
||||||
<field name="name">表面工艺可选参数</field>
|
|
||||||
<field name="type">ir.actions.act_window</field>
|
|
||||||
<field name="res_model">sf.production.process.parameter</field>
|
|
||||||
<field name="view_mode">tree,form</field>
|
|
||||||
</record>
|
|
||||||
|
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
|
|||||||