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.
141 lines
6.2 KiB
141 lines
6.2 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
|
|
# Author: Ayana KP (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
|
|
import re
|
|
from datetime import timedelta
|
|
from odoo import fields, models, _
|
|
from odoo.exceptions import UserError
|
|
from odoo.addons.google_account.models.google_service import \
|
|
GOOGLE_TOKEN_ENDPOINT
|
|
|
|
|
|
class ResUsers(models.Model):
|
|
"""Extend res.users model to include Google Calendar integration."""
|
|
|
|
_inherit = 'res.users'
|
|
|
|
refresh_token = fields.Char(string='Refresh Token',
|
|
help='Refresh token used for token '
|
|
'authentication with Google Calendar'
|
|
' service.')
|
|
user_token = fields.Char(string='User Token',
|
|
help='User token or access token obtained from '
|
|
'Google Calendar service.')
|
|
last_sync_date = fields.Datetime(string='Token Validity',
|
|
help='Date and time indicating the '
|
|
'validity'
|
|
' period of the user token.')
|
|
api_key = fields.Char(string="Enter API Key",
|
|
help='API key required for authentication and access '
|
|
'to Google Calendar service.')
|
|
google_user_mail = fields.Char(string='User Mail',
|
|
help='The Mail address where the task is '
|
|
'to be created')
|
|
|
|
def _set_auth_tokens(self, access_token, refresh_token, ttl):
|
|
"""Set the authentication tokens for the user."""
|
|
self.write({
|
|
'refresh_token': refresh_token,
|
|
'user_token': access_token,
|
|
'last_sync_date': fields.Datetime.now() + timedelta(
|
|
seconds=ttl) if ttl else False,
|
|
})
|
|
|
|
def authenticate_button(self):
|
|
"""Authenticate the user with Google Calendar service."""
|
|
self.ensure_one()
|
|
get_param = self.env['ir.config_parameter'].sudo().get_param
|
|
client_id = get_param('google_calendar_client_id')
|
|
client_secret = get_param('google_calendar_client_secret')
|
|
if not client_id or not client_secret:
|
|
raise UserError(_("The account for the Google Calendar "
|
|
"service is not configured."))
|
|
# Validate the API key and email credentials
|
|
if not (self.api_key and len(
|
|
self.api_key) > 10 and self.is_valid_email()):
|
|
raise UserError(_("Invalid credentials. Please provide valid "
|
|
"API key or email."))
|
|
self.refresh_token = self.google_calendar_account_id.calendar_rtoken
|
|
self.user_token = self.google_calendar_account_id.calendar_token
|
|
self.last_sync_date = self.google_calendar_account_id. \
|
|
calendar_token_validity
|
|
notification = {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'title': _('Successful'),
|
|
'type': 'success',
|
|
'message': 'Authentication successful!',
|
|
'sticky': True,
|
|
}
|
|
}
|
|
return notification
|
|
|
|
def is_valid_email(self):
|
|
""" Return True if the email is valid, False otherwise"""
|
|
pattern = r'^[\w\.-]+@[\w\.-]+\.\w+$'
|
|
if self.google_user_mail and re.match(pattern, self.google_user_mail):
|
|
return True
|
|
return False
|
|
|
|
def refresh_button(self):
|
|
"""Refresh the user token using the refresh token."""
|
|
get_param = self.env['ir.config_parameter'].sudo().get_param
|
|
client_id = get_param('google_calendar_client_id')
|
|
client_secret = get_param('google_calendar_client_secret')
|
|
if not client_id or not client_secret:
|
|
raise UserError(
|
|
_("The account for the Google Calendar service is"
|
|
" not configured."))
|
|
headers = {"content-type": "application/x-www-form-urlencoded"}
|
|
data = {
|
|
'refresh_token': self.refresh_token,
|
|
'client_id': client_id,
|
|
'client_secret': client_secret,
|
|
'grant_type': 'refresh_token',
|
|
}
|
|
try:
|
|
_dummy, response, _dummy = self.env['google.service']._do_request(
|
|
GOOGLE_TOKEN_ENDPOINT, params=data,
|
|
headers=headers, method='POST', preuri='')
|
|
ttl = response.get('expires_in')
|
|
self.write({
|
|
'user_token': response.get('access_token'),
|
|
'last_sync_date': fields.Datetime.now() + timedelta(
|
|
seconds=ttl),
|
|
})
|
|
except requests.HTTPError as error:
|
|
if error.response.status_code in (
|
|
400, 401): # invalid grant or invalid client
|
|
# Delete refresh token and make sure it's committed
|
|
self.env.cr.rollback()
|
|
self._set_auth_tokens(False, False, 0)
|
|
self.env.cr.commit()
|
|
error_key = error.response.json().get("error", "nc")
|
|
error_msg = _(
|
|
"An error occurred while generating the token. "
|
|
"Your authorization code may be invalid or has already"
|
|
" expired [%s].You should check your Client ID and secret on "
|
|
"the Google APIs platform try to stop and restart your "
|
|
"calendar synchronization.",
|
|
error_key)
|
|
raise UserError(error_msg)
|
|
|