diff --git a/owl_demo/__init__.py b/owl_demo/__init__.py deleted file mode 100644 index f7209b17..00000000 --- a/owl_demo/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from . import models -from . import controllers diff --git a/owl_demo/__manifest__.py b/owl_demo/__manifest__.py deleted file mode 100644 index 93565bfa..00000000 --- a/owl_demo/__manifest__.py +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "OWL开发演示", - "summary": "示例OWL开发模块。", - "description": "用于演示OWL模块的开发。", - "author": "Van", - "website": "https://topodoo.com", - "category": "Tutorials", - "version": "15.0.0.1", - "depends": ["sale", "sale_management"], - "demo": [], - "data": [ - #'report/test_sale_report.xml', - 'views/views.xml', - ], - 'assets': { - 'web.assets_qweb': [ - # 'owl_demo/static/src/xml/MyComponent.xml', - - #'owl_demo/static/src/js/html_template/template_demo_field.xml', - 'owl_demo/static/src/js/3d_viewer/3d_viewer.xml', - ], - 'web.assets_backend': [ - # 'owl_demo/static/src/xml/MyComponent.xml', - # 'owl_demo/static/src/js/components/MyComponent.js', - # 'owl_demo/static/src/js/services/*', - - #'owl_demo/static/src/js/html_template/*', - 'owl_demo/static/src/js/3d_viewer/*', - 'owl_demo/static/src/lib/model-viewer.min.js', - ], - } -} \ No newline at end of file diff --git a/owl_demo/controllers/__init__.py b/owl_demo/controllers/__init__.py deleted file mode 100644 index deec4a8b..00000000 --- a/owl_demo/controllers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from . import main \ No newline at end of file diff --git a/owl_demo/controllers/main.py b/owl_demo/controllers/main.py deleted file mode 100644 index 5ecd7bc3..00000000 --- a/owl_demo/controllers/main.py +++ /dev/null @@ -1,266 +0,0 @@ -# -*- coding: utf-8 -*- -# Part of Odoo. See LICENSE file for full copyright and licensing details. -import base64 -import io -import json -import os - -from odoo import _ -from odoo import http -from odoo.http import request - - -class Viewer3d(http.Controller): - - @http.route(['/Viewer3d/'], type='http', auth="None") - def viewer3d(self, attachment_id, **kwargs): - attachment = self._attachment_get(attachment_id) - return attachment - - def _attachment_get(self, attachment_id): - attachment = request.env['ir.attachment'].sudo().browse(attachment_id) - if not attachment: - return - return attachment.datas - - def stl_to_gltf(binary_stl_path, out_path, is_binary): - import struct - - gltf2 = ''' - { - "scenes" : [ - { - "nodes" : [ 0 ] - } - ], - "nodes" : [ - { - "mesh" : 0 - } - ], - "meshes" : [ - { - "primitives" : [ { - "attributes" : { - "POSITION" : 1 - }, - "indices" : 0 - } ] - } - ], - "buffers" : [ - { - %s - "byteLength" : %d - } - ], - "bufferViews" : [ - { - "buffer" : 0, - "byteOffset" : 0, - "byteLength" : %d, - "target" : 34963 - }, - { - "buffer" : 0, - "byteOffset" : %d, - "byteLength" : %d, - "target" : 34962 - } - ], - "accessors" : [ - { - "bufferView" : 0, - "byteOffset" : 0, - "componentType" : 5125, - "count" : %d, - "type" : "SCALAR", - "max" : [ %d ], - "min" : [ 0 ] - }, - { - "bufferView" : 1, - "byteOffset" : 0, - "componentType" : 5126, - "count" : %d, - "type" : "VEC3", - "min" : [%f, %f, %f], - "max" : [%f, %f, %f] - } - ], - "asset" : { - "version" : "2.0" - } - } - ''' - - header_bytes = 80 - unsigned_long_int_bytes = 4 - float_bytes = 4 - vec3_bytes = 4 * 3 - spacer_bytes = 2 - num_vertices_in_face = 3 - - vertices = {} - indices = [] - - if not is_binary: - out_bin = os.path.join(out_path, "out.bin") - out_gltf = os.path.join(out_path, "out.gltf") - else: - out_bin = out_path - - unpack_face = struct.Struct("<12fH").unpack - face_bytes = float_bytes * 12 + 2 - - with open(path_to_stl, "rb") as f: - f.seek(header_bytes) # skip 80 bytes headers - - num_faces_bytes = f.read(unsigned_long_int_bytes) - number_faces = struct.unpack(" maxx: maxx = x - if y < miny: miny = y - if y > maxy: maxy = y - if z < minz: minz = z - if z > maxz: maxz = z - - # f.seek(spacer_bytes, 1) # skip the spacer - - number_vertices = len(vertices) - vertices_bytelength = number_vertices * vec3_bytes # each vec3 has 3 floats, each float is 4 bytes - unpadded_indices_bytelength = number_vertices * unsigned_long_int_bytes - - out_number_vertices = len(vertices) - out_number_indices = len(indices) - - unpadded_indices_bytelength = out_number_indices * unsigned_long_int_bytes - indices_bytelength = (unpadded_indices_bytelength + 3) & ~3 - - out_bin_bytelength = vertices_bytelength + indices_bytelength - - if is_binary: - out_bin_uir = "" - else: - out_bin_uir = '"uri": "out.bin",' - - gltf2 = gltf2 % (out_bin_uir, - # buffer - out_bin_bytelength, - - # bufferViews[0] - indices_bytelength, - - # bufferViews[1] - indices_bytelength, - vertices_bytelength, - - # accessors[0] - out_number_indices, - out_number_vertices - 1, - - # accessors[1] - out_number_vertices, - minx, miny, minz, - maxx, maxy, maxz - ) - - glb_out = bytearray() - if is_binary: - gltf2 = gltf2.replace(" ", "") - gltf2 = gltf2.replace("\n", "") - - scene = bytearray(gltf2.encode()) - - scene_len = len(scene) - padded_scene_len = (scene_len + 3) & ~3 - body_offset = padded_scene_len + 12 + 8 - - file_len = body_offset + out_bin_bytelength + 8 - - # 12-byte header - glb_out.extend(struct.pack(' - - - \ No newline at end of file diff --git a/owl_demo/static/src/css/MyWidget.css b/owl_demo/static/src/css/MyWidget.css deleted file mode 100644 index 12e077c3..00000000 --- a/owl_demo/static/src/css/MyWidget.css +++ /dev/null @@ -1,30 +0,0 @@ -.o_int_colorpicker { - .o_color_pill { - display: inline-block; - height: 25px; - width: 25px; - margin: 4px; - border-radius: 25px; - position: relative; - @for $size from 1 through length($o-colors) { - &.o_color_#{$size - 1} { - background-color: nth($o-colors, $size); - &:not(.readonly):hover { - transform: scale(1.2); - transition: 0.3s; - cursor: pointer; - } - &.active:after{ - content: "\f00c"; - display: inline-block; - font: normal normal normal 14px/1 FontAwesome; - font-size: inherit; - color: #fff; - position: absolute; - padding: 4px; - font-size: 16px; - } - } - } - } -} \ No newline at end of file diff --git a/owl_demo/static/src/js/3d_viewer/3d_viewer.js b/owl_demo/static/src/js/3d_viewer/3d_viewer.js deleted file mode 100644 index 08e76570..00000000 --- a/owl_demo/static/src/js/3d_viewer/3d_viewer.js +++ /dev/null @@ -1,127 +0,0 @@ -/** @odoo-module **/ - -import { registry } from "@web/core/registry"; -import { _lt } from "@web/core/l10n/translation"; -import { standardFieldProps } from "@web/views/fields/standard_field_props"; -import { useInputField } from "@web/views/fields/input_field_hook"; -import { FileUploader } from "@web/views/fields/file_handler"; -import { session } from "@web/session"; -import { useService } from "@web/core/utils/hooks"; -import { isBinarySize } from "@web/core/utils/binary"; -import { download } from "@web/core/network/download"; -import utils from 'web.utils'; - -import core from 'web.core'; -import rpc from 'web.rpc'; - -var QWeb = core.qweb; - -import { Component, onWillUpdateProps, useState, useRef, useEffect } from "@odoo/owl"; - -export class StepViewer extends Component { - setup() { - this.notification = useService("notification"); - this.state = useState({ - fileName: this.props.record.data[this.props.fileNameField] || "", - }); - onWillUpdateProps((nextProps) => { - if (nextProps.readonly) { - this.state.fileName = nextProps.record.data[nextProps.fileNameField] || ""; - } - }); - - this.show_template = useRef('showStepViewer') - useInputField({ - getValue: () => this.props.value || "" - }); - - useEffect( - (el) => { - if (!el) { - return; - } - return this.formatTemplate($(el)); - }, - () => [this.show_template.el], - ) - } - - formatTemplate($el) { - console.log($el) - var self=this; - if (this.props.readonly && this.props.value) { - var url = "/owl_demo/static/src/js/3d_viewer/test.glb"; -// var session = this.getSession(); -// if (this.props.value) { -// if (utils.is_bin_size(this.props.value)) { -// url = session.url("/web/content", { -// model: this.model, -// id: JSON.stringify(this.props.record.res_id), -// field: this.props.record.name, -// }); -// } else { -// url = "data:model/gltf-binary;base64," + this.propsvalue.value; -// } -// } - return $el.html(QWeb.render("owl_demo.StepViewer",{'url':url})) - - } - } - - get fileName() { - return this.state.fileName || this.props.value || ""; - } - - - update({ data, name }) { - this.state.fileName = name || ""; - const { fileNameField, record } = this.props; - const changes = { [this.props.name]: data || false }; - if (fileNameField in record.fields && record.data[fileNameField] !== name) { - changes[fileNameField] = name || false; - } - return this.props.record.update(changes); - } - - async onFileDownload() { - await download({ - data: { - model: this.props.record.resModel, - id: this.props.record.resId, - field: this.props.name, - filename_field: this.fileName, - filename: this.fileName || "", - download: true, - data: isBinarySize(this.props.value) ? null : this.props.value, - }, - url: "/web/content", - }); - } - -} - -StepViewer.template = "owl_demo.BinaryField3d"; - -StepViewer.displayName = _lt("3D File"); -StepViewer.supportedTypes = ["binary"]; - -StepViewer.components = { - FileUploader, -}; -StepViewer.props = { - ...standardFieldProps, - acceptedFileExtensions: { type: String, optional: true }, - fileNameField: { type: String, optional: true }, -}; -StepViewer.defaultProps = { - acceptedFileExtensions: "*.stp", -}; - -StepViewer.extractProps = ({ attrs }) => { - return { - acceptedFileExtensions: attrs.options.accepted_file_extensions, - fileNameField: attrs.filename, - }; -}; - -registry.category("fields").add("Viewer3D", StepViewer); diff --git a/owl_demo/static/src/js/3d_viewer/3d_viewer.xml b/owl_demo/static/src/js/3d_viewer/3d_viewer.xml deleted file mode 100644 index dd277106..00000000 --- a/owl_demo/static/src/js/3d_viewer/3d_viewer.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - -
- - -
-
- - - -
- - - -
-
-
-
-
-
- - - -
- - - -
- - - - - - -
-
- -
diff --git a/owl_demo/static/src/js/3d_viewer/stl2gltf.py b/owl_demo/static/src/js/3d_viewer/stl2gltf.py deleted file mode 100644 index 1bdcc942..00000000 --- a/owl_demo/static/src/js/3d_viewer/stl2gltf.py +++ /dev/null @@ -1,277 +0,0 @@ -import os - -def stl_to_gltf(binary_stl_path, out_path, is_binary): - import struct - - gltf2 = ''' -{ - "scenes" : [ - { - "nodes" : [ 0 ] - } - ], - "nodes" : [ - { - "mesh" : 0 - } - ], - "meshes" : [ - { - "primitives" : [ { - "attributes" : { - "POSITION" : 1 - }, - "indices" : 0 - } ] - } - ], - "buffers" : [ - { - %s - "byteLength" : %d - } - ], - "bufferViews" : [ - { - "buffer" : 0, - "byteOffset" : 0, - "byteLength" : %d, - "target" : 34963 - }, - { - "buffer" : 0, - "byteOffset" : %d, - "byteLength" : %d, - "target" : 34962 - } - ], - "accessors" : [ - { - "bufferView" : 0, - "byteOffset" : 0, - "componentType" : 5125, - "count" : %d, - "type" : "SCALAR", - "max" : [ %d ], - "min" : [ 0 ] - }, - { - "bufferView" : 1, - "byteOffset" : 0, - "componentType" : 5126, - "count" : %d, - "type" : "VEC3", - "min" : [%f, %f, %f], - "max" : [%f, %f, %f] - } - ], - "asset" : { - "version" : "2.0" - } -} -''' - - header_bytes = 80 - unsigned_long_int_bytes = 4 - float_bytes = 4 - vec3_bytes = 4 * 3 - spacer_bytes = 2 - num_vertices_in_face = 3 - - vertices = {} - indices = [] - - if not is_binary: - out_bin = os.path.join(out_path, "out.bin") - out_gltf = os.path.join(out_path, "out.gltf") - else: - out_bin = out_path - - unpack_face = struct.Struct("<12fH").unpack - face_bytes = float_bytes*12 + 2 - - with open(path_to_stl, "rb") as f: - f.seek(header_bytes) # skip 80 bytes headers - - num_faces_bytes = f.read(unsigned_long_int_bytes) - number_faces = struct.unpack(" maxx: maxx = x - if y < miny: miny = y - if y > maxy: maxy = y - if z < minz: minz = z - if z > maxz: maxz = z - - # f.seek(spacer_bytes, 1) # skip the spacer - - number_vertices = len(vertices) - vertices_bytelength = number_vertices * vec3_bytes # each vec3 has 3 floats, each float is 4 bytes - unpadded_indices_bytelength = number_vertices * unsigned_long_int_bytes - - out_number_vertices = len(vertices) - out_number_indices = len(indices) - - unpadded_indices_bytelength = out_number_indices * unsigned_long_int_bytes - indices_bytelength = (unpadded_indices_bytelength + 3) & ~3 - - out_bin_bytelength = vertices_bytelength + indices_bytelength - - if is_binary: - out_bin_uir = "" - else: - out_bin_uir = '"uri": "out.bin",' - - gltf2 = gltf2 % ( out_bin_uir, - #buffer - out_bin_bytelength, - - # bufferViews[0] - indices_bytelength, - - # bufferViews[1] - indices_bytelength, - vertices_bytelength, - - # accessors[0] - out_number_indices, - out_number_vertices - 1, - - # accessors[1] - out_number_vertices, - minx, miny, minz, - maxx, maxy, maxz - ) - - glb_out = bytearray() - if is_binary: - gltf2 = gltf2.replace(" ", "") - gltf2 = gltf2.replace("\n", "") - - scene = bytearray(gltf2.encode()) - - scene_len = len(scene) - padded_scene_len = (scene_len + 3) & ~3 - body_offset = padded_scene_len + 12 + 8 - - file_len = body_offset + out_bin_bytelength + 8 - - # 12-byte header - glb_out.extend(struct.pack(' 3: - is_binary = True - else: - is_binary = False - - if out_path.lower().endswith(".glb"): - print("Use binary mode since output file has glb extension") - is_binary = True - else: - if is_binary: - print("output file should have glb extension but not %s", out_path) - - if not os.path.exists(path_to_stl): - print("stl file does not exists %s" % path_to_stl) - - if not is_binary: - if not os.path.isdir(out_path): - os.mkdir(out_path) - - stl_to_gltf(path_to_stl, out_path, is_binary) \ No newline at end of file diff --git a/owl_demo/static/src/js/3d_viewer/test.glb b/owl_demo/static/src/js/3d_viewer/test.glb deleted file mode 100644 index c4a6352b..00000000 Binary files a/owl_demo/static/src/js/3d_viewer/test.glb and /dev/null differ diff --git a/owl_demo/static/src/js/components/MyComponent.js b/owl_demo/static/src/js/components/MyComponent.js deleted file mode 100644 index 7000aa9e..00000000 --- a/owl_demo/static/src/js/components/MyComponent.js +++ /dev/null @@ -1,25 +0,0 @@ -/** @odoo-module **/ - -const { Component, useState, mount, whenReady, xml } = owl; - -export class MyComponent extends Component { - static template = 'owl_demo.my_component' - - - setup() { - this.state = useState({ is_show:true}); - } - - onRemove(ev) { - this.state.is_show = false; - } - -} - -//MyComponent.template = 'owl_demo.MyComponent'; - -whenReady(() => { - var my_component = new MyComponent(); - mount(my_component, document.body); - //$("#myModal").modal('show'); -}); \ No newline at end of file diff --git a/owl_demo/static/src/js/components/PartnerOrderSummary.js b/owl_demo/static/src/js/components/PartnerOrderSummary.js deleted file mode 100644 index 39cce4ba..00000000 --- a/owl_demo/static/src/js/components/PartnerOrderSummary.js +++ /dev/null @@ -1,84 +0,0 @@ -/** @odoo-module **/ - -const { Component, useState, mount, xml } = owl; - -import { registry } from "@web/core/registry"; -import { formView } from "@web/views/form/form_view"; -import { FormCompiler } from "@web/views/form/form_compiler"; -import { FormRenderer } from '@web/views/form/form_renderer'; - -class PartnerOrderSummary extends Component { - partner = useState({}); - constructor(self, partner) { - super(); - this.partner = partner; - } -}; - -PartnerOrderSummary.template = "owl_demo.PartnerOrderSummary"; - - -function compilePartner(el, params) { -// this._rpc({ -// model: "res.partner", -// method: "read", -// args: [[this.state.data.partner_id.res_id]] -// }).then(data => { -// (new ComponentWrapper(this, -// PartnerOrderSummary, -// useState(data[0]) -// )).mount(element); -// }); - - return "

hello world

"; -} - -function compileForm() { - const res = this.compileForm(...arguments); - res.classList.append("test111"); - return res; -} - -export class SaleOrderFormCompiler extends FormCompiler { - setup() { - super.setup(); - this.compilers.unshift( - { selector: "form", fn: compileForm }, - { selector: "div .o_partner_order_summary", fn: compilePartner } - ); - } -} - -export class SaleOrderFormRenderer extends FormRenderer { } - -SaleOrderFormRenderer.components = { - ...FormRenderer.components, - PartnerOrderSummary, -}; - -registry.category('views').add('sale.view_order_form', { - ...formView, - Compiler: SaleOrderFormCompiler, - Renderer: SaleOrderFormRenderer, -}); - - -/*** 重载表单渲染器,对任何包含o_partner_order_summary这一class 的div挂载当前组件 */ -//FormRenderer.include({ -// _render: async function() { -// await this._super(...arguments); -// for (const element of this.el.querySelectorAll(".o_partner_order_summary")) { -// this._rpc({ -// model: "res.partner", -// method: "read", -// args: [[this.state.data.partner_id.res_id]] -// }).then(data => { -// (new ComponentWrapper(this, -// PartnerOrderSummary, -// useState(data[0]) -// )).mount(element); -// }); -// } -// } -//}); - diff --git a/owl_demo/static/src/js/html_template/template_demo_field.xml b/owl_demo/static/src/js/html_template/template_demo_field.xml deleted file mode 100644 index 43b015d1..00000000 --- a/owl_demo/static/src/js/html_template/template_demo_field.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - -
    -
  • Cras justo odio
  • -
  • Dapibus ac facilisis in
  • -
  • Morbi leo risus
  • -
  • Porta ac consectetur ac
  • -
  • Vestibulum at eros
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
- - - -
- - - - - - - - - - - - - -
diff --git a/owl_demo/static/src/js/html_template/template_field.js b/owl_demo/static/src/js/html_template/template_field.js deleted file mode 100644 index 90b2425c..00000000 --- a/owl_demo/static/src/js/html_template/template_field.js +++ /dev/null @@ -1,97 +0,0 @@ -/** @odoo-module **/ - -import { registry } from "@web/core/registry"; -import { _lt } from "@web/core/l10n/translation"; -import { standardFieldProps } from "@web/views/fields/standard_field_props"; -import { useInputField } from "@web/views/fields/input_field_hook"; -import { session } from "@web/session"; -import core from 'web.core'; -import rpc from 'web.rpc'; - -var QWeb = core.qweb; - -import { Component,useRef,useEffect } from "@odoo/owl"; - -export class CTemplateField extends Component { - setup() { - this.show_template = useRef('showTemplate') - useInputField({ - getValue: () => this.props.value || "" - }); - - useEffect( - (el) => { - if (!el) { - return; - } - return this.formatTemplate($(el)); - }, - () => [this.show_template.el], - ) - } - - formatTemplate($el) { - console.log($el) - var self=this; - if (this.props.readonly && this.props.value) { - //value = this.props.value + ' | ' + this.props.template_xml_id; - if (this.props.type == 'one2many' || this.props.type == 'many2many'){ - // 如果是one2many或many2many,就重新获取对象列表 - rpc.query({ - model: this.props.value.resModel, - method: 'read', - args: [this.props.value.currentIds,[]], - }).then((result) => { - console.log(result); - return $el.html(QWeb.render(this.props.template_xml_id,{'record':this.props.record,'current_field':result})) - }); - } - else if (this.props.type == 'many2one'){ - // 如果是one2many或many2many,就重新获取对象列表 - rpc.query({ - model: this.props.record.fields[this.props.name].relation, - method: 'read', - args: [this.props.value[0],[]], - }).then((result) => { - console.log(result); - return $el.html(QWeb.render(this.props.template_xml_id,{'record':this.props.record,'current_field':result[0]})) - }); - } - else{ - if (this.props.template_xml_id === undefined) - { - return $el.html(this.props.value); - }else{ - return $el.html(QWeb.render(this.props.template_xml_id,{'record':this.props.record,'current_field':this.props.value})); - } - - } - } - - // - } - -} - -CTemplateField.template = "owl_demo.CTemplateField"; -CTemplateField.props = { - ...standardFieldProps, - template_xml_id: { type: String, optional: true }, - placeholder: { type: String, optional: true }, -}; -CTemplateField.defaultProps = { -// hideSymbol: false, -// inputType: "text", -}; - -CTemplateField.supportedTypes = ["many2one","char"]; -CTemplateField.displayName = _lt("CTemplate"); - -CTemplateField.extractProps = ({ attrs }) => { - return { - template_xml_id: attrs.options.template, - placeholder: attrs.placeholder, - }; -}; - -registry.category("fields").add("CTemplate", CTemplateField); diff --git a/owl_demo/static/src/js/html_template/template_field.scss b/owl_demo/static/src/js/html_template/template_field.scss deleted file mode 100644 index 021ef387..00000000 --- a/owl_demo/static/src/js/html_template/template_field.scss +++ /dev/null @@ -1,3 +0,0 @@ -.o_field_widget.o_field_template { - display: block; -} diff --git a/owl_demo/static/src/js/html_template/template_field.xml b/owl_demo/static/src/js/html_template/template_field.xml deleted file mode 100644 index fbeb7274..00000000 --- a/owl_demo/static/src/js/html_template/template_field.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - -
- - - diff --git a/owl_demo/static/src/js/services/notification.js b/owl_demo/static/src/js/services/notification.js deleted file mode 100644 index 2096cd3a..00000000 --- a/owl_demo/static/src/js/services/notification.js +++ /dev/null @@ -1,25 +0,0 @@ -/** @odoo-module **/ - -import { registry } from "@web/core/registry"; - -const serviceRegistry = registry.category("services"); - -const myService = { - dependencies: ["notification","title","effect"], - start(env, { notification, title,effect }) { - -// let counter = 1; -// setInterval(() => { -// var tik_str = `Tick Tock ${counter++}`; -// notification.add(tik_str); -// title.setParts({ odoo: tik_str, fruit: tik_str }); -// effect.add({ -// type: "rainbow_man", // can be omitted, default type is already "rainbow_man" -// message: "Boom! Team record for the past 30 days." + tik_str, -// }); -// }, 5000); - - } -}; - -serviceRegistry.add("myService", myService); \ No newline at end of file diff --git a/owl_demo/static/src/js/widgets/MyWidget.js b/owl_demo/static/src/js/widgets/MyWidget.js deleted file mode 100644 index 49452cc6..00000000 --- a/owl_demo/static/src/js/widgets/MyWidget.js +++ /dev/null @@ -1,50 +0,0 @@ -/** @odoo-module **/ - -import AbstractField from 'web.AbstractField'; -import fieldRegistry from 'web.field_registry'; - -export const ShowUnitsWidgetField = AbstractField.extend({ - supportedFieldTypes: ['float','char','datetime'], - - /** - * @override - */ -// init: function () { -// this._super.apply(this, arguments); -// this.units = this.nodeOptions && this.nodeOptions.units || ''; -// }, - - /** - * @override - */ - _renderReadonly() { - this.units = this.nodeOptions && this.nodeOptions.units || ''; - this.$el.empty().html(this._formatValue(this.value) + " "+this.units+""); - }, - -}); - -fieldRegistry.add('show_units', ShowUnitsWidgetField); - -export const ShowUnitsWidgetField = AbstractField.extend({ - supportedFieldTypes: ['float','char','datetime'], - - /** - * @override - */ -// init: function () { -// this._super.apply(this, arguments); -// this.units = this.nodeOptions && this.nodeOptions.units || ''; -// }, - - /** - * @override - */ - _renderReadonly() { - this.units = this.nodeOptions && this.nodeOptions.units || ''; - this.$el.empty().html(this._formatValue(this.value) + " "+this.units+""); - }, - -}); - -fieldRegistry.add('show_units', ShowUnitsWidgetField); \ No newline at end of file diff --git a/owl_demo/static/src/xml/MyComponent.xml b/owl_demo/static/src/xml/MyComponent.xml deleted file mode 100644 index 6db9e2b2..00000000 --- a/owl_demo/static/src/xml/MyComponent.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - -
- -
-
- -
\ No newline at end of file diff --git a/owl_demo/static/src/xml/MyWidget.xml b/owl_demo/static/src/xml/MyWidget.xml deleted file mode 100644 index 00a6b92c..00000000 --- a/owl_demo/static/src/xml/MyWidget.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/owl_demo/static/src/xml/PartnerOrderSummary.xml b/owl_demo/static/src/xml/PartnerOrderSummary.xml deleted file mode 100644 index 1f1c5664..00000000 --- a/owl_demo/static/src/xml/PartnerOrderSummary.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - -
- - -

- -

- - - -

- -
-
-

- -

-

Orders

-
-
-

- -

-

Total Sales

-
-
-
-
-
\ No newline at end of file diff --git a/owl_demo/views/views.xml b/owl_demo/views/views.xml deleted file mode 100644 index b558e85b..00000000 --- a/owl_demo/views/views.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - sale.order.form.inherit - sale.order - - - - - - - - - - - - - sale.order.tree.inherit - sale.order - - - - CTemplate - {'template':'owl_demo.field_partner_id'} - - - - - - - - - \ No newline at end of file diff --git a/sf_bf_connect/controllers/controllers.py b/sf_bf_connect/controllers/controllers.py index 4ec71cd6..12270d8e 100644 --- a/sf_bf_connect/controllers/controllers.py +++ b/sf_bf_connect/controllers/controllers.py @@ -7,7 +7,7 @@ from odoo.http import request class Sf_Bf_Connect(http.Controller): - @http.route('/api/bfm_process_order/list', type='http', auth='none', methods=['GET', 'POST'], csrf=False, + @http.route('/api/bfm_process_order/list', type='http', auth='sf_token', methods=['GET', 'POST'], csrf=False, cors="*") def get_bfm_process_order_list(self, **kw): """ @@ -119,6 +119,7 @@ class Sf_Bf_Connect(http.Controller): logging.info('get_bfm_process_order_list error:%s' % e) res['status'] = -1 res['message'] = '工厂创建销售订单和产品失败,请联系管理员' + request.cr.rollback() return json.JSONEncoder().encode(res) diff --git a/sf_dlm/__manifest__.py b/sf_dlm/__manifest__.py index 098a2cdd..d124ca8d 100644 --- a/sf_dlm/__manifest__.py +++ b/sf_dlm/__manifest__.py @@ -10,7 +10,7 @@ """, 'category': 'sf', 'website': 'https://www.sf.jikimo.com', - 'depends': ['mrp', 'base', 'sf_manufacturing'], + 'depends': ['mrp', 'base', 'sf_manufacturing','web_widget_model_viewer'], 'data': [ 'data/product_data.xml', 'views/product_template_view.xml', diff --git a/sf_dlm/views/product_template_view.xml b/sf_dlm/views/product_template_view.xml index 89d390a2..ddc2704b 100644 --- a/sf_dlm/views/product_template_view.xml +++ b/sf_dlm/views/product_template_view.xml @@ -7,13 +7,16 @@ + - + - + + diff --git a/sf_sale/models/sale_order.py b/sf_sale/models/sale_order.py index aadd956e..817feda8 100644 --- a/sf_sale/models/sale_order.py +++ b/sf_sale/models/sale_order.py @@ -11,7 +11,6 @@ class ReSaleOrder(models.Model): address_of_delivery = fields.Char('交货人地址') # 业务平台分配工厂后在智能工厂先创建销售订单 - def sale_order_create(self, company_id, delivery_name, delivery_telephone, delivery_address, deadline_of_delivery): now_time = datetime.datetime.now() diff --git a/web_widget_model_viewer/__init__.py b/web_widget_model_viewer/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/web_widget_model_viewer/__init__.py @@ -0,0 +1 @@ + diff --git a/web_widget_model_viewer/__manifest__.py b/web_widget_model_viewer/__manifest__.py new file mode 100644 index 00000000..52ed13b1 --- /dev/null +++ b/web_widget_model_viewer/__manifest__.py @@ -0,0 +1,22 @@ +{ + "name": "3D模型展示", + "summary": "3D模型展示模块", + "description": "3D模型展示模块(限odoo16)", + "author": "Van", + "website": "https://jikimo.com", + "category": "Tutorials", + "version": "16.0.0.1", + "depends": ['web'], + "demo": [], + "data": [ + #'views/views.xml', #这是为了测试的效果,可以删除 + ], + 'assets': { + 'web.assets_qweb': [ + 'web_widget_model_viewer/static/src/js/3d_viewer.xml', + ], + 'web.assets_backend': [ + 'web_widget_model_viewer/static/src/js/*', + ], + } +} \ No newline at end of file diff --git a/web_widget_model_viewer/readme.md b/web_widget_model_viewer/readme.md new file mode 100644 index 00000000..ba98626a --- /dev/null +++ b/web_widget_model_viewer/readme.md @@ -0,0 +1,25 @@ +# 演示DEMO +## 先给销售订单添加一个Binary字段 + + class SaleOrder(models.Model): + _inherit = "sale.order" + + step_file = fields.Binary("Step File") + +## 然后在销售订单详情的表单视中增加一个带有widget的标签 + + + sale.order.form.inherit + sale.order + + + + + + + + + + + ## 然后就可以到销售订单页面上查看效果 +![img.png](static/src/images/img.png) \ No newline at end of file diff --git a/web_widget_model_viewer/static/src/images/img.png b/web_widget_model_viewer/static/src/images/img.png new file mode 100644 index 00000000..54080e49 Binary files /dev/null and b/web_widget_model_viewer/static/src/images/img.png differ diff --git a/web_widget_model_viewer/static/src/js/3d_viewer.js b/web_widget_model_viewer/static/src/js/3d_viewer.js new file mode 100644 index 00000000..261590fb --- /dev/null +++ b/web_widget_model_viewer/static/src/js/3d_viewer.js @@ -0,0 +1,62 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { _lt } from "@web/core/l10n/translation"; +import { standardFieldProps } from "@web/views/fields/standard_field_props"; +import { useInputField } from "@web/views/fields/input_field_hook"; +import { FileUploader } from "@web/views/fields/file_handler"; +import { session } from "@web/session"; +import { useService } from "@web/core/utils/hooks"; +import { isBinarySize } from "@web/core/utils/binary"; +import { download } from "@web/core/network/download"; +import utils from 'web.utils'; + +import core from 'web.core'; +import rpc from 'web.rpc'; + +var QWeb = core.qweb; + +import { Component, onWillUpdateProps, useState, useRef, useEffect } from "@odoo/owl"; + +export class StepViewer extends Component { + setup() { + this.props.url = this.formatUrl(); + } + + formatUrl(){ + var url = ''; + if (this.props.value) { + if (utils.is_bin_size(this.props.value)) { + var url_props = { + base_url: session['web.base.url'], + model: this.props.record.resModel, + id: JSON.stringify(this.props.record.data['id']), + field: this.props.name} + url = url_props['base_url']+'/web/content/'+url_props['model']+'/'+url_props['id']+'/'+url_props['field']+'?download=true' + + } else { + url = "data:model/gltf-binary;base64," + this.props.value; + } + } + return url + } + +} + +StepViewer.template = "web_widget_model_viewer.BinaryField3d"; + +StepViewer.displayName = _lt("3D File"); +StepViewer.supportedTypes = ["binary"]; + +StepViewer.props = { + ...standardFieldProps, + url: { type: String, optional: true }, +}; + +StepViewer.extractProps = ({ attrs }) => { + return { + url: attrs.options.url, + }; +}; + +registry.category("fields").add("Viewer3D", StepViewer); diff --git a/web_widget_model_viewer/static/src/js/3d_viewer.xml b/web_widget_model_viewer/static/src/js/3d_viewer.xml new file mode 100644 index 00000000..a9da9606 --- /dev/null +++ b/web_widget_model_viewer/static/src/js/3d_viewer.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +