mirror of
https://github.com/guohuadeng/app-odoo.git
synced 2025-02-23 04:11:36 +02:00
fix #I6FNUR [app_chatgpt]ChatGpt对接改造至 app-odoo
This commit is contained in:
@@ -37,10 +37,14 @@
|
|||||||
''',
|
''',
|
||||||
'depends': ['base', 'base_setup', 'mail'],
|
'depends': ['base', 'base_setup', 'mail'],
|
||||||
'data': [
|
'data': [
|
||||||
|
'security/ir.model.access.csv',
|
||||||
'data/mail_channel_data.xml',
|
'data/mail_channel_data.xml',
|
||||||
|
'data/gpt_robot_data.xml',
|
||||||
'data/user_partner_data.xml',
|
'data/user_partner_data.xml',
|
||||||
'data/ir_config_parameter.xml',
|
'data/ir_config_parameter.xml',
|
||||||
'views/res_config_settings_views.xml',
|
'views/res_config_settings_views.xml',
|
||||||
|
'views/gpt_robot_views.xml',
|
||||||
|
'views/res_users_views.xml',
|
||||||
],
|
],
|
||||||
'external_dependencies': {'python': ['openai']},
|
'external_dependencies': {'python': ['openai']},
|
||||||
'images': ['static/description/banner.png'],
|
'images': ['static/description/banner.png'],
|
||||||
|
|||||||
9
app_chatgpt/data/gpt_robot_data.xml
Normal file
9
app_chatgpt/data/gpt_robot_data.xml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<record id="chatgpt_robot1" model="gpt.robot">
|
||||||
|
<field name="name">ChatGPT Robot 1</field>
|
||||||
|
</record>
|
||||||
|
<record id="chatgpt_robot2" model="gpt.robot">
|
||||||
|
<field name="name">ChatGPT Robot 2</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
@@ -13,5 +13,39 @@
|
|||||||
<field name="company_ids" eval="[Command.link(ref('base.main_company'))]"/>
|
<field name="company_ids" eval="[Command.link(ref('base.main_company'))]"/>
|
||||||
<field name="groups_id" eval="[Command.link(ref('base.group_user'))]"/>
|
<field name="groups_id" eval="[Command.link(ref('base.group_user'))]"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
<record id="partner_chatgpt1" model="res.partner">
|
||||||
|
<field name="name">ChatGPT机器人1</field>
|
||||||
|
<field name="image_1920" type="base64" file="app_chatgpt/static/description/chatgpt.png"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="user_chatgpt1" model="res.users">
|
||||||
|
<field name="name">ChatGPT1</field>
|
||||||
|
<field name="login">chatgpt1@sunpop.cn</field>
|
||||||
|
<field name="email">chatgpt1@sunpop.cn</field>
|
||||||
|
<field name="password">chatgpt</field>
|
||||||
|
<field name="partner_id" ref="app_chatgpt.partner_chatgpt1"/>
|
||||||
|
<field name="gpt_id" ref="app_chatgpt.chatgpt_robot1"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="company_ids" eval="[Command.link(ref('base.main_company'))]"/>
|
||||||
|
<field name="groups_id" eval="[Command.link(ref('base.group_user'))]"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="partner_chatgpt2" model="res.partner">
|
||||||
|
<field name="name">ChatGPT机器人2</field>
|
||||||
|
<field name="image_1920" type="base64" file="app_chatgpt/static/description/chatgpt.png"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="user_chatgpt2" model="res.users">
|
||||||
|
<field name="name">ChatGPT2</field>
|
||||||
|
<field name="login">chatgpt2@sunpop.cn</field>
|
||||||
|
<field name="email">chatgpt2@sunpop.cn</field>
|
||||||
|
<field name="password">chatgpt</field>
|
||||||
|
<field name="partner_id" ref="app_chatgpt.partner_chatgpt2"/>
|
||||||
|
<field name="gpt_id" ref="app_chatgpt.chatgpt_robot2"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="company_ids" eval="[Command.link(ref('base.main_company'))]"/>
|
||||||
|
<field name="groups_id" eval="[Command.link(ref('base.group_user'))]"/>
|
||||||
|
</record>
|
||||||
</data>
|
</data>
|
||||||
</odoo>
|
</odoo>
|
||||||
|
|||||||
@@ -3,3 +3,5 @@
|
|||||||
|
|
||||||
from . import mail_channel
|
from . import mail_channel
|
||||||
from . import res_config_settings
|
from . import res_config_settings
|
||||||
|
from . import gpt_robot
|
||||||
|
from . import res_users
|
||||||
|
|||||||
12
app_chatgpt/models/gpt_robot.py
Normal file
12
app_chatgpt/models/gpt_robot.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import api, fields, models, _
|
||||||
|
|
||||||
|
|
||||||
|
class GptRobot(models.Model):
|
||||||
|
_name = 'gpt.robot'
|
||||||
|
_description = 'Gpt Robot'
|
||||||
|
|
||||||
|
name = fields.Char(string='Name')
|
||||||
|
openapi_api_key = fields.Char(string="API Key", help="Provide the API key here")
|
||||||
|
temperature = fields.Float(string='Temperature')
|
||||||
@@ -80,11 +80,35 @@ class Channel(models.Model):
|
|||||||
def _notify_thread(self, message, msg_vals=False, **kwargs):
|
def _notify_thread(self, message, msg_vals=False, **kwargs):
|
||||||
rdata = super(Channel, self)._notify_thread(message, msg_vals=msg_vals, **kwargs)
|
rdata = super(Channel, self)._notify_thread(message, msg_vals=msg_vals, **kwargs)
|
||||||
# print(f'rdata:{rdata}')
|
# print(f'rdata:{rdata}')
|
||||||
|
|
||||||
chatgpt_channel_id = self.env.ref('app_chatgpt.channel_chatgpt')
|
chatgpt_channel_id = self.env.ref('app_chatgpt.channel_chatgpt')
|
||||||
user_chatgpt = self.env.ref("app_chatgpt.user_chatgpt")
|
user_chatgpt = self.env.ref("app_chatgpt.user_chatgpt")
|
||||||
partner_chatgpt = self.env.ref("app_chatgpt.partner_chatgpt")
|
partner_chatgpt = self.env.ref("app_chatgpt.partner_chatgpt")
|
||||||
|
|
||||||
author_id = msg_vals.get('author_id')
|
author_id = msg_vals.get('author_id')
|
||||||
# print('author_id:',author_id)
|
# print('author_id:',author_id)
|
||||||
|
|
||||||
|
gpt_id = self.env['gpt.robot']
|
||||||
|
partner_ids = list(msg_vals.get('partner_ids'))
|
||||||
|
if partner_ids:
|
||||||
|
partners = self.env['res.partner'].search([('id', 'in', partner_ids)])
|
||||||
|
user_id = partners.mapped('user_ids').filtered(lambda r: r.gpt_id)[:1]
|
||||||
|
if user_id:
|
||||||
|
gpt_policy = user_id.gpt_policy
|
||||||
|
gpt_wl_users = user_id.gpt_wl_users
|
||||||
|
is_allow = message.create_uid.id in gpt_wl_users.ids
|
||||||
|
if gpt_policy == 'all' or (gpt_policy == 'limit' and is_allow):
|
||||||
|
user_chatgpt = user_id
|
||||||
|
partner_chatgpt = user_id.partner_id
|
||||||
|
gpt_id = user_id.gpt_id
|
||||||
|
# if gpt_policy == 'limit' and user_id.gpt_wl_users:
|
||||||
|
# if message.get('create_uid').id in user_id.gpt_wl_users.ids:
|
||||||
|
# user_chatgpt = user_id
|
||||||
|
# partner_chatgpt = user_id.partner_id
|
||||||
|
# gpt_id = user_id.gpt_id
|
||||||
|
# elif gpt_policy == 'all':
|
||||||
|
|
||||||
|
|
||||||
# print('partner_chatgpt.id:',partner_chatgpt.id)
|
# print('partner_chatgpt.id:',partner_chatgpt.id)
|
||||||
chatgpt_name = str(partner_chatgpt.name or '') + ', '
|
chatgpt_name = str(partner_chatgpt.name or '') + ', '
|
||||||
# print('chatgpt_name:', chatgpt_name)
|
# print('chatgpt_name:', chatgpt_name)
|
||||||
@@ -94,6 +118,8 @@ class Channel(models.Model):
|
|||||||
if not prompt:
|
if not prompt:
|
||||||
return rdata
|
return rdata
|
||||||
api_key = self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openapi_api_key')
|
api_key = self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openapi_api_key')
|
||||||
|
if gpt_id:
|
||||||
|
api_key = gpt_id.openapi_api_key
|
||||||
try:
|
try:
|
||||||
openapi_context_timeout = int(self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openapi_context_timeout')) or 600
|
openapi_context_timeout = int(self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openapi_context_timeout')) or 600
|
||||||
except:
|
except:
|
||||||
@@ -105,6 +131,9 @@ class Channel(models.Model):
|
|||||||
if author_id:
|
if author_id:
|
||||||
partner_id = Partner.browse(author_id)
|
partner_id = Partner.browse(author_id)
|
||||||
if partner_id:
|
if partner_id:
|
||||||
|
user_id = partner_id.user_ids[:1]
|
||||||
|
if user_id.gpt_id:
|
||||||
|
return rdata
|
||||||
partner_name = partner_id.name
|
partner_name = partner_id.name
|
||||||
# print(msg_vals)
|
# print(msg_vals)
|
||||||
# print(msg_vals.get('record_name', ''))
|
# print(msg_vals.get('record_name', ''))
|
||||||
|
|||||||
15
app_chatgpt/models/res_users.py
Normal file
15
app_chatgpt/models/res_users.py
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from odoo import fields, models
|
||||||
|
|
||||||
|
|
||||||
|
class ResUsers(models.Model):
|
||||||
|
_inherit = "res.users"
|
||||||
|
|
||||||
|
gpt_id = fields.Many2one('gpt.robot', string='Bind to ChatGpt')
|
||||||
|
gpt_policy = fields.Selection([
|
||||||
|
('all', 'All Users'),
|
||||||
|
('limit', 'Selected Users')
|
||||||
|
], string='Allowed Conversation Mode', default='all', ondelete='set default')
|
||||||
|
gpt_wl_users = fields.Many2many('res.users', 'res_users_res_users_rel', 'robot_id', 'user_id', string='Allowed Users', domain="[('id', '!=', id)]")
|
||||||
|
gpt_demo_time = fields.Integer('Default Demo Time', default=0)
|
||||||
2
app_chatgpt/security/ir.model.access.csv
Normal file
2
app_chatgpt/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_gpt_robt_user,GptRobotUser,model_gpt_robot,base.group_user,1,1,1,1
|
||||||
|
52
app_chatgpt/views/gpt_robot_views.xml
Normal file
52
app_chatgpt/views/gpt_robot_views.xml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<record id="gpt_robot_tree_view" model="ir.ui.view">
|
||||||
|
<field name="name">gpt.robot.tree</field>
|
||||||
|
<field name="model">gpt.robot</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<tree>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="openapi_api_key"/>
|
||||||
|
<field name="temperature"/>
|
||||||
|
</tree>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="gpt_robot_form_view" model="ir.ui.view">
|
||||||
|
<field name="name">gpt.robot.form</field>
|
||||||
|
<field name="model">gpt.robot</field>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<form>
|
||||||
|
<sheet>
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="name"/>
|
||||||
|
<field name="openapi_api_key"/>
|
||||||
|
<field name="temperature"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</sheet>
|
||||||
|
</form>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="action_gpt_robot" model="ir.actions.act_window">
|
||||||
|
<field name="name">GPT Robot</field>
|
||||||
|
<field name="res_model">gpt.robot</field>
|
||||||
|
<field name="view_mode">tree,form</field>
|
||||||
|
<field name="help" type="html">
|
||||||
|
<p class="o_view_nocontent_smiling_face">
|
||||||
|
Let's create a GPT Robot.
|
||||||
|
</p>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<menuitem
|
||||||
|
id="menu_gpt_robot"
|
||||||
|
name="GPT Robot"
|
||||||
|
parent="base.menu_administration"
|
||||||
|
sequence="90"
|
||||||
|
action="action_gpt_robot"
|
||||||
|
groups="base.group_system"/>
|
||||||
|
|
||||||
|
</odoo>
|
||||||
22
app_chatgpt/views/res_users_views.xml
Normal file
22
app_chatgpt/views/res_users_views.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<record id="app_chatgpt_res_users_form" model="ir.ui.view">
|
||||||
|
<field name="name">app.chatgpt.res.users.form</field>
|
||||||
|
<field name="model">res.users</field>
|
||||||
|
<field name="inherit_id" ref="base.view_users_form"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//page[@name='preferences']" position="after">
|
||||||
|
<page name="page_chatgpt" string="ChatGPT">
|
||||||
|
<group>
|
||||||
|
<group>
|
||||||
|
<field name="gpt_id"/>
|
||||||
|
<field name="gpt_policy"/>
|
||||||
|
<field name="gpt_wl_users" widget="many2many_tags" attrs="{'invisible': [('gpt_policy', '=', 'all')]}"/>
|
||||||
|
<field name="gpt_demo_time"/>
|
||||||
|
</group>
|
||||||
|
</group>
|
||||||
|
</page>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
Reference in New Issue
Block a user