diff --git a/app_base_chinese/data/res_lang_data.xml b/app_base_chinese/data/res_lang_data.xml index a8789afc..f91c7829 100644 --- a/app_base_chinese/data/res_lang_data.xml +++ b/app_base_chinese/data/res_lang_data.xml @@ -2,12 +2,12 @@ - + 中文 %Y-%m-%d %H:%M:%S - + English diff --git a/app_base_chinese/data/res_partner_data.xml b/app_base_chinese/data/res_partner_data.xml index 1a824678..df834a0e 100644 --- a/app_base_chinese/data/res_partner_data.xml +++ b/app_base_chinese/data/res_partner_data.xml @@ -1,7 +1,7 @@ - + 公共访客用户 diff --git a/app_base_chinese/data/sales_team_data.xml b/app_base_chinese/data/sales_team_data.xml index 249d2f59..007a20fe 100644 --- a/app_base_chinese/data/sales_team_data.xml +++ b/app_base_chinese/data/sales_team_data.xml @@ -1,8 +1,11 @@ - + 中国 + + China + diff --git a/app_chatgpt/__manifest__.py b/app_chatgpt/__manifest__.py index f6be58d9..ba7e919f 100644 --- a/app_chatgpt/__manifest__.py +++ b/app_chatgpt/__manifest__.py @@ -10,7 +10,7 @@ { 'name': 'ChatGPT4,Google Bard, AiGC Center.Ai服务中心,聚合全网Ai', - 'version': '16.23.07.29', + 'version': '16.23.08.15', 'author': 'odooai.cn', 'company': 'odooai.cn', 'maintainer': 'odooai.cn', @@ -61,6 +61,7 @@ 'views/ai_robot_views.xml', 'views/res_partner_ai_use_views.xml', 'views/res_users_views.xml', + 'views/mail_channel_views.xml', ], 'assets': { 'mail.assets_messaging': [ diff --git a/app_chatgpt/models/__init__.py b/app_chatgpt/models/__init__.py index 6f41af76..aadc6ff6 100644 --- a/app_chatgpt/models/__init__.py +++ b/app_chatgpt/models/__init__.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- +from . import res_partner from . import mail_channel from . import res_config_settings from . import ai_robot -from . import res_partner from . import res_partner_ai_use from . import res_users from . import mail_message diff --git a/app_chatgpt/models/mail_channel.py b/app_chatgpt/models/mail_channel.py index a635ec1e..bed7cf1e 100644 --- a/app_chatgpt/models/mail_channel.py +++ b/app_chatgpt/models/mail_channel.py @@ -15,8 +15,84 @@ _logger = logging.getLogger(__name__) class Channel(models.Model): _inherit = 'mail.channel' - - def get_openai_context(self, channel_id, author_id, answer_id, minutes=30, chat_count=1): + + is_private = fields.Boolean(string="私有频道", default=False, help="私人频道不公开,可邀请及清退指定用户") + # 因为 channel_member_ids 不好处理,在此增加此字段 + # 主Ai + ai_partner_id = fields.Many2one(comodel_name="res.partner", string="专属主Ai", required=False, + domain=[('gpt_id', '!=', None), ('is_chat_private', '=', True)], + default=lambda self: self._app_get_m2o_default('ai_partner_id'), + help="主Ai是主要对话对象,当没有@操作时,由主Ai回答", ) + ext_ai_partner_id = fields.Many2one(comodel_name="res.partner", string="辅助Ai", + domain=[('gpt_id', '!=', None), ('is_chat_private', '=', True)], + help="通过 @辅助Ai 可以让辅助Ai回答问题", ) + description = fields.Char('Ai角色设定', help="填写后,Ai将以您设定的身份与你交互,如:你是一个在航空航天领域的专家。不填则根据问题智能处理") + set_max_tokens = fields.Selection([ + ('300', '简短'), + ('600', '标准'), + ('1000', '中等'), + ('2000', '长篇'), + ('3000', '超长篇'), + ('32000', '32K'), + ], string='响应篇幅限制', default='600', help="越大返回内容越多,计费也越多") + set_chat_count = fields.Selection([ + ('none', 'Ai自动判断'), + ('1', '1标准'), + ('3', '3强关联'), + ('5', '5超强关联'), + ], string="上下文相关", default='1', help="0-5,设定后,会将最近n次对话发给Ai,有助于他更好的回答,但太大费用也高") + set_temperature = fields.Selection([ + ('2', '天马行空'), + ('1.5', '创造性'), + ('1', '标准'), + ('0.6', '理性'), + ('0.1', '保守'), + ], string="创造性", default='1', help="0-21,值越大越富有想像力,越小则越保守") + set_top_p = fields.Selection([ + ('0.9', '严谨惯性思维'), + ('0.6', '标准推理'), + ('0.4', '跳跃性'), + ('0.1', '随便'), + ], string="思维连贯性", default='0.6', help="0-1,值越大越倾向大众化的连贯思维") + # 避免使用常用词 + set_frequency_penalty = fields.Selection([ + ('2', '老学究-晦涩难懂'), + ('1.5', '学院派-较多高级词'), + ('1', '标准'), + ('0.1', '少常用词'), + ('-1', '通俗易懂'), + ('-2', '大白话'), + ], string='语言风格', default='1', help="-2~2,值越大越少使用常用词") + set_presence_penalty = fields.Selection([ + ('2', '多样强迫症'), + ('1.5', '新颖化'), + ('1', '标准'), + ('0.1', '允许常规重复'), + ('-1', '允许较多重复'), + ('-2', '更多强调重复'), + ], string='用词多样性', default='1', help="-2~2,值越大越少重复词") + + # todo: 这里用 compute? + max_tokens = fields.Integer('最长响应Token', default=600, help="越大返回内容越多,计费也越多") + chat_count = fields.Integer(string="上下文数量", default=0, help="0~3,设定后,会将最近n次对话发给Ai,有助于他更好的回答") + temperature = fields.Float(string="创造性值", default=1, help="0~2,值越大越富有想像力,越小则越保守") + top_p = fields.Float(string="连贯性值", default=0.6, help="0~1,值越大越富有想像力,越小则越保守") + frequency_penalty = fields.Float('避免常用词值', default=1, help="-2~2,值越大越少使用常用词") + presence_penalty = fields.Float('避免重复词值', default=1, help="-2~2,值越大越少重复词") + + is_current_channel = fields.Boolean('是否当前用户默认频道', compute='_compute_is_current_channel', help='是否当前用户默认微信对话频道') + + def name_get(self): + result = [] + for c in self: + if c.channel_type == 'channel' and c.is_private: + pre = '[私]' + else: + pre = '' + result.append((c.id, "%s%s" % (pre, c.name or ''))) + return result + + def get_openai_context(self, channel_id, author_id, answer_id, minutes=30, chat_count=0): # 上下文处理,要处理群的方式,以及独聊的方式 # azure新api 处理 context_history = [] @@ -39,7 +115,10 @@ class Channel(models.Model): domain = expression.AND([domain, [('date', '>=', afterTime)]]) else: domain = expression.AND([domain, [('author_id', '=', answer_id.id)]]) - ai_msg_list = message_model.with_context(tz='UTC').search(domain, order="id desc", limit=chat_count) + if chat_count == 0: + ai_msg_list = [] + else: + ai_msg_list = message_model.with_context(tz='UTC').search(domain, order="id desc", limit=chat_count) for ai_msg in ai_msg_list: # 判断这个 ai_msg 是不是ai发,有才 insert。 判断 user_msg 是不是 user发的,有才 insert user_msg = ai_msg.parent_id.sudo() @@ -95,7 +174,9 @@ class Channel(models.Model): # 不处理 一般notify,但处理欢迎 if '
joined the channel
'): - return rdata + return rdata + if 'o_odoobot_command' in message.body: + return rdata if channel_type == 'chat': channel_partner_ids = self.channel_partner_ids @@ -155,7 +236,8 @@ class Channel(models.Model): # elif user_id.gpt_id and not is_allow: # # 暂时有限用户的Ai # raise UserError(_('此Ai暂时未开放,请联系管理员。')) - + if hasattr(ai, 'is_translator') and ai.is_translator: + return rdata chatgpt_channel_id = self.env.ref('app_chatgpt.channel_chatgpt') if message.body == _('
joined the channel
'): @@ -186,12 +268,14 @@ class Channel(models.Model): openai.api_key = api_key # 非4版本,取0次。其它取3 次历史 chat_count = 3 - if '4' in ai.ai_model: + if '4' in ai.ai_model or '4' in ai.name: + chat_count = 1 if hasattr(self, 'chat_count'): if self.chat_count > 0: chat_count = 1 else: chat_count = chat_count + if author_id != answer_id.id and self.channel_type == 'chat': # 私聊 _logger.info(f'私聊:author_id:{author_id},partner_chatgpt.id:{answer_id.id}') diff --git a/app_chatgpt/models/res_partner.py b/app_chatgpt/models/res_partner.py index a4b6787b..c6b7f597 100644 --- a/app_chatgpt/models/res_partner.py +++ b/app_chatgpt/models/res_partner.py @@ -1,9 +1,58 @@ # -*- coding: utf-8 -*- -from odoo import fields, models +from odoo import fields, models, api class ResPartner(models.Model): _inherit = "res.partner" gpt_id = fields.Many2one('ai.robot', string='Bind to ChatGpt') + + is_chat_private = fields.Boolean('Allow Chat Private', default=False) + + @api.model + def im_search(self, name, limit=20): + users = self.env['res.users'].search([ + ('id', '!=', self.env.user.id), + ('name', 'ilike', name), + ('active', '=', True), + ('share', '=', False), + ('is_chat_private', '=', True) + ], order='gpt_id, name, id', limit=limit) + return list(users.partner_id.mail_partner_format().values()) + + def mail_partner_format(self, fields=None): + # 直接覆盖原生,增加 gpt_id 字段 + partners_format = dict() + if not fields: + fields = {'id': True, 'name': True, 'email': True, 'active': True, 'im_status': True, 'gpt_id': 0, 'user': {}} + for partner in self: + data = {} + if 'id' in fields: + data['id'] = partner.id + if 'name' in fields: + name = partner.name + # 英文不好分,暂时不隐名 + # if not partner.related_user_id.gpt_id: + # name = partner.name[0] + '*' * (len(partner.name) - 1) + data['name'] = name + if 'email' in fields: + data['email'] = partner.email + if 'active' in fields: + data['active'] = partner.active + if 'im_status' in fields: + data['im_status'] = partner.im_status + if 'gpt_id' in fields: + data['gpt_id'] = partner.gpt_id.id if partner.gpt_id else 0 + if 'user' in fields: + internal_users = partner.user_ids - partner.user_ids.filtered('share') + main_user = internal_users[0] if len(internal_users) > 0 else partner.user_ids[0] if len(partner.user_ids) > 0 else self.env['res.users'] + data['user'] = { + "id": main_user.id, + "isInternalUser": not main_user.share, + } if main_user else [('clear',)] + # if 'guest' in self.env.context or not self.env.user.has_group('base.group_erp_manager'): + # 完全不显示 邮箱 + data.pop('email', None) + partners_format[partner] = data + return partners_format diff --git a/app_chatgpt/models/res_users.py b/app_chatgpt/models/res_users.py index 2c4f3b1d..b6bff3a5 100644 --- a/app_chatgpt/models/res_users.py +++ b/app_chatgpt/models/res_users.py @@ -14,3 +14,4 @@ class ResUsers(models.Model): ], string='Allowed Conversation Mode', default='all', ondelete='set default') gpt_wl_partners = fields.Many2many('res.partner', 'res_partner_ai_use', 'ai_user_id', 'name', string='Allowed Partners') gpt_demo_time = fields.Integer('Default Demo Time', default=0) + is_chat_private = fields.Boolean('Allow Chat Private', default=False, related='partner_id.is_chat_private', inherited=True, readonly=False) \ No newline at end of file diff --git a/app_chatgpt/security/ir.model.access.csv b/app_chatgpt/security/ir.model.access.csv index b9e2237f..6319725b 100644 --- a/app_chatgpt/security/ir.model.access.csv +++ b/app_chatgpt/security/ir.model.access.csv @@ -1,4 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_gpt_robt_manager,AiRobotUser,model_ai_robot,base.group_erp_manager,1,1,1,1 access_res_partner_ai_use_user,ResPartnerAiUseUser,model_res_partner_ai_use,base.group_user,1,0,0,0 -access_res_partner_ai_use_manager,ResPartnerAiUseUser,model_res_partner_ai_use,sales_team.group_sale_manager,1,1,1,1 \ No newline at end of file +access_res_partner_ai_use_manager,ResPartnerAiUseUser,model_res_partner_ai_use,base.group_erp_manager,1,1,1,1 \ No newline at end of file diff --git a/app_chatgpt/security/ir_rules.xml b/app_chatgpt/security/ir_rules.xml index 025766fd..f95001d2 100644 --- a/app_chatgpt/security/ir_rules.xml +++ b/app_chatgpt/security/ir_rules.xml @@ -11,6 +11,6 @@ All AI Use [(1,'=',1)] - +
\ No newline at end of file diff --git a/app_chatgpt/views/mail_channel_views.xml b/app_chatgpt/views/mail_channel_views.xml new file mode 100644 index 00000000..937d3fc2 --- /dev/null +++ b/app_chatgpt/views/mail_channel_views.xml @@ -0,0 +1,111 @@ + + + + + + + ai.mail.channel.form + mail.channel + extension + + + + + + + + + + + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + +
+
+
+
+ + + +

0-3,设定后,会将最近n次对话发给Ai,有助于他更好的回答

+ +

最大响应Token,控制返回内容长度

+ +

0-1,值越大越富有想像力,越小则越保守

+ +

0-1,值越大越少使用常用词

+ +

0-1,值越大越少重复词

+
+
+
+
+ + + + mail.channel + + extension + + + + + + 角色: + + + + + + + + + + + + + + mail.channel + + + + + + + + + + + +
+
diff --git a/app_common/__manifest__.py b/app_common/__manifest__.py index bb840355..1be0a196 100644 --- a/app_common/__manifest__.py +++ b/app_common/__manifest__.py @@ -39,7 +39,7 @@ { 'name': "odooai Odooapp Common Func", - 'version': '16.23.05.09', + 'version': '16.23.08.17', 'author': 'odooai.cn', 'category': 'Base', 'website': 'https://www.odooai.cn', diff --git a/app_common/models/__init__.py b/app_common/models/__init__.py index feeb3377..b9af2dec 100644 --- a/app_common/models/__init__.py +++ b/app_common/models/__init__.py @@ -29,6 +29,7 @@ from . import res_users from . import ir_mail_server from . import mail_mail from . import ir_http +from . import app_import diff --git a/app_common/models/app_import.py b/app_common/models/app_import.py new file mode 100644 index 00000000..c608bc4b --- /dev/null +++ b/app_common/models/app_import.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +import base64 +import io +import csv +import os.path + +from odoo import api, fields, models, modules, tools, SUPERUSER_ID, _ +from odoo.tools import pycompat +from odoo.tests import common +ADMIN_USER_ID = common.ADMIN_USER_ID + +def app_quick_import(cr, content_path, sep=None): + if not sep: + sep = '/' + dir_split = content_path.split(sep) + module_name = dir_split[0] + file_name = dir_split[2] + file_path, file_type = os.path.splitext(content_path) + model_name = file_name.replace(file_type, '') + file_path = modules.get_module_resource(module_name, dir_split[1], file_name) + content = open(file_path, 'rb').read() + uid = SUPERUSER_ID + if model_name == 'mail.channel': + # todo: 创建mail.channel时,如果用root用户会报错 + uid = 2 + env = api.Environment(cr, uid, {}) + if file_type == '.csv': + file_type = 'text/csv' + elif file_type in ['.xls', '.xlsx']: + file_type = 'application/vnd.ms-excel' + import_wizard = env['base_import.import'].create({ + 'res_model': model_name, + 'file_name': file_name, + 'file_type': file_type, + 'file': content, + }) + if file_type == 'text/csv': + preview = import_wizard.parse_preview({ + 'separator': ',', + 'has_headers': True, + 'quoting': '"', + }) + elif file_type == 'application/vnd.ms-excel': + preview = import_wizard.parse_preview({ + 'has_headers': True, + }) + result = import_wizard.execute_import( + preview["headers"], + preview["headers"], + preview["options"] + ) + + diff --git a/app_odoo_customize/__init__.py b/app_odoo_customize/__init__.py index 32eadd1c..b2860ba3 100644 --- a/app_odoo_customize/__init__.py +++ b/app_odoo_customize/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- +from . import controllers from . import models from . import wizard from . import hooks diff --git a/app_odoo_customize/__manifest__.py b/app_odoo_customize/__manifest__.py index 5f22841e..40aba2a7 100644 --- a/app_odoo_customize/__manifest__.py +++ b/app_odoo_customize/__manifest__.py @@ -23,7 +23,7 @@ { 'name': 'odoo 16 Customize OEM(Boost, Data reset)', - 'version': '16.23.08.05', + 'version': '16.23.08.15', 'author': 'odooai.cn', 'category': 'Extra Tools', 'website': 'https://www.odooai.cn', @@ -135,6 +135,9 @@ 40. Fix support for enterprise version. 41. Fix odoo bug, when click Preferences menu not hide in mobile. 42. Add menu navbar setup for top or bottom. navigator footer support. + 43. Check to only Debug / Debug Assets for Odoo Admin. Deny debug from url for other user. + 44. Check to stop subscribe and follow. This to make odoo speed up. + 45. Add addons path info to module. This module can help to white label the Odoo. Also helpful for training and support for your odoo end-user. @@ -183,5 +186,9 @@ 39. 只有系统管理员可以操作快速debug 40. 增强对企业版的支持 41. 修正odoo原生移动端菜单bug,点击个人设置时,原菜单不隐藏等 + 42. 可设置导航栏在上方还是下方,分开桌面与移动端. + 43. 可设置只允许管理员进入开发者模式,不可在url中直接debut=1来调试 + 44. 可配置停用自动用户订阅功能,这会提速odoo,减少资源消耗 + 45. 为应用模块增加模块路径信息 """, } diff --git a/app_odoo_customize/controllers/__init__.py b/app_odoo_customize/controllers/__init__.py new file mode 100644 index 00000000..0a3e6996 --- /dev/null +++ b/app_odoo_customize/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + +# todo: website 有bug oauth +from . import controllers \ No newline at end of file diff --git a/app_odoo_customize/controllers/controllers.py b/app_odoo_customize/controllers/controllers.py new file mode 100644 index 00000000..782c5364 --- /dev/null +++ b/app_odoo_customize/controllers/controllers.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. +from odoo import http +from odoo.addons.portal.controllers.web import Home +from odoo.http import request + + +class KsHome(Home): + + @http.route() + def web_client(self, s_action=None, **kw): + res = super(KsHome, self).web_client(s_action, **kw) + + if kw.get('debug') in ['1', 'assets', 'assets,tests']: + config_parameter = request.env['ir.config_parameter'].sudo() + app_debug_only_admin = config_parameter.get_param('app_debug_only_admin') + if request.session.uid and request.env.user.browse(request.session.uid)._is_admin(): + pass + else: + if app_debug_only_admin: + return request.redirect('/web/session/logout?debug=0') + return res + + + diff --git a/app_odoo_customize/data/ir_config_parameter_data.xml b/app_odoo_customize/data/ir_config_parameter_data.xml index 5bcdc4f2..41e39780 100644 --- a/app_odoo_customize/data/ir_config_parameter_data.xml +++ b/app_odoo_customize/data/ir_config_parameter_data.xml @@ -22,5 +22,6 @@ + \ No newline at end of file diff --git a/app_odoo_customize/models/__init__.py b/app_odoo_customize/models/__init__.py index 4c7df871..8283382a 100644 --- a/app_odoo_customize/models/__init__.py +++ b/app_odoo_customize/models/__init__.py @@ -6,5 +6,6 @@ from . import ir_module_module from . import web_environment_ribbon_backend from . import ir_http from . import ir_module_addons_path +from . import mail_thread # 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 index fba1cb01..c7306cf3 100644 --- a/app_odoo_customize/models/ir_http.py +++ b/app_odoo_customize/models/ir_http.py @@ -32,4 +32,7 @@ class IrHttp(models.AbstractModel): # 增加 bar位置处理 result['app_navbar_pos_pc'] = config_parameter.get_param('app_navbar_pos_pc', 'top') result['app_navbar_pos_mobile'] = config_parameter.get_param('app_navbar_pos_mobile', 'top') + # 此处直接取,不用 session + result['app_debug_only_admin'] = config_parameter.get_param('app_debug_only_admin') + result['app_stop_subscribe'] = config_parameter.get_param('app_stop_subscribe') return result diff --git a/app_odoo_customize/models/ir_module_module.py b/app_odoo_customize/models/ir_module_module.py index a90b916c..d1eed80d 100644 --- a/app_odoo_customize/models/ir_module_module.py +++ b/app_odoo_customize/models/ir_module_module.py @@ -18,6 +18,7 @@ class IrModule(models.Model): local_updatable = fields.Boolean('Local updatable', compute=False, default=False, store=True) addons_path_id = fields.Many2one('ir.module.addons.path', string='Addons Path ID', readonly=True) addons_path = fields.Char(string='Addons Path', related='addons_path_id.path', readonly=True) + license = fields.Char(readonly=True) def module_multi_uninstall(self): """ Perform the various steps required to uninstall a module completely diff --git a/app_odoo_customize/models/mail_thread.py b/app_odoo_customize/models/mail_thread.py new file mode 100644 index 00000000..cc882872 --- /dev/null +++ b/app_odoo_customize/models/mail_thread.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo import api, fields, models, _ + + +class MailThread(models.AbstractModel): + _inherit = "mail.thread" + + def message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None): + """ 停用订阅功能. """ + ir_config = self.env['ir.config_parameter'] + app_stop_subscribe = True if ir_config.get_param('app_stop_subscribe', False) == "True" else False + if app_stop_subscribe: + return True + else: + return super(MailThread, self).message_subscribe(partner_ids, subtype_ids) + + def _message_subscribe(self, partner_ids=None, channel_ids=None, subtype_ids=None, customer_ids=None): + """ 停用订阅功能. """ + ir_config = self.env['ir.config_parameter'] + app_stop_subscribe = True if ir_config.get_param('app_stop_subscribe', False) == "True" else False + if app_stop_subscribe: + return True + else: + return super(MailThread, self)._message_subscribe(partner_ids, subtype_ids, customer_ids) + + def _message_auto_subscribe_followers(self, updated_values, default_subtype_ids): + """ 停用订阅功能. """ + ir_config = self.env['ir.config_parameter'] + app_stop_subscribe = True if ir_config.get_param('app_stop_subscribe', False) == "True" else False + if app_stop_subscribe: + return [] + else: + return super(MailThread, self)._message_auto_subscribe_followers(updated_values, default_subtype_ids) + + def _message_auto_subscribe_notify(self, partner_ids, template): + """ 停用订阅功能. """ + ir_config = self.env['ir.config_parameter'] + app_stop_subscribe = True if ir_config.get_param('app_stop_subscribe', False) == "True" else False + if app_stop_subscribe: + return True + else: + return super(MailThread, self)._message_auto_subscribe_notify(partner_ids, template) diff --git a/app_odoo_customize/models/res_config_settings.py b/app_odoo_customize/models/res_config_settings.py index 6715c44f..e2a2c2ae 100644 --- a/app_odoo_customize/models/res_config_settings.py +++ b/app_odoo_customize/models/res_config_settings.py @@ -54,6 +54,12 @@ class ResConfigSettings(models.TransientModel): ('bottom', 'Bottom'), # ('left', 'Left'), ], config_parameter='app_navbar_pos_mobile') + + # 安全与提速 + app_debug_only_admin = fields.Boolean('Debug for Admin', config_parameter='app_debug_only_admin', + help="Check to only Debug / Debug Assets for Odoo Admin. Deny debug from url for other user.") + app_stop_subscribe = fields.Boolean('Stop Odoo Subscribe', help="Check to stop subscribe and follow. This to make odoo speed up.", + config_parameter='app_stop_subscribe') def set_module_url(self): sql = "UPDATE ir_module_module SET website = '%s' WHERE license like '%s' and website <> ''" % (self.app_enterprise_url, 'OEEL%') diff --git a/app_odoo_customize/static/description/banner.gif b/app_odoo_customize/static/description/banner.gif index 00ebe9b2..b1ab4685 100644 Binary files a/app_odoo_customize/static/description/banner.gif and b/app_odoo_customize/static/description/banner.gif differ diff --git a/app_odoo_customize/static/description/cnreadme.png b/app_odoo_customize/static/description/cnreadme.png index 8e3f3f6c..f990fbc6 100644 Binary files a/app_odoo_customize/static/description/cnreadme.png and b/app_odoo_customize/static/description/cnreadme.png differ diff --git a/app_odoo_customize/static/description/index.html b/app_odoo_customize/static/description/index.html index 7024716a..c89e9754 100644 --- a/app_odoo_customize/static/description/index.html +++ b/app_odoo_customize/static/description/index.html @@ -47,7 +47,12 @@

This is a Long Term Support Apps.

-

Update: v16.23.05.24

+

Update: v16.23.08.15

+

43. Check to only Debug / Debug Assets for Odoo Admin. Deny debug from url for other user.

+

44. Check to stop subscribe and follow. This to make odoo speed up.

+

Update: v16.23.07.25

+

42. Add menu navbar setup for top or bottom. navigator footer support.

+

Update: v16.23.07.14

41. Fix odoo bug, when click Preferences menu not hide in mobile.

Update: v16.23.05.04

Fix bug in mobile view in popup menu.

diff --git a/app_odoo_customize/views/app_theme_config_settings_views.xml b/app_odoo_customize/views/app_theme_config_settings_views.xml index 248e6a62..9aaadffe 100644 --- a/app_odoo_customize/views/app_theme_config_settings_views.xml +++ b/app_odoo_customize/views/app_theme_config_settings_views.xml @@ -29,6 +29,14 @@ + + + + + + + + diff --git a/app_odoo_customize/views/ir_module_module_views.xml b/app_odoo_customize/views/ir_module_module_views.xml index 6b83055e..23209dcc 100644 --- a/app_odoo_customize/views/ir_module_module_views.xml +++ b/app_odoo_customize/views/ir_module_module_views.xml @@ -25,6 +25,9 @@ ir.module.module + + + @@ -33,25 +36,22 @@ + app.ir.module.module.form ir.module.module - - -

- app_odoo_customize.group_show_author_in_apps -

- - app_odoo_customize.group_show_author_in_apps - - - - - - - + + +

+ app_odoo_customize.group_show_author_in_apps +

+ + + +
+ ir.module.module.kanban.inherit.base ir.module.module diff --git a/app_product_superbar/views/product_template_views.xml b/app_product_superbar/views/product_template_views.xml index ed6416e4..2ff1e35f 100644 --- a/app_product_superbar/views/product_template_views.xml +++ b/app_product_superbar/views/product_template_views.xml @@ -9,8 +9,8 @@ - - + +
diff --git a/app_sale_superbar/views/sale_order_views.xml b/app_sale_superbar/views/sale_order_views.xml index 246849d4..a3c1a235 100644 --- a/app_sale_superbar/views/sale_order_views.xml +++ b/app_sale_superbar/views/sale_order_views.xml @@ -8,7 +8,7 @@ - + diff --git a/app_web_enterprise/static/src/xml/form.xml b/app_web_enterprise/static/src/xml/form.xml index 6fedbc99..954a8747 100644 --- a/app_web_enterprise/static/src/xml/form.xml +++ b/app_web_enterprise/static/src/xml/form.xml @@ -18,4 +18,13 @@ Discard + + + + + + + + + diff --git a/app_website_blog_editor/views/blog_post_views.xml b/app_website_blog_editor/views/blog_post_views.xml index 400275e5..12cf6187 100644 --- a/app_website_blog_editor/views/blog_post_views.xml +++ b/app_website_blog_editor/views/blog_post_views.xml @@ -5,6 +5,9 @@ blog.post + + + hide @@ -14,6 +17,9 @@ show + + + @@ -32,7 +38,10 @@ blog.post - + + + + diff --git a/app_website_blog_superbar/views/blog_post_views.xml b/app_website_blog_superbar/views/blog_post_views.xml index 81b40084..8a7d9ac8 100644 --- a/app_website_blog_superbar/views/blog_post_views.xml +++ b/app_website_blog_superbar/views/blog_post_views.xml @@ -7,7 +7,8 @@ - + + diff --git a/app_website_product_superbar/views/product_template_views.xml b/app_website_product_superbar/views/product_template_views.xml index e9dbffc1..dcf1552c 100644 --- a/app_website_product_superbar/views/product_template_views.xml +++ b/app_website_product_superbar/views/product_template_views.xml @@ -1,16 +1,17 @@ - - - - app.product.template.search - product.template - - - - - - - - - + + + + app.product.template.search + product.template + + + + + + + + + + \ No newline at end of file diff --git a/app_website_sale_editor/views/product_template_views.xml b/app_website_sale_editor/views/product_template_views.xml index fd1c3489..58e0be3e 100644 --- a/app_website_sale_editor/views/product_template_views.xml +++ b/app_website_sale_editor/views/product_template_views.xml @@ -25,7 +25,20 @@ - + + + + + + + + + + + + + +