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.
 
 
 
 
 

159 lines
7.9 KiB

# -*- coding: utf-8 -*-
#############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions (<https://www.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 json
import requests
from odoo import api, fields, models
from odoo.exceptions import ValidationError
class InheritContacts(models.Model):
"""
Extends the base 'res.partner' model to include additional fields related to Mailercloud integration.
This class inherits from the 'res.partner' model and adds custom fields for Mailercloud integration,
including 'partner_type' and 'mailer_cloud'.
"""
_inherit = 'res.partner'
partner_type = fields.Char(
string='Partner Type', compute='_compute_partner_type',
help='Type of the partner, computed based on specific criteria.')
mailer_cloud = fields.Char(string='Mailercloud',
help='Identifier for the partner in '
'Mailercloud.')
def _compute_partner_type(self):
"""
Compute method to determine the 'partner_type' based on specific criteria.
This method computes the 'partner_type' field based on certain conditions or criteria.
"""
for rec in self:
if rec.sale_order_count > 0 and rec.purchase_order_count > 0:
rec.partner_type = "Vendor and Customer"
elif rec.sale_order_count > 0:
rec.partner_type = "Customer"
elif rec.purchase_order_count > 0:
rec.partner_type = "Vendor"
else:
rec.partner_type = None
@api.model
def create(self, vals_list):
"""
Create method to extend the creation of 'res.partner' records and synchronize data with Mailercloud.
This method is called when creating a new 'res.partner' record. It extends the base creation process
to include synchronization with Mailercloud, if contact synchronization is active for any associated API.
:param vals_list: List of dictionaries containing values for the new 'res.partner' record(s).
:return: Created 'res.partner' record(s).
:raises: ValidationError if there is an issue with the Mailercloud API synchronization.
"""
res = super(InheritContacts, self).create(vals_list)
contact_sync = self.env['mailer.cloud.api.sync'].search(
[('contact_sync_active', '=', True)],
order='contact_sync_time desc', limit=1)
if contact_sync:
try:
for rec in contact_sync:
contact_details_dict = {}
contact_details_dict.clear()
for i in range(
len(rec.contact_mapping_ids.mapped(
'property_id.name'))):
if self.env['mailer.cloud.properties'].search([('id', '=', rec.contact_mapping_ids.mapped(
'property_id')[i].id)]).mailer_cloud:
contact_details_dict['custom_fields'] = {
rec.contact_mapping_ids.mapped('property_id.mailer_cloud')[i]:
res.read([rec.contact_mapping_ids.mapped('contact_fields')[i]])[0][
rec.contact_mapping_ids.mapped('contact_fields')[i]] or ' '}
for key, value in contact_details_dict['custom_fields'].items():
if isinstance(value, float):
contact_details_dict[
'custom_fields'].update(
{key: round(value)})
else:
contact_details_dict[
rec.contact_mapping_ids.mapped(
'property_id.name')[
i]] = res.read([rec.contact_mapping_ids.mapped('contact_fields')[i]])[0][
rec.contact_mapping_ids.mapped('contact_fields')[i]] or ' '
for key, value in contact_details_dict.items():
if isinstance(value, float):
contact_details_dict.update(
{key: round(value)})
contact_details_dict[
'list_id'] = rec.list_id.mailer_cloud
url = "https://cloudapi.mailercloud.com/v1/contacts"
payload = json.dumps(contact_details_dict)
headers = {
'Authorization': rec.api_key,
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
if response.status_code in (400, 401):
raise ValidationError(
response.json()['errors'][0]['message'])
except Exception as e:
raise ValidationError(e)
return res
def write(self, vals):
"""
Extend the standard write method for 'res.partner' records and synchronize updates with Mailercloud.
This method is called when updating an existing 'res.partner' record. It extends the base write process
to include synchronization with Mailercloud if contact synchronization is active for any associated API.
:param vals: Dictionary of field-value pairs to update for the 'res.partner' record.
:return: Result of the standard write method.
:raises: ValidationError if there is an issue with the Mailercloud API synchronization.
"""
res = super(InheritContacts, self).write(vals)
contact_sync = self.env['mailer.cloud.api.sync'].search(
[('contact_sync_active', '=', True)], order='contact_sync_time desc', limit=1)
if contact_sync:
update_dict = {}
for key, vals in vals.items():
for rec in contact_sync.contact_mapping_ids:
if key == rec.contact_fields and rec.property_id.mailer_cloud:
update_dict['custom_fields'] = {
rec.property_id.mailer_cloud: round(vals) if type(vals) == float else vals}
elif key == rec.contact_fields:
update_dict[key] = round(vals) if type(vals) == float else vals
else:
continue
if len(update_dict) > 0:
try:
url = "https://cloudapi.mailercloud.com/v1/contacts/" + self.email
payload = json.dumps(update_dict)
headers = {
'Authorization': contact_sync.api_key,
'Content-Type': 'application/json'
}
requests.request("PUT", url, headers=headers, data=payload)
except Exception as e:
raise ValidationError(e)
else:
pass
return res