diff --git a/app_odoo_customize/__manifest__.py b/app_odoo_customize/__manifest__.py index f2ab035b..f1955116 100644 --- a/app_odoo_customize/__manifest__.py +++ b/app_odoo_customize/__manifest__.py @@ -23,17 +23,65 @@ { 'name': 'odoo 15 Customize OEM(Boost, Data reset)', - 'version': '15.21.10.07', + 'version': '15.21.10.08', 'author': 'Sunpop.cn', 'category': 'Productivity', 'website': 'https://www.sunpop.cn', 'license': 'LGPL-3', 'sequence': 2, + 'images': ['static/description/banner.gif'], 'summary': """ - 1 click customize odoo, reset data. For quick develop. Set brand, boost, reset data, debug. Language Switcher. + 1 click customize odoo, reset data. For quick develop. Set brand, boost, reset data, debug. Language Switcher. Easy Delete data.reset account chart. - customize my odoo. + customize my odoo. """, + 'depends': [ + 'base_setup', + 'web', + 'mail', + 'iap', + # 'digest', + # when enterprise + # 'web_mobile' + ], + 'data': [ + 'security/res_groups.xml', + 'security/ir.model.access.csv', + 'views/app_odoo_customize_views.xml', + 'views/app_theme_config_settings_views.xml', + 'views/res_config_settings_views.xml', + 'views/ir_views.xml', + 'views/ir_module_module_views.xml', + 'views/ir_translation_views.xml', + 'views/ir_ui_menu_views.xml', + 'views/ir_ui_view_views.xml', + 'views/ir_model_fields_views.xml', + 'views/ir_model_data_views.xml', + # data + 'data/ir_config_parameter_data.xml', + 'data/ir_module_module_data.xml', + # 'data/digest_template_data.xml', + 'data/res_company_data.xml', + ], + # 'qweb': [ + # 'static/src/xml/*.xml', + # ], + 'assets': { + 'web.assets_backend': [ + 'app_odoo_customize/static/src/scss/app.scss', + 'app_odoo_customize/static/src/scss/ribbon.scss', + 'app_odoo_customize/static/src/scss/dialog.scss', + 'app_odoo_customize/static/src/js/app_window_title.js', + 'app_odoo_customize/static/src/js/user_menu.js', + # 'app_odoo_customize/static/src/js/ribbon.js', + 'app_odoo_customize/static/src/js/dialog.js', + ], + }, + 'pre_init_hook': 'pre_init_hook', + 'post_init_hook': 'post_init_hook', + 'installable': True, + 'application': True, + 'auto_install': True, 'description': """ App Customize Odoo (Change Title,Language,Documentation,Quick Debug) @@ -87,7 +135,7 @@ The user can get the help document just by one click. ## 在符合odoo开源协议的前提下,去除odoo版权信息,自定义你的odoo 可完全自行设置下列 odoo 选项,让 odoo 看上去像是你的软件产品 - 支持odoo 15,14,13,12, 11, 10, 9 版本,社区版企业版通用 + 支持odoo 15,14,13,12, 11, 10, 9 版本,社区版企业版通用 1. 删除菜单导航页脚的 Odoo 标签 2. 将弹出窗口中 "Odoo" 设置为自定义名称 3. 自定义用户菜单中的 Documentation, Support, About 的链接 @@ -119,61 +167,13 @@ 29. App版本比较,快速查看可本地更新的模块 30. 一键导出翻译文件 po 31. 显示或去除 odoo 推荐 - 32. 增加修复品类及区位名的操作 - 33. 增加 Demo 的显示设置 - 34. 增加清除质检数据 - 35. 优化至odoo14适用 - 36. 可为多个模块强制更新翻译 - 37. noupdate字段的快速管理,主要针对 xml_id - 38. 对话框可拖拽 + 32. 增加修复品类及区位名的操作 + 33. 增加 Demo 的显示设置 + 34. 增加清除质检数据 + 35. 优化至odoo14适用 + 36. 可为多个模块强制更新翻译 + 37. noupdate字段的快速管理,主要针对 xml_id + 38. 对话框可拖拽 39. 只有系统管理员可以操作快速debug """, - 'images': ['static/description/banner.gif'], - 'depends': [ - 'base_setup', - 'web', - 'mail', - 'iap', - # 'digest', - # when enterprise - # 'web_mobile' - ], - 'data': [ - 'security/res_groups.xml', - 'security/ir.model.access.csv', - 'views/app_odoo_customize_views.xml', - 'views/app_theme_config_settings_views.xml', - 'views/res_config_settings_views.xml', - 'views/ir_views.xml', - 'views/ir_module_module_views.xml', - 'views/ir_translation_views.xml', - 'views/ir_ui_menu_views.xml', - 'views/ir_ui_view_views.xml', - 'views/ir_model_fields_views.xml', - 'views/ir_model_data_views.xml', - # data - 'data/ir_config_parameter_data.xml', - 'data/ir_module_module_data.xml', - # 'data/digest_template_data.xml', - 'data/res_company_data.xml', - ], - 'qweb': [ - 'static/src/xml/*.xml', - ], - 'assets': { - 'web.assets_backend': [ - 'app_odoo_customize/static/src/scss/app.scss', - 'app_odoo_customize/static/src/scss/ribbon.scss', - 'app_odoo_customize/static/src/scss/dialog.scss', - 'app_odoo_customize/static/src/js/app_window_title.js', - 'app_odoo_customize/static/src/js/customize_user_menu.js', - 'app_odoo_customize/static/src/js/ribbon.js', - 'app_odoo_customize/static/src/js/dialog.js', - ], - }, - 'pre_init_hook': 'pre_init_hook', - 'post_init_hook': 'post_init_hook', - 'installable': True, - 'application': True, - 'auto_install': True, } diff --git a/app_odoo_customize/data/ir_config_parameter_data.xml b/app_odoo_customize/data/ir_config_parameter_data.xml index 849a5a26..794b1da5 100644 --- a/app_odoo_customize/data/ir_config_parameter_data.xml +++ b/app_odoo_customize/data/ir_config_parameter_data.xml @@ -17,7 +17,7 @@ - + diff --git a/app_odoo_customize/models/__init__.py b/app_odoo_customize/models/__init__.py index 1c5bcbfb..3c95cea5 100644 --- a/app_odoo_customize/models/__init__.py +++ b/app_odoo_customize/models/__init__.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- from . import res_config_settings -from . import ir_ui_view from . import base_language_install from . import ir_module_module from . import web_environment_ribbon_backend +from . import ir_http +# from . import ir_ui_view # from . import ir_ui_menu diff --git a/app_odoo_customize/models/ir_http.py b/app_odoo_customize/models/ir_http.py new file mode 100644 index 00000000..ddf8a9d6 --- /dev/null +++ b/app_odoo_customize/models/ir_http.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + + +from odoo import models +from odoo.http import request + + + +class IrHttp(models.AbstractModel): + _inherit = 'ir.http' + + def session_info(self): + result = super(IrHttp, self).session_info() + config_parameter = request.env['ir.config_parameter'].sudo() + result['app_system_name'] = config_parameter.get_param('app_system_name', 'odooApp') + result['app_documentation_url'] = config_parameter.get_param('app_documentation_url') + result['app_documentation_dev_url'] = config_parameter.get_param('app_documentation_dev_url') + result['app_support_url'] = config_parameter.get_param('app_support_url') + result['app_account_title'] = config_parameter.get_param('app_account_title') + result['app_account_url'] = config_parameter.get_param('app_account_url') + result['app_show_documentation'] = config_parameter.get_param('app_show_documentation') + result['app_show_documentation_dev'] = config_parameter.get_param('app_show_documentation_dev') + result['app_show_support'] = config_parameter.get_param('app_show_support') + result['app_show_account'] = config_parameter.get_param('app_show_account') + result['app_show_poweredby'] = config_parameter.get_param('app_show_poweredby') + return result diff --git a/app_odoo_customize/models/ir_module_module.py b/app_odoo_customize/models/ir_module_module.py index a4f8e391..e8028b2b 100644 --- a/app_odoo_customize/models/ir_module_module.py +++ b/app_odoo_customize/models/ir_module_module.py @@ -46,7 +46,7 @@ class IrModule(models.Model): }) return action - @api.depends('name', 'state') + @api.depends('name', 'latest_version', 'state') def _get_latest_version(self): default_version = modules.adapt_version('1.0') for module in self: diff --git a/app_odoo_customize/models/ir_ui_view.py b/app_odoo_customize/models/ir_ui_view.py index 632653f7..30217efd 100644 --- a/app_odoo_customize/models/ir_ui_view.py +++ b/app_odoo_customize/models/ir_ui_view.py @@ -9,10 +9,9 @@ _logger = logging.getLogger(__name__) class View(models.Model): _inherit = 'ir.ui.view' - @api.model - def render_template(self, template, values=None, engine='ir.qweb'): - if template in ['web.login', 'web.webclient_bootstrap']: - if not values: - values = {} - values["title"] = self.env['ir.config_parameter'].sudo().get_param("app_system_name", "odooApp") - return super(View, self).render_template(template, values=values, engine=engine) \ No newline at end of file + def _render_template(self, template, values=None, engine='ir.qweb'): + # if template in ['web.login', 'web.webclient_bootstrap']: + if not values: + values = {} + values["title"] = values["app_title"] = self.env['ir.config_parameter'].sudo().get_param("app_system_name", "odooApp") + return super(View, self)._render_template(template, values=values, engine=engine) diff --git a/app_odoo_customize/models/res_config_settings.py b/app_odoo_customize/models/res_config_settings.py index 84d1932a..98176652 100644 --- a/app_odoo_customize/models/res_config_settings.py +++ b/app_odoo_customize/models/res_config_settings.py @@ -3,6 +3,7 @@ import logging from odoo import api, fields, models, _ +from odoo.exceptions import UserError, ValidationError _logger = logging.getLogger(__name__) diff --git a/app_odoo_customize/static/src/js/app_window_title.js b/app_odoo_customize/static/src/js/app_window_title.js index 8e673b54..155261eb 100644 --- a/app_odoo_customize/static/src/js/app_window_title.js +++ b/app_odoo_customize/static/src/js/app_window_title.js @@ -1,12 +1,13 @@ -odoo.define('app_odoo_customize.app_system_name', function (require) { -"use strict"; +/** @odoo-module **/ -var WebClient = require('web.WebClient'); -WebClient.include({ - init: function() { +import { WebClient } from "@web/webclient/webclient"; +import { patch } from "@web/core/utils/patch"; +import { session } from "@web/session"; + +patch(WebClient.prototype, "app_odoo_customize.WebClient", { + setup() { this._super.apply(this, arguments); - this.set('title_part', {"zopenerp": document.title}); + const app_system_name = session.app_system_name || 'odooApp'; + this.title.setParts({ zopenerp: app_system_name }); // zopenerp is easy to grep } }); - -}); \ No newline at end of file diff --git a/app_odoo_customize/static/src/js/dialog.js b/app_odoo_customize/static/src/js/dialog.js index 2cc20f82..8c337eb9 100644 --- a/app_odoo_customize/static/src/js/dialog.js +++ b/app_odoo_customize/static/src/js/dialog.js @@ -1,17 +1,23 @@ -odoo.define('app_odoo_customize.dialog', function (require) { -'use strict'; +/** @odoo-module **/ - var Dialog = require('web.Dialog'); +import { Dialog } from "@web/core/dialog/dialog"; +import { patch } from "@web/core/utils/patch"; +import { session } from "@web/session"; - Dialog.include({ - open: function () { - this._super.apply(this, arguments); - this._opened.then(function(){ - $(".modal-content").draggable({ - handle: ".modal-header" - }); - }); - return this; - }, - }); +patch(Dialog.prototype, "app_odoo_customize.Dialog", { + setup() { + this._super.apply(this, arguments); + const app_system_name = session.app_system_name || "odooApp"; + this.title = app_system_name; + }, + // mounted() { + // //todo: 没用,不能用 jq的处理方式 + // this._super.apply(this, arguments); + // var $dl = this.__owl__.vnode ? this.__owl__.vnode.elm : null; + // var $ml = $dl.children[0].children[0].children[0]; + // $ml.draggable({ + // handle: ".modal-header" + // }); + // }, }); + diff --git a/app_odoo_customize/static/src/js/user_menu.js b/app_odoo_customize/static/src/js/user_menu.js new file mode 100644 index 00000000..016f1c32 --- /dev/null +++ b/app_odoo_customize/static/src/js/user_menu.js @@ -0,0 +1,116 @@ +/** @odoo-module **/ + +import { UserMenu } from "@web/webclient/user_menu/user_menu"; +import { routeToUrl } from "@web/core/browser/router_service"; +import { patch } from "@web/core/utils/patch"; +import { browser } from "@web/core/browser/browser"; +import { registry } from "@web/core/registry"; +import { session } from "@web/session"; +const userMenuRegistry = registry.category("user_menuitems"); + +patch(UserMenu.prototype, "app_odoo_customize.UserMenu", { + setup() { + this._super.apply(this, arguments); + userMenuRegistry.remove("documentation"); + userMenuRegistry.remove("support"); + userMenuRegistry.remove("odoo_account"); + userMenuRegistry.add("debug", debugItem) + .add("asset_asset", activateAssetsDebugging) + .add("leave_debug", leaveDebugMode) + .add("separator0", separator8) + .add("documentation", documentationItem) + .add("support", supportItem) + .add("odoo_account", odooAccountItem); + }, + // getElements() { + // var ret = this._super.apply(this, arguments); + // return ret; + // }, +}); + +function debugItem(env) { + const url_debug = $.param.querystring(window.location.href, 'debug=1'); + return { + type: "item", + id: "debug", + description: env._t("Activate the developer mode"), + href: url_debug, + callback: () => { + browser.open(url_debug, "_self"); + }, + sequence: 5, + }; +} + +function activateAssetsDebugging(env) { + return { + type: "item", + description: env._t("Activate Assets Debugging"), + callback: () => { + browser.location.search = "?debug=assets"; + }, + sequence: 6, + }; +} + +function leaveDebugMode(env) { + return { + type: "item", + description: env._t("Leave the Developer Tools"), + callback: () => { + const route = env.services.router.current; + route.search.debug = ""; + browser.location.href = browser.location.origin + routeToUrl(route); + }, + sequence: 7, + }; +} + +function separator8() { + return { + type: "separator", + sequence: 8, + }; +} +function documentationItem(env) { + const documentationURL = session.app_documentation_url; + return { + type: "item", + id: "documentation", + description: env._t("Documentation"), + href: documentationURL, + callback: () => { + browser.open(documentationURL, "_blank"); + }, + sequence: 10, + }; +} + +function supportItem(env) { + const url = session.app_support_url; + return { + type: "item", + id: "support", + description: env._t("Support"), + href: url, + callback: () => { + browser.open(url, "_blank"); + }, + sequence: 20, + }; +} + +function odooAccountItem(env) { + const app_account_title = session.app_account_title; + const app_account_url = session.app_account_url; + return { + type: "item", + id: "account", + description: env._t(app_account_title), + href: app_account_url, + callback: () => { + browser.open(app_account_url, "_blank"); + }, + sequence: 60, + }; +} diff --git a/app_odoo_customize/static/src/xml/customize_user_menu.xml b/app_odoo_customize/static/src/xml/customize_user_menu.xml index 8662379b..95834640 100644 --- a/app_odoo_customize/static/src/xml/customize_user_menu.xml +++ b/app_odoo_customize/static/src/xml/customize_user_menu.xml @@ -1,6 +1,8 @@ - + + + Activate the developer mode