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.
		
		
		
		
		
			
		
			
				
					
					
						
							212 lines
						
					
					
						
							9.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							212 lines
						
					
					
						
							9.7 KiB
						
					
					
				
								from odoo import models, fields
							 | 
						|
								import requests
							 | 
						|
								import json
							 | 
						|
								from odoo.exceptions import ValidationError
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class MailerCloudApiSync(models.Model):
							 | 
						|
								    _name = 'mailer.cloud.api.sync'
							 | 
						|
								
							 | 
						|
								    api_key = fields.Char(string='Api Key', required=True)
							 | 
						|
								    active = fields.Boolean(string='Check')
							 | 
						|
								    email = fields.Char(string='Email')
							 | 
						|
								    name = fields.Char(string="Name")
							 | 
						|
								    plan = fields.Char(string='Plan')
							 | 
						|
								    remaining_contacts = fields.Integer(string='Remaining Contacts')
							 | 
						|
								    total_contacts = fields.Integer(string='Total Contacts')
							 | 
						|
								    used_contacts = fields.Integer(string='Used Contacts')
							 | 
						|
								    list_id = fields.Many2one('mailer.cloud.list', string='List')
							 | 
						|
								    contact_mapping_ids = fields.One2many('contact.sync', 'sync_id')
							 | 
						|
								    contact_sync_active = fields.Boolean()
							 | 
						|
								    contact_sync_time = fields.Datetime()
							 | 
						|
								
							 | 
						|
								    def action_sync(self):
							 | 
						|
								        # test connection api
							 | 
						|
								        self.write({'contact_mapping_ids': [(5, 0, 0)]})
							 | 
						|
								        try:
							 | 
						|
								            url = "https://cloudapi.mailercloud.com/v1/client/plan"
							 | 
						|
								
							 | 
						|
								            payload = ""
							 | 
						|
								            headers = {
							 | 
						|
								                'Authorization': self.api_key,
							 | 
						|
								                'Content-Type': 'application/json'
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            response = requests.request("GET", url, headers=headers,
							 | 
						|
								                                        data=payload)
							 | 
						|
								            if response.status_code == 200:
							 | 
						|
								                self.write({
							 | 
						|
								                    'email': response.json()['data']['email'],
							 | 
						|
								                    'name': response.json()['data']['name'],
							 | 
						|
								                    'plan': response.json()['data']['plan'],
							 | 
						|
								                    'remaining_contacts': response.json()['data'][
							 | 
						|
								                        'remaining_contacts'],
							 | 
						|
								                    'total_contacts': response.json()['data'][
							 | 
						|
								                        'total_contacts'],
							 | 
						|
								                    'used_contacts': response.json()['data']['used_contacts'],
							 | 
						|
								                    'active': True,
							 | 
						|
								                    'contact_mapping_ids':
							 | 
						|
								                        [(0, 0, {'property_id': self.env.ref(
							 | 
						|
								                            'mailer_cloud_connector.property_data_name').id,
							 | 
						|
								                                 'contact_fields': 'name'}),
							 | 
						|
								                         (0, 0, {'property_id': self.env.ref(
							 | 
						|
								                             'mailer_cloud_connector.property_data_email').id,
							 | 
						|
								                                 'contact_fields': 'email'})]
							 | 
						|
								                })
							 | 
						|
								                self.get_list(self.id)
							 | 
						|
								                self.get_properties()
							 | 
						|
								            else:
							 | 
						|
								                raise ValidationError(response.json()['errors'][0]['message'])
							 | 
						|
								        except Exception as e:
							 | 
						|
								            raise ValidationError(e)
							 | 
						|
								
							 | 
						|
								    def get_list(self, user):
							 | 
						|
								        # getting list of particular api
							 | 
						|
								        self.env['mailer.cloud.list'].search([]).unlink()
							 | 
						|
								        try:
							 | 
						|
								            url = "https://cloudapi.mailercloud.com/v1/lists/search"
							 | 
						|
								
							 | 
						|
								            payload = json.dumps({
							 | 
						|
								                "limit": 100,
							 | 
						|
								                "list_type": 1,
							 | 
						|
								                "page": 1,
							 | 
						|
								                "search_name": "",
							 | 
						|
								                "sort_field": "name",
							 | 
						|
								                "sort_order": "asc"
							 | 
						|
								            })
							 | 
						|
								            headers = {
							 | 
						|
								                'Authorization': self.api_key,
							 | 
						|
								                'Content-Type': 'application/json'
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            response = requests.request("POST", url, headers=headers,
							 | 
						|
								                                        data=payload)
							 | 
						|
								            if response.status_code == 200:
							 | 
						|
								                for rec in response.json()['data']:
							 | 
						|
								                    self.env['mailer.cloud.list'].create({
							 | 
						|
								                        'name': rec['name'],
							 | 
						|
								                        'mailer_cloud_id': rec['id'],
							 | 
						|
								                        'authorization_id': user,
							 | 
						|
								                    })
							 | 
						|
								            elif response.status_code == 400:
							 | 
						|
								                raise ValidationError(response.json()['error']['message'])
							 | 
						|
								            elif response.status_code == 401:
							 | 
						|
								                raise ValidationError(response.json()['errors'][0]['message'])
							 | 
						|
								        except Exception as e:
							 | 
						|
								            raise ValidationError(e)
							 | 
						|
								
							 | 
						|
								    def get_properties(self):
							 | 
						|
								        # getting properties of particular api
							 | 
						|
								        try:
							 | 
						|
								            url = "https://cloudapi.mailercloud.com/v1/contact/property/search"
							 | 
						|
								
							 | 
						|
								            payload = json.dumps({
							 | 
						|
								                "limit": 100,
							 | 
						|
								                "page": 1,
							 | 
						|
								                "search": ""
							 | 
						|
								            })
							 | 
						|
								            headers = {
							 | 
						|
								                'Authorization': self.api_key,
							 | 
						|
								                'Content-Type': 'application/json'
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            response = requests.request("POST", url, headers=headers,
							 | 
						|
								                                        data=payload)
							 | 
						|
								            if response.status_code == 200:
							 | 
						|
								                for record in response.json()['data']:
							 | 
						|
								                    if record['field_value'] not in self.env[
							 | 
						|
								                        'mailer.cloud.properties'].search(
							 | 
						|
								                        [('authorization_id', '=', False)]).mapped('name'):
							 | 
						|
								                        if record['field_type'] == 'Text':
							 | 
						|
								                            type_name = 'text'
							 | 
						|
								                        elif record['field_type'] == 'Number':
							 | 
						|
								                            type_name = 'number'
							 | 
						|
								                        elif record['field_type'] == 'Date':
							 | 
						|
								                            type_name = 'date'
							 | 
						|
								                        elif record['field_type'] == 'Textarea':
							 | 
						|
								                            type_name = 'textarea'
							 | 
						|
								                        self.env.cr.execute("""INSERT INTO mailer_cloud_properties(mailer_cloud_id,name,type,authorization_id)
							 | 
						|
								                                                                                        VALUES('%s','%s','%s',%s)""" % (
							 | 
						|
								                            record['id'], record['field_value'], type_name,
							 | 
						|
								                            self.id))
							 | 
						|
								            elif response.status_code == 400:
							 | 
						|
								                raise ValidationError(response.json()['error']['message'])
							 | 
						|
								            elif response.status_code == 401:
							 | 
						|
								                raise ValidationError(response.json()['errors'][0]['message'])
							 | 
						|
								        except Exception as e:
							 | 
						|
								            raise ValidationError(e)
							 | 
						|
								
							 | 
						|
								    def action_contact_sync(self):
							 | 
						|
								        # for syncing contacts
							 | 
						|
								        if self.list_id:
							 | 
						|
								            try:
							 | 
						|
								                contact_details = []
							 | 
						|
								                contact_details.clear()
							 | 
						|
								                res = self.env['res.partner'].search([], limit=50)
							 | 
						|
								                for j in res:
							 | 
						|
								                    contact_details_dict = {}
							 | 
						|
								                    contact_details_dict.clear()
							 | 
						|
								                    for i in range(
							 | 
						|
								                            len(self.contact_mapping_ids.mapped(
							 | 
						|
								                                'property_id.name'))):
							 | 
						|
								                        if self.env['mailer.cloud.properties'].search(
							 | 
						|
								                                [('id', '=',
							 | 
						|
								                                  self.contact_mapping_ids.mapped(
							 | 
						|
								                                      'property_id')[
							 | 
						|
								                                      i].id)]).mailer_cloud_id != False:
							 | 
						|
								                            contact_details_dict['custom_fields'] = {
							 | 
						|
								                                self.contact_mapping_ids.mapped(
							 | 
						|
								                                    'property_id.mailer_cloud_id')[i]:
							 | 
						|
								                                    self.env['res.partner'].search_read(
							 | 
						|
								                                        [('id', '=', j.id)], [
							 | 
						|
								                                            self.contact_mapping_ids.mapped(
							 | 
						|
								                                                'contact_fields')[i]])[0][
							 | 
						|
								                                        self.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[
							 | 
						|
								                                self.contact_mapping_ids.mapped(
							 | 
						|
								                                    'property_id.name')[
							 | 
						|
								                                    i]] = self.env['res.partner'].search_read(
							 | 
						|
								                                [('id', '=', j.id)], [
							 | 
						|
								                                    self.contact_mapping_ids.mapped(
							 | 
						|
								                                        'contact_fields')[i]])[0][
							 | 
						|
								                                              self.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.append(contact_details_dict)
							 | 
						|
								                url = "https://cloudapi.mailercloud.com/v1/contacts/batch"
							 | 
						|
								                payload = json.dumps({
							 | 
						|
								                    "contacts": contact_details,
							 | 
						|
								                    "list_id": self.list_id.mailer_cloud_id
							 | 
						|
								                })
							 | 
						|
								                headers = {
							 | 
						|
								                    'Authorization': self.api_key,
							 | 
						|
								                    'Content-Type': 'application/json'
							 | 
						|
								                }
							 | 
						|
								                response = requests.request("POST", url, headers=headers,
							 | 
						|
								                                            data=payload)
							 | 
						|
								                if response.status_code == 200:
							 | 
						|
								                    self.write({
							 | 
						|
								                        'contact_sync_active': True,
							 | 
						|
								                        'contact_sync_time': fields.Datetime.now()
							 | 
						|
								                    })
							 | 
						|
								                elif response.status_code == 400:
							 | 
						|
								                    raise ValidationError(response.json()['errors']['message'])
							 | 
						|
								                elif response.status_code == 401:
							 | 
						|
								                    raise ValidationError(
							 | 
						|
								                        response.json()['errors'][0]['message'])
							 | 
						|
								            except Exception as e:
							 | 
						|
								                raise ValidationError(e)
							 | 
						|
								        else:
							 | 
						|
								            raise ValidationError("Please Choose a List")
							 | 
						|
								
							 |