You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
6.7 KiB
141 lines
6.7 KiB
# -*- coding: utf-8 -*-
|
|
################################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
|
|
# Author: Unnimaya C O (odoo@cybrosys.com)
|
|
#
|
|
# You can modify it under the terms of the GNU AFFERO
|
|
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
# (AGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
################################################################################
|
|
import requests
|
|
from odoo import fields, models
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class MondayConnector(models.TransientModel):
|
|
_name = 'monday.connector'
|
|
_description = 'Monday Connector'
|
|
_rec_name = 'credential_id'
|
|
|
|
credential_id = fields.Many2one('monday.credential', required="True",
|
|
string="Monday Credentials",
|
|
help="Select the credential for connecting"
|
|
" with Monday.com")
|
|
import_user = fields.Boolean(string="Import User",
|
|
help="Check if you want to import user")
|
|
import_board = fields.Boolean(string="Import Board",
|
|
help="Check if you want to import board")
|
|
import_group = fields.Boolean(string="Import Group",
|
|
help="If you want to import the board, "
|
|
"groups will also imported",
|
|
readonly=True, default=True)
|
|
import_item = fields.Boolean(string="Import Item",
|
|
help="If you want to import the board, "
|
|
"items will also imported",
|
|
readonly=True, default=True)
|
|
import_contact = fields.Boolean(string="Import Customer",
|
|
help="Check if you want to import contact")
|
|
|
|
def action_execute(self):
|
|
"""Function for executing Import and Export between Odoo and
|
|
Monday.com"""
|
|
if self.import_board:
|
|
self.get_boards("https://api.monday.com/v2",
|
|
{"Authorization": self.credential_id.token})
|
|
if self.import_user:
|
|
self.get_users("https://api.monday.com/v2",
|
|
{"Authorization": self.credential_id.token})
|
|
self.unlink()
|
|
|
|
def get_boards(self, url, headers):
|
|
"""Function for receiving Boards from Monday.com"""
|
|
vals = {}
|
|
response = requests.post(url=url, json={
|
|
'query': '{boards{ name id owner{name} groups{title id} ' \
|
|
'items { name column_values{title id type text } }} }'},
|
|
headers=headers)
|
|
board = self.env['monday.board'].search([]).mapped('board_reference')
|
|
if 'error_code' in response.json().keys():
|
|
raise ValidationError(response.json()['error_message'])
|
|
elif 'errors' in response.json().keys():
|
|
raise ValidationError(response.json()['errors'])
|
|
else:
|
|
for rec in response.json()['data']['boards']:
|
|
if rec['id'] not in board:
|
|
# Create Board
|
|
board_obj = self.env['monday.board'].create([{
|
|
'name': rec['name'],
|
|
'board_reference': rec['id'],
|
|
'owner': rec['owner']['name']
|
|
}])
|
|
for item in rec['groups']:
|
|
if rec['id'] not in board:
|
|
board_obj.write({
|
|
'group_ids': [
|
|
(0, 0,
|
|
{'name': item['title'],
|
|
'group': item['id']}),
|
|
]
|
|
})
|
|
for item in rec['items']:
|
|
if rec['id'] not in board:
|
|
# Update Items
|
|
board_obj.write({
|
|
'item_ids': [
|
|
(0, 0,
|
|
{'name': item['name'],
|
|
'column_value_ids': [
|
|
(0, 0,
|
|
{'title': value['title'],
|
|
'item_id': value['id'],
|
|
'text': value['text'],
|
|
}) for value in item['column_values']
|
|
]
|
|
}), ]})
|
|
if rec['name'] == 'Contacts' and self.import_contact:
|
|
for value in item['column_values']:
|
|
vals[value['title']] = value['text']
|
|
partner = self.env['res.partner'].search([]).mapped(
|
|
'email')
|
|
if vals['Email'] not in partner:
|
|
# Create User
|
|
self.env['res.partner'].create({
|
|
'name': item['name'],
|
|
'phone': vals['Phone'],
|
|
'email': vals['Email'],
|
|
'company_name': vals[
|
|
'Company'] if 'Company' in vals.keys()
|
|
else False,
|
|
'monday_reference': True
|
|
})
|
|
|
|
def get_users(self, apiurl, headers):
|
|
"""Function for receiving Users from Monday.com"""
|
|
response = requests.post(url=apiurl,
|
|
json={'query': '{users { id name email }}'},
|
|
headers=headers)
|
|
if 'error_code' in response.json().keys():
|
|
raise ValidationError(response.json()['error_message'])
|
|
elif 'errors' in response.json().keys():
|
|
raise ValidationError(response.json()['errors'])
|
|
for rec in response.json()['data']['users']:
|
|
if not self.env['res.users'].search([('login', '=', rec['email'])]):
|
|
self.env['res.users'].create({
|
|
'name': rec['name'],
|
|
'email': rec['email'],
|
|
'login': rec['email'],
|
|
'password': 'demo_password',
|
|
'monday_reference': rec['id']
|
|
})
|
|
|