Browse Source

Nov 3 : [FIX] Bug Fixed 'odoo_slack_connector'

pull/295/head
AjmalCybro 2 years ago
parent
commit
8a344b5d9b
  1. 6
      odoo_slack_connector/README.rst
  2. 2
      odoo_slack_connector/__manifest__.py
  3. 5
      odoo_slack_connector/data/scheduled_action.xml
  4. 7
      odoo_slack_connector/doc/RELEASE_NOTES.md
  5. 16
      odoo_slack_connector/models/mail_channel.py
  6. 83
      odoo_slack_connector/models/mail_message.py
  7. 11
      odoo_slack_connector/models/res_company.py
  8. 16
      odoo_slack_connector/models/res_users.py
  9. 4
      odoo_slack_connector/security/ir.model.access.csv
  10. 2
      odoo_slack_connector/views/mail_channel.xml
  11. 2
      odoo_slack_connector/views/mail_message.xml
  12. 82
      odoo_slack_connector/views/res_company.xml
  13. 26
      odoo_slack_connector/views/res_partner.xml
  14. 28
      odoo_slack_connector/views/res_users.xml

6
odoo_slack_connector/README.rst

@ -3,7 +3,7 @@
:alt: License: LGPL-3 :alt: License: LGPL-3
Slack Odoo Connector Slack Odoo Connector
========================= ====================
Allows to integrate with slack. Allows to integrate with slack.
Configuration Configuration
@ -25,12 +25,12 @@ Developer: Viswanth K v15 @ cybrosys, odoo@cybrosys.com
Viswanth K v16 @ cybrosys, odoo@cybrosys.com Viswanth K v16 @ cybrosys, odoo@cybrosys.com
Contacts Contacts
------- --------
* Mail Contact : odoo@cybrosys.com * Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com * Website : https://cybrosys.com
Bug Tracker Bug Tracker
------- -----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer Maintainer

2
odoo_slack_connector/__manifest__.py

@ -22,7 +22,7 @@
{ {
'name': "Slack Odoo Connector", 'name': "Slack Odoo Connector",
'version': '16.0.1.0.0', 'version': '16.0.1.0.2',
'summary': "Integrate slack with Odoo", 'summary': "Integrate slack with Odoo",
'description': "This module will help you to connect with slack to manage slack Conversations", 'description': "This module will help you to connect with slack to manage slack Conversations",
'category': 'Extra Tools', 'category': 'Extra Tools',

5
odoo_slack_connector/data/scheduled_action.xml

@ -1,16 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<odoo> <odoo>
<data noupdate="1"> <data noupdate="1">
<!-- scheduled action to fetch the meassages from slack--> <!-- scheduled action to fetch the messages from slack -->
<record id="ir_cron_scheduler_synchronization_slack_odoo" model="ir.cron"> <record id="ir_cron_scheduler_synchronization_slack_odoo" model="ir.cron">
<field name="name">Auto Synchronization of slack and odoo</field> <field name="name">Auto Synchronization of slack and odoo</field>
<field name="model_id" ref="model_mail_message"/> <field name="model_id" ref="model_mail_message"/>
<field name="state">code</field> <field name="state">code</field>
<field name="code">model.synchronization_slack()</field> <field name="code">model.synchronization_slack()</field>
<field name="user_id" ref="base.user_root"/>
<field name="interval_number">1</field> <field name="interval_number">1</field>
<field name="interval_type">minutes</field> <field name="interval_type">minutes</field>
<field name="numbercall">-1</field> <field name="numbercall">-1</field>
</record> </record>
</data> </data>
</odoo> </odoo>

7
odoo_slack_connector/doc/RELEASE_NOTES.md

@ -8,4 +8,9 @@
#### 11.06.2023 #### 11.06.2023
#### Version 16.0.1.0.1 #### Version 16.0.1.0.1
##### FIX ##### FIX
- Bug Fix: Fixed the issue where slack members are not loading to odoo - Bug Fix: Fixed the issue where slack members are not loading to odoo
#### 26.10.2023
#### Version 16.0.1.0.2
##### FIX
- Bug Fix: Resolved the issue causing a server error during the synchronization of Slack with Odoo.

16
odoo_slack_connector/models/mail_channel.py

@ -31,9 +31,9 @@ class MailChannel(models.Model):
_inherit = 'mail.channel' _inherit = 'mail.channel'
_description = 'Slack Channel' _description = 'Slack Channel'
is_slack = fields.Boolean("Slack", default=False) is_slack = fields.Boolean(string="Slack", default=False)
channel = fields.Char("ID") channel = fields.Char("ID")
msg_date = fields.Datetime() msg_date = fields.Datetime(string="Message Date")
def sync_members(self): def sync_members(self):
"""To load members into channels""" """To load members into channels"""
@ -52,18 +52,22 @@ class MailChannel(models.Model):
response = session.get(url, headers=headers, data=payload) response = session.get(url, headers=headers, data=payload)
channel_members = response.json() channel_members = response.json()
slack_user_list = [] slack_user_list = []
for slack_user_id in channel_members['members']: for slack_user_id in channel_members['members']:
contact = self.env['res.partner'].search([('slack_user_id', '=', slack_user_id)]) contact = self.env['res.partner'].search([('slack_user_id', '=', slack_user_id)])
slack_user_list.append(contact.id) if contact:
slack_user_list.append(contact.id)
else:
contact = self.env['res.partner'].create({
'name': 'Slack User',
'slack_user_id': slack_user_id
})
slack_user_list.append(contact.id)
current_channel_user_list = channel.channel_member_ids.mapped('partner_id.id') current_channel_user_list = channel.channel_member_ids.mapped('partner_id.id')
sample_list = [ sample_list = [
(0, 0, {'partner_id': contact_id}) (0, 0, {'partner_id': contact_id})
for contact_id in slack_user_list for contact_id in slack_user_list
if contact_id not in current_channel_user_list if contact_id not in current_channel_user_list
] ]
channel.channel_member_ids = sample_list channel.channel_member_ids = sample_list
except RequestException as e: except RequestException as e:

83
odoo_slack_connector/models/mail_message.py

@ -19,7 +19,7 @@
# If not, see <http://www.gnu.org/licenses/>. # If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################# #############################################################################
from odoo import fields, models, api from odoo import api, fields, models
import requests, re, json import requests, re, json
from datetime import datetime from datetime import datetime
from dateutil import tz from dateutil import tz
@ -35,7 +35,7 @@ class MailMessage(models.Model):
_description = 'Slack Message' _description = 'Slack Message'
is_slack = fields.Boolean(string="Slack", default=False) is_slack = fields.Boolean(string="Slack", default=False)
channel = fields.Many2one('mail.channel') channel = fields.Many2one('mail.channel', string="Channel")
@api.model @api.model
def create(self, vals): def create(self, vals):
@ -57,9 +57,12 @@ class MailMessage(models.Model):
} }
new_text = remove_html(rec.body) new_text = remove_html(rec.body)
url = "https://slack.com/api/chat.postMessage?channel=" + rec.record_name + "&" + "text=" + new_text url = "https://slack.com/api/chat.postMessage?channel=" + rec.record_name + "&" + "text=" + new_text
requests.request("POST", url, headers=headers, data=payload) requests.request("POST", url, headers=headers,
data=payload)
rec.is_slack = True rec.is_slack = True
converted_time = datetime.strptime(channel_date,'%Y-%m-%d %H:%M:%S').astimezone(to_zone) converted_time = datetime.strptime(channel_date,
'%Y-%m-%d %H:%M:%S').astimezone(
to_zone)
channel.msg_date = converted_time.strftime('%Y-%m-%d %H:%M:%S') channel.msg_date = converted_time.strftime('%Y-%m-%d %H:%M:%S')
return res return res
@ -74,41 +77,45 @@ class MailMessage(models.Model):
payload = {} payload = {}
headers = {'Authorization': 'Bearer ' + company_record.token} headers = {'Authorization': 'Bearer ' + company_record.token}
url = "https://slack.com/api/conversations.history?channel=" + channel_id.channel url = "https://slack.com/api/conversations.history?channel=" + channel_id.channel
channel_response = requests.request("GET", url, headers=headers, channel_response = requests.request("GET", url,
headers=headers,
data=payload) data=payload)
channels_response = channel_response.__dict__['_content'] channels_response = channel_response.__dict__['_content']
dict_channels = channels_response.decode("UTF-8") dict_channels = channels_response.decode("UTF-8")
channels_history = json.loads(dict_channels) channels_history = json.loads(dict_channels)
channels_history['messages'].reverse() if channels_history['ok']:
if not channel_id.msg_date: channels_history['messages'].reverse()
converted_time = datetime.strptime(channel_date, if not channel_id.msg_date:
'%Y-%m-%d %H:%M:%S').astimezone( converted_time = datetime.strptime(channel_date,
to_zone) '%Y-%m-%d %H:%M:%S').astimezone(
channel_id.msg_date = converted_time.strftime( to_zone)
'%Y-%m-%d %H:%M:%S') channel_id.msg_date = converted_time.strftime(
else: '%Y-%m-%d %H:%M:%S')
for i in channels_history['messages']: else:
if 'user' in i: for i in channels_history['messages']:
users = self.env['res.users'].search( if 'user' in i:
[('slack_user_id', '=', i['user'])]) users = self.env['res.users'].search(
dt_object = ( [('slack_user_id', '=', i['user'])])
datetime.fromtimestamp(float(i['ts'])).strftime( dt_object = (
'%Y-%m-%d %H:%M:%S')) datetime.fromtimestamp(
date_time_obj = datetime.strptime(dt_object, float(i['ts'])).strftime(
'%Y-%m-%d %H:%M:%S') '%Y-%m-%d %H:%M:%S'))
converted_time = date_time_obj.astimezone(to_zone) date_time_obj = datetime.strptime(dt_object,
if datetime.strptime(converted_time.strftime( '%Y-%m-%d %H:%M:%S')
'%Y-%m-%d %H:%M:%S'), converted_time = date_time_obj.astimezone(
'%Y-%m-%d %H:%M:%S') > channel_id.msg_date: to_zone)
self.with_user(users.id).create({ if datetime.strptime(converted_time.strftime(
'body': i['text'], '%Y-%m-%d %H:%M:%S'),
'record_name': channel_id.name, '%Y-%m-%d %H:%M:%S') > channel_id.msg_date:
'model': 'mail.channel', self.with_user(users.id).create({
'is_slack': True, 'body': i['text'],
'res_id': channel_id.id, 'record_name': channel_id.name,
}) 'model': 'mail.channel',
converted_time = datetime.strptime(channel_date, 'is_slack': True,
'%Y-%m-%d %H:%M:%S').astimezone( 'res_id': channel_id.id,
to_zone) })
channel_id.msg_date = converted_time.strftime( converted_time = datetime.strptime(channel_date,
'%Y-%m-%d %H:%M:%S') '%Y-%m-%d %H:%M:%S').astimezone(
to_zone)
channel_id.msg_date = converted_time.strftime(
'%Y-%m-%d %H:%M:%S')

11
odoo_slack_connector/models/res_company.py

@ -20,9 +20,13 @@
# #
############################################################################# #############################################################################
import json import json
import logging
import requests import requests
from requests import RequestException
from odoo import fields, models from odoo import fields, models
logger = logging.getLogger(__name__)
class ResCompany(models.Model): class ResCompany(models.Model):
_inherit = 'res.company' _inherit = 'res.company'
@ -48,7 +52,6 @@ class ResCompany(models.Model):
headers = { headers = {
'Authorization': 'Bearer ' + self.token 'Authorization': 'Bearer ' + self.token
} }
users_response = requests.request("GET", url1, headers=headers, users_response = requests.request("GET", url1, headers=headers,
data=payload) data=payload)
users_response = users_response.__dict__['_content'] users_response = users_response.__dict__['_content']
@ -61,7 +64,6 @@ class ResCompany(models.Model):
channels_response = channel_response.__dict__['_content'] channels_response = channel_response.__dict__['_content']
dict_channels = channels_response.decode("UTF-8") dict_channels = channels_response.decode("UTF-8")
channels = json.loads(dict_channels) channels = json.loads(dict_channels)
search_channel = self.env['mail.channel'].search([]) search_channel = self.env['mail.channel'].search([])
for i in search_channel: for i in search_channel:
channel_list.append(i.channel) channel_list.append(i.channel)
@ -74,7 +76,8 @@ class ResCompany(models.Model):
'is_slack': True, 'is_slack': True,
}, ]) }, ])
search_channel.sync_members() search_channel.sync_members()
self.env['res.users'].search([]).sync_users() users = self.env['res.users'].search([])
users.sync_users()
users_list = [] users_list = []
slack_id_list = [] slack_id_list = []
channels_list = [] channels_list = []
@ -88,7 +91,6 @@ class ResCompany(models.Model):
{'name': channel['name']} {'name': channel['name']}
)) ))
self.slack_channel_ids = channels_list self.slack_channel_ids = channels_list
record_user_list = [] record_user_list = []
for rec in record.slack_users_ids: for rec in record.slack_users_ids:
record_user_list.append(rec.user) record_user_list.append(rec.user)
@ -105,7 +107,6 @@ class ResCompany(models.Model):
'email': email}, 'email': email},
)) ))
self.slack_users_ids = users_list self.slack_users_ids = users_list
for partner_id in self.env['res.partner'].search([]): for partner_id in self.env['res.partner'].search([]):
slack_id_list.append(partner_id.slack_user_id) slack_id_list.append(partner_id.slack_user_id)
if members is not False: if members is not False:

16
odoo_slack_connector/models/res_users.py

@ -23,6 +23,7 @@ import requests
import logging import logging
from odoo import fields, models from odoo import fields, models
from odoo.exceptions import UserError
class ResPartner(models.Model): class ResPartner(models.Model):
@ -35,16 +36,13 @@ class ResPartner(models.Model):
def sync_users(self): def sync_users(self):
"""To load slack users""" """To load slack users"""
slack_internal_user_list = [user_id.slack_user_id for user_id in self] slack_internal_user_list = [user_id.slack_user_id for user_id in self]
url = "https://slack.com/api/users.list" url = "https://slack.com/api/users.list"
company_record = self.env.user.company_id company_record = self.env.user.company_id
payload = {} payload = {}
headers = { headers = {
'Authorization': 'Bearer ' + company_record.token 'Authorization': 'Bearer ' + company_record.token
} }
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
try: try:
response = requests.get(url, headers=headers, data=payload) response = requests.get(url, headers=headers, data=payload)
response.raise_for_status() response.raise_for_status()
@ -69,7 +67,17 @@ class ResPartner(models.Model):
vals_list.append(vals) vals_list.append(vals)
try: try:
if vals_list: if vals_list:
self.create(vals_list) for val in vals_list:
existing_user = self.search([
('login', '=', val['login'])], limit=1)
if existing_user:
if existing_user.is_slack_internal_users:
existing_user.write(
{'slack_user_id': val['slack_user_id']})
else:
raise UserError("User with email '%s' already exists as a Slack user." % val['login'])
else:
self.create(val)
except Exception as e: except Exception as e:
# Handle creation exception # Handle creation exception
logger.error(f"Error creating Slack users: {e}") logger.error(f"Error creating Slack users: {e}")

4
odoo_slack_connector/security/ir.model.access.csv

@ -1,7 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_res_company_slack_users,access.res.company.slack.users,model_res_company_slack_users,base.group_user,1,1,1,1 access_res_company_slack_users,access.res.company.slack.users,model_res_company_slack_users,base.group_user,1,1,1,1
access_res_company_slack_channels,access.res.company.slack.channels,model_res_company_slack_channels,base.group_user,1,1,1,1 access_res_company_slack_channels,access.res.company.slack.channels,model_res_company_slack_channels,base.group_user,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_res_company_slack_users access.res.company.slack.users model_res_company_slack_users base.group_user 1 1 1 1
3 access_res_company_slack_channels access.res.company.slack.channels model_res_company_slack_channels base.group_user 1 1 1 1

2
odoo_slack_connector/views/mail_channel.xml

@ -13,4 +13,4 @@
</field> </field>
</record> </record>
</data> </data>
</odoo> </odoo>

2
odoo_slack_connector/views/mail_message.xml

@ -12,4 +12,4 @@
</field> </field>
</record> </record>
</data> </data>
</odoo> </odoo>

82
odoo_slack_connector/views/res_company.xml

@ -1,48 +1,46 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<odoo> <odoo>
<data> <record id="view_company_form" model="ir.ui.view">
<record id="view_form_res_company_inherit" model="ir.ui.view"> <field name="name">res.company.inherit.odoo.slack.connector</field>
<field name="name">res.company.for.inherit</field> <field name="model">res.company</field>
<field name="model">res.company</field> <field name="inherit_id" ref="base.view_company_form"/>
<field name="inherit_id" ref="base.view_company_form"/> <field name="arch" type="xml">
<field name="arch" type="xml"> <data>
<data> <xpath expr="//page[@name='general_info']" position="after">
<xpath expr="//page[@name='general_info']" position="after"> <page name="stack_integration"
<page name="stack_integration" string="Slack Integration">
string="Slack Integration"> <group>
<group> <group>
<group> <field name="token"/>
<field name="token"/>
</group>
<group>
<button name="sync_conversations"
string="Sync Conversations"
type="object"
class="oe_highlight"/>
</group>
</group> </group>
<group> <group>
<field name="slack_users_ids"> <button name="sync_conversations"
<tree editable="bottom" string="All Users" string="Sync Conversations"
create="false" delete="0"> type="object"
<field name="name"/> class="oe_highlight"/>
<field name="email"/>
<field name="user"/>
</tree>
</field>
</group> </group>
<group> </group>
<field name="slack_channel_ids"> <group>
<tree editable="bottom" string="Channels" <field name="slack_users_ids">
create="false" delete="0"> <tree editable="bottom" string="All Users"
<field name="name"/> create="false" delete="0">
</tree> <field name="name"/>
</field> <field name="email"/>
</group> <field name="user"/>
</page> </tree>
</xpath> </field>
</data> </group>
</field> <group>
</record> <field name="slack_channel_ids">
</data> <tree editable="bottom" string="Channels"
</odoo> create="false" delete="0">
<field name="name"/>
</tree>
</field>
</group>
</page>
</xpath>
</data>
</field>
</record>
</odoo>

26
odoo_slack_connector/views/res_partner.xml

@ -1,16 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<odoo> <odoo>
<data> <record id="res_partner_form_inherit" model="ir.ui.view">
<record id="res_partner_form_inherit" model="ir.ui.view"> <field name="name">res.partner.form.inherit</field>
<field name="name">res.partner.form.inherit</field> <field name="model">res.partner</field>
<field name="model">res.partner</field> <field name="inherit_id" ref="base.view_partner_form"/>
<field name="inherit_id" ref="base.view_partner_form"/> <field name="arch" type="xml">
<field name="arch" type="xml"> <xpath expr="//field[@name='vat']" position="after">
<xpath expr="//field[@name='vat']" position="after"> <field name="is_slack_user" invisible="1"/>
<field name="is_slack_user" invisible="1"/> <field name="slack_user_id"/>
<field name="slack_user_id"/> </xpath>
</xpath> </field>
</field> </record>
</record> </odoo>
</data>
</odoo>

28
odoo_slack_connector/views/res_users.xml

@ -1,17 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<odoo> <odoo>
<data> <record id="res_users_form_inherit" model="ir.ui.view">
<record id="res_users_form_inherit" model="ir.ui.view"> <field name="name">res.users.form.inherit</field>
<field name="name">res.users.form.inherit</field> <field name="model">res.users</field>
<field name="model">res.users</field> <field name="inherit_id" ref="base.view_users_form"/>
<field name="inherit_id" ref="base.view_users_form"/> <field name="arch" type="xml">
<field name="arch" type="xml"> <xpath expr="//field[@name='login']" position="after">
<xpath expr="//field[@name='login']" position="after"> <p>Slack User Id</p>
<p>Slack User Id</p> <field name="is_slack_internal_users" invisible="1"/>
<field name="is_slack_internal_users" invisible="1"/> <field name="slack_user_id"/>
<field name="slack_user_id"/> </xpath>
</xpath> </field>
</field> </record>
</record> </odoo>
</data>
</odoo>

Loading…
Cancel
Save