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

2
odoo_slack_connector/__manifest__.py

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

5
odoo_slack_connector/data/scheduled_action.xml

@ -1,16 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<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">
<field name="name">Auto Synchronization of slack and odoo</field>
<field name="model_id" ref="model_mail_message"/>
<field name="state">code</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_type">minutes</field>
<field name="numbercall">-1</field>
</record>
</data>
</odoo>
</odoo>

7
odoo_slack_connector/doc/RELEASE_NOTES.md

@ -8,4 +8,9 @@
#### 11.06.2023
#### Version 16.0.1.0.1
##### 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'
_description = 'Slack Channel'
is_slack = fields.Boolean("Slack", default=False)
is_slack = fields.Boolean(string="Slack", default=False)
channel = fields.Char("ID")
msg_date = fields.Datetime()
msg_date = fields.Datetime(string="Message Date")
def sync_members(self):
"""To load members into channels"""
@ -52,18 +52,22 @@ class MailChannel(models.Model):
response = session.get(url, headers=headers, data=payload)
channel_members = response.json()
slack_user_list = []
for slack_user_id in channel_members['members']:
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')
sample_list = [
(0, 0, {'partner_id': contact_id})
for contact_id in slack_user_list
if contact_id not in current_channel_user_list
]
channel.channel_member_ids = sample_list
except RequestException as e:

83
odoo_slack_connector/models/mail_message.py

@ -19,7 +19,7 @@
# If not, see <http://www.gnu.org/licenses/>.
#
#############################################################################
from odoo import fields, models, api
from odoo import api, fields, models
import requests, re, json
from datetime import datetime
from dateutil import tz
@ -35,7 +35,7 @@ class MailMessage(models.Model):
_description = 'Slack Message'
is_slack = fields.Boolean(string="Slack", default=False)
channel = fields.Many2one('mail.channel')
channel = fields.Many2one('mail.channel', string="Channel")
@api.model
def create(self, vals):
@ -57,9 +57,12 @@ class MailMessage(models.Model):
}
new_text = remove_html(rec.body)
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
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')
return res
@ -74,41 +77,45 @@ class MailMessage(models.Model):
payload = {}
headers = {'Authorization': 'Bearer ' + company_record.token}
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)
channels_response = channel_response.__dict__['_content']
dict_channels = channels_response.decode("UTF-8")
channels_history = json.loads(dict_channels)
channels_history['messages'].reverse()
if not channel_id.msg_date:
converted_time = datetime.strptime(channel_date,
'%Y-%m-%d %H:%M:%S').astimezone(
to_zone)
channel_id.msg_date = converted_time.strftime(
'%Y-%m-%d %H:%M:%S')
else:
for i in channels_history['messages']:
if 'user' in i:
users = self.env['res.users'].search(
[('slack_user_id', '=', i['user'])])
dt_object = (
datetime.fromtimestamp(float(i['ts'])).strftime(
'%Y-%m-%d %H:%M:%S'))
date_time_obj = datetime.strptime(dt_object,
'%Y-%m-%d %H:%M:%S')
converted_time = date_time_obj.astimezone(to_zone)
if datetime.strptime(converted_time.strftime(
'%Y-%m-%d %H:%M:%S'),
'%Y-%m-%d %H:%M:%S') > channel_id.msg_date:
self.with_user(users.id).create({
'body': i['text'],
'record_name': channel_id.name,
'model': 'mail.channel',
'is_slack': True,
'res_id': channel_id.id,
})
converted_time = datetime.strptime(channel_date,
'%Y-%m-%d %H:%M:%S').astimezone(
to_zone)
channel_id.msg_date = converted_time.strftime(
'%Y-%m-%d %H:%M:%S')
if channels_history['ok']:
channels_history['messages'].reverse()
if not channel_id.msg_date:
converted_time = datetime.strptime(channel_date,
'%Y-%m-%d %H:%M:%S').astimezone(
to_zone)
channel_id.msg_date = converted_time.strftime(
'%Y-%m-%d %H:%M:%S')
else:
for i in channels_history['messages']:
if 'user' in i:
users = self.env['res.users'].search(
[('slack_user_id', '=', i['user'])])
dt_object = (
datetime.fromtimestamp(
float(i['ts'])).strftime(
'%Y-%m-%d %H:%M:%S'))
date_time_obj = datetime.strptime(dt_object,
'%Y-%m-%d %H:%M:%S')
converted_time = date_time_obj.astimezone(
to_zone)
if datetime.strptime(converted_time.strftime(
'%Y-%m-%d %H:%M:%S'),
'%Y-%m-%d %H:%M:%S') > channel_id.msg_date:
self.with_user(users.id).create({
'body': i['text'],
'record_name': channel_id.name,
'model': 'mail.channel',
'is_slack': True,
'res_id': channel_id.id,
})
converted_time = datetime.strptime(channel_date,
'%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 logging
import requests
from requests import RequestException
from odoo import fields, models
logger = logging.getLogger(__name__)
class ResCompany(models.Model):
_inherit = 'res.company'
@ -48,7 +52,6 @@ class ResCompany(models.Model):
headers = {
'Authorization': 'Bearer ' + self.token
}
users_response = requests.request("GET", url1, headers=headers,
data=payload)
users_response = users_response.__dict__['_content']
@ -61,7 +64,6 @@ class ResCompany(models.Model):
channels_response = channel_response.__dict__['_content']
dict_channels = channels_response.decode("UTF-8")
channels = json.loads(dict_channels)
search_channel = self.env['mail.channel'].search([])
for i in search_channel:
channel_list.append(i.channel)
@ -74,7 +76,8 @@ class ResCompany(models.Model):
'is_slack': True,
}, ])
search_channel.sync_members()
self.env['res.users'].search([]).sync_users()
users = self.env['res.users'].search([])
users.sync_users()
users_list = []
slack_id_list = []
channels_list = []
@ -88,7 +91,6 @@ class ResCompany(models.Model):
{'name': channel['name']}
))
self.slack_channel_ids = channels_list
record_user_list = []
for rec in record.slack_users_ids:
record_user_list.append(rec.user)
@ -105,7 +107,6 @@ class ResCompany(models.Model):
'email': email},
))
self.slack_users_ids = users_list
for partner_id in self.env['res.partner'].search([]):
slack_id_list.append(partner_id.slack_user_id)
if members is not False:

16
odoo_slack_connector/models/res_users.py

@ -23,6 +23,7 @@ import requests
import logging
from odoo import fields, models
from odoo.exceptions import UserError
class ResPartner(models.Model):
@ -35,16 +36,13 @@ class ResPartner(models.Model):
def sync_users(self):
"""To load slack users"""
slack_internal_user_list = [user_id.slack_user_id for user_id in self]
url = "https://slack.com/api/users.list"
company_record = self.env.user.company_id
payload = {}
headers = {
'Authorization': 'Bearer ' + company_record.token
}
logger = logging.getLogger(__name__)
try:
response = requests.get(url, headers=headers, data=payload)
response.raise_for_status()
@ -69,7 +67,17 @@ class ResPartner(models.Model):
vals_list.append(vals)
try:
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:
# Handle creation exception
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
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

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>
</record>
</data>
</odoo>
</odoo>

2
odoo_slack_connector/views/mail_message.xml

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

82
odoo_slack_connector/views/res_company.xml

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

28
odoo_slack_connector/views/res_users.xml

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

Loading…
Cancel
Save