@@ -29,12 +29,12 @@
|
||||
],
|
||||
'assets': {
|
||||
'web.assets_backend': [
|
||||
'yuthon_ai_agent_17/static/src/js/ai_chat_action.js',
|
||||
'yuthon_ai_agent_17/static/src/js/ai_floating.js',
|
||||
'yuthon_ai_agent_17/static/src/xml/ai_chat_template.xml',
|
||||
'yuthon_ai_agent_17/static/src/xml/ai_navbar_button.xml',
|
||||
'yuthon_ai_agent_17/static/src/css/ai_chat.css',
|
||||
'yuthon_ai_agent_17/static/src/css/ai_floating.css',
|
||||
'yuthon_ai_agent/static/src/js/ai_chat_action.js',
|
||||
'yuthon_ai_agent/static/src/js/ai_floating.js',
|
||||
'yuthon_ai_agent/static/src/xml/ai_chat_template.xml',
|
||||
'yuthon_ai_agent/static/src/xml/ai_navbar_button.xml',
|
||||
'yuthon_ai_agent/static/src/css/ai_chat.css',
|
||||
'yuthon_ai_agent/static/src/css/ai_floating.css',
|
||||
],
|
||||
},
|
||||
'installable': True,
|
||||
|
||||
@@ -11,7 +11,7 @@ class AiChatController(http.Controller):
|
||||
|
||||
def _check_ai_access(self):
|
||||
"""检查用户是否有 AI Agent 使用权限"""
|
||||
if not request.env.user.has_group('yuthon_ai_agent_17.group_ai_agent_user'):
|
||||
if not request.env.user.has_group('yuthon_ai_agent.group_ai_agent_user'):
|
||||
return {'error': '您没有使用 AI 助手的权限,请联系管理员开通。'}
|
||||
return None
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@ class AiConversation(models.Model):
|
||||
self.ensure_one()
|
||||
return {
|
||||
'type': 'ir.actions.client',
|
||||
'tag': 'yuthon_ai_agent_17.chat',
|
||||
'tag': 'yuthon_ai_agent.chat',
|
||||
'name': self.name,
|
||||
'params': {'res_id': self.id},
|
||||
}
|
||||
@@ -445,7 +445,7 @@ class AiConversation(models.Model):
|
||||
"""发送用户消息并获取 AI 回复(支持工具调用)。"""
|
||||
self.ensure_one()
|
||||
# 权限校验:只有 AI Agent 用户组才能使用
|
||||
if not self.env.user.has_group('yuthon_ai_agent_17.group_ai_agent_user'):
|
||||
if not self.env.user.has_group('yuthon_ai_agent.group_ai_agent_user'):
|
||||
return {'error': '您没有使用 AI 助手的权限,请联系管理员开通。'}
|
||||
|
||||
provider = self.provider_id
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<field name="name">AI Agent 管理员</field>
|
||||
<field name="category_id" ref="base.module_category_hidden"/>
|
||||
<field name="comment">管理 AI 服务商配置</field>
|
||||
<field name="implied_ids" eval="[(4, ref('yuthon_ai_agent_17.group_ai_agent_user'))]"/>
|
||||
<field name="implied_ids" eval="[(4, ref('yuthon_ai_agent.group_ai_agent_user'))]"/>
|
||||
<field name="users" eval="[(4, ref('base.user_admin'))]"/>
|
||||
</record>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<field name="name">AI 对话:仅本人</field>
|
||||
<field name="model_id" ref="model_ai_conversation"/>
|
||||
<field name="domain_force">[('create_uid','=',user.id)]</field>
|
||||
<field name="groups" eval="[(4, ref('yuthon_ai_agent_17.group_ai_agent_user'))]"/>
|
||||
<field name="groups" eval="[(4, ref('yuthon_ai_agent.group_ai_agent_user'))]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
@@ -34,7 +34,7 @@
|
||||
<field name="name">AI 画像:仅本人</field>
|
||||
<field name="model_id" ref="model_ai_user_profile"/>
|
||||
<field name="domain_force">[('user_id','=',user.id)]</field>
|
||||
<field name="groups" eval="[(4, ref('yuthon_ai_agent_17.group_ai_agent_user'))]"/>
|
||||
<field name="groups" eval="[(4, ref('yuthon_ai_agent.group_ai_agent_user'))]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
@@ -46,7 +46,7 @@
|
||||
<field name="name">AI 记忆:仅本人</field>
|
||||
<field name="model_id" ref="model_ai_user_memory"/>
|
||||
<field name="domain_force">[('profile_id.user_id','=',user.id)]</field>
|
||||
<field name="groups" eval="[(4, ref('yuthon_ai_agent_17.group_ai_agent_user'))]"/>
|
||||
<field name="groups" eval="[(4, ref('yuthon_ai_agent.group_ai_agent_user'))]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
@@ -58,7 +58,7 @@
|
||||
<field name="name">Token 用量:仅本人</field>
|
||||
<field name="model_id" ref="model_ai_token_usage"/>
|
||||
<field name="domain_force">[('user_id','=',user.id)]</field>
|
||||
<field name="groups" eval="[(4, ref('yuthon_ai_agent_17.group_ai_agent_user'))]"/>
|
||||
<field name="groups" eval="[(4, ref('yuthon_ai_agent.group_ai_agent_user'))]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_ai_provider_read,AI服务商-只读,model_ai_provider,yuthon_ai_agent_17.group_ai_agent_user,1,0,0,0
|
||||
access_ai_provider_admin,AI服务商-管理员,model_ai_provider,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_conversation_user,AI对话-用户,model_ai_conversation,yuthon_ai_agent_17.group_ai_agent_user,1,1,1,1
|
||||
access_ai_message_user,AI消息-用户,model_ai_message,yuthon_ai_agent_17.group_ai_agent_user,1,1,1,1
|
||||
access_ai_conversation_admin,AI对话-管理员,model_ai_conversation,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_message_admin,AI消息-管理员,model_ai_message,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_user_profile_user,AI画像-用户,model_ai_user_profile,yuthon_ai_agent_17.group_ai_agent_user,1,1,1,0
|
||||
access_ai_user_profile_admin,AI画像-管理员,model_ai_user_profile,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_user_memory_user,AI记忆-用户,model_ai_user_memory,yuthon_ai_agent_17.group_ai_agent_user,1,1,1,1
|
||||
access_ai_user_memory_admin,AI记忆-管理员,model_ai_user_memory,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_token_usage_user,Token用量-用户,model_ai_token_usage,yuthon_ai_agent_17.group_ai_agent_user,1,0,1,0
|
||||
access_ai_token_usage_admin,Token用量-管理员,model_ai_token_usage,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_token_usage_summary_user,Token汇总-用户,model_ai_token_usage_summary,yuthon_ai_agent_17.group_ai_agent_user,1,0,0,0
|
||||
access_ai_token_usage_summary_admin,Token汇总-管理员,model_ai_token_usage_summary,yuthon_ai_agent_17.group_ai_agent_admin,1,0,0,0
|
||||
access_ai_rule_user,AI规则-用户只读,model_ai_rule,yuthon_ai_agent_17.group_ai_agent_user,1,0,0,0
|
||||
access_ai_rule_admin,AI规则-管理员,model_ai_rule,yuthon_ai_agent_17.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_provider_read,AI服务商-只读,model_ai_provider,yuthon_ai_agent.group_ai_agent_user,1,0,0,0
|
||||
access_ai_provider_admin,AI服务商-管理员,model_ai_provider,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_conversation_user,AI对话-用户,model_ai_conversation,yuthon_ai_agent.group_ai_agent_user,1,1,1,1
|
||||
access_ai_message_user,AI消息-用户,model_ai_message,yuthon_ai_agent.group_ai_agent_user,1,1,1,1
|
||||
access_ai_conversation_admin,AI对话-管理员,model_ai_conversation,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_message_admin,AI消息-管理员,model_ai_message,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_user_profile_user,AI画像-用户,model_ai_user_profile,yuthon_ai_agent.group_ai_agent_user,1,1,1,0
|
||||
access_ai_user_profile_admin,AI画像-管理员,model_ai_user_profile,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_user_memory_user,AI记忆-用户,model_ai_user_memory,yuthon_ai_agent.group_ai_agent_user,1,1,1,1
|
||||
access_ai_user_memory_admin,AI记忆-管理员,model_ai_user_memory,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_token_usage_user,Token用量-用户,model_ai_token_usage,yuthon_ai_agent.group_ai_agent_user,1,0,1,0
|
||||
access_ai_token_usage_admin,Token用量-管理员,model_ai_token_usage,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
|
||||
access_ai_token_usage_summary_user,Token汇总-用户,model_ai_token_usage_summary,yuthon_ai_agent.group_ai_agent_user,1,0,0,0
|
||||
access_ai_token_usage_summary_admin,Token汇总-管理员,model_ai_token_usage_summary,yuthon_ai_agent.group_ai_agent_admin,1,0,0,0
|
||||
access_ai_rule_user,AI规则-用户只读,model_ai_rule,yuthon_ai_agent.group_ai_agent_user,1,0,0,0
|
||||
access_ai_rule_admin,AI规则-管理员,model_ai_rule,yuthon_ai_agent.group_ai_agent_admin,1,1,1,1
|
||||
|
||||
|
@@ -5,7 +5,7 @@ import { registry } from "@web/core/registry";
|
||||
import { useService } from "@web/core/utils/hooks";
|
||||
|
||||
export class AiChatAction extends Component {
|
||||
static template = "yuthon_ai_agent_17.AiChatTemplate";
|
||||
static template = "yuthon_ai_agent.AiChatTemplate";
|
||||
// Client Action 接收的 props
|
||||
static props = ["*"];
|
||||
|
||||
@@ -86,4 +86,4 @@ export class AiChatAction extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
registry.category("actions").add("yuthon_ai_agent_17.chat", AiChatAction);
|
||||
registry.category("actions").add("yuthon_ai_agent.chat", AiChatAction);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<templates xml:space="preserve">
|
||||
<t t-name="yuthon_ai_agent_17.AiChatTemplate">
|
||||
<t t-name="yuthon_ai_agent.AiChatTemplate">
|
||||
<div class="o_ai_chat_action d-flex flex-column h-100">
|
||||
<!-- 头部 -->
|
||||
<div class="ai-chat-header p-2 border-bottom d-flex justify-content-between align-items-center">
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<templates xml:space="preserve">
|
||||
|
||||
<!-- 右上角托盘按钮 -->
|
||||
<t t-name="yuthon_ai_agent_17.AiSystray">
|
||||
<t t-name="yuthon_ai_agent.AiSystray">
|
||||
<div class="o_ai_systray">
|
||||
<button class="o_ai_systray_btn" t-on-click="toggleChat"
|
||||
title="AI 助手" aria-label="AI 助手">
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
<!-- Client Action: 聊天界面 -->
|
||||
<record id="action_ai_chat_client" model="ir.actions.client">
|
||||
<field name="name">AI Chat</field>
|
||||
<field name="tag">yuthon_ai_agent_17.chat</field>
|
||||
<field name="tag">yuthon_ai_agent.chat</field>
|
||||
</record>
|
||||
|
||||
<!-- 标准 Window Action(list/form) -->
|
||||
@@ -91,9 +91,9 @@
|
||||
<!-- 旧菜单 xmlid 保留但隐藏(menu_ai_root 已在 ai_provider_views.xml 定义) -->
|
||||
<menuitem id="menu_ai_chat" name="对话管理"
|
||||
parent="menu_ai_root" action="action_ai_conversation" sequence="99"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
|
||||
|
||||
<menuitem id="menu_ai_config" name="服务商配置"
|
||||
parent="menu_ai_root" action="action_ai_provider" sequence="99"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
|
||||
</odoo>
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
<!-- 根菜单 & 系统配置父菜单 -->
|
||||
<!-- ============================================ -->
|
||||
<menuitem id="menu_ai_root" name="AI 助手" sequence="70"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_user,yuthon_ai_agent_17.group_ai_agent_admin"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_user,yuthon_ai_agent.group_ai_agent_admin"/>
|
||||
|
||||
<menuitem id="menu_system_config" name="系统配置"
|
||||
parent="menu_ai_root" sequence="50"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin"/>
|
||||
|
||||
<!-- ============================================ -->
|
||||
<!-- AI 服务商 - 列表视图 -->
|
||||
@@ -132,6 +132,6 @@
|
||||
<!-- 服务商配置菜单 → 归入系统配置 -->
|
||||
<menuitem id="menu_ai_provider" name="服务商配置"
|
||||
parent="menu_system_config" action="action_ai_provider" sequence="1"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin"/>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -134,6 +134,6 @@
|
||||
<!-- 菜单 → 系统配置 -->
|
||||
<menuitem id="menu_ai_rule" name="规则配置"
|
||||
parent="menu_system_config" action="action_ai_rule" sequence="2"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin"/>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -91,11 +91,11 @@
|
||||
<!-- ============================================ -->
|
||||
<menuitem id="menu_all_token_usage" name="Token 明细"
|
||||
parent="menu_system_config" action="action_all_token_usage" sequence="10"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
|
||||
|
||||
<menuitem id="menu_token_usage_summary" name="Token 汇总"
|
||||
parent="menu_system_config" action="action_token_usage_summary" sequence="15"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
|
||||
|
||||
<!-- 兼容旧 XML ID(升级时不残留) -->
|
||||
<record id="action_my_token_usage" model="ir.actions.act_window">
|
||||
@@ -106,9 +106,9 @@
|
||||
</record>
|
||||
<menuitem id="menu_my_token_usage" name="Token 明细"
|
||||
parent="menu_ai_root" sequence="99"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
|
||||
<menuitem id="menu_token_management" name="Token 管理"
|
||||
parent="menu_ai_root" sequence="99"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -128,7 +128,7 @@ action = {
|
||||
'res_model': 'ai.user.profile',
|
||||
'res_id': profile.id,
|
||||
'view_mode': 'form',
|
||||
'views': [(env.ref('yuthon_ai_agent_17.view_ai_user_profile_form').id, 'form')],
|
||||
'views': [(env.ref('yuthon_ai_agent.view_ai_user_profile_form').id, 'form')],
|
||||
'target': 'current',
|
||||
}
|
||||
</field>
|
||||
@@ -152,11 +152,11 @@ action = {
|
||||
<!-- 管理员:用户列表 → 归入系统配置 -->
|
||||
<menuitem id="menu_ai_profiles" name="用户列表"
|
||||
parent="menu_system_config" action="action_all_ai_profiles" sequence="5"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin"/>
|
||||
|
||||
<!-- 旧 xmlid 保留但隐藏(兼容升级) -->
|
||||
<menuitem id="menu_user_management" name="用户管理"
|
||||
parent="menu_ai_root" sequence="99"
|
||||
groups="yuthon_ai_agent_17.group_ai_agent_admin" active="0"/>
|
||||
groups="yuthon_ai_agent.group_ai_agent_admin" active="0"/>
|
||||
|
||||
</odoo>
|
||||
|
||||
@@ -141,18 +141,11 @@ class IssueLibrary(models.Model):
|
||||
records = self.env['issue.library'].browse(active_ids)
|
||||
count = 0
|
||||
for record in records:
|
||||
if record.class_char:
|
||||
# 先清理HTML标签
|
||||
value = record.class_char
|
||||
value = re.sub(r'<[^>]+>', '', value)
|
||||
# 再补"次"字
|
||||
if '班子会' in value and '第' in value:
|
||||
pattern = r'(第\d+)(班子会)'
|
||||
new_value = re.sub(pattern, r'\1次\2', value)
|
||||
else:
|
||||
new_value = value
|
||||
if new_value != record.class_char:
|
||||
record.class_char = new_value
|
||||
# 只清理party_char的HTML标签
|
||||
if record.party_char:
|
||||
clean_value = re.sub(r'<[^>]+>', '', record.party_char)
|
||||
if clean_value != record.party_char:
|
||||
record.party_char = clean_value
|
||||
count += 1
|
||||
return {
|
||||
'type': 'ir.actions.client',
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
decoration-muted="issue_state == 'cancel'">
|
||||
<header>
|
||||
<button name="all_meeting_issue" type="object" string="会议安排" class="oe_highlight" groups="yuthon_salary.group_lc_user"/>
|
||||
<button name="batch_add_ci_char" type="object" string="批量补'次'字" class="oe_highlight"/>
|
||||
</header>
|
||||
<field name="code"/>
|
||||
<field name="name" column_invisible="1"/>
|
||||
|
||||
@@ -21,6 +21,8 @@ class PropertyOpenRent(models.Model):
|
||||
upset = fields.Float(string="底价")
|
||||
document_ids = fields.Many2many('ir.attachment', string="附件")
|
||||
handling_opinions = fields.Text(string="经办意见")
|
||||
type_stamp_ids = fields.Many2many('seals.type.setting', string='用章类型')
|
||||
is_chapter = fields.Selection([('yes', '是'), ('no', '否')], string='是否用章', default='no')
|
||||
|
||||
# 物业
|
||||
property_name = fields.Char(string="物业信息")
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
<field name="upset" invisible="1"/>
|
||||
<field name="property_name" readonly="1"/>
|
||||
<field name="handling_opinions"/>
|
||||
<field name="is_chapter" string="是否用章"/>
|
||||
<field name="type_stamp_ids" widget="many2many_tags" string="用章类型" options="{'no_create': True, 'no_open': True}" required="is_chapter" invisible="is_chapter != 'yes'"/>
|
||||
</group>
|
||||
</group>
|
||||
<group>
|
||||
|
||||
Reference in New Issue
Block a user