Merge branch 'develop' of https://e.coding.net/jikimo-hn/jikimo_sfs/jikimo_sf into feature/产品的权限优化
# Conflicts: # sf_dlm_management/views/product_template_management_view.xml # sf_sale/models/quick_easy_order.py # sf_sale/models/sale_order.py # sf_sale/views/purchase_order_view.xml
@@ -36,6 +36,7 @@
|
|||||||
# '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',
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
3
jikimo_frontend/static/src/css/list_border_styles.css
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
.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;
|
||||||
|
}
|
||||||
@@ -79,9 +79,9 @@ td.o_required_modifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.oe_kanban_card.kanban_color_1 {
|
.oe_kanban_card.kanban_color_1 {
|
||||||
background-color: #27FEA9 !important;
|
background-color: #fff !important;
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
color: #fff;
|
color: #777;
|
||||||
}
|
}
|
||||||
|
|
||||||
.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) {
|
||||||
@@ -383,7 +383,9 @@ 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;
|
||||||
@@ -400,4 +402,51 @@ 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
.row_no {
|
.row_no {
|
||||||
width: 3.2% !important;
|
width: 35px !important;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|||||||
14
jikimo_hide_options/__init__.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# -*- 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()
|
||||||
32
jikimo_hide_options/__manifest__.py
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# -*- 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',
|
||||||
|
}
|
||||||
4
jikimo_hide_options/models/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from . import model_access_rights
|
||||||
|
from . import models
|
||||||
|
|
||||||
107
jikimo_hide_options/models/model_access_rights.py
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
# -*- 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;')
|
||||||
|
#
|
||||||
|
# # 其他清理工作...
|
||||||
353
jikimo_hide_options/models/models.py
Normal file
@@ -0,0 +1,353 @@
|
|||||||
|
# -*- 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
|
||||||
2
jikimo_hide_options/security/ir.model.access.csv
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
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
|
||||||
|
9
jikimo_hide_options/security/security.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?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>
|
||||||
BIN
jikimo_hide_options/static/description/assets/icons/check.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
jikimo_hide_options/static/description/assets/icons/chevron.png
Normal file
|
After Width: | Height: | Size: 310 B |
BIN
jikimo_hide_options/static/description/assets/icons/cogs.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 576 B |
|
After Width: | Height: | Size: 733 B |
|
After Width: | Height: | Size: 911 B |
BIN
jikimo_hide_options/static/description/assets/icons/license.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
jikimo_hide_options/static/description/assets/icons/lifebuoy.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 673 B |
|
After Width: | Height: | Size: 878 B |
BIN
jikimo_hide_options/static/description/assets/icons/puzzle.png
Normal file
|
After Width: | Height: | Size: 653 B |
|
After Width: | Height: | Size: 905 B |
|
After Width: | Height: | Size: 839 B |
|
After Width: | Height: | Size: 427 B |
BIN
jikimo_hide_options/static/description/assets/icons/training.png
Normal file
|
After Width: | Height: | Size: 627 B |
BIN
jikimo_hide_options/static/description/assets/icons/update.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
jikimo_hide_options/static/description/assets/icons/user.png
Normal file
|
After Width: | Height: | Size: 988 B |
BIN
jikimo_hide_options/static/description/assets/icons/wrench.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
BIN
jikimo_hide_options/static/description/assets/misc/check-box.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
jikimo_hide_options/static/description/assets/misc/compass.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
jikimo_hide_options/static/description/assets/misc/corporate.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 4.4 KiB |
BIN
jikimo_hide_options/static/description/assets/misc/features.png
Normal file
|
After Width: | Height: | Size: 589 B |
BIN
jikimo_hide_options/static/description/assets/misc/logo.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
jikimo_hide_options/static/description/assets/misc/pictures.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
jikimo_hide_options/static/description/assets/misc/pie-chart.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 967 B |
BIN
jikimo_hide_options/static/description/assets/misc/star.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
jikimo_hide_options/static/description/assets/misc/support.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
jikimo_hide_options/static/description/assets/misc/whatsapp.png
Normal file
|
After Width: | Height: | Size: 5.0 KiB |
BIN
jikimo_hide_options/static/description/assets/modules/1.png
Normal file
|
After Width: | Height: | Size: 228 KiB |
BIN
jikimo_hide_options/static/description/assets/modules/l2.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
jikimo_hide_options/static/description/assets/modules/l3.png
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
jikimo_hide_options/static/description/assets/modules/l4.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
jikimo_hide_options/static/description/assets/modules/l5.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
jikimo_hide_options/static/description/assets/modules/l6.png
Normal file
|
After Width: | Height: | Size: 237 KiB |
|
After Width: | Height: | Size: 138 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 95 KiB |
|
After Width: | Height: | Size: 87 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
After Width: | Height: | Size: 94 KiB |
BIN
jikimo_hide_options/static/description/banner.jpg
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
jikimo_hide_options/static/description/icon.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
596
jikimo_hide_options/static/description/index.html
Normal file
@@ -0,0 +1,596 @@
|
|||||||
|
<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 -->
|
||||||
46
jikimo_hide_options/static/src/js/form_controller.js
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/** @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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
42
jikimo_hide_options/static/src/js/kanban_controller.js
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/** @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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
50
jikimo_hide_options/static/src/js/list_controller.js
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/** @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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
58
jikimo_hide_options/views/model_access_rights_views.xml
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<?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>
|
||||||
@@ -1,2 +1,3 @@
|
|||||||
from . import models
|
from . import models
|
||||||
from . import commons
|
from . import commons
|
||||||
|
from . import controllers
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
'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',
|
||||||
|
|
||||||
],
|
],
|
||||||
'demo': [
|
'demo': [
|
||||||
|
|||||||
@@ -19,3 +19,13 @@ 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
|
||||||
|
|||||||
1
sf_base/controllers/__init__.py
Normal file
@@ -0,0 +1 @@
|
|||||||
|
from . import controllers
|
||||||
40
sf_base/controllers/controllers.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# -*- 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/MaintenanceToolGroups', 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,3 +4,4 @@ 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,7 +92,8 @@ 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('图片')
|
||||||
@@ -357,8 +358,7 @@ class MachineToolType(models.Model):
|
|||||||
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('丝杆')
|
||||||
|
|||||||
252
sf_base/models/basic_parameters_fixture.py
Normal file
@@ -0,0 +1,252 @@
|
|||||||
|
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))
|
||||||
|
|
||||||
|
def _json_zero_chuck_param(self, obj):
|
||||||
|
zero_chuck_param_str = (0, '', {
|
||||||
|
'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,
|
||||||
|
})
|
||||||
|
return zero_chuck_param_str
|
||||||
|
|
||||||
|
def _json_zero_tray_param(self, obj):
|
||||||
|
zero_tray_param_str = (0, '', {
|
||||||
|
'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'],
|
||||||
|
})
|
||||||
|
return zero_tray_param_str
|
||||||
|
|
||||||
|
def _json_pneumatic_fixture_param(self, obj):
|
||||||
|
pneumatic_fixture_param_str = (0, '', {
|
||||||
|
'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'],
|
||||||
|
})
|
||||||
|
return pneumatic_fixture_param_str
|
||||||
|
|
||||||
|
def _json_jaw_vice_fixture_param(self, obj):
|
||||||
|
jaw_vice_fixture_param_str = (0, '', {
|
||||||
|
'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'],
|
||||||
|
})
|
||||||
|
return jaw_vice_fixture_param_str
|
||||||
|
|
||||||
|
def _json_magnet_fixture_param(self, obj):
|
||||||
|
magnet_fixture_param_str = (0, '', {
|
||||||
|
'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'],
|
||||||
|
})
|
||||||
|
return magnet_fixture_param_str
|
||||||
|
|
||||||
|
def _json_adapter_board_fixture_param(self, obj):
|
||||||
|
adapter_board_fixture_param_str = (0, '', {
|
||||||
|
'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'],
|
||||||
|
})
|
||||||
|
return adapter_board_fixture_param_str
|
||||||
|
|
||||||
|
def _json_scroll_chuck_param(self, obj):
|
||||||
|
scroll_chuck_param_str = (0, '', {
|
||||||
|
'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'],
|
||||||
|
})
|
||||||
|
return scroll_chuck_param_str
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
# -*- 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
|
from odoo import fields, models, api
|
||||||
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@@ -59,6 +61,14 @@ 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.constrains('supplier_ids')
|
||||||
|
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'
|
||||||
|
|||||||
@@ -26,66 +26,65 @@ class FixtureModel(models.Model):
|
|||||||
_name = 'sf.fixture.model'
|
_name = 'sf.fixture.model'
|
||||||
_description = "夹具型号"
|
_description = "夹具型号"
|
||||||
|
|
||||||
name = fields.Char(string="名称", size=15)
|
name = fields.Char(string="名称", size=50, required=True)
|
||||||
fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料", )
|
fixture_material_id = fields.Many2one('sf.fixture.material', string="夹具物料", required=True)
|
||||||
fixture_material_type = fields.Char(string="夹具物料类型", related='fixture_material_id.name', store=True)
|
fixture_material_type = fields.Char(string="夹具物料类型", related='fixture_material_id.name')
|
||||||
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型")
|
multi_mounting_type_id = fields.Many2one('sf.multi_mounting.type', string="联装类型", required=True)
|
||||||
brand_id = fields.Many2one('sf.machine.brand', string="品牌", domain="[('tag_ids.name', 'ilike', '夹具')]")
|
brand_id = fields.Many2one('sf.machine.brand', string="品牌")
|
||||||
clamping_way = fields.Char(string="装夹方式")
|
model_file = fields.Binary(string="图片")
|
||||||
port_type = fields.Char(string="接口类型")
|
status = fields.Boolean('状态')
|
||||||
model_file = fields.Binary(string="3D模型图")
|
active = fields.Boolean('有效', default=False)
|
||||||
|
|
||||||
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 _onchange_fixture_material_id(self, fixture_material_id):
|
# def _get_code(self, fixture_model_type_code):
|
||||||
if fixture_material_id:
|
# fixture_model = self.env['sf.fixture.model'].sudo().search(
|
||||||
if fixture_material_id.name == "气动夹具":
|
# [('code', 'ilike', fixture_model_type_code)],
|
||||||
code = self._get_code("JKM-C-JJWL-QDJJ-")
|
# limit=1,
|
||||||
elif fixture_material_id.name == "转接板(锁板)夹具":
|
# order="id desc")
|
||||||
code = self._get_code("JKM-C-JJWL-ZJBJJ-")
|
# if not fixture_model:
|
||||||
elif fixture_material_id.name == "磁吸夹具":
|
# num = "%03d" % 1
|
||||||
code = self._get_code("JKM-C-JJWL-CXJJ-")
|
# else:
|
||||||
elif fixture_material_id.name == "虎钳夹具":
|
# m = int(fixture_model.code[-3:]) + 1
|
||||||
code = self._get_code("JKM-C-JJWL-HQJJ-")
|
# num = "%03d" % m
|
||||||
else:
|
# return "%s%s" % (fixture_model_type_code, num)
|
||||||
code = self._get_code("JKM-C-JJWL-LDKP-")
|
#
|
||||||
return code
|
# def _onchange_fixture_material_id(self, fixture_material_id):
|
||||||
|
# if fixture_material_id:
|
||||||
@api.model_create_multi
|
# if self.fixture_material_id.name == "气动夹具":
|
||||||
def create(self, vals):
|
# code = self._get_code("JKM-C-JJWL-QDJJ-")
|
||||||
obj = super(FixtureModel, self).create(vals)
|
# elif self.fixture_material_id.name == "转接板(锁板)夹具":
|
||||||
if obj.fixture_material_id:
|
# code = self._get_code("JKM-C-JJWL-ZJJJ-")
|
||||||
code = self._onchange_fixture_material_id(obj.fixture_material_id)
|
# elif self.fixture_material_id.name == "磁吸夹具":
|
||||||
obj.code = code
|
# code = self._get_code("JKM-C-JJWL-CXJJ-")
|
||||||
return obj
|
# elif self.fixture_material_id.name == "虎钳夹具":
|
||||||
|
# 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,5 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
import json
|
||||||
|
import requests
|
||||||
from odoo import fields, models, api
|
from odoo import fields, models, api
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
|
from odoo.addons.sf_base.commons.common import Common
|
||||||
|
|
||||||
|
|
||||||
class CuttingToolMaterial(models.Model):
|
class CuttingToolMaterial(models.Model):
|
||||||
@@ -75,6 +79,8 @@ 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', '=', '刀片形状')])
|
||||||
@@ -87,8 +93,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_coolant_library_rel',
|
suitable_coolant_ids = fields.Many2many('maintenance.equipment.image', 'suitable_coolants_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',
|
||||||
@@ -104,21 +110,20 @@ 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(整体式刀具)')
|
||||||
domain=[('cutting_speed', '!=', False)])
|
feed_per_tooth_ids_3 = fields.One2many('sf.feed.per.tooth', 'standard_library_id', '每齿走刀量fz(刀片)')
|
||||||
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', '材料型号')
|
||||||
# 适用夹头型号可以多选
|
# 适用夹头型号可以多选
|
||||||
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(
|
||||||
@@ -138,22 +143,28 @@ 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)
|
||||||
|
|
||||||
@@ -175,7 +186,7 @@ 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='设备')
|
||||||
@@ -233,3 +244,49 @@ 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)
|
||||||
|
|
||||||
|
# ==========机床刀具组接口==========
|
||||||
|
def _register_tool_groups(self, obj):
|
||||||
|
create_url = '/AutoDeviceApi/MaintenanceToolGroups'
|
||||||
|
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 = sf_sync_config['sf_url'] + create_url
|
||||||
|
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)
|
||||||
|
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
|
||||||
|
|||||||
10
sf_base/models/tool_base_new.py.rej
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
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,6 +6,7 @@ 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)
|
||||||
@@ -13,8 +14,8 @@ class ToolMaterialsBasicParameters(models.Model):
|
|||||||
# 整体式刀具参数
|
# 整体式刀具参数
|
||||||
total_length = fields.Float('总长度(mm)')
|
total_length = fields.Float('总长度(mm)')
|
||||||
blade_number = fields.Selection(
|
blade_number = fields.Selection(
|
||||||
[('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')],
|
[('0', '0'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8')],
|
||||||
string='刃数(个)')
|
string='刃数(个)', default='0')
|
||||||
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)')
|
||||||
@@ -40,19 +41,19 @@ class ToolMaterialsBasicParameters(models.Model):
|
|||||||
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([('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'),
|
blade_blade_number = fields.Selection(
|
||||||
('7', '7'), ('8', '8'), ('9', '9'), ('10', '10')],
|
[('0', '0'), ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ('7', '7'), ('8', '8'),
|
||||||
string='刀片的刃数(个)')
|
('9', '9'), ('10', '10')],
|
||||||
|
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)')
|
||||||
@@ -73,11 +74,8 @@ 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_ids = fields.Many2many(
|
blade_id = fields.Many2one(
|
||||||
'sf.cutting.tool.type',
|
'sf.cutting_tool.standard.library',
|
||||||
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='适配刀片型号' # 使用空列表作为默认值
|
||||||
)
|
)
|
||||||
@@ -90,295 +88,107 @@ 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)
|
||||||
is_rough_machining = fields.Boolean('可粗加工', default=False)
|
taper_shank_model = fields.Char('锥柄型号')
|
||||||
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)', size=20)
|
weight = fields.Float('重量(kg)')
|
||||||
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)
|
||||||
handle_ids = fields.Many2many(
|
active = fields.Boolean(string='有效', default=True)
|
||||||
'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_id = fields.Many2one('sf.materials.model', '材料名称',
|
material_name_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)')
|
||||||
cutting_speed_n1 = fields.Char('径向切宽 ae=100%D1 ap=1*D1 切削速度Vc')
|
ability_feature_library = fields.Many2one('maintenance.equipment.image', '加工方式',
|
||||||
cutting_speed_n2 = fields.Char('径向切宽 ae=50%D1 ap=1.5*D1 切削速度Vc')
|
domain="[('type', '=', '加工能力')]")
|
||||||
cutting_speed_n3 = fields.Char('径向切宽 ae=25%D1 ap=L1max 切削速度Vc')
|
cutting_width_depth_id = fields.Many2one('sf.cutting.width.depth', '切削宽度和深度')
|
||||||
cutting_speed_n4 = fields.Char('径向切宽 ae=15%D1 ap=L1max 切削速度Vc')
|
process_capability = fields.Selection([('粗加工', '粗加工'), ('精加工', '精加工')], string='粗/精加工')
|
||||||
cutting_speed_n5 = fields.Char('径向切宽 ae=5%D1 ap=L1max 切削速度Vc')
|
cutting_speed = fields.Char('切削速度', required=True)
|
||||||
rough_machining = fields.Char('粗加工 Vc(m/min)')
|
cutting_speed_max = fields.Float('最大值')
|
||||||
precision_machining = fields.Char('精加工 Vc(m/min)')
|
cutting_speed_min = fields.Float('最小值')
|
||||||
application = fields.Selection([('主应用', '主应用'), ('次应用', '次应用')], '主/次应用')
|
|
||||||
|
|
||||||
def _json_cutting_speed(self, obj):
|
application = fields.Selection([('主应用', '主应用'), ('次应用', '次应用')], '主/次应用')
|
||||||
cutting_speed_str = (0, '', {
|
active = fields.Boolean(string='有效', default=True)
|
||||||
'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 = 'machining_method desc, blade_diameter, materials_type_id'
|
_order = 'blade_diameter,cutting_width_depth_id,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)
|
||||||
feed_per_tooth = fields.Char('每齿走刀量 (mm/z)')
|
materials_type_id = fields.Many2one('sf.materials.model', string='材料名称', readonly=True)
|
||||||
|
cutting_width_depth_id = fields.Many2one('sf.cutting.width.depth', '切削宽度和深度', readonly=True)
|
||||||
|
feed_per_tooth = fields.Char('每齿走刀量 (mm/z)', size=20)
|
||||||
|
active = fields.Boolean(string='有效', default=True)
|
||||||
|
|
||||||
def _json_feed_per_tooth(self, obj):
|
|
||||||
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('坡铣角度')
|
||||||
|
|||||||
@@ -71,7 +71,7 @@
|
|||||||
<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,34 +1,144 @@
|
|||||||
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,1
|
access_sf_machine_tool,sf_machine_tool,model_sf_machine_tool,base.group_user,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_admin,sf_machine_tool_admin,model_sf_machine_tool,base.group_system,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,sf_machine_tool_type,model_sf_machine_tool_type,base.group_user,1,1,1,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_tool_type_admin,sf_machine_tool_type_admin,model_sf_machine_tool_type,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,1
|
access_sf_machine_brand,sf_machine_brand,model_sf_machine_brand,base.group_user,1,1,1,0
|
||||||
access_sf_processing_order,sf_processing_order,model_sf_processing_order,base.group_user,1,1,1,1
|
access_sf_machine_brand_admin,sf_machine_brand_admin,model_sf_machine_brand,base.group_system,1,1,1,0
|
||||||
access_sf_production_process,sf_production_process,model_sf_production_process,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,0
|
||||||
access_sf_production_materials,sf_production_materials,model_sf_production_materials,base.group_user,1,1,1,1
|
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_materials_model,sf_materials_model,model_sf_materials_model,base.group_user,1,1,1,1
|
access_sf_machine_control_system,sf_machine_control_system,model_sf_machine_control_system,base.group_user,1,1,1,0
|
||||||
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,base.group_user,1,1,1,1
|
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_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,base.group_user,1,1,1,1
|
access_sf_processing_order,sf_processing_order,model_sf_processing_order,base.group_user,1,1,1,0
|
||||||
access_sf_production_process_parameter,sf_production_process_parameter,model_sf_production_process_parameter,base.group_user,1,1,1,1
|
access_sf_processing_order_admin,sf_processing_order_admin,model_sf_processing_order,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,1
|
access_sf_production_process,sf_production_process,model_sf_production_process,base.group_user,1,1,1,0
|
||||||
access_sf_machine_tool_category,sf_machine_tool_category,model_sf_machine_tool_category,base.group_user,1,1,1,1
|
access_sf_production_process_admin,sf_production_process_admin,model_sf_production_process,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,1
|
access_sf_production_materials,sf_production_materials,model_sf_production_materials,base.group_user,1,1,1,0
|
||||||
access_sf_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,base.group_user,1,1,1,1
|
access_sf_production_materials_admin,sf_production_materials_admin,model_sf_production_materials,base.group_system,1,1,1,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,sf_materials_model,model_sf_materials_model,base.group_user,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,1
|
access_sf_materials_model_admin,sf_materials_model_admin,model_sf_materials_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,1
|
access_sf_processing_technology,sf_processing_technology,model_sf_processing_technology,base.group_user,1,1,1,0
|
||||||
access_sf_multi_mounting_type,sf_multi_mounting_type,model_sf_multi_mounting_type,base.group_user,1,1,1,1
|
access_sf_processing_technology_admin,sf_processing_technology_admin,model_sf_processing_technology,base.group_system,1,1,1,0
|
||||||
access_sf_fixture_model,sf_fixture_model,model_sf_fixture_model,base.group_user,1,1,1,1
|
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_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,sf_functional_fixture_type,model_sf_functional_fixture_type,base.group_user,1,1,1,1
|
||||||
access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,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_sync_common,sf_sync_common,model_sf_sync_common,base.group_user,1,1,1,1
|
access_sf_functional_fixture,sf_functional_fixture,model_sf_functional_fixture,base.group_user,1,1,1,0
|
||||||
access_sf_international_standards,sf_international_standards,model_sf_international_standards,base.group_user,1,1,1,1
|
access_sf_functional_fixture_admin,sf_functional_fixture_admin,model_sf_functional_fixture,base.group_system,1,1,1,0
|
||||||
access_material_apply,material_apply,model_material_apply,base.group_user,1,1,1,1
|
access_sf_sync_common,sf_sync_common,model_sf_sync_common,base.group_user,1,1,1,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_sync_common,sf_sync_common_admin,model_sf_sync_common,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,1
|
access_sf_international_standards,sf_international_standards,model_sf_international_standards,base.group_user,1,1,1,0
|
||||||
access_sf_cutting_speed,sf_cutting_speed,model_sf_cutting_speed,base.group_user,1,1,1,1
|
access_sf_international_standards_admin,sf_international_standards_admin,model_sf_international_standards,base.group_system,1,1,1,0
|
||||||
access_sf_feed_per_tooth,sf_feed_per_tooth,model_sf_feed_per_tooth,base.group_user,1,1,1,1
|
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_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_director,sf_cutting_speed_group_plan_director,model_sf_cutting_speed,sf_base.group_plan_director,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_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,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_control_system,sf_machine_control_system,model_sf_machine_control_system,sf_base.group_sf_mrp_user,1,0,0,0
|
||||||
|
access_sf_processing_order,sf_processing_order,model_sf_processing_order,sf_base.group_sf_mrp_user,1,0,0,0
|
||||||
|
access_sf_production_process,sf_production_process,model_sf_production_process,sf_base.group_sf_mrp_user,1,0,0,0
|
||||||
|
access_sf_production_materials,sf_production_materials,model_sf_production_materials,sf_base.group_sf_mrp_user,1,0,0,0
|
||||||
|
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_group_purchase_director,sf_production_materials_group_purchase_director,model_sf_production_materials,sf_base.group_purchase_director,1,1,0,0
|
||||||
|
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_materials_model,sf_materials_model,model_sf_materials_model,sf_base.group_sf_mrp_user,1,0,0,0
|
||||||
|
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_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_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_processing_technology,sf_processing_technology,model_sf_processing_technology,sf_base.group_sf_mrp_user,1,0,0,0
|
||||||
|
access_sf_supplier_sort,sf_supplier_sort,model_sf_supplier_sort,sf_base.group_sf_mrp_user,1,0,0,0
|
||||||
|
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_production_process_category,sf_production_process_category,model_sf_production_process_category,sf_base.group_sf_mrp_user,1,0,0,0
|
||||||
|
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_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_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_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_cutting_tool_type,sf_cutting_tool_type,model_sf_cutting_tool_type,sf_base.group_sf_mrp_user,1,0,0,0
|
||||||
|
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_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_fixture_material,sf_fixture_material,model_sf_fixture_material,sf_base.group_sf_mrp_user,1,0,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,0,0,0
|
||||||
|
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_group_purchase_director,access_purchase_order_group_purchase_director,purchase.model_purchase_order,sf_base.group_purchase_director,1,1,1,0
|
||||||
@@ -36,6 +146,9 @@ access_purchase_order_line_group_purchase,access_purchase_order_line_group_purch
|
|||||||
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_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_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
|
||||||
@@ -44,11 +157,32 @@ access_purchase_order_line,purchase.order.line,purchase.model_purchase_order_lin
|
|||||||
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,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_processing_order,sf_processing_order,model_sf_processing_order,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_processing_technology,sf_processing_technology,model_sf_processing_technology,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
|
||||||
|
|
||||||
|
15
sf_base/views/change_base_view.xml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<?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>
|
||||||
@@ -32,30 +32,6 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- <record id="sf_fixture_material_view_form" model="ir.ui.view">-->
|
|
||||||
<!-- <field name="name">夹具物料</field>-->
|
|
||||||
<!-- <field name="model">sf.fixture.material</field>-->
|
|
||||||
<!-- <field name="arch" type="xml">-->
|
|
||||||
<!-- <form string="夹具物料">-->
|
|
||||||
<!-- <sheet>-->
|
|
||||||
<!-- <group string="基本信息">-->
|
|
||||||
<!-- <group>-->
|
|
||||||
<!-- <field name="code"/>-->
|
|
||||||
<!-- </group>-->
|
|
||||||
<!-- <group>-->
|
|
||||||
<!-- <field name="name"/>-->
|
|
||||||
<!-- </group>-->
|
|
||||||
<!-- </group>-->
|
|
||||||
<!-- <group>-->
|
|
||||||
<!-- <!– <group>–>-->
|
|
||||||
<!-- <field name="remark"/>-->
|
|
||||||
<!-- <!– </group>–>-->
|
|
||||||
<!-- </group>-->
|
|
||||||
<!-- </sheet>-->
|
|
||||||
<!-- </form>-->
|
|
||||||
<!-- </field>-->
|
|
||||||
<!-- </record>-->
|
|
||||||
|
|
||||||
<record id="sf_fixture_material_view_act" model="ir.actions.act_window">
|
<record id="sf_fixture_material_view_act" 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>
|
||||||
@@ -96,28 +72,6 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- <record id="sf_multi_mounting_type_view_form" model="ir.ui.view">-->
|
|
||||||
<!-- <field name="name">联装类型</field>-->
|
|
||||||
<!-- <field name="model">sf.multi_mounting.type</field>-->
|
|
||||||
<!-- <field name="arch" type="xml">-->
|
|
||||||
<!-- <form string="联装类型">-->
|
|
||||||
<!-- <sheet>-->
|
|
||||||
<!-- <group string="基本信息">-->
|
|
||||||
<!-- <group>-->
|
|
||||||
<!-- <field name="code"/>-->
|
|
||||||
<!-- </group>-->
|
|
||||||
<!-- <group>-->
|
|
||||||
<!-- <field name="name"/>-->
|
|
||||||
<!-- </group>-->
|
|
||||||
<!-- </group>-->
|
|
||||||
<!-- <group>-->
|
|
||||||
<!-- <field name="remark"/>-->
|
|
||||||
<!-- </group>-->
|
|
||||||
<!-- </sheet>-->
|
|
||||||
<!-- </form>-->
|
|
||||||
<!-- </field>-->
|
|
||||||
<!-- </record>-->
|
|
||||||
|
|
||||||
<record id="sf_multi_mounting_type_view_act" model="ir.actions.act_window">
|
<record id="sf_multi_mounting_type_view_act" 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>
|
||||||
@@ -151,9 +105,9 @@
|
|||||||
context="{'group_by' : 'multi_mounting_type_id'}"/>
|
context="{'group_by' : 'multi_mounting_type_id'}"/>
|
||||||
</group>
|
</group>
|
||||||
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
<filter name="filter_active" string="已归档" domain="[('active','=',False)]"/>
|
||||||
|
<searchpanel>
|
||||||
<searchpanel class="account_root">
|
|
||||||
<field name="fixture_material_id" icon="fa-filter"/>
|
<field name="fixture_material_id" icon="fa-filter"/>
|
||||||
|
<field name="brand_id" icon="fa-filter"/>
|
||||||
</searchpanel>
|
</searchpanel>
|
||||||
</search>
|
</search>
|
||||||
</field>
|
</field>
|
||||||
@@ -163,12 +117,17 @@
|
|||||||
<field name="name">夹具型号</field>
|
<field name="name">夹具型号</field>
|
||||||
<field name="model">sf.fixture.model</field>
|
<field name="model">sf.fixture.model</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="0">
|
||||||
<field name="code"/>
|
<field name="code"/>
|
||||||
<field name="name" string="名称"/>
|
|
||||||
<field name="brand_id"/>
|
<field name="brand_id"/>
|
||||||
|
<field name="name"/>
|
||||||
<field name="fixture_material_id"/>
|
<field name="fixture_material_id"/>
|
||||||
<field name="multi_mounting_type_id"/>
|
<field name="multi_mounting_type_id"/>
|
||||||
|
<field name="create_uid" string="创建人"/>
|
||||||
|
<field name="create_date" string="创建时间"/>
|
||||||
|
<field name="write_uid" string="更新人"/>
|
||||||
|
<field name="write_date" string="更新时间"/>
|
||||||
|
<field name="active" string="状态" widget="boolean_toggle"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -181,15 +140,19 @@
|
|||||||
<sheet>
|
<sheet>
|
||||||
<div class="oe_title">
|
<div class="oe_title">
|
||||||
<h1>
|
<h1>
|
||||||
<field name="name"/>
|
<field name="name" required="1" placeholder="名称"/>
|
||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<group>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="code" force_save="1" readonly="1"/>
|
<field name="code" readonly="1" force_save="1"/>
|
||||||
<field name="fixture_material_id" options="{'no_create': True}"/>
|
<field name="fixture_material_id" options="{'no_create': True}" required="1"/>
|
||||||
<field name="fixture_material_type" invisible="1"/>
|
<field name="fixture_material_type" invisible="1"/>
|
||||||
<field name="multi_mounting_type_id" options="{'no_create': True}"/>
|
<field name="multi_mounting_type_id" options="{'no_create': True}" required="1"/>
|
||||||
|
<field name="brand_id" required="1"
|
||||||
|
domain="[('tag_ids', '=', '夹具')]"
|
||||||
|
options="{'no_create': True}"/>
|
||||||
|
<field name="active" string="状态" widget="boolean_toggle"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<!-- <field name="upload_model_file" widget="many2many_binary"/>-->
|
<!-- <field name="upload_model_file" widget="many2many_binary"/>-->
|
||||||
@@ -198,67 +161,192 @@
|
|||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<notebook>
|
<notebook>
|
||||||
<page string="参数"
|
<page string="基本参数">
|
||||||
attrs='{"invisible": [("fixture_material_type","not in",("气动夹具","转接板(锁板)夹具","磁吸夹具","虎钳夹具","零点卡盘"))]}'>
|
<field name="zero_chuck_ids"
|
||||||
<group>
|
attrs="{'invisible': [('fixture_material_type', '!=', '零点卡盘')]}">
|
||||||
<group>
|
<tree editable="bottom" class="center" delete="0">
|
||||||
<field name="brand_id" options="{'no_create': True}"/>
|
<field name="name"/>
|
||||||
<label for="length" string="尺寸(mm)"/>
|
<field name="length"/>
|
||||||
<div class="test_model">
|
<field name="width"/>
|
||||||
<label for="length" string="长"/>
|
<field name="height"/>
|
||||||
<field name="length" class="o_address_zip"
|
<field name="diameter"/>
|
||||||
options="{'format': false}"/>
|
<field name="weight"/>
|
||||||
<span>&nbsp;</span>
|
<field name="orientation_dish_diameter"/>
|
||||||
<label for="width" string="宽"/>
|
<field name="clamping_diameter"/>
|
||||||
<field name="width" class="o_address_zip"
|
<field name="clamping_num"/>
|
||||||
options="{'format': false}"/>
|
<field name="chucking_power_max"/>
|
||||||
<span>&nbsp;</span>
|
<field name="repeated_positioning_accuracy"/>
|
||||||
<label for="height" string="高"/>
|
<field name="boolean_transposing_hole"/>
|
||||||
<field name="height" class="o_address_zip"
|
<field name="unlocking_method"/>
|
||||||
options="{'format': false}"/>
|
<field name="boolean_chip_blowing_function"/>
|
||||||
</div>
|
<field name="carrying_capacity_max"/>
|
||||||
<field name="weight"></field>
|
<field name="materials_model_id" options="{'no_create': True}"
|
||||||
<field name="materials_model_id" options="{'no_create': True}"/>
|
placeholder="请选择"/>
|
||||||
<field name="clamping_way"
|
<field name="rigidity"/>
|
||||||
attrs='{"invisible": [("fixture_material_type","not in",("气动夹具","磁吸夹具","虎钳夹具"))]}'/>
|
<field name="machine_tool_type_id" options="{'no_create': True}"
|
||||||
<field name="port_type"
|
placeholder="请选择"/>
|
||||||
attrs='{"invisible": [("fixture_material_type","not in",("气动夹具","磁吸夹具","虎钳夹具"))]}'/>
|
</tree>
|
||||||
<field name="through_hole_size"
|
</field>
|
||||||
attrs='{"invisible": [("fixture_material_type","!=",("转接板(锁板)夹具"))]}'/>
|
<field name="zero_tray_ids"
|
||||||
<field name="screw_size"
|
attrs="{'invisible': [('fixture_material_type', '!=', '零点托盘')]}">
|
||||||
attrs='{"invisible": [("fixture_material_type","!=",("转接板(锁板)夹具"))]}'/>
|
<tree editable="bottom" class="center" delete="0">
|
||||||
<field name="driving_way"
|
<field name="name"/>
|
||||||
attrs='{"invisible": [("fixture_material_type","not in",("虎钳夹具","零点卡盘"))]}'/>
|
<field name="length"/>
|
||||||
<field name="apply_machine_tool_type_ids" widget="many2many_tags"
|
<field name="width"/>
|
||||||
options="{'no_create': True}"
|
<field name="height"/>
|
||||||
attrs='{"invisible": [("fixture_material_type","!=",("零点卡盘"))]}'/>
|
<field name="diameter"/>
|
||||||
</group>
|
<field name="weight"/>
|
||||||
<group>
|
<field name="clamping_diameter"/>
|
||||||
<label for="length" string="夹持工件最大尺寸(mm)"
|
<field name="connector_diameter"/>
|
||||||
attrs='{"invisible": [("fixture_material_type","=",("零点卡盘"))]}'/>
|
<field name="chucking_power_max"/>
|
||||||
<div class="test_model"
|
<field name="repeated_positioning_accuracy"/>
|
||||||
attrs='{"invisible": [("fixture_material_type","=",("零点卡盘"))]}'>
|
<field name="boolean_chip_blowing_function"/>
|
||||||
<label for="clamp_workpiece_length_max" string="长"/>
|
<field name="way_to_install"/>
|
||||||
<field name="clamp_workpiece_length_max" class="o_address_zip"
|
<field name="type_of_drive"/>
|
||||||
options="{'format': false}"
|
<field name="carrying_capacity_max"/>
|
||||||
attrs="{'required': [('fixture_material_type', 'in',('气动夹具','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
<field name="materials_model_id" options="{'no_create': True}"
|
||||||
<span>&nbsp;</span>
|
placeholder="请选择"/>
|
||||||
<label for="clamp_workpiece_width_max" string="宽"/>
|
<field name="rigidity"/>
|
||||||
<field name="clamp_workpiece_width_max" class="o_address_zip"
|
|
||||||
options="{'format': false}"
|
</tree>
|
||||||
attrs="{'required': [('fixture_material_type', 'in',('气动夹具','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
</field>
|
||||||
<span>&nbsp;</span>
|
<field name="pneumatic_fixture_ids"
|
||||||
<label for="clamp_workpiece_height_max" string="高"/>
|
attrs="{'invisible': [('fixture_material_type', '!=', '气动夹具')]}">
|
||||||
<field name="clamp_workpiece_height_max" class="o_address_zip"
|
<tree editable="bottom" class="center" delete="0">
|
||||||
options="{'format': false}"
|
<field name="name"/>
|
||||||
attrs="{'required': [('fixture_material_type', 'in',('气动夹具','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
<field name="length"/>
|
||||||
</div>
|
<field name="width"/>
|
||||||
<field name="clamp_workpiece_diameter_max" string="夹持工件最大直径(mm)"
|
<field name="height"/>
|
||||||
attrs="{'invisible': [('fixture_material_type','=','零点卡盘')],'required': [('fixture_material_type', 'in',('气动夹具','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
<field name="weight"/>
|
||||||
<field name="maximum_carrying_weight"></field>
|
<field name="gripper_length_min"/>
|
||||||
<field name="maximum_clamping_force"></field>
|
<field name="gripper_width_min"/>
|
||||||
</group>
|
<field name="gripper_height_min"/>
|
||||||
</group>
|
<field name="gripper_length_max"/>
|
||||||
|
<field name="gripper_width_max"/>
|
||||||
|
<field name="gripper_height_max"/>
|
||||||
|
<field name="gripper_diameter_min"/>
|
||||||
|
<field name="gripper_diameter_max"/>
|
||||||
|
<field name="chucking_power_max"/>
|
||||||
|
<field name="carrying_capacity_max"/>
|
||||||
|
<field name="rated_air_pressure"/>
|
||||||
|
<field name="materials_model_id" options="{'no_create': True}"
|
||||||
|
placeholder="请选择"/>
|
||||||
|
<field name="rigidity"/>
|
||||||
|
<field name="interface_materials_model_id" options="{'no_create': True}"
|
||||||
|
placeholder="请选择"/>
|
||||||
|
<field name="type_of_drive"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
<field name="jaw_vice_fixture_ids"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', '!=', '虎钳夹具')]}">
|
||||||
|
<tree editable="bottom" class="center" delete="0">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="length"/>
|
||||||
|
<field name="width"/>
|
||||||
|
<field name="height"/>
|
||||||
|
<field name="weight"/>
|
||||||
|
<field name="gripper_length_min"/>
|
||||||
|
<field name="gripper_width_min"/>
|
||||||
|
<field name="gripper_height_min"/>
|
||||||
|
<field name="gripper_length_max"/>
|
||||||
|
<field name="gripper_width_max"/>
|
||||||
|
<field name="gripper_height_max"/>
|
||||||
|
<field name="gripper_diameter_min"/>
|
||||||
|
<field name="gripper_diameter_max"/>
|
||||||
|
<field name="chucking_power_max"/>
|
||||||
|
<field name="carrying_capacity_max"/>
|
||||||
|
<field name="transverse_groove"/>
|
||||||
|
<field name="longitudinal_fitting_groove"/>
|
||||||
|
<field name="materials_model_id" options="{'no_create': True}"
|
||||||
|
placeholder="请选择"/>
|
||||||
|
<field name="rigidity"/>
|
||||||
|
<field name="interface_materials_model_id" options="{'no_create': True}"
|
||||||
|
placeholder="请选择"/>
|
||||||
|
<field name="type_of_drive"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
<field name="magnet_fixture_ids"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', '!=', '磁吸夹具')]}">
|
||||||
|
<tree editable="bottom" class="center" delete="0">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="length"/>
|
||||||
|
<field name="width"/>
|
||||||
|
<field name="height"/>
|
||||||
|
<field name="height_tolerance_value"/>
|
||||||
|
<field name="weight"/>
|
||||||
|
<field name="gripper_length_min"/>
|
||||||
|
<field name="gripper_width_min"/>
|
||||||
|
<field name="gripper_height_min"/>
|
||||||
|
<field name="gripper_length_max"/>
|
||||||
|
<field name="gripper_width_max"/>
|
||||||
|
<field name="gripper_height_max"/>
|
||||||
|
<field name="gripper_diameter_min"/>
|
||||||
|
<field name="gripper_diameter_max"/>
|
||||||
|
<field name="rated_adsorption_force"/>
|
||||||
|
<field name="magnetic_field_height"/>
|
||||||
|
<field name="magnetic_pole_plate_grinding_allowance"/>
|
||||||
|
<field name="carrying_capacity_max"/>
|
||||||
|
<field name="materials_model_id" options="{'no_create': True}"
|
||||||
|
placeholder="请选择"/>
|
||||||
|
<field name="rigidity"/>
|
||||||
|
<field name="interface_materials_model_id" options="{'no_create': True}"
|
||||||
|
placeholder="请选择"/>
|
||||||
|
<field name="type_of_drive"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
<field name="adapter_board_fixture_ids"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', '!=', '转接板(锁板)夹具')]}">
|
||||||
|
<tree editable="bottom" class="center" delete="0">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="length"/>
|
||||||
|
<field name="width"/>
|
||||||
|
<field name="height"/>
|
||||||
|
<field name="weight"/>
|
||||||
|
<field name="gripper_length_min"/>
|
||||||
|
<field name="gripper_width_min"/>
|
||||||
|
<field name="gripper_height_min"/>
|
||||||
|
<field name="gripper_length_max"/>
|
||||||
|
<field name="gripper_width_max"/>
|
||||||
|
<field name="gripper_height_max"/>
|
||||||
|
<field name="gripper_diameter_min"/>
|
||||||
|
<field name="gripper_diameter_max"/>
|
||||||
|
<field name="chucking_power_max"/>
|
||||||
|
<field name="carrying_capacity_max"/>
|
||||||
|
<field name="materials_model_id" options="{'no_create': True}"
|
||||||
|
placeholder="请选择"/>
|
||||||
|
<field name="rigidity"/>
|
||||||
|
<field name="screw_size"/>
|
||||||
|
<field name="via_hole_diameter"/>
|
||||||
|
<field name="type_of_drive"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
<field name="scroll_chuck_ids"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', '!=', '三爪卡盘')]}">
|
||||||
|
<tree editable="bottom" class="center" delete="0">
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="length"/>
|
||||||
|
<field name="width"/>
|
||||||
|
<field name="height"/>
|
||||||
|
<field name="diameter"/>
|
||||||
|
<field name="weight"/>
|
||||||
|
<field name="gripper_length_min"/>
|
||||||
|
<field name="gripper_width_min"/>
|
||||||
|
<field name="gripper_height_min"/>
|
||||||
|
<field name="gripper_length_max"/>
|
||||||
|
<field name="gripper_width_max"/>
|
||||||
|
<field name="gripper_height_max"/>
|
||||||
|
<field name="gripper_diameter_min"/>
|
||||||
|
<field name="gripper_diameter_max"/>
|
||||||
|
<field name="chucking_power_max"/>
|
||||||
|
<field name="carrying_capacity_max"/>
|
||||||
|
<field name="materials_model_id" options="{'no_create': True}"
|
||||||
|
placeholder="请选择"/>
|
||||||
|
<field name="rigidity"/>
|
||||||
|
<field name="mounting_hole_depth"/>
|
||||||
|
<field name="centering_diameter"/>
|
||||||
|
<field name="type_of_drive"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
</page>
|
</page>
|
||||||
</notebook>
|
</notebook>
|
||||||
</sheet>
|
</sheet>
|
||||||
|
|||||||
@@ -46,8 +46,6 @@
|
|||||||
<field name="blade_blade_number"/>
|
<field name="blade_blade_number"/>
|
||||||
<field name="main_included_angle" />
|
<field name="main_included_angle" />
|
||||||
<field name="top_angle" />
|
<field name="top_angle" />
|
||||||
<field name="blade_tip_dip_angle"/>
|
|
||||||
<field name="side_cutting_edge_angle"/>
|
|
||||||
<field name="thread_model"/>
|
<field name="thread_model"/>
|
||||||
<field name="thread_num" />
|
<field name="thread_num" />
|
||||||
<field name="blade_tip_height_tolerance" />
|
<field name="blade_tip_height_tolerance" />
|
||||||
@@ -73,7 +71,7 @@
|
|||||||
<field name="is_cooling_hole" />
|
<field name="is_cooling_hole" />
|
||||||
<field name="locating_slot_code" />
|
<field name="locating_slot_code" />
|
||||||
<field name="installing_structure"/>
|
<field name="installing_structure"/>
|
||||||
<field name="blade_ids"/>
|
<field name="blade_id"/>
|
||||||
<field name="tool_shim" />
|
<field name="tool_shim" />
|
||||||
<field name="cotter_pin" />
|
<field name="cotter_pin" />
|
||||||
<field name="pressing_plate"/>
|
<field name="pressing_plate"/>
|
||||||
|
|||||||
@@ -92,5 +92,12 @@
|
|||||||
action="action_maintenance_equipment_image"
|
action="action_maintenance_equipment_image"
|
||||||
sequence="5"/>
|
sequence="5"/>
|
||||||
|
|
||||||
|
<menuitem
|
||||||
|
id="menu_sf_tool_groups"
|
||||||
|
name="刀具组"
|
||||||
|
parent="menu_sf_cutting_tool"
|
||||||
|
action="sf_tool_groups_view_act"
|
||||||
|
sequence="10"/>
|
||||||
|
|
||||||
</data>
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -149,12 +149,20 @@
|
|||||||
options="{'format': false}"/>
|
options="{'format': false}"/>
|
||||||
<span>(mm)&nbsp;</span>
|
<span>(mm)&nbsp;</span>
|
||||||
</div>
|
</div>
|
||||||
|
<field name="ramping_angle_ids" widget="many2many_tags"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}"/>
|
||||||
<field name="cutter_bar_ids" widget="many2many_tags"
|
<field name="cutter_bar_ids" widget="many2many_tags"
|
||||||
options="{'no_create': True}" search="[]"
|
options="{'no_create': True}" search="[]"
|
||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||||
<field name="cutter_pad_ids" widget="many2many_tags"
|
<field name="cutter_pad_ids" widget="many2many_tags"
|
||||||
options="{'no_create': True}" search="[]"
|
options="{'no_create': True}" search="[]"
|
||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||||
|
<field name="handle_id" placeholder="请选择"
|
||||||
|
options="{'no_create': True}" search="[]"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')]}"/>
|
||||||
|
<field name="chuck_id" placeholder="请选择"
|
||||||
|
options="{'no_create': True}" search="[]"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')]}"/>
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="material_model_id" placeholder="请选择" string="材质"
|
<field name="material_model_id" placeholder="请选择" string="材质"
|
||||||
@@ -195,7 +203,7 @@
|
|||||||
<group string="走刀方向">
|
<group string="走刀方向">
|
||||||
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes"/>
|
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes"/>
|
||||||
</group>
|
</group>
|
||||||
<group string="适合冷却液">
|
<group string="适合冷却方式">
|
||||||
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes"/>
|
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
@@ -221,7 +229,7 @@
|
|||||||
<field name="pitch"/>
|
<field name="pitch"/>
|
||||||
<field name="blade_width"/>
|
<field name="blade_width"/>
|
||||||
<field name="blade_depth"/>
|
<field name="blade_depth"/>
|
||||||
<field name="cutting_depth"/>
|
<field name="cut_depth_max"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
|
|
||||||
@@ -232,24 +240,22 @@
|
|||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<field name="length"/>
|
<field name="length"/>
|
||||||
<field name="thickness"/>
|
<field name="thickness"/>
|
||||||
<field name="width"/>
|
|
||||||
<field name="cutting_blade_length"/>
|
|
||||||
<field name="relief_angle" class="du"/>
|
|
||||||
<field name="blade_tip_circular_arc_radius"/>
|
|
||||||
<field name="inscribed_circle_diameter" class="diameter"/>
|
<field name="inscribed_circle_diameter" class="diameter"/>
|
||||||
<field name="install_aperture_diameter" class="diameter"/>
|
<field name="install_aperture_diameter" class="diameter"/>
|
||||||
<field name="pitch"/>
|
<field name="blade_tip_circular_arc_radius" string="刀尖圆弧半径RE(mm)"/>
|
||||||
|
<field name="cutting_blade_length"/>
|
||||||
|
<field name="relief_angle" class="du"/>
|
||||||
<field name="chip_breaker_groove" placeholder="请选择"/>
|
<field name="chip_breaker_groove" placeholder="请选择"/>
|
||||||
|
<field name="chip_breaker_type_code"/>
|
||||||
<field name="blade_teeth_model" placeholder="请选择"/>
|
<field name="blade_teeth_model" placeholder="请选择"/>
|
||||||
<field name="cutting_depth" string="最大切削深度(mm)"/>
|
<field name="thread_model" placeholder="请选择"/>
|
||||||
|
<field name="pitch"/>
|
||||||
|
<field name="thread_num"/>
|
||||||
|
<field name="cut_depth_max"/>
|
||||||
<field name="blade_blade_number" string="刃数(个)"/>
|
<field name="blade_blade_number" string="刃数(个)"/>
|
||||||
<field name="blade_width" string="刃宽(mm)"/>
|
<field name="blade_width" string="刃宽(mm)"/>
|
||||||
<field name="main_included_angle"/>
|
<field name="main_included_angle"/>
|
||||||
<field name="top_angle"/>
|
<field name="top_angle"/>
|
||||||
<field name="blade_tip_dip_angle"/>
|
|
||||||
<field name="side_cutting_edge_angle"/>
|
|
||||||
<field name="thread_model" placeholder="请选择"/>
|
|
||||||
<field name="thread_num"/>
|
|
||||||
<field name="blade_tip_height_tolerance"/>
|
<field name="blade_tip_height_tolerance"/>
|
||||||
<field name="inscribed_circle_tolerance"/>
|
<field name="inscribed_circle_tolerance"/>
|
||||||
<field name="thickness_tolerance"/>
|
<field name="thickness_tolerance"/>
|
||||||
@@ -260,29 +266,29 @@
|
|||||||
<tree editable="bottom" class="center" delete="1">
|
<tree editable="bottom" class="center" delete="1">
|
||||||
<field name="cutting_tool_type" invisible="1"/>
|
<field name="cutting_tool_type" invisible="1"/>
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<field name="height"/>
|
|
||||||
<field name="width"/>
|
|
||||||
<field name="total_length"/>
|
<field name="total_length"/>
|
||||||
<field name="blade_height"/>
|
<field name="width"/>
|
||||||
<field name="blade_width"/>
|
<field name="height"/>
|
||||||
<field name="blade_length"/>
|
<field name="knife_head_length"/>
|
||||||
|
<field name="knife_head_width"/>
|
||||||
|
<field name="knife_head_height"/>
|
||||||
<field name="blade_diameter" class="diameter"/>
|
<field name="blade_diameter" class="diameter"/>
|
||||||
<field name="cutter_arbor_diameter" class="diameter"/>
|
<field name="cutter_arbor_diameter" class="diameter"/>
|
||||||
<field name="main_included_angle" class="du"/>
|
<field name="main_included_angle" class="du"/>
|
||||||
<field name="relief_angle" class="du"/>
|
<field name="relief_angle" class="du"/>
|
||||||
<field name="cutting_depth" string="最大切削深度(mm)"/>
|
<field name="cutting_blade_length"/>
|
||||||
|
<field name="cut_depth_max"/>
|
||||||
<field name="min_machining_aperture" class="diameter"/>
|
<field name="min_machining_aperture" class="diameter"/>
|
||||||
<field name="install_blade_tip_num"/>
|
<field name="install_blade_tip_num"/>
|
||||||
<field name="cutting_blade_model"/>
|
|
||||||
<field name="is_cooling_hole" />
|
|
||||||
<field name="locating_slot_code"/>
|
|
||||||
<field name="installing_structure"/>
|
<field name="installing_structure"/>
|
||||||
<field name="blade_ids" widget="many2many_tags" placeholder="请选择"/>
|
<field name="blade_id" placeholder="请选择"/>
|
||||||
<field name="tool_shim"/>
|
<field name="tool_shim"/>
|
||||||
<field name="cotter_pin"/>
|
<field name="cotter_pin"/>
|
||||||
<field name="pressing_plate"/>
|
<field name="pressing_plate"/>
|
||||||
<field name="screw"/>
|
<field name="screw"/>
|
||||||
<field name="spanner"/>
|
<field name="spanner"/>
|
||||||
|
<field name="is_cooling_hole"/>
|
||||||
|
<field name="locating_slot_code"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
|
|
||||||
@@ -297,14 +303,14 @@
|
|||||||
<field name="interface_diameter" class="diameter"/>
|
<field name="interface_diameter" class="diameter"/>
|
||||||
<field name="total_length"/>
|
<field name="total_length"/>
|
||||||
<field name="blade_length"/>
|
<field name="blade_length"/>
|
||||||
<field name="cutting_depth" string="最大切削深度(mm)"/>
|
<field name="cutting_blade_length" string="切削刃长度(mm)"/>
|
||||||
|
<field name="cut_depth_max"/>
|
||||||
<field name="main_included_angle" class="du"/>
|
<field name="main_included_angle" class="du"/>
|
||||||
<field name="installing_structure"/>
|
<field name="installing_structure"/>
|
||||||
<field name="blade_ids" widget="many2many_tags" placeholder="请选择"/>
|
<field name="blade_id" placeholder="请选择"/>
|
||||||
<field name="screw"/>
|
<field name="screw"/>
|
||||||
<field name="spanner"/>
|
<field name="spanner"/>
|
||||||
<field name="cutting_blade_model"/>
|
<field name="is_cooling_hole"/>
|
||||||
<field name="is_cooling_hole" />
|
|
||||||
<field name="locating_slot_code"/>
|
<field name="locating_slot_code"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
@@ -314,27 +320,25 @@
|
|||||||
<tree editable="bottom" class="center" delete="1">
|
<tree editable="bottom" class="center" delete="1">
|
||||||
<field name="cutting_tool_type" invisible="1"/>
|
<field name="cutting_tool_type" invisible="1"/>
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
|
<field name="taper_shank_model"/>
|
||||||
<field name="total_length"/>
|
<field name="total_length"/>
|
||||||
|
<field name="shank_length"/>
|
||||||
|
<field name="shank_diameter" class="diameter"/>
|
||||||
<field name="flange_shank_length"/>
|
<field name="flange_shank_length"/>
|
||||||
<field name="handle_external_diameter" class="diameter"/>
|
<field name="flange_diameter"/>
|
||||||
<field name="handle_inside_diameter" class="diameter"/>
|
<field name="diameter_slip_accuracy"/>
|
||||||
|
<field name="dynamic_balance_class"/>
|
||||||
<field name="min_clamping_diameter" class="diameter"/>
|
<field name="min_clamping_diameter" class="diameter"/>
|
||||||
<field name="max_clamping_diameter" class="diameter"/>
|
<field name="max_clamping_diameter" class="diameter"/>
|
||||||
<field name="clamping_mode"/>
|
|
||||||
<field name="max_load_capacity"/>
|
|
||||||
<field name="taper" class="du"/>
|
|
||||||
<field name="tool_changing_time"/>
|
|
||||||
<field name="standard_rotate_speed"/>
|
|
||||||
<field name="max_rotate_speed"/>
|
<field name="max_rotate_speed"/>
|
||||||
<field name="diameter_slip_accuracy"/>
|
<field name="fit_chuck_size"/>
|
||||||
|
<field name="nut"/>
|
||||||
|
<field name="spanner" string="适配锁紧扳手型号"/>
|
||||||
|
<field name="clamping_mode"/>
|
||||||
|
<field name="tool_changing_time"/>
|
||||||
<field name="cooling_model"/>
|
<field name="cooling_model"/>
|
||||||
<field name="is_rough_machining" />
|
<field name="is_quick_cutting"/>
|
||||||
<field name="is_finish_machining" />
|
<field name="is_safe_lock"/>
|
||||||
<field name="is_quick_cutting" />
|
|
||||||
<field name="is_drill_hole" />
|
|
||||||
<field name="is_safe_lock" />
|
|
||||||
<field name="screw"/>
|
|
||||||
<field name="spanner"/>
|
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
<field name="chuck_basic_parameters_ids"
|
<field name="chuck_basic_parameters_ids"
|
||||||
@@ -342,21 +346,17 @@
|
|||||||
<tree editable="bottom" class="center" delete="1">
|
<tree editable="bottom" class="center" delete="1">
|
||||||
<field name="cutting_tool_type" invisible="1"/>
|
<field name="cutting_tool_type" invisible="1"/>
|
||||||
<field name="name"/>
|
<field name="name"/>
|
||||||
<field name="er_size_model"/>
|
<field name="er_size_model" string="尺寸型号"/>
|
||||||
<field name="min_clamping_diameter" class="diameter" required="1"/>
|
<field name="min_clamping_diameter" class="diameter" required="1"/>
|
||||||
<field name="max_clamping_diameter" class="diameter"/>
|
<field name="max_clamping_diameter" class="diameter"/>
|
||||||
|
<field name="total_length"/>
|
||||||
<field name="outer_diameter" class="diameter"/>
|
<field name="outer_diameter" class="diameter"/>
|
||||||
<field name="inner_diameter" class="diameter"/>
|
<field name="inner_diameter" class="diameter"/>
|
||||||
<field name="total_length"/>
|
|
||||||
<field name="taper" class="du"/>
|
<field name="taper" class="du"/>
|
||||||
<field name="run_out_accuracy"/>
|
<field name="run_out_accuracy"/>
|
||||||
<field name="top_diameter" class="diameter"/>
|
<field name="top_diameter" class="diameter"/>
|
||||||
<field name="weight"/>
|
<field name="weight"/>
|
||||||
<field name="clamping_mode"/>
|
|
||||||
<field name="clamping_length"/>
|
|
||||||
<field name="clamping_tolerance"/>
|
|
||||||
<field name="max_load_capacity"/>
|
<field name="max_load_capacity"/>
|
||||||
<field name="handle_ids" widget="many2many_tags" placeholder="请选择"/>
|
|
||||||
<field name="cooling_jacket"/>
|
<field name="cooling_jacket"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
@@ -364,23 +364,20 @@
|
|||||||
<page string="切削速度Vc"
|
<page string="切削速度Vc"
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}">
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}">
|
||||||
<field name="cutting_speed_ids">
|
<field name="cutting_speed_ids">
|
||||||
<tree editable="bottom" class="center" delete="1">
|
<tree editable="bottom" class="center mrs_cutting_speed_tree" delete="1">
|
||||||
<field name="execution_standard_id" placeholder="请选择" required="1"/>
|
<field name="execution_standard_id" placeholder="请选择" required="1"/>
|
||||||
<field name="material_code" readonly="1"/>
|
<field name="material_code" readonly="1"/>
|
||||||
<field name="material_id" placeholder="请选择"
|
<field name="material_name_id" placeholder="请选择"
|
||||||
attrs="{'readonly': [('execution_standard_id', '=', False)], 'required': [('execution_standard_id', '!=', False)]}"/>
|
attrs="{'readonly': [('execution_standard_id', '=', False)],
|
||||||
|
'required': [('execution_standard_id', '!=', False)]}"/>
|
||||||
<field name="material_grade" readonly="1"/>
|
<field name="material_grade" readonly="1"/>
|
||||||
<field name="tensile_strength" readonly="1"/>
|
<field name="tensile_strength" readonly="1"/>
|
||||||
<field name="hardness" readonly="1"/>
|
<field name="hardness" readonly="1"/>
|
||||||
<field name="slope_milling_angle" widget="du"/>
|
|
||||||
<field name="cutting_speed_n1"/>
|
|
||||||
<field name="cutting_speed_n2"/>
|
|
||||||
<field name="cutting_speed_n3"/>
|
|
||||||
<field name="cutting_speed_n4"/>
|
|
||||||
<field name="cutting_speed_n5"/>
|
|
||||||
<field name="rough_machining"/>
|
|
||||||
<field name="precision_machining"/>
|
|
||||||
<field name="application" placeholder="请选择" required="1"/>
|
<field name="application" placeholder="请选择" required="1"/>
|
||||||
|
<field name="ability_feature_library"/>
|
||||||
|
<field name="cutting_width_depth_id"/>
|
||||||
|
<field name="process_capability"/>
|
||||||
|
<field name="cutting_speed"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</page>
|
</page>
|
||||||
@@ -389,33 +386,18 @@
|
|||||||
<field name="feed_per_tooth_ids"
|
<field name="feed_per_tooth_ids"
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具'))]}">
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具'))]}">
|
||||||
<tree editable="bottom" class="center" create="0" delete="0">
|
<tree editable="bottom" class="center" create="0" delete="0">
|
||||||
<field name="cutting_speed"/>
|
<field name="cutting_width_depth_id"/>
|
||||||
<field name="blade_diameter"/>
|
|
||||||
<field name="feed_per_tooth" required="1"/>
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
<field name="feed_per_tooth_ids_2"
|
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具'))]}">
|
|
||||||
<tree editable="bottom" class="center" create="0" delete="0">
|
|
||||||
<field name="machining_method"/>
|
|
||||||
<field name="materials_type_id"/>
|
<field name="materials_type_id"/>
|
||||||
<field name="blade_diameter"/>
|
<field name="blade_diameter"/>
|
||||||
<field name="feed_per_tooth" required="1"/>
|
<field name="feed_per_tooth"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
<field name="feed_per_tooth_ids_3"
|
<field name="feed_per_tooth_ids_3"
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))]}">
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))]}">
|
||||||
<tree editable="bottom" class="center" create="0" delete="0">
|
<tree editable="bottom" class="center" create="0" delete="0">
|
||||||
<field name="cutting_speed"/>
|
<field name="cutting_width_depth_id"/>
|
||||||
<field name="feed_per_tooth" required="1"/>
|
|
||||||
</tree>
|
|
||||||
</field>
|
|
||||||
<field name="feed_per_tooth_ids_4"
|
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))]}">
|
|
||||||
<tree editable="bottom" class="center" create="0" delete="0">
|
|
||||||
<field name="machining_method"/>
|
|
||||||
<field name="materials_type_id"/>
|
<field name="materials_type_id"/>
|
||||||
<field name="feed_per_tooth" required="1"/>
|
<field name="feed_per_tooth"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
</page>
|
</page>
|
||||||
@@ -508,34 +490,53 @@
|
|||||||
<field name="domain">[]</field>
|
<field name="domain">[]</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<!-- ================================================刀具基础参数================================================ -->
|
<!-- ================================================刀具组================================================ -->
|
||||||
<!-- <record id="view_sf_tool_materials_basic_parameters_tree" model="ir.ui.view">-->
|
<record id="sf_tool_groups_tree" model="ir.ui.view">
|
||||||
<!-- <field name="name">sf.tool.materials.basic.parameters.tree</field>-->
|
<field name="name">刀具组</field>
|
||||||
<!-- <field name="model">sf.tool.materials.basic.parameters</field>-->
|
<field name="model">sf.tool.groups</field>
|
||||||
<!-- <field name="arch" type="xml">-->
|
<field name="arch" type="xml">
|
||||||
<!-- <tree string="基础参数" delete="0" create="0">-->
|
<tree editable="bottom">
|
||||||
<!-- <field name="total_length" />-->
|
<field name="name"/>
|
||||||
<!-- <field name="blade_number" />-->
|
<field name="equipment_ids" widget="many2many_tags"/>
|
||||||
<!-- <field name="neck_diameter"/>-->
|
<field name="remark"/>
|
||||||
<!-- <field name="neck_length"/>-->
|
<field name="create_uid" string="创建人"/>
|
||||||
<!-- <field name="handle_diameter" />-->
|
<field name="create_date" string="创建时间"/>
|
||||||
<!-- <field name="handle_length" />-->
|
</tree>
|
||||||
<!-- <field name="blade_tip_diameter"/>-->
|
</field>
|
||||||
<!-- <field name="blade_tip_working_size"/>-->
|
</record>
|
||||||
<!-- <field name="blade_tip_taper" />-->
|
|
||||||
<!-- <field name="blade_diameter" />-->
|
|
||||||
<!-- <field name="blade_length"/>-->
|
|
||||||
<!-- <field name="blade_helix_angle"/>-->
|
|
||||||
<!-- <field name="blade_width" />-->
|
|
||||||
<!-- <field name="blade_width" />-->
|
|
||||||
<!-- <field name="pitch"/>-->
|
|
||||||
<!-- <field name="cutting_depth"/>-->
|
|
||||||
<!-- </tree>-->
|
|
||||||
<!-- </field>-->
|
|
||||||
<!-- </record>-->
|
|
||||||
|
|
||||||
|
|
||||||
|
<record id="sf_tool_groups_view_act" model="ir.actions.act_window">
|
||||||
|
<field name="name">刀具组</field>
|
||||||
|
<field name="type">ir.actions.act_window</field>
|
||||||
|
<field name="res_model">sf.tool.groups</field>
|
||||||
|
<field name="view_mode">tree</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<!-- ================================================刀具基础参数================================================ -->
|
||||||
|
<!-- <record id="view_sf_tool_materials_basic_parameters_tree" model="ir.ui.view">-->
|
||||||
|
<!-- <field name="name">sf.tool.materials.basic.parameters.tree</field>-->
|
||||||
|
<!-- <field name="model">sf.tool.materials.basic.parameters</field>-->
|
||||||
|
<!-- <field name="arch" type="xml">-->
|
||||||
|
<!-- <tree string="基础参数" delete="0" create="0">-->
|
||||||
|
<!-- <field name="total_length" />-->
|
||||||
|
<!-- <field name="blade_number" />-->
|
||||||
|
<!-- <field name="neck_diameter"/>-->
|
||||||
|
<!-- <field name="neck_length"/>-->
|
||||||
|
<!-- <field name="handle_diameter" />-->
|
||||||
|
<!-- <field name="handle_length" />-->
|
||||||
|
<!-- <field name="blade_tip_diameter"/>-->
|
||||||
|
<!-- <field name="blade_tip_working_size"/>-->
|
||||||
|
<!-- <field name="blade_tip_taper" />-->
|
||||||
|
<!-- <field name="blade_diameter" />-->
|
||||||
|
<!-- <field name="blade_length"/>-->
|
||||||
|
<!-- <field name="blade_helix_angle"/>-->
|
||||||
|
<!-- <field name="blade_width" />-->
|
||||||
|
<!-- <field name="blade_width" />-->
|
||||||
|
<!-- <field name="pitch"/>-->
|
||||||
|
<!-- <field name="cutting_depth"/>-->
|
||||||
|
<!-- </tree>-->
|
||||||
|
<!-- </field>-->
|
||||||
|
<!-- </record>-->
|
||||||
|
|
||||||
|
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ class Sf_Bf_Connect(http.Controller):
|
|||||||
aa = request.env['sale.order'].sudo().search([('name', '=', order_id.name)])
|
aa = request.env['sale.order'].sudo().search([('name', '=', order_id.name)])
|
||||||
logging.info('get_bfm_process_or===================================:%s' % order_id.name)
|
logging.info('get_bfm_process_or===================================:%s' % order_id.name)
|
||||||
aa.default_code = kw['order_number']
|
aa.default_code = kw['order_number']
|
||||||
|
if kw.get('logistics_way'):
|
||||||
|
aa.logistics_way = kw['logistics_way']
|
||||||
logging.info('get_bfm_process_order_listaaaaaaaaaaaaaaaaaaaaaaaaaaaa================:%s' % aa.default_code)
|
logging.info('get_bfm_process_order_listaaaaaaaaaaaaaaaaaaaaaaaaaaaa================:%s' % aa.default_code)
|
||||||
for item in bfm_process_order_list:
|
for item in bfm_process_order_list:
|
||||||
product = request.env['product.template'].sudo().product_create(product_id, item, order_id,
|
product = request.env['product.template'].sudo().product_create(product_id, item, order_id,
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ class Http(models.AbstractModel):
|
|||||||
def _auth_method_sf_token(cls):
|
def _auth_method_sf_token(cls):
|
||||||
# 从headers.environ中获取对方传过来的token,timestamp,加密的校验字符串
|
# 从headers.environ中获取对方传过来的token,timestamp,加密的校验字符串
|
||||||
datas = request.httprequest.headers.environ
|
datas = request.httprequest.headers.environ
|
||||||
|
logging.info(datas)
|
||||||
if 'HTTP_TOKEN' in datas:
|
if 'HTTP_TOKEN' in datas:
|
||||||
_logger.info('token:%s' % datas['HTTP_TOKEN'])
|
_logger.info('token:%s' % datas['HTTP_TOKEN'])
|
||||||
# 查询密钥
|
# 查询密钥
|
||||||
@@ -40,6 +41,7 @@ class Http(models.AbstractModel):
|
|||||||
raise AuthenticationError('请求已过期')
|
raise AuthenticationError('请求已过期')
|
||||||
check_str = '%s%s%s' % (datas['HTTP_TOKEN'], post_time, factory_secret.sf_secret_key)
|
check_str = '%s%s%s' % (datas['HTTP_TOKEN'], post_time, factory_secret.sf_secret_key)
|
||||||
check_sf_str = hashlib.sha1(check_str.encode('utf-8')).hexdigest()
|
check_sf_str = hashlib.sha1(check_str.encode('utf-8')).hexdigest()
|
||||||
|
_logger.info('check_str:%s' % check_sf_str)
|
||||||
if check_sf_str != datas['HTTP_CHECKSTR']:
|
if check_sf_str != datas['HTTP_CHECKSTR']:
|
||||||
raise AuthenticationError('数据校验不通过')
|
raise AuthenticationError('数据校验不通过')
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -42,6 +42,25 @@ class JdEclp(models.Model):
|
|||||||
# bill_show = fields.Binary(string='物流面单展示', readonly=True, related='self.bill.datas')
|
# bill_show = fields.Binary(string='物流面单展示', readonly=True, related='self.bill.datas')
|
||||||
bill_show = fields.Binary(string='物流面单展示', readonly=True)
|
bill_show = fields.Binary(string='物流面单展示', readonly=True)
|
||||||
check_out = fields.Char(string='查询是否为出库单', compute='_check_is_out')
|
check_out = fields.Char(string='查询是否为出库单', compute='_check_is_out')
|
||||||
|
# 是否下了快递单
|
||||||
|
is_bill = fields.Boolean(string='是否下了快递单', default=False)
|
||||||
|
# 物流状态
|
||||||
|
logistics_status = fields.Selection([('0', '未下单'), ('1', '已下单'), ('2', '已获取物流面单'), ('3', '已打印物流单')],
|
||||||
|
string='物流状态', default='0', readonly=True)
|
||||||
|
|
||||||
|
logistics_way = fields.Selection([('自提', '自提'), ('到付', '到付'), ('在线支付', '在线支付')], string='物流方式', readonly=True)
|
||||||
|
|
||||||
|
def button_validate(self):
|
||||||
|
"""
|
||||||
|
重写出库方法,获取物流面单
|
||||||
|
"""
|
||||||
|
res = super(JdEclp, self).button_validate()
|
||||||
|
if self.check_out == 'OUT':
|
||||||
|
if self.logistics_way != '自提':
|
||||||
|
if self.logistics_status != '2':
|
||||||
|
raise ValidationError('非自提订单,必须先下物流单,并获取物流面单后才可出库!')
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
@api.depends('name')
|
@api.depends('name')
|
||||||
def _check_is_out(self):
|
def _check_is_out(self):
|
||||||
@@ -68,6 +87,7 @@ class JdEclp(models.Model):
|
|||||||
# if self.receiverName and self.receiverMobile and self.receiverProvinceName and self.receiverCityName and
|
# if self.receiverName and self.receiverMobile and self.receiverProvinceName and self.receiverCityName and
|
||||||
# self.receiverCountyName and self.receiverTownName:
|
# self.receiverCountyName and self.receiverTownName:
|
||||||
sale_order_id = self.env['sale.order'].search([('name', '=', self.origin)])
|
sale_order_id = self.env['sale.order'].search([('name', '=', self.origin)])
|
||||||
|
self.logistics_way = sale_order_id.logistics_way
|
||||||
# stock_picking_type_id = self.enc['stock.picking.type'].search([('picking_type_id', '=', '')])
|
# stock_picking_type_id = self.enc['stock.picking.type'].search([('picking_type_id', '=', '')])
|
||||||
# if sale_order_id.address_of_delivery != False:
|
# if sale_order_id.address_of_delivery != False:
|
||||||
# if not sale_order_id:
|
# if not sale_order_id:
|
||||||
@@ -141,6 +161,8 @@ class JdEclp(models.Model):
|
|||||||
response = requests.post(url2, json=json2, data=None)
|
response = requests.post(url2, json=json2, data=None)
|
||||||
# _logger.info('调用成功2', response.json()['result']['wbNo'])
|
# _logger.info('调用成功2', response.json()['result']['wbNo'])
|
||||||
self.carrier_tracking_ref = response.json()['result']['wbNo']
|
self.carrier_tracking_ref = response.json()['result']['wbNo']
|
||||||
|
self.is_bill = True
|
||||||
|
self.logistics_status = '1'
|
||||||
|
|
||||||
# else:
|
# else:
|
||||||
# raise UserError("选择京东物流才能下单呦")
|
# raise UserError("选择京东物流才能下单呦")
|
||||||
@@ -180,3 +202,4 @@ class JdEclp(models.Model):
|
|||||||
# 'model_name': 'stock.picking',
|
# 'model_name': 'stock.picking',
|
||||||
})
|
})
|
||||||
_logger.info(attachment)
|
_logger.info(attachment)
|
||||||
|
self.logistics_status = '2'
|
||||||
|
|||||||
@@ -9,8 +9,8 @@
|
|||||||
<xpath expr="//page[last()]" position="before">
|
<xpath expr="//page[last()]" position="before">
|
||||||
<page string="token和密钥">
|
<page string="token和密钥">
|
||||||
<group>
|
<group>
|
||||||
<field name="sf_token"/>
|
<field name="sf_token" readonly="1"/>
|
||||||
<field name="sf_secret_key"/>
|
<field name="sf_secret_key" readonly="1"/>
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
</xpath>
|
</xpath>
|
||||||
|
|||||||
@@ -12,16 +12,30 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<!-- <record id="sf_bf_connect_vpicktree" model="ir.ui.view"> -->
|
||||||
|
<!-- <field name="name">sf.bf.connect.vpicktree</field> -->
|
||||||
|
<!-- <field name="model">stock.picking</field> -->
|
||||||
|
<!-- <field name="inherit_id" ref="stock.vpicktree"/> -->
|
||||||
|
<!-- <field name="arch" type="xml"> -->
|
||||||
|
<!-- <field name="state" position="after"> -->
|
||||||
|
<!-- <field name="logistics_status" string="物流状态"/> -->
|
||||||
|
<!-- </field> -->
|
||||||
|
<!-- </field> -->
|
||||||
|
<!-- </record> -->
|
||||||
|
|
||||||
<record id="custom_view_picking_form" model="ir.ui.view">
|
<record id="custom_view_picking_form" model="ir.ui.view">
|
||||||
<field name="name">物流</field>
|
<field name="name">物流</field>
|
||||||
<field name="model">stock.picking</field>
|
<field name="model">stock.picking</field>
|
||||||
<field name="inherit_id" ref="stock.view_picking_form"/>
|
<field name="inherit_id" ref="stock.view_picking_form"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//form//header//button[@name='action_assign']" position="after">
|
<xpath expr="//form//header//button[@name='action_assign']" position="after">
|
||||||
|
<field name="is_bill" invisible="True"/>
|
||||||
|
<field name="logistics_status" invisible="True"/>
|
||||||
|
<field name="logistics_way" invisible="True"/>
|
||||||
<button string="京东物流下单" name="create_order" type="object" confirm="是否确认物流下单" class="btn-primary"
|
<button string="京东物流下单" name="create_order" type="object" confirm="是否确认物流下单" class="btn-primary"
|
||||||
attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
attrs="{'invisible': ['|', '|', '|', ('check_out', '!=', 'OUT'), ('state', '!=', 'assigned'), ('is_bill', '=', True), ('logistics_way', '=', '自提')]}"/>
|
||||||
<button string="获取物流面单" name="get_bill" type="object" confirm="是否获取物流面单" class="btn-primary"
|
<button string="获取物流面单" name="get_bill" type="object" confirm="是否获取物流面单" class="btn-primary"
|
||||||
attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
attrs="{'invisible': ['|', '|', '|', '|', ('check_out', '!=', 'OUT'), ('state', '!=', 'assigned'), ('logistics_status', '=', '2'), ('is_bill', '=', False), ('logistics_way', '=', '自提')]}"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
@@ -31,6 +45,12 @@
|
|||||||
<field name="model">stock.picking</field>
|
<field name="model">stock.picking</field>
|
||||||
<field name="inherit_id" ref="delivery.view_picking_withcarrier_out_form"/>
|
<field name="inherit_id" ref="delivery.view_picking_withcarrier_out_form"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
|
|
||||||
|
<field name="location_id" position="after">
|
||||||
|
<field name="logistics_status" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
||||||
|
<field name="logistics_way" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
||||||
|
</field>
|
||||||
|
|
||||||
<xpath expr="//group//field[@name='carrier_id']" position="after">
|
<xpath expr="//group//field[@name='carrier_id']" position="after">
|
||||||
<!-- <field name="senderNickName" domain="[('self.name', 'like', '%OUT%')]"/> -->
|
<!-- <field name="senderNickName" domain="[('self.name', 'like', '%OUT%')]"/> -->
|
||||||
<field name="senderNickName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
<field name="senderNickName" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
||||||
@@ -48,6 +68,7 @@
|
|||||||
<field name="grossVolume" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
<field name="grossVolume" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
||||||
<field name="pickupBeginTime" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
<field name="pickupBeginTime" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
||||||
<field name="bill_show" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
<field name="bill_show" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
||||||
|
<field name="logistics_status"/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//group//field[@name='group_id']" position="after">
|
<xpath expr="//group//field[@name='group_id']" position="after">
|
||||||
<field name="bill_show" widget="pdf_viewer" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
<field name="bill_show" widget="pdf_viewer" attrs="{'invisible': [('check_out', '!=', 'OUT')]}"/>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<odoo>
|
<odoo>
|
||||||
<data noupdate="1">
|
<data>
|
||||||
<record id="product_category_embryo_sf" model="product.category">
|
<record id="product_category_embryo_sf" model="product.category">
|
||||||
<field name="name">坯料</field>
|
<field name="name">坯料</field>
|
||||||
<field name="type">坯料</field>
|
<field name="type">坯料</field>
|
||||||
@@ -35,10 +35,15 @@
|
|||||||
<field name="type">功能刀具</field>
|
<field name="type">功能刀具</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
<record id="res_partner_bfm" model="res.partner">
|
<!-- <record id="res_partner_bfm" model="res.partner">-->
|
||||||
<field name="name">业务平台</field>
|
<!-- <field name="name">业务平台</field>-->
|
||||||
<!-- <field name="company_id" ref="base.main_company"/>-->
|
<!-- <!– <field name="company_id" ref="base.main_company"/>–>-->
|
||||||
</record>
|
<!-- </record>-->
|
||||||
|
|
||||||
|
<!-- <record id="res_users_bfm" model="res.users">-->
|
||||||
|
<!-- <field name="name">业务平台</field>-->
|
||||||
|
<!-- <field name="partner_id" ref="res_partner_bfm"/>-->
|
||||||
|
<!-- </record>-->
|
||||||
|
|
||||||
<record id="product_functional_tool_sf" model="product.product">
|
<record id="product_functional_tool_sf" model="product.product">
|
||||||
<field name="name">功能刀具</field>
|
<field name="name">功能刀具</field>
|
||||||
|
|||||||
@@ -13,6 +13,18 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="product_template_tree_view_inherit_sf" model="ir.ui.view">
|
||||||
|
<field name="name">product.template.tree.inherit.sf</field>
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="product.product_template_tree_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree position="attributes">
|
||||||
|
<attribute name="delete">False</attribute>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
|
||||||
<record id="view_template_property_form" model="ir.ui.view">
|
<record id="view_template_property_form" model="ir.ui.view">
|
||||||
<field name="name">product.template.stock.property.form.inherit</field>
|
<field name="name">product.template.stock.property.form.inherit</field>
|
||||||
<field name="model">product.template</field>
|
<field name="model">product.template</field>
|
||||||
|
|||||||
35
sf_dlm_management/static/js/changeCss.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
// 因为表格可以拖动设置宽度,所以需要用js设置初始宽度
|
||||||
|
function setBasicParamTableWidth() {
|
||||||
|
|
||||||
|
|
||||||
|
const basicParamDom = $('.fixTableCss')
|
||||||
|
let dom = []
|
||||||
|
try {
|
||||||
|
dom = basicParamDom.find('table').find('thead').children().children()
|
||||||
|
|
||||||
|
} catch {
|
||||||
|
dom = []
|
||||||
|
}
|
||||||
|
if (!dom) return
|
||||||
|
dom.each(function () {
|
||||||
|
if ($(this).hasClass('row_no') >= 0) { // 序号列
|
||||||
|
// 不设置 通过css设置
|
||||||
|
}
|
||||||
|
const text = $(this).text()
|
||||||
|
$(this).find('span').removeClass('text-truncate')
|
||||||
|
if (text.length > 5) {
|
||||||
|
$(this).width('150px')
|
||||||
|
} else if (text.length == 5) {
|
||||||
|
$(this).width('100px')
|
||||||
|
} else if (text.length == 4) {
|
||||||
|
$(this).width('80px')
|
||||||
|
} else if (text.length == 3) {
|
||||||
|
$(this).width('65px')
|
||||||
|
} else if (text.length == 2) {
|
||||||
|
$(this).width('50px')
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
setTimeout(setBasicParamTableWidth, 500)
|
||||||
@@ -7,7 +7,11 @@
|
|||||||
<field name="inherit_id" ref="sf_sale.view_product_template_form_inherit_sf"/>
|
<field name="inherit_id" ref="sf_sale.view_product_template_form_inherit_sf"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<field name="invoice_policy" position="after">
|
<field name="invoice_policy" position="after">
|
||||||
|
<<<<<<< HEAD
|
||||||
<field name='categ_id'/>
|
<field name='categ_id'/>
|
||||||
|
=======
|
||||||
|
<field name='categ_id' attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
<field name='is_bfm' invisible="1"/>
|
<field name='is_bfm' invisible="1"/>
|
||||||
<field name='categ_type' invisible="1"/>
|
<field name='categ_type' invisible="1"/>
|
||||||
<field name="upload_model_file"
|
<field name="upload_model_file"
|
||||||
@@ -18,6 +22,7 @@
|
|||||||
<field name='cutting_tool_type' invisible="1"/>
|
<field name='cutting_tool_type' invisible="1"/>
|
||||||
<field name="fixture_material_type" invisible="1"/>
|
<field name="fixture_material_type" invisible="1"/>
|
||||||
<field name="embryo_model_type_id" string="模型类型"
|
<field name="embryo_model_type_id" string="模型类型"
|
||||||
|
<<<<<<< HEAD
|
||||||
attrs="{'invisible': ['|',('categ_type', '!=', '坯料'),('categ_type', '=', False)]}"/>
|
attrs="{'invisible': ['|',('categ_type', '!=', '坯料'),('categ_type', '=', False)]}"/>
|
||||||
<field name="materials_id" string="材料" placeholder="请选择"
|
<field name="materials_id" string="材料" placeholder="请选择"
|
||||||
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])]}"/>
|
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])]}"/>
|
||||||
@@ -34,14 +39,38 @@
|
|||||||
domain="[('cutting_tool_material_id','=',cutting_tool_material_id)]"/>
|
domain="[('cutting_tool_material_id','=',cutting_tool_material_id)]"/>
|
||||||
<field name="specification_id" placeholder="请选择" options='{"limit": 1}'
|
<field name="specification_id" placeholder="请选择" options='{"limit": 1}'
|
||||||
attrs="{'invisible': [('categ_type', '!=', '刀具')]}"
|
attrs="{'invisible': [('categ_type', '!=', '刀具')]}"
|
||||||
|
=======
|
||||||
|
attrs="{'invisible': ['|',('categ_type', '!=', '坯料'),('categ_type', '=', False)],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="materials_id" string="材料" placeholder="请选择"
|
||||||
|
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="materials_type_id" string="型号" placeholder="请选择"
|
||||||
|
domain="[('materials_id', '=', materials_id)]"
|
||||||
|
attrs="{'invisible': [('categ_type', 'not in', ['成品','坯料', '原材料'])],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="server_product_process_parameters_id" string="表面工艺参数"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
attrs="{'invisible': ['|',('categ_type', '!=', '表面工艺'),('categ_type', '=', False)]}"/>
|
||||||
|
<field name="cutting_tool_material_id"
|
||||||
|
attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}"
|
||||||
|
placeholder="请选择"/>
|
||||||
|
<field name="cutting_tool_model_id" placeholder="请选择"
|
||||||
|
attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}"
|
||||||
|
domain="[('cutting_tool_material_id','=',cutting_tool_material_id)]"/>
|
||||||
|
<field name="specification_id" placeholder="请选择"
|
||||||
|
attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}"
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
domain="[('standard_library_id','=',cutting_tool_model_id)]"/>
|
domain="[('standard_library_id','=',cutting_tool_model_id)]"/>
|
||||||
<field name="fixture_material_id" attrs="{'invisible': [('categ_type', '!=', '夹具')]}"
|
<field name="fixture_material_id" attrs="{'invisible': [('categ_type', '!=', '夹具')]}"
|
||||||
placeholder="请选择"/>
|
placeholder="请选择"/>
|
||||||
<field name="fixture_model_id" string="型号" placeholder="请选择"
|
<field name="fixture_model_id" string="型号" placeholder="请选择"
|
||||||
attrs="{'invisible': [('categ_type', '!=', '夹具')]}"
|
attrs="{'invisible': [('categ_type', '!=', '夹具')],'required': [('categ_type', '=', '夹具')]}"
|
||||||
domain="[('fixture_material_id','=',fixture_material_id)]"/>
|
domain="[('fixture_material_id','=',fixture_material_id)]"/>
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
<field name="specification_fixture_id" string="规格" placeholder="请选择"
|
||||||
|
attrs="{'invisible': [('categ_type', '!=', '夹具')]}"
|
||||||
|
domain="[('fixture_model_id','=',fixture_model_id)]"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
</field>
|
</field>
|
||||||
|
|
||||||
<xpath expr="//label[@for='volume']" position="before">
|
<xpath expr="//label[@for='volume']" position="before">
|
||||||
<label for="length" string="尺寸"
|
<label for="length" string="尺寸"
|
||||||
attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}"/>
|
attrs="{'invisible':[('product_variant_count', '>', 1), ('is_product_variant', '=', False)]}"/>
|
||||||
@@ -85,8 +114,7 @@
|
|||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.ui.view" id="view_product_template_form_inherit_sf">
|
||||||
<record model="ir.ui.view" id="view_product_template_only_form_inherit_sf">
|
|
||||||
<field name="name">product.template.only.form.inherit.sf</field>
|
<field name="name">product.template.only.form.inherit.sf</field>
|
||||||
<field name="model">product.template</field>
|
<field name="model">product.template</field>
|
||||||
<field name="inherit_id" ref="product.product_template_only_form_view"/>
|
<field name="inherit_id" ref="product.product_template_only_form_view"/>
|
||||||
@@ -97,6 +125,7 @@
|
|||||||
<field name="default_code" position="replace">
|
<field name="default_code" position="replace">
|
||||||
<field name='default_code' invisible="1"/>
|
<field name='default_code' invisible="1"/>
|
||||||
</field>
|
</field>
|
||||||
|
<<<<<<< HEAD
|
||||||
<xpath expr="//page[@name='variants']" position="before">
|
<xpath expr="//page[@name='variants']" position="before">
|
||||||
<page string="刀具物料参数" attrs="{'invisible': [('categ_type', '!=', '刀具')]}">
|
<page string="刀具物料参数" attrs="{'invisible': [('categ_type', '!=', '刀具')]}">
|
||||||
<group>
|
<group>
|
||||||
@@ -115,15 +144,51 @@
|
|||||||
<field name="cutting_tool_run_out_accuracy_min" class="o_address_zip"
|
<field name="cutting_tool_run_out_accuracy_min" class="o_address_zip"
|
||||||
options="{'format': false}"
|
options="{'format': false}"
|
||||||
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}"/>
|
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}"/>
|
||||||
|
=======
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="ir.ui.view" id="view_product_template_only_form_inherit_sf">
|
||||||
|
<field name="name">product.template.only.form.inherit.sf</field>
|
||||||
|
<field name="model">product.template</field>
|
||||||
|
<field name="inherit_id" ref="sf_dlm_management.view_sale_product_template_form_inherit_sf"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//page[1]" position="after">
|
||||||
|
<page string="刀具物料参数"
|
||||||
|
attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}">
|
||||||
|
<group>
|
||||||
|
<group attrs="{'invisible': [('categ_type', '!=', '刀具')]}" col="1">
|
||||||
|
<field name="cutting_tool_type_id" options="{'no_create': True}"
|
||||||
|
placeholder="请选择" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="brand_id" options="{'no_create': True}" placeholder="请选择"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_total_length"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','夹头','刀柄'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="tool_hardness" string="硬度(hrc)"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<label for="cutting_tool_run_out_accuracy_min" string="端跳精度"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<div class="o_address_format"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}">
|
||||||
|
<label for="cutting_tool_run_out_accuracy_min" string="最小"/>
|
||||||
|
<field name="cutting_tool_run_out_accuracy_min" class="o_address_zip"
|
||||||
|
options="{'format': false}"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
<span>(mm)&nbsp;</span>
|
<span>(mm)&nbsp;</span>
|
||||||
<label for="cutting_tool_run_out_accuracy_max" string="最大"/>
|
<label for="cutting_tool_run_out_accuracy_max" string="最大"/>
|
||||||
<field name="cutting_tool_run_out_accuracy_max" class="o_address_zip"
|
<field name="cutting_tool_run_out_accuracy_max" class="o_address_zip"
|
||||||
options="{'format': false}"
|
options="{'format': false}"
|
||||||
|
<<<<<<< HEAD
|
||||||
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}"/>
|
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')]}"/>
|
||||||
|
=======
|
||||||
|
attrs="{'invisible': [('cutting_tool_type','!=','整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
<span>(mm)&nbsp;</span>
|
<span>(mm)&nbsp;</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<field name="tool_width"
|
<field name="tool_width"
|
||||||
|
<<<<<<< HEAD
|
||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||||
<field name="tool_height"
|
<field name="tool_height"
|
||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}"/>
|
||||||
@@ -203,6 +268,69 @@
|
|||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||||
<field name="cutting_tool_blade_width" string="刃宽"
|
<field name="cutting_tool_blade_width" string="刃宽"
|
||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')]}"/>
|
||||||
|
=======
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="tool_height"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_flange_diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_flange_length"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_diameter" string="刃部直径(mm)" class="diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_length"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_width"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_depth"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_helix_angle"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_number" placeholder="请选择"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_tip_working_size"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_tip_diameter" string="刀尖直径(mm)" class="diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_tip_taper" string="刀尖锥度(°)"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<!--刀片-->
|
||||||
|
<label for="tool_length" string="尺寸(mm)"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<div class="test_model"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}">
|
||||||
|
<label for="tool_length" string="长"/>
|
||||||
|
<field name="tool_length" class="o_address_zip"
|
||||||
|
options="{'format': false}"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<label for="tool_thickness" string="厚"/>
|
||||||
|
<field name="tool_thickness" class="o_address_zip"
|
||||||
|
options="{'format': false}"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
</div>
|
||||||
|
<field name="cutting_tool_blade_blade_number" string="刃数"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_width" string="刃宽"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_cut_blade_length"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_tip_circular_arc_radius"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_tip_height_tolerance"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_inscribed_circle_diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_inscribed_circle_tolerance"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_install_aperture_diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_chip_breaker_groove"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_chip_breaker_type_code"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_cut_depth_max"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
<!--刀杆-->
|
<!--刀杆-->
|
||||||
|
|
||||||
<label for="cutting_tool_knife_head_length" string="刀头尺寸(mm)"
|
<label for="cutting_tool_knife_head_length" string="刀头尺寸(mm)"
|
||||||
@@ -211,6 +339,7 @@
|
|||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}">
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')]}">
|
||||||
<label for="cutting_tool_knife_head_length" string="长"/>
|
<label for="cutting_tool_knife_head_length" string="长"/>
|
||||||
<field name="cutting_tool_knife_head_length" class="o_address_zip"
|
<field name="cutting_tool_knife_head_length" class="o_address_zip"
|
||||||
|
<<<<<<< HEAD
|
||||||
options="{'format': false}"/>
|
options="{'format': false}"/>
|
||||||
<label for="cutting_tool_knife_head_width" string="宽"/>
|
<label for="cutting_tool_knife_head_width" string="宽"/>
|
||||||
<field name="cutting_tool_knife_head_width" class="o_address_zip"
|
<field name="cutting_tool_knife_head_width" class="o_address_zip"
|
||||||
@@ -240,12 +369,42 @@
|
|||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||||
<field name="cutting_tool_interface_diameter"
|
<field name="cutting_tool_interface_diameter"
|
||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||||
|
=======
|
||||||
|
options="{'format': false}"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<label for="cutting_tool_knife_head_width" string="宽"/>
|
||||||
|
<field name="cutting_tool_knife_head_width" class="o_address_zip"
|
||||||
|
options="{'format': false}"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<label for="cutting_tool_knife_head_height" string="高"/>
|
||||||
|
<field name="cutting_tool_knife_head_height" class="o_address_zip"
|
||||||
|
options="{'format': false}"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
</div>
|
||||||
|
<field name="cutting_tool_blade_diameter" string="刃部直径(mm)" class="diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
|
||||||
|
<field name="cutting_tool_blade_length"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
|
||||||
|
<field name="cutting_tool_cutter_arbor_diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_cut_blade_length" string="切削刃长度(mm)"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_cut_depth_max"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_min_machining_aperture"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_install_blade_tip_num"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<!--刀盘-->
|
||||||
|
<field name="cutting_tool_cutter_head_diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_interface_diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
|
|
||||||
<!--夹头-->
|
<!--夹头-->
|
||||||
<field name="cutting_tool_clamping_length"
|
|
||||||
attrs='{"invisible": [("cutting_tool_type","!=","夹头")]}'/>
|
|
||||||
<field name="cutting_tool_clamping_tolerance"
|
|
||||||
attrs='{"invisible": [("cutting_tool_type","!=","夹头")]}'/>
|
|
||||||
<label for="cutting_tool_clamping_diameter_min" string="夹持直径"
|
<label for="cutting_tool_clamping_diameter_min" string="夹持直径"
|
||||||
attrs='{"invisible": [("cutting_tool_type","not in",("夹头","刀柄"))]}'/>
|
attrs='{"invisible": [("cutting_tool_type","not in",("夹头","刀柄"))]}'/>
|
||||||
<div class="o_address_format"
|
<div class="o_address_format"
|
||||||
@@ -253,11 +412,16 @@
|
|||||||
<label for="cutting_tool_clamping_diameter_min" string="最小"/>
|
<label for="cutting_tool_clamping_diameter_min" string="最小"/>
|
||||||
<field name="cutting_tool_clamping_diameter_min" class="o_address_zip diameter"
|
<field name="cutting_tool_clamping_diameter_min" class="o_address_zip diameter"
|
||||||
options="{'format': false}"
|
options="{'format': false}"
|
||||||
|
<<<<<<< HEAD
|
||||||
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))]}"/>
|
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))]}"/>
|
||||||
|
=======
|
||||||
|
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
<span>(mm)&nbsp;</span>
|
<span>(mm)&nbsp;</span>
|
||||||
<label for="cutting_tool_clamping_diameter_max" string="最大"/>
|
<label for="cutting_tool_clamping_diameter_max" string="最大"/>
|
||||||
<field name="cutting_tool_clamping_diameter_max" class="o_address_zip diameter"
|
<field name="cutting_tool_clamping_diameter_max" class="o_address_zip diameter"
|
||||||
options="{'format': false}"
|
options="{'format': false}"
|
||||||
|
<<<<<<< HEAD
|
||||||
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))]}"/>
|
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))]}"/>
|
||||||
<span>(mm)&nbsp;</span>
|
<span>(mm)&nbsp;</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -385,74 +549,232 @@
|
|||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||||
<field name="cutting_tool_blade_ids" widget="many2many_tags"
|
<field name="cutting_tool_blade_ids" widget="many2many_tags"
|
||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')]}"/>
|
||||||
|
=======
|
||||||
|
attrs="{'required': [('cutting_tool_type','not in',('夹头','刀柄'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<span>(mm)&nbsp;</span>
|
||||||
|
</div>
|
||||||
|
<field name="cutting_tool_clamping_way"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type','not in',('刀柄','夹头'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_top_diameter" class="diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type','not in',('夹头'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_outer_diameter" class="diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type','not in',('夹头'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_inner_diameter" class="diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type','not in',('夹头'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<!--夹头-->
|
||||||
|
<field name="cutting_tool_speed_max"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_change_time"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_cooling_type"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
</group>
|
||||||
|
<group attrs="{'invisible': [('categ_type', '!=', '刀具')],'readonly': [('id', '!=', False)]}">
|
||||||
|
<field name="materials_type_id" options="{'no_create': True}" placeholder="请选择"
|
||||||
|
string="材质" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="coating_material" attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_type"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_coarse_medium_fine" string="粗/中/精" placeholder="请选择"
|
||||||
|
attrs="{'required': [('cutting_tool_type','=','整体式刀具')],'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<!--整体式刀具-->
|
||||||
|
<field name="cutting_tool_shank_diameter" string="柄部直径(mm)" class="diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_shank_length"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_neck_diameter" string="颈部直径(mm)" class="diameter"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_neck_length" string="颈部长度(mm)"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_cut_depth_max"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_pitch"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="tool_weight"
|
||||||
|
attrs='{"invisible": [("cutting_tool_type","not in",("夹头","刀柄"))],"readonly": [("id", "!=", False)]}'/>
|
||||||
|
<field name="cutting_tool_taper"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('夹头','刀柄'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_taper_shank_model"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_dynamic_balance_class"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_jump_accuracy"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_rear_angle"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_main_included_angle"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片','刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<!-- <field name="cutting_tool_front_angle"-->
|
||||||
|
<!-- attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))]}"/>-->
|
||||||
|
<field name="cutting_tool_top_angle"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀片'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_pitch"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_bladed_teeth_model"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_thread_model"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_thread_num"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_thickness_tolerance"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_cutter_bar_ids" widget="many2many_tags"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_cutter_pad_ids" widget="many2many_tags"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀片')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<!--刀柄-->
|
||||||
|
<field name="cutting_tool_is_high_speed_cutting"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_is_safety_lock" string="有无安全锁"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<!--夹头-->
|
||||||
|
<field name="cutting_tool_jump_accuracy" string="跳动精度(mm)"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_max_load_capacity"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_er_size_model"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_handle_id"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cooling_suit_type_ids"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '夹头')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<!-- 刀杆 -->
|
||||||
|
<field name="cutting_tool_rear_angle"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_installing_structure"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_is_cooling_hole"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_locating_slot_code"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_blade_id"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_tool_shim"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_cotter_pin"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_pressing_plate"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀杆')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_screw"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_fit_nut_model"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_wrench"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀柄'))],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_chuck_id"
|
||||||
|
options="{'no_create': True}"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_fit_chuck_size"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀柄')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<!-- 刀盘 -->
|
||||||
|
<field name="cutting_tool_screw"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
<field name="cutting_tool_wrench"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', '!=', '刀盘')],'readonly': [('id', '!=', False)]}"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group string="适配刀片形状"
|
<group string="适配刀片形状"
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'in', ('刀柄','夹头','整体式刀具',False))]}">
|
attrs="{'invisible': [('cutting_tool_type', 'in', ('刀柄','夹头','整体式刀具',False))]}">
|
||||||
|
<<<<<<< HEAD
|
||||||
<field name="fit_blade_shape_id" string="" widget="many2one_radio"/>
|
<field name="fit_blade_shape_id" string="" widget="many2one_radio"/>
|
||||||
|
=======
|
||||||
|
<field name="fit_blade_shape_id" string="" widget="many2one_radio"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
</group>
|
</group>
|
||||||
<group string="适合加工方式"
|
<group string="适合加工方式"
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||||
<field name="suitable_machining_method_ids" string=""
|
<field name="suitable_machining_method_ids" string=""
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
widget="custom_many2many_checkboxes"/>
|
widget="custom_many2many_checkboxes"/>
|
||||||
</group>
|
</group>
|
||||||
<group string="刀尖特征"
|
<group string="刀尖特征"
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||||
<field name="blade_tip_characteristics_id" string=""
|
<field name="blade_tip_characteristics_id" string=""
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
widget="many2one_radio"/>
|
widget="many2one_radio"/>
|
||||||
</group>
|
</group>
|
||||||
<group attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
<group attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||||
<group string="柄部类型"
|
<group string="柄部类型"
|
||||||
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
|
attrs="{'invisible': [('cutting_tool_type', '!=', '整体式刀具')]}">
|
||||||
|
<<<<<<< HEAD
|
||||||
<field name="handle_type_id" string="" widget="many2one_radio"/>
|
<field name="handle_type_id" string="" widget="many2one_radio"/>
|
||||||
</group>
|
</group>
|
||||||
<group string="压紧方式"
|
<group string="压紧方式"
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}">
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}">
|
||||||
<field name="compaction_way_id" string="" widget="many2one_radio"/>
|
<field name="compaction_way_id" string="" widget="many2one_radio"/>
|
||||||
|
=======
|
||||||
|
<field name="handle_type_id" string="" widget="many2one_radio"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
</group>
|
||||||
|
<group string="压紧方式"
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('刀杆','刀盘'))]}">
|
||||||
|
<field name="compaction_way_id" string="" widget="many2one_radio"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
<group attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀杆','刀盘','刀片'))]}">
|
||||||
<group string="走刀方向">
|
<group string="走刀方向">
|
||||||
|
<<<<<<< HEAD
|
||||||
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes"/>
|
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes"/>
|
||||||
</group>
|
</group>
|
||||||
<group string="适合冷却液">
|
<group string="适合冷却液">
|
||||||
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes"/>
|
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes"/>
|
||||||
|
=======
|
||||||
|
<field name="cutting_direction_ids" string="" widget="custom_many2many_checkboxes"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
</group>
|
||||||
|
<group string="适合冷却方式">
|
||||||
|
<field name="suitable_coolant_ids" string="" widget="custom_many2many_checkboxes"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}"/>
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<notebook>
|
<notebook>
|
||||||
<page string="切削速度Vc"
|
<page string="切削速度Vc"
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}">
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}">
|
||||||
|
<<<<<<< HEAD
|
||||||
<field name="cutting_speed_ids" string="" widget="one2many">
|
<field name="cutting_speed_ids" string="" widget="one2many">
|
||||||
|
=======
|
||||||
|
<field name="cutting_speed_ids" string="" widget="one2many"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}" class="fixTableCss">
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
<tree editable="bottom">
|
<tree editable="bottom">
|
||||||
<!-- <field name="order"/>-->
|
|
||||||
<field name="execution_standard_id"/>
|
<field name="execution_standard_id"/>
|
||||||
<field name="material_code"/>
|
<field name="material_code"/>
|
||||||
<field name="material_id"/>
|
|
||||||
<field name="material_grade"/>
|
<field name="material_grade"/>
|
||||||
<field name="tensile_strength"/>
|
<field name="tensile_strength"/>
|
||||||
<field name="hardness"/>
|
<field name="hardness"/>
|
||||||
<field name="cutting_speed_n1"/>
|
|
||||||
<field name="cutting_speed_n2"/>
|
|
||||||
<field name="cutting_speed_n3"/>
|
|
||||||
<field name="cutting_speed_n4"/>
|
|
||||||
<field name="cutting_speed_n5"/>
|
|
||||||
<field name="rough_machining"/>
|
|
||||||
<field name="precision_machining"/>
|
|
||||||
<field name="application"/>
|
<field name="application"/>
|
||||||
</tree>
|
</tree>
|
||||||
</field>
|
</field>
|
||||||
|
<script src="/sf_dlm_management/static/js/changeCss.js"></script>
|
||||||
</page>
|
</page>
|
||||||
<page string="每齿走刀量fz"
|
<page string="每齿走刀量fz"
|
||||||
|
<<<<<<< HEAD
|
||||||
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}">
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))]}">
|
||||||
<field name="feed_per_tooth_ids" string="" widget="one2many">
|
<field name="feed_per_tooth_ids" string="" widget="one2many">
|
||||||
|
=======
|
||||||
|
attrs="{'invisible': [('cutting_tool_type', 'not in', ('整体式刀具','刀片'))],'readonly': [('categ_type', '=', '刀具')]}">
|
||||||
|
<field name="feed_per_tooth_ids" string="" widget="one2many"
|
||||||
|
attrs="{'readonly': [('id', '!=', False)]}">
|
||||||
|
>>>>>>> 8695a66e3d9be860f778caba8db5500885f4548f
|
||||||
<tree editable="bottom">
|
<tree editable="bottom">
|
||||||
<field name="cutting_speed"
|
<!-- <field name="cutting_speed"-->
|
||||||
attrs="{'readonly': [('materials_type_id','!=',False)]}"/>
|
<!-- attrs="{'readonly': [('materials_type_id','!=',False)]}"/>-->
|
||||||
<field name="machining_method" placeholder="请选择"
|
<field name="materials_type_id" placeholder="请选择"/>
|
||||||
attrs="{'readonly': [('cutting_speed','!=',False)]}"/>
|
|
||||||
<field name="materials_type_id" placeholder="请选择"
|
|
||||||
attrs="{'readonly': [('cutting_speed','!=',False)]}"/>
|
|
||||||
<field name="blade_diameter"/>
|
<field name="blade_diameter"/>
|
||||||
<field name="feed_per_tooth"/>
|
<field name="feed_per_tooth"/>
|
||||||
</tree>
|
</tree>
|
||||||
@@ -461,64 +783,107 @@
|
|||||||
</notebook>
|
</notebook>
|
||||||
</page>
|
</page>
|
||||||
<page string="夹具物料参数" attrs="{'invisible': [('categ_type', '!=', '夹具')]}">
|
<page string="夹具物料参数" attrs="{'invisible': [('categ_type', '!=', '夹具')]}">
|
||||||
<group attrs='{"invisible": [("fixture_material_type","not in",("气动夹具","转接板(锁板)夹具","磁吸夹具","虎钳夹具","零点卡盘","零点托盘"))]}'>
|
<group>
|
||||||
<group>
|
<group>
|
||||||
<field name="brand_id"/>
|
<field name="brand_id" placeholder="请选择"/>
|
||||||
<field name="fixture_multi_mounting_type_id" options="{'no_create': True}"/>
|
<field name="multi_mounting_type_id" placeholder="请选择"
|
||||||
<label for="tool_length" string="尺寸(mm)"/>
|
attrs="{'required': [('categ_type', '=', '夹具')]}"/>
|
||||||
<div class="o_address_format">
|
<field name="length" string="长度(mm)"/>
|
||||||
<label for="tool_length" string="长"/>
|
<field name="width" string="宽度(mm)"/>
|
||||||
<field name="tool_length" class="o_address_zip"
|
<field name="height" string="高度(mm)"/>
|
||||||
options="{'format': false}"/>
|
<field name="height_tolerance_value"
|
||||||
<!-- <span>&nbsp;</span>-->
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['磁吸夹具'])]}"/>
|
||||||
<label for="tool_width" string="宽"/>
|
<field name="diameter"
|
||||||
<field name="tool_width" class="o_address_zip"
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点卡盘', '零点托盘', '三爪卡盘'])]}"/>
|
||||||
options="{'format': false}"/>
|
<field name="weight"/>
|
||||||
<!-- <span>&nbsp;</span>-->
|
<field name="chucking_power_max"
|
||||||
<label for="tool_height" string="高"/>
|
attrs="{'invisible': [('fixture_material_type', '=','磁吸夹具')]}"/>
|
||||||
<field name="tool_height" class="o_address_zip"
|
<field name="carrying_capacity_max"/>
|
||||||
options="{'format': false}"/>
|
<field name="rigidity"/>
|
||||||
</div>
|
|
||||||
<field name="tool_weight"></field>
|
|
||||||
<label for="fixture_clamp_workpiece_length_max" string="夹持工件最大尺寸(mm)"
|
|
||||||
attrs='{"invisible": [("fixture_material_type","in",("零点卡盘","零点托盘"))]}'/>
|
|
||||||
<div class="o_address_format"
|
|
||||||
attrs='{"invisible": [("fixture_material_type","in",("零点卡盘","零点托盘"))]}'>
|
|
||||||
<label for="fixture_clamp_workpiece_length_max" string="长"/>
|
|
||||||
<field name="fixture_clamp_workpiece_length_max" class="o_address_zip"
|
|
||||||
options="{'format': false}"
|
|
||||||
attrs="{'required': [('fixture_material_type', 'in',('气动夹具','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
|
||||||
<!-- <span>&nbsp;</span>-->
|
|
||||||
<label for="fixture_clamp_workpiece_width_max" string="宽"/>
|
|
||||||
<field name="fixture_clamp_workpiece_width_max" class="o_address_zip"
|
|
||||||
options="{'format': false}"
|
|
||||||
attrs="{'required': [('fixture_material_type', 'in',('气动夹具','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
|
||||||
<!-- <span>&nbsp;</span>-->
|
|
||||||
<label for="fixture_clamp_workpiece_height_max" string="高"/>
|
|
||||||
<field name="fixture_clamp_workpiece_height_max" class="o_address_zip"
|
|
||||||
options="{'format': false}"
|
|
||||||
attrs="{'required': [('fixture_material_type', 'in',('气动托盘','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
|
||||||
</div>
|
|
||||||
<field name="fixture_clamp_workpiece_diameter_max"
|
|
||||||
attrs="{'invisible': [('fixture_material_type','in',('零点卡盘','零点托盘'))],'required': [('fixture_material_type', 'in',('气动夹具','转接板(锁板)夹具','磁吸夹具','虎钳夹具'))]}"/>
|
|
||||||
<field name="fixture_maximum_carrying_weight"></field>
|
|
||||||
<field name="fixture_maximum_clamping_force"></field>
|
|
||||||
</group>
|
</group>
|
||||||
<group>
|
<group>
|
||||||
<field name="materials_type_id" options="{'no_create': True}"/>
|
<label for="gripper_length_min" string="夹持工件最小尺寸"
|
||||||
<field name="fixture_clamping_way"
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['气动夹具','虎钳夹具','磁吸夹具','转接板(锁板)夹具','三爪卡盘'])]}"/>
|
||||||
attrs='{"invisible": [("fixture_material_type","not in",("气动夹具","磁吸夹具","虎钳夹具"))]}'/>
|
<div class="o_address_format"
|
||||||
<field name="fixture_port_type"
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['气动夹具','虎钳夹具','磁吸夹具','转接板(锁板)夹具','三爪卡盘'])]}">
|
||||||
attrs='{"invisible": [("fixture_material_type","not in",("气动夹具","磁吸夹具","虎钳夹具"))]}'/>
|
<label for="gripper_length_min" string="长"/>
|
||||||
<field name="fixture_through_hole_size"
|
<field name="gripper_length_min" class="o_address_zip"/>
|
||||||
attrs='{"invisible": [("fixture_material_type","!=",("转接板(锁板)夹具"))]}'/>
|
<span>&nbsp;</span>
|
||||||
<field name="fixture_screw_size"
|
<label for="gripper_width_min" string="宽"/>
|
||||||
attrs='{"invisible": [("fixture_material_type","!=",("转接板(锁板)夹具"))]}'/>
|
<field name="gripper_width_min" class="o_address_zip"/>
|
||||||
<field name="fixture_driving_way"
|
<span>&nbsp;</span>
|
||||||
attrs='{"invisible": [("fixture_material_type","not in",("虎钳夹具","零点卡盘","零点托盘"))]}'/>
|
<label for="gripper_height_min" string="高"/>
|
||||||
<field name="fixture_apply_machine_tool_type_ids" options="{'no_create': True}"
|
<field name="gripper_height_min" class="o_address_zip"/>
|
||||||
widget="many2many_tags"
|
</div>
|
||||||
attrs='{"invisible": [("fixture_material_type","not in",("零点卡盘","零点托盘"))]}'/>
|
<label for="gripper_length_max" string="夹持工件最大尺寸"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['气动夹具','虎钳夹具','磁吸夹具','转接板(锁板)夹具','三爪卡盘'])]}"/>
|
||||||
|
<div class="o_address_format"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['气动夹具','虎钳夹具','磁吸夹具','转接板(锁板)夹具','三爪卡盘'])]}">
|
||||||
|
<label for="gripper_length_max" string="长"/>
|
||||||
|
<field name="gripper_length_max" class="o_address_zip"/>
|
||||||
|
<span>&nbsp;</span>
|
||||||
|
<label for="gripper_width_max" string="宽"/>
|
||||||
|
<field name="gripper_width_max" class="o_address_zip"/>
|
||||||
|
<span>&nbsp;</span>
|
||||||
|
<label for="gripper_width_max" string="高"/>
|
||||||
|
<field name="gripper_width_max" class="o_address_zip"/>
|
||||||
|
</div>
|
||||||
|
<field name="gripper_diameter_min" string="夹持工件最小直径(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['气动夹具','虎钳夹具','磁吸夹具','转接板(锁板)夹具','三爪卡盘'])]}"/>
|
||||||
|
<field name="gripper_diameter_max" string="夹持工件最大直径(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['气动夹具','虎钳夹具','磁吸夹具','转接板(锁板)夹具','三爪卡盘'])]}"/>
|
||||||
|
<field name="clamping_diameter" string="装夹直径(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点卡盘','零点托盘'])]}"/>
|
||||||
|
<field name="clamping_num" placeholder="请选择" string="装夹单元数"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', '!=', '零点卡盘')]}"/>
|
||||||
|
<field name="repeated_positioning_accuracy" placeholder="请输入重复定位孔精度"
|
||||||
|
string="重复定位精度(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点卡盘','零点托盘'])]}"/>
|
||||||
|
<field name="orientation_dish_diameter" string="定位盘直径(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点卡盘'])]}"/>
|
||||||
|
<field name="boolean_transposing_hole" string="是否有转位孔"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点卡盘'])]}"/>
|
||||||
|
<field name="connector_diameter" placeholder="请选择" string="连接头直径(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点托盘'])]}"/>
|
||||||
|
<field name="way_to_install" placeholder="请选择" string="安装方式"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点托盘'])]}"/>
|
||||||
|
<field name="rated_air_pressure" string="额定气压(Mpa)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['气动夹具'])]}"/>
|
||||||
|
|
||||||
|
<field name="transverse_groove" string="横向配合槽n(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['虎钳夹具'])]}"/>
|
||||||
|
<field name="longitudinal_fitting_groove" string="纵向配合槽l(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['虎钳夹具'])]}"/>
|
||||||
|
|
||||||
|
<field name="rated_adsorption_force" string="额定吸附力(N/cm²)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['磁吸夹具'])]}"/>
|
||||||
|
<field name="magnetic_field_height" string="磁场高度(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['磁吸夹具'])]}"/>
|
||||||
|
<field name="magnetic_pole_plate_grinding_allowance" string="磁极板磨削余量(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['磁吸夹具'])]}"/>
|
||||||
|
|
||||||
|
<field name="screw_size" string="螺牙大小(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['转接板(锁板)夹具'])]}"/>
|
||||||
|
<field name="via_hole_diameter" string="过孔直径(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['转接板(锁板)夹具'])]}"/>
|
||||||
|
|
||||||
|
<field name="mounting_hole_depth" string="安装孔深度(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['三爪卡盘'])]}"/>
|
||||||
|
<field name="centering_diameter" string="定心直径(mm)"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['三爪卡盘'])]}"/>
|
||||||
|
|
||||||
|
<field name="boolean_chip_blowing_function" string="是否有吹屑功能"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点卡盘','零点托盘'])]}"/>
|
||||||
|
<field name="materials_model_id" placeholder="请选择"/>
|
||||||
|
<field name="interface_materials_model_id" placeholder="请选择" string="接口类型"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['气动夹具','虎钳夹具','磁吸夹具'])]}"/>
|
||||||
|
<field name="type_of_drive" placeholder="请选择" string="驱动方式"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点托盘','气动夹具','虎钳夹具','磁吸夹具','转接板(锁板)夹具','三爪卡盘'])]}"/>
|
||||||
|
<field name="unlocking_method" string="解锁方式" placeholder="请选择"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点卡盘'])]}"/>
|
||||||
|
<field name="machine_tool_type_id" string="适用机床型号" placeholder="请选择"
|
||||||
|
attrs="{'invisible': [('fixture_material_type', 'not in', ['零点卡盘'])]}"/>
|
||||||
|
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
</page>
|
</page>
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//group//field[@name='processing_panel']" position="after">
|
<xpath expr="//group//field[@name='processing_panel']" position="after">
|
||||||
<!-- invisible="1" -->
|
<!-- invisible="1" -->
|
||||||
<field name="_barcode_scanned" widget="barcode_handler" string="扫码" attrs='{"invisible": [("routing_type","!=","装夹")]}'/>
|
<field name="_barcode_scanned" widget="barcode_handler" string="扫码" attrs='{"invisible": [("routing_type","!=","装夹预调")]}'/>
|
||||||
</xpath>
|
</xpath>
|
||||||
<xpath expr="//page//field[@name='tray_code']" position="replace">
|
<xpath expr="//page//field[@name='tray_code']" position="replace">
|
||||||
<field name="tray_code" widget="code"/>
|
<field name="tray_code" widget="code"/>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
<field name="sequence_number"/>
|
<field name="sequence_number"/>
|
||||||
<field name="program_name"/>
|
<field name="program_name"/>
|
||||||
<field name="cnc_id" string="文件"/>
|
<field name="cnc_id" string="文件"/>
|
||||||
|
<field name="functional_tool_type_id"/>
|
||||||
<field name="cutting_tool_name"/>
|
<field name="cutting_tool_name"/>
|
||||||
<field name="cutting_tool_no"/>
|
<field name="cutting_tool_no"/>
|
||||||
<field name="processing_type"/>
|
<field name="processing_type"/>
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<xpath expr="//form//notebook//page[1]" position="after">
|
<xpath expr="//form//notebook//page[1]" position="after">
|
||||||
<!-- <xpath expr="//page[@name='other']" position="before">-->
|
<!-- <xpath expr="//page[@name='other']" position="before">-->
|
||||||
<!-- <notebook> -->
|
<!-- <notebook> -->
|
||||||
<page string="机床监控">
|
<page string="机床运行状态" attrs="{'invisible': [('equipment_type', '!=', '机床')]}">
|
||||||
<group string='状态监控'>
|
<group string='状态监控'>
|
||||||
<group>
|
<group>
|
||||||
<field name="timestamp"/>
|
<field name="timestamp"/>
|
||||||
@@ -29,44 +29,44 @@
|
|||||||
<field name="spindle_speed"/>
|
<field name="spindle_speed"/>
|
||||||
</group>
|
</group>
|
||||||
</group>
|
</group>
|
||||||
<group string='刀位统计'>
|
<!-- <group string='刀位统计'> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<field name="tool_num_process_time1"/>
|
<!-- <field name="tool_num_process_time1"/> -->
|
||||||
<field name="tool_num_process_time5"/>
|
<!-- <field name="tool_num_process_time5"/> -->
|
||||||
<field name="tool_num_process_time9"/>
|
<!-- <field name="tool_num_process_time9"/> -->
|
||||||
<field name="tool_num_process_time13"/>
|
<!-- <field name="tool_num_process_time13"/> -->
|
||||||
<field name="tool_num_process_time17"/>
|
<!-- <field name="tool_num_process_time17"/> -->
|
||||||
<field name="tool_num_process_time21"/>
|
<!-- <field name="tool_num_process_time21"/> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<field name="tool_num_process_time2"/>
|
<!-- <field name="tool_num_process_time2"/> -->
|
||||||
<field name="tool_num_process_time6"/>
|
<!-- <field name="tool_num_process_time6"/> -->
|
||||||
<field name="tool_num_process_time10"/>
|
<!-- <field name="tool_num_process_time10"/> -->
|
||||||
<field name="tool_num_process_time14"/>
|
<!-- <field name="tool_num_process_time14"/> -->
|
||||||
<field name="tool_num_process_time18"/>
|
<!-- <field name="tool_num_process_time18"/> -->
|
||||||
<field name="tool_num_process_time22"/>
|
<!-- <field name="tool_num_process_time22"/> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<field name="tool_num_process_time3"/>
|
<!-- <field name="tool_num_process_time3"/> -->
|
||||||
<field name="tool_num_process_time7"/>
|
<!-- <field name="tool_num_process_time7"/> -->
|
||||||
<field name="tool_num_process_time11"/>
|
<!-- <field name="tool_num_process_time11"/> -->
|
||||||
<field name="tool_num_process_time15"/>
|
<!-- <field name="tool_num_process_time15"/> -->
|
||||||
<field name="tool_num_process_time19"/>
|
<!-- <field name="tool_num_process_time19"/> -->
|
||||||
<field name="tool_num_process_time23"/>
|
<!-- <field name="tool_num_process_time23"/> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<field name="tool_num_process_time4"/>
|
<!-- <field name="tool_num_process_time4"/> -->
|
||||||
<field name="tool_num_process_time8"/>
|
<!-- <field name="tool_num_process_time8"/> -->
|
||||||
<field name="tool_num_process_time12"/>
|
<!-- <field name="tool_num_process_time12"/> -->
|
||||||
<field name="tool_num_process_time16"/>
|
<!-- <field name="tool_num_process_time16"/> -->
|
||||||
<field name="tool_num_process_time20"/>
|
<!-- <field name="tool_num_process_time20"/> -->
|
||||||
<field name="tool_num_process_time24"/>
|
<!-- <field name="tool_num_process_time24"/> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
|
|
||||||
<!-- <div class="o_address_format"> -->
|
<!-- <div class="o_address_format"> -->
|
||||||
<!-- <label for="tool_num_process_time1" string="刀位1"/> -->
|
<!-- <label for="tool_num_process_time1" string="刀位1"/> -->
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
<!-- </div> -->
|
<!-- </div> -->
|
||||||
<!-- </group> -->
|
<!-- </group> -->
|
||||||
</page>
|
</page>
|
||||||
<page string="机床配置">
|
<page string="机床运行数据" attrs="{'invisible': [('equipment_type', '!=', '机床')]}">
|
||||||
<!-- <group string="机床配置">--> -->
|
<!-- <group string="机床配置">--> -->
|
||||||
<group string="ftp相关">
|
<group string="ftp相关">
|
||||||
<group>
|
<group>
|
||||||
@@ -216,46 +216,46 @@
|
|||||||
</group>
|
</group>
|
||||||
<!-- </group> -->
|
<!-- </group> -->
|
||||||
</page>
|
</page>
|
||||||
<page string="刀位配置">
|
<!-- <page string="刀位配置"> -->
|
||||||
<group string="刀位配置">
|
<!-- <group string="刀位配置"> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<field name="tool_num1"/>
|
<!-- <field name="tool_num1"/> -->
|
||||||
<field name="tool_num5"/>
|
<!-- <field name="tool_num5"/> -->
|
||||||
<field name="tool_num9"/>
|
<!-- <field name="tool_num9"/> -->
|
||||||
<field name="tool_num13"/>
|
<!-- <field name="tool_num13"/> -->
|
||||||
<field name="tool_num17"/>
|
<!-- <field name="tool_num17"/> -->
|
||||||
<field name="tool_num21"/>
|
<!-- <field name="tool_num21"/> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<field name="tool_num2"/>
|
<!-- <field name="tool_num2"/> -->
|
||||||
<field name="tool_num6"/>
|
<!-- <field name="tool_num6"/> -->
|
||||||
<field name="tool_num10"/>
|
<!-- <field name="tool_num10"/> -->
|
||||||
<field name="tool_num14"/>
|
<!-- <field name="tool_num14"/> -->
|
||||||
<field name="tool_num18"/>
|
<!-- <field name="tool_num18"/> -->
|
||||||
<field name="tool_num22"/>
|
<!-- <field name="tool_num22"/> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<field name="tool_num3"/>
|
<!-- <field name="tool_num3"/> -->
|
||||||
<field name="tool_num7"/>
|
<!-- <field name="tool_num7"/> -->
|
||||||
<field name="tool_num11"/>
|
<!-- <field name="tool_num11"/> -->
|
||||||
<field name="tool_num15"/>
|
<!-- <field name="tool_num15"/> -->
|
||||||
<field name="tool_num19"/>
|
<!-- <field name="tool_num19"/> -->
|
||||||
<field name="tool_num23"/>
|
<!-- <field name="tool_num23"/> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
<group>
|
<!-- <group> -->
|
||||||
<field name="tool_num4"/>
|
<!-- <field name="tool_num4"/> -->
|
||||||
<field name="tool_num8"/>
|
<!-- <field name="tool_num8"/> -->
|
||||||
<field name="tool_num12"/>
|
<!-- <field name="tool_num12"/> -->
|
||||||
<field name="tool_num16"/>
|
<!-- <field name="tool_num16"/> -->
|
||||||
<field name="tool_num20"/>
|
<!-- <field name="tool_num20"/> -->
|
||||||
<field name="tool_num24"/>
|
<!-- <field name="tool_num24"/> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
</group>
|
<!-- </group> -->
|
||||||
</page>
|
<!-- </page> -->
|
||||||
<!-- </notebook> -->
|
<!-- </notebook> -->
|
||||||
</xpath>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
|
|||||||
@@ -8,14 +8,14 @@
|
|||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//div[hasclass('app_settings_block')]/div" position="before">
|
<xpath expr="//div[hasclass('app_settings_block')]/div" position="before">
|
||||||
<div>
|
<div>
|
||||||
<h2>bfm环境配置</h2>
|
<h2>业务平台参数配置</h2>
|
||||||
<div class="row mt16 o_settings_container" id="jd_api">
|
<div class="row mt16 o_settings_container" id="jd_api">
|
||||||
<div class="col-12 col-lg-6 o_setting_box">
|
<div class="col-12 col-lg-6 o_setting_box">
|
||||||
<div class="o_setting_left_pane"/>
|
<div class="o_setting_left_pane"/>
|
||||||
<div class="o_setting_right_pane">
|
<div class="o_setting_right_pane">
|
||||||
<div class="text-muted">
|
<div class="text-muted">
|
||||||
<label for="bfm_url"/>
|
<label for="bfm_url" />
|
||||||
<field name="bfm_url"/>
|
<field name="bfm_url" string="访问地址"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- </div> -->
|
<!-- </div> -->
|
||||||
|
|||||||
@@ -10,7 +10,9 @@
|
|||||||
'data': [
|
'data': [
|
||||||
'security/group_security.xml',
|
'security/group_security.xml',
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
|
'security/ir_rule_data.xml',
|
||||||
'views/maintenance_logs_views.xml',
|
'views/maintenance_logs_views.xml',
|
||||||
|
'views/maintenance_equipment_oee_views.xml',
|
||||||
'views/maintenance_views.xml',
|
'views/maintenance_views.xml',
|
||||||
'views/equipment_maintenance_standards_views.xml',
|
'views/equipment_maintenance_standards_views.xml',
|
||||||
'views/maintenance_request_views.xml',
|
'views/maintenance_request_views.xml',
|
||||||
|
|||||||