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.
		
		
		
		
		
			
		
			
				
					
					
						
							163 lines
						
					
					
						
							6.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							163 lines
						
					
					
						
							6.9 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################### | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Cybrosys Techno Solutions (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 logging | |
| import requests | |
| from odoo import fields, models | |
| from odoo.exceptions import ValidationError | |
| 
 | |
| _logger = logging.getLogger(__name__) | |
| 
 | |
| TIMEOUT = 20 | |
| 
 | |
| 
 | |
| class ResPartner(models.Model): | |
|     """Inherit res_partner for integrating contacts with Google""" | |
|     _inherit = 'res.partner' | |
| 
 | |
|     google_resource = fields.Char('Google Contact Id', | |
|                                   help='Contact Unique identifier', | |
|                                   readonly=True) | |
|     google_etag = fields.Char( | |
|         'Google Etag', help='Contact Version control key', readonly=True) | |
|     first_name = fields.Char( | |
|         'First Name', help='Enter the first name of the person.') | |
|     last_name = fields.Char( | |
|         'Last Name', help='Enter the last name of the person.') | |
| 
 | |
|     def action_export_google_contacts(self): | |
|         """Export Contacts FROM Google TO ODOO""" | |
|         current_uid = self._context.get('uid') | |
|         user_id = self.env['res.users'].browse(current_uid) | |
|         company_id = user_id.company_id | |
|         partner_ids = self.env['res.partner'].sudo().browse( | |
|             self.env.context.get('active_ids')) | |
|         for partner in partner_ids: | |
|             header = { | |
|                 'Authorization': | |
|                     f'Bearer {company_id.contact_company_access_token}', | |
|                 'Content-Type': 'application/json' | |
|             } | |
|             contact_payload = { | |
|                 'names': [ | |
|                     { | |
|                         'givenName': partner.first_name or partner.name, | |
|                         'familyName': partner.last_name or '' | |
|                     } | |
|                 ], | |
|                 'emailAddresses': [ | |
|                     { | |
|                         'value': partner.email or '', | |
|                         'type': 'work' | |
|                     } | |
|                 ], | |
|                 'phoneNumbers': [ | |
|                     { | |
|                         'value': partner.phone or '', | |
|                         'type': 'work' | |
|                     } | |
|                 ], | |
|                 'addresses': [ | |
|                     { | |
|                         'streetAddress': partner.street or '', | |
|                         'city': partner.city or '', | |
|                         'region': partner.state_id.name or '', | |
|                         'postalCode': partner.zip or '', | |
|                         'country': partner.country_id.name or '', | |
|                         'type': 'work' | |
|                     } | |
|                 ], | |
|                 'organizations': [ | |
|                     { | |
|                         'name': partner.company_id.name or '', | |
|                         'title': partner.title or '', | |
|                         'type': 'work' | |
|                     } | |
|                 ] | |
|             } | |
|             if partner.google_etag: | |
|                 contact_resource_name = partner.google_resource | |
|                 contact_payload['resourceName'] = contact_resource_name | |
|                 contact_payload['etag'] = partner.google_etag | |
|                 url = ( | |
|                     f"https://people.googleapis.com/v1/{contact_resource_name}:updateContact?" | |
|                     "updatePersonFields=emailAddresses,names,phoneNumbers," | |
|                     "addresses,organizations,userDefined&" | |
|                     "prettyPrint=false" | |
|                 ) | |
|                 response = requests.patch(url, headers=header, | |
|                                           json=contact_payload) | |
|                 if response.status_code == 200: | |
|                     partner.write({ | |
|                         'google_resource': response.json().get('resourceName'), | |
|                         'google_etag': response.json().get('etag') | |
|                     }) | |
|                     _logger.info("Contact updated successfully!") | |
|                 else: | |
|                     error_message = f"Failed to update contact. Error: {response.text}" | |
|                     raise ValidationError(error_message) | |
|             else: | |
|                 url = 'https://people.googleapis.com/v1/people:createContact' | |
|                 result = requests.post(url, headers=header, | |
|                                        json=contact_payload) | |
|                 if result.status_code == 200: | |
|                     partner.write({ | |
|                         'google_resource': result.json().get('resourceName'), | |
|                         'google_etag': result.json().get('etag') | |
|                     }) | |
|                     _logger.info("Contact exported successfully!") | |
|                 else: | |
|                     error_message = f"Failed to export contact. Error: {result.text}" | |
|                     raise ValidationError(error_message) | |
| 
 | |
|     def action_delete_google_contact(self): | |
|         """Deleting a contact from Google Contacts""" | |
|         current_uid = self._context.get('uid') | |
|         user_id = self.env['res.users'].browse(current_uid) | |
|         company_id = user_id.company_id | |
|         partner_ids = self.env['res.partner'].sudo().browse( | |
|             self.env.context.get('active_ids')) | |
|         for partner in partner_ids: | |
|             contact_resource_name = partner.google_resource | |
|             if not contact_resource_name: | |
|                 _logger.warning( | |
|                     "Partner %s does not have a Google contact resource name.", | |
|                     partner.name) | |
|                 continue | |
|             url = f"https://people.googleapis.com/v1/{contact_resource_name}:deleteContact" | |
|             headers = { | |
|                 'Authorization': f'Bearer {company_id.contact_company_access_token}', | |
|                 'Content-Type': 'application/json' | |
|             } | |
|             response = requests.delete(url, headers=headers) | |
|             if response.status_code == 200: | |
|                 _logger.info("Contact deleted successfully!") | |
|                 partner.google_resource = '' | |
|                 partner.google_etag = '' | |
|                 partner.unlink() | |
|             elif response.status_code == 404: | |
|                 _logger.warning( | |
|                     "Contact not found in Google. Removing local reference.") | |
|                 partner.google_resource = '' | |
|                 partner.google_etag = '' | |
|             else: | |
|                 error_message = f"Failed to delete contact. Error: {response.text}" | |
|                 raise ValidationError(error_message)
 | |
| 
 |