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.
105 lines
4.4 KiB
105 lines
4.4 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
|
|
# Author: Sayanth M K(<https://www.cybrosys.com>)
|
|
#
|
|
# You can modify it under the terms of the GNU LESSER
|
|
# GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
|
|
#
|
|
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
|
|
# (LGPL v3) along with this program.
|
|
# If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
#############################################################################
|
|
from .todoist_api_python.api import TodoistAPI
|
|
from odoo import fields, models, _
|
|
from odoo.exceptions import MissingError
|
|
|
|
|
|
def _get_todoist_projects_tasks(token, project=False):
|
|
"""Fetch Projects and Tasks from API"""
|
|
try:
|
|
return TodoistAPI(
|
|
token).get_projects() if project else TodoistAPI(token).get_tasks()
|
|
except Exception as error:
|
|
return error
|
|
|
|
|
|
class ResUsers(models.Model):
|
|
"""Extends res_users model to integrate Todoist functionality."""
|
|
_inherit = 'res.users'
|
|
|
|
todoist_token = fields.Char(string='Todoist Token',
|
|
help='todoist auth token to retrieve data'
|
|
' from todoist',
|
|
copy=False)
|
|
|
|
def _fetch_token(self):
|
|
"""Method to fetch a token from user"""
|
|
if self.todoist_token:
|
|
return self.todoist_token
|
|
raise MissingError('Token not found!')
|
|
|
|
def _add_all_projects(self):
|
|
"""Add all projects or Write projects with updated data from API"""
|
|
for project in _get_todoist_projects_tasks(self._fetch_token(),
|
|
project=True):
|
|
vals = {'todo_project': str(project.id), 'name': project.name}
|
|
exist = self.env['project.project'].sudo().search(
|
|
[('todo_project', '=', vals['todo_project'])],
|
|
limit=1)
|
|
exist.write(vals) if exist else self.env[
|
|
'project.project'].sudo().create(vals)
|
|
|
|
def _add_task_tags(self, tags):
|
|
"""Add all tags or Write tags with updated data from API"""
|
|
TagModel = self.env['project.tags']
|
|
existing_tags = {tag.name: tag for tag in
|
|
TagModel.sudo().search([('name', 'in', tags)])}
|
|
created_tags = TagModel.sudo().create(
|
|
[{'name': tag} for tag in tags if tag not in existing_tags])
|
|
existing_tags.update({tag.name: tag for tag in created_tags})
|
|
return [existing_tags[tag].id for tag in tags]
|
|
|
|
def _add_all_tasks(self):
|
|
"""Add all tasks or Write tasks with updated data from API"""
|
|
ProjectModel = self.env['project.project']
|
|
TaskModel = self.env['project.task']
|
|
for task in _get_todoist_projects_tasks(self._fetch_token(),
|
|
project=False):
|
|
task_vals = {
|
|
'project_id': ProjectModel.sudo().search(
|
|
[('todo_project', '=', str(task.project_id))], limit=1).id,
|
|
'name': task.content,
|
|
'todo_task': str(task.id),
|
|
'date_deadline': task.due.date if task.due else False,
|
|
'tag_ids': [(6, 0, self._add_task_tags(task.labels))],
|
|
'description': task.description if task.description else False,
|
|
}
|
|
existing_task = TaskModel.sudo().search(
|
|
[('todo_task', '=', task_vals['todo_task'])], limit=1)
|
|
existing_task.write(
|
|
task_vals) if existing_task else TaskModel.sudo().create(
|
|
task_vals)
|
|
|
|
def action_sync_todoist_with_odoo(self):
|
|
"""Sync the Todoist with odoo"""
|
|
self._add_all_projects()
|
|
self._add_all_tasks()
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'type': 'success',
|
|
'message': (_("Successfully Synchronized Data!")),
|
|
'next': {'type': 'ir.actions.act_window_close'},
|
|
}
|
|
}
|
|
|