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
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
|
|
|