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.
		
		
		
		
		
			
		
			
				
					
					
						
							131 lines
						
					
					
						
							6.0 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							131 lines
						
					
					
						
							6.0 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Jumana Jabin MP (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 bs4 import BeautifulSoup
							 | 
						|
								from datetime import datetime
							 | 
						|
								from odoo import api, fields, models
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class ProjectTask(models.Model):
							 | 
						|
								    """ Model for Project Task to add in google task """
							 | 
						|
								    _inherit = 'project.task'
							 | 
						|
								
							 | 
						|
								    is_add_in_gtask = fields.Boolean(string="Add In Google Task",
							 | 
						|
								                                     help='Whether to add the task in Google'
							 | 
						|
								                                          ' Task')
							 | 
						|
								    google_task = fields.Char(string="Exported to Google Task",
							 | 
						|
								                              help='ID of the task exported to Google Task')
							 | 
						|
								    is_imported = fields.Boolean(string='Imported From Google Task',
							 | 
						|
								                                 help='Whether the task is imported from '
							 | 
						|
								                                      'Google Task')
							 | 
						|
								    task_id = fields.Many2one('project.task', string='Task',
							 | 
						|
								                              help='Select a task from the list.')
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def create(self, vals):
							 | 
						|
								        """Create method override to sync task with Google Task when created"""
							 | 
						|
								        task = super().create(vals)
							 | 
						|
								        if task.is_add_in_gtask:
							 | 
						|
								            self.action_sync_task_to_google(task)
							 | 
						|
								        return task
							 | 
						|
								
							 | 
						|
								    def write(self, vals):
							 | 
						|
								        """Write method override to sync task with Google Task when updated"""
							 | 
						|
								        res = super(ProjectTask, self).write(vals)
							 | 
						|
								        for task in self:
							 | 
						|
								            if task.is_add_in_gtask in vals:
							 | 
						|
								                self.action_sync_task_to_google(task)
							 | 
						|
								        return res
							 | 
						|
								
							 | 
						|
								    def action_sync_task_to_google(self):
							 | 
						|
								        """Sync the task to Google Task"""
							 | 
						|
								        if not self.description:
							 | 
						|
								            self.description ="New Task added to Google Task"
							 | 
						|
								        self.is_add_in_gtask = True
							 | 
						|
								        company_id = self.env.ref(
							 | 
						|
								            'odoo_google_tasks_integration.project_google_credential_data')
							 | 
						|
								        url = f"https://tasks.googleapis.com/tasks/v1/lists/@default/tasks?" \
							 | 
						|
								              f"key={company_id.hangout_company_api_key}"
							 | 
						|
								        headers = {
							 | 
						|
								            "Authorization": f"Bearer "
							 | 
						|
								                             f"{company_id.hangout_company_access_token}",
							 | 
						|
								            'Content-Type': 'application/json',
							 | 
						|
								            "Accept": "application/json"
							 | 
						|
								        }
							 | 
						|
								        # Extract the plain text from the description using BeautifulSoup
							 | 
						|
								        soup = BeautifulSoup(self.description, 'html.parser')
							 | 
						|
								        note = soup.get_text()
							 | 
						|
								        datetime_obj = fields.datetime.combine(
							 | 
						|
								            self.date_deadline or fields.Date.today(), datetime.min.time())
							 | 
						|
								        main_task_data = {
							 | 
						|
								            'title': self.name,
							 | 
						|
								            'due': datetime_obj.strftime("%Y-%m-%dT%H:%M:%SZ"),
							 | 
						|
								            'notes': note if self.description else None,
							 | 
						|
								        }
							 | 
						|
								        # Create or update the main task
							 | 
						|
								        if self.google_task:
							 | 
						|
								            main_task_url = f"https://tasks.googleapis.com/tasks/v1/lists/" \
							 | 
						|
								                            f"@default/tasks/{self.google_task}"
							 | 
						|
								            response = requests.patch(main_task_url, headers=headers,
							 | 
						|
								                                      json=main_task_data)
							 | 
						|
								        else:
							 | 
						|
								            response = requests.post(url, headers=headers, json=main_task_data)
							 | 
						|
								        if response.status_code == 200:
							 | 
						|
								            main_task_id = response.json().get('id')
							 | 
						|
								            if self.google_task != main_task_id:
							 | 
						|
								                self.google_task = main_task_id
							 | 
						|
								                message = f'(Main task created/updated: {main_task_id})'
							 | 
						|
								                self.message_post(body=message)
							 | 
						|
								            # Update the corresponding Google task for the current task
							 | 
						|
								            google_task = self.env['project.task'].search(
							 | 
						|
								                [('task_id', '=', self.id)], limit=1)
							 | 
						|
								            if google_task and google_task.google_task != main_task_id:
							 | 
						|
								                google_task.google_task = main_task_id
							 | 
						|
								            # Process subtasks
							 | 
						|
								            for subtask in self.child_ids:
							 | 
						|
								                subtask_data = {
							 | 
						|
								                    'title': subtask.name,
							 | 
						|
								                    'status': 'needsAction',
							 | 
						|
								                }
							 | 
						|
								                if subtask.google_task:
							 | 
						|
								                    subtask_url = f"https://tasks.googleapis.com/tasks/v1/" \
							 | 
						|
								                                  f"lists/@default/tasks/{subtask.google_task}"
							 | 
						|
								                    response = requests.patch(subtask_url, headers=headers,
							 | 
						|
								                                              json=subtask_data)
							 | 
						|
								                else:
							 | 
						|
								                    response = requests.post(url, headers=headers,
							 | 
						|
								                                             json=subtask_data)
							 | 
						|
								                if response.status_code == 200 :
							 | 
						|
								                    subtask_id = response.json().get('id')
							 | 
						|
								                    if subtask.google_task != subtask_id:
							 | 
						|
								                        subtask.google_task = subtask_id
							 | 
						|
								                        message = f'(Subtask created/updated: {subtask_id})'
							 | 
						|
								                        self.message_post(body=message)
							 | 
						|
								                    # Move the subtask under the main task
							 | 
						|
								                    move_url = f"https://tasks.googleapis.com/tasks/v1/lists/"\
							 | 
						|
								                               f"@default/tasks/{subtask_id}/move"
							 | 
						|
								                    move_data = {
							 | 
						|
								                        'parent': main_task_id
							 | 
						|
								                    }
							 | 
						|
								                    move_response = requests.post(move_url, headers=headers,
							 | 
						|
								                                                  json=move_data)
							 | 
						|
								                    return move_response
							 | 
						|
								
							 |