Browse Source

Dec 12: [ADD] Initial Commit 'sync_task_with_google_calender'

pull/254/merge
Cybrosys Technologies 5 months ago
parent
commit
034ffb0d58
  1. 51
      sync_task_with_google_calender/README.rst
  2. 22
      sync_task_with_google_calender/__init__.py
  3. 48
      sync_task_with_google_calender/__manifest__.py
  4. 6
      sync_task_with_google_calender/doc/RELEASE_NOTES.md
  5. 23
      sync_task_with_google_calender/models/__init__.py
  6. 188
      sync_task_with_google_calender/models/project_task.py
  7. 140
      sync_task_with_google_calender/models/res_users.py
  8. BIN
      sync_task_with_google_calender/static/description/assets/icons/check.png
  9. BIN
      sync_task_with_google_calender/static/description/assets/icons/chevron.png
  10. BIN
      sync_task_with_google_calender/static/description/assets/icons/cogs.png
  11. BIN
      sync_task_with_google_calender/static/description/assets/icons/consultation.png
  12. BIN
      sync_task_with_google_calender/static/description/assets/icons/ecom-black.png
  13. BIN
      sync_task_with_google_calender/static/description/assets/icons/education-black.png
  14. BIN
      sync_task_with_google_calender/static/description/assets/icons/hotel-black.png
  15. BIN
      sync_task_with_google_calender/static/description/assets/icons/license.png
  16. BIN
      sync_task_with_google_calender/static/description/assets/icons/lifebuoy.png
  17. BIN
      sync_task_with_google_calender/static/description/assets/icons/manufacturing-black.png
  18. BIN
      sync_task_with_google_calender/static/description/assets/icons/pos-black.png
  19. BIN
      sync_task_with_google_calender/static/description/assets/icons/puzzle.png
  20. BIN
      sync_task_with_google_calender/static/description/assets/icons/restaurant-black.png
  21. BIN
      sync_task_with_google_calender/static/description/assets/icons/service-black.png
  22. BIN
      sync_task_with_google_calender/static/description/assets/icons/trading-black.png
  23. BIN
      sync_task_with_google_calender/static/description/assets/icons/training.png
  24. BIN
      sync_task_with_google_calender/static/description/assets/icons/update.png
  25. BIN
      sync_task_with_google_calender/static/description/assets/icons/user.png
  26. BIN
      sync_task_with_google_calender/static/description/assets/icons/wrench.png
  27. BIN
      sync_task_with_google_calender/static/description/assets/misc/categories.png
  28. BIN
      sync_task_with_google_calender/static/description/assets/misc/check-box.png
  29. BIN
      sync_task_with_google_calender/static/description/assets/misc/compass.png
  30. BIN
      sync_task_with_google_calender/static/description/assets/misc/corporate.png
  31. BIN
      sync_task_with_google_calender/static/description/assets/misc/customer-support.png
  32. BIN
      sync_task_with_google_calender/static/description/assets/misc/cybrosys-logo.png
  33. BIN
      sync_task_with_google_calender/static/description/assets/misc/features.png
  34. BIN
      sync_task_with_google_calender/static/description/assets/misc/logo.png
  35. BIN
      sync_task_with_google_calender/static/description/assets/misc/pictures.png
  36. BIN
      sync_task_with_google_calender/static/description/assets/misc/pie-chart.png
  37. BIN
      sync_task_with_google_calender/static/description/assets/misc/right-arrow.png
  38. BIN
      sync_task_with_google_calender/static/description/assets/misc/star.png
  39. BIN
      sync_task_with_google_calender/static/description/assets/misc/support.png
  40. BIN
      sync_task_with_google_calender/static/description/assets/misc/whatsapp.png
  41. BIN
      sync_task_with_google_calender/static/description/assets/modules/1.png
  42. BIN
      sync_task_with_google_calender/static/description/assets/modules/2.png
  43. BIN
      sync_task_with_google_calender/static/description/assets/modules/3.png
  44. BIN
      sync_task_with_google_calender/static/description/assets/modules/4.png
  45. BIN
      sync_task_with_google_calender/static/description/assets/modules/5.gif
  46. BIN
      sync_task_with_google_calender/static/description/assets/modules/6.png
  47. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/1.png
  48. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/10.png
  49. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/11.png
  50. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/12.png
  51. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/13.png
  52. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/14.png
  53. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/15.png
  54. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/16.png
  55. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/17.png
  56. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/18.png
  57. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/19.png
  58. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/2.png
  59. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/20.png
  60. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/3.png
  61. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/4.png
  62. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/6.png
  63. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/7.png
  64. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/8.png
  65. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/9.png
  66. BIN
      sync_task_with_google_calender/static/description/assets/screenshots/hero.gif
  67. BIN
      sync_task_with_google_calender/static/description/banner.png
  68. BIN
      sync_task_with_google_calender/static/description/icon.png
  69. 763
      sync_task_with_google_calender/static/description/index.html
  70. 28
      sync_task_with_google_calender/views/project_task_views.xml
  71. 37
      sync_task_with_google_calender/views/res_users_views.xml

51
sync_task_with_google_calender/README.rst

@ -0,0 +1,51 @@
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
Google Calendar Integration for Project and Task
================================================
* Sync Project Task with Google Calendar.
* Auto Update Task with Google Calendar.
* Option to Sync Selected Task with Google Calendar.
* Email Notification.
Configuration
=============
* No additional configurations needed
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
License
-------
General Public License, Version 3 (AGPL v3).
(https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Credits
-------
* Developers: (V17) Ayana KP,
(V16) Jumana Jabin MP,
Contact: odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

22
sync_task_with_google_calender/__init__.py

@ -0,0 +1,22 @@
# -*- 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/>.
#
#############################################################################
from . import models

48
sync_task_with_google_calender/__manifest__.py

@ -0,0 +1,48 @@
# -*- 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/>.
#
#############################################################################
{
'name': 'Google Calendar Integration For Project And Task',
'version': '15.0.1.0.0',
'category': 'Project',
'summary': 'Integrating Odoo Project With Google Calender.',
"description": """Google Calendar Integration for Project Tasks odoo app
helps users to sync project tasks with google Calendar. Users can get all
task information like name, description, create date time, deadline, and
attende, If a user updates a task then google calendar events also get
updated.""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': "https://www.cybrosys.com",
'depends': ['project', 'google_calendar'],
'data': [
'views/res_users_views.xml',
'views/project_task_views.xml',
],
'images': [
'static/description/banner.png'
],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': False
}

6
sync_task_with_google_calender/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <sync_task_with_google_calender>
#### 03.12.2024
#### Version 15.0.1.0.0
#### ADD
- Initial commit for Google Calendar Integration For Project And Task

23
sync_task_with_google_calender/models/__init__.py

@ -0,0 +1,23 @@
# -*- 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/>.
#
#############################################################################
from . import project_task
from . import res_users

188
sync_task_with_google_calender/models/project_task.py

@ -0,0 +1,188 @@
# -*- 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
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class ProjectTask(models.Model):
""" Extend 'project.task' model to add Google Calendar integration."""
_inherit = 'project.task'
is_add_in_gcalendar = fields.Boolean(string="Add In G-Calendar Event",
help="Set this field True if you want to"
" add this task to Google Calendar.")
task_event = fields.Char(string="Task Google Calendar Event ID",
help="This field stores the unique ID of Google"
" Calendar event associated with the task.")
task_created = fields.Char(string="Task Creator ID",
help="This field stores the unique ID of the "
"task creator or owner.")
@api.model
def create(self, vals):
"""Override create() method to sync task to Google Calendar if
enabled."""
task = super().create(vals)
if task.is_add_in_gcalendar:
self.sync_task_to_google_calendar(task)
return task
def write(self, vals):
"""Override write() method to update Google Calendar event if relevant
fields are modified."""
res = super().write(vals)
if any(field in ['user_id', 'partner_id', 'name', 'description',
'date_deadline', 'due_date', 'is_add_in_gcalendar'] for
field in vals):
task = self
self.update_google_calendar_event(task)
return res
def sync_task_to_google_calendar(self, task):
"""Sync the task to Google Calendar by creating a new event."""
if self.is_add_in_gcalendar and (
not self.partner_id or not self.date_deadline):
required_fields = []
if not self.partner_id:
required_fields.append(self._fields['partner_id'].string)
if not self.date_deadline:
required_fields.append(self._fields['date_deadline'].string)
raise UserError(_(
f"The following fields are required when 'Add In G-Calendar"
f" Event' is enabled: {', '.join(required_fields)}"))
headers, url = self._prepare_headers_and_url(
self.env.user.google_user_mail)
project_name = task.project_id.name.capitalize() if task.project_id \
else ''
event = {
'summary': f"Project: {project_name} - Task: {task.name}",
'description': task.description,
'start': {'date': str(task.date_deadline)},
'end': {
'date': str(task.date_deadline)} if task.date_deadline else {
'date': ''},
'extendedProperties': {
'private': {
'create_date_time': str(task.create_date),
'user': task.manager_id.name if task.manager_id else '',
}
},
'attendees': [{'email': attendee.email} for attendee in
task.user_ids if attendee.email],
'reminders': {
'useDefault': False,
'overrides': [
{'method': 'email', 'minutes': 0},
{'method': 'email', 'minutes': 24 * 60},
]
}
}
if task.partner_id and task.partner_id.email:
event['attendees'].append({'email': task.partner_id.email})
event['reminders']['overrides'].append(
{'method': 'email', 'minutes': 60})
response = requests.post(url, headers=headers, json=event)
if response.status_code == 200:
event_id = response.json().get('id')
creator_email = response.json().get('creator', {}).get('email')
message = f'Google Calendar Event created\nTask ID: {task.id}\n' \
f'Event ID: {event_id}\nCreator Email: {creator_email}'
task.message_post(body=message)
task.task_event = event_id
task.task_created = creator_email
else:
message = 'Failed to create event in Google Calendar'
task.message_post(body=message)
def update_google_calendar_event(self, task):
"""Update the Google Calendar event associated with the task."""
event_id = task.task_event
if not event_id:
self.sync_task_to_google_calendar(task)
return
event = {
'summary': task.name,
'description': task.description,
'start': {'date': str(task.date_deadline)},
'end': {
'date': str(task.date_deadline)} if task.date_deadline else {
'date': ''},
'extendedProperties': {
'private': {
'create_date_time': str(task.create_date),
'user': task.manager_id.name if task.manager_id else '',
}
},
'attendees': [{'email': attendee.email} for attendee in
task.user_ids if attendee.email],
}
headers, url = self._prepare_headers_and_url(
self.env.user.google_user_mail, event_id)
response = requests.patch(url, headers=headers, json=event)
if response.status_code == 200:
message = f'Event updated in Google Calendar'
task.message_post(body=message)
else:
message = f'Failed to update event in Google Calendar'
task.message_post(body=message)
def _prepare_headers_and_url(self, google_calendar_id, event_id=None):
"""
Prepare headers and URL for Google Calendar API requests.
"""
headers = {
"Authorization": f"Bearer {self.env.user.user_token}",
"Content-Type": "application/json",
"Accept": "application/json"
}
api_key = self.env.user.api_key
url = f"https://www.googleapis.com/calendar/v3/calendars/" \
f"{google_calendar_id}/events"
if event_id:
url += f"/{event_id}"
url += f"?key={api_key}"
return headers, url
def unlink(self):
"""Override unlink method to delete associated Google Calendar
events."""
self.delete_google_calendar_events()
return super(ProjectTask, self).unlink()
def delete_google_calendar_events(self):
"""Delete associated events from Google Calendar."""
event_ids = self.mapped('task_event')
if event_ids:
headers = {
"Authorization": f"Bearer {self.env.user.user_token}",
"Content-Type": "application/json",
"Accept": "application/json"
}
for event_id in event_ids:
url = f"https://www.googleapis.com/calendar/v3/calendars/" \
f"{self.env.user.google_user_mail}/events/{event_id}" \
f"?key=" \
f"{self.env.user.api_key}"
# Delete event from Google Calendar
response = requests.delete(url, headers=headers)
return response

140
sync_task_with_google_calender/models/res_users.py

@ -0,0 +1,140 @@
# -*- 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 action_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_cal_account_id.calendar_rtoken
self.user_token = self.google_cal_account_id.calendar_token
self.last_sync_date = self.google_cal_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 action_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)

BIN
sync_task_with_google_calender/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
sync_task_with_google_calender/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
sync_task_with_google_calender/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
sync_task_with_google_calender/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
sync_task_with_google_calender/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
sync_task_with_google_calender/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
sync_task_with_google_calender/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
sync_task_with_google_calender/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
sync_task_with_google_calender/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
sync_task_with_google_calender/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
sync_task_with_google_calender/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
sync_task_with_google_calender/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
sync_task_with_google_calender/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
sync_task_with_google_calender/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
sync_task_with_google_calender/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
sync_task_with_google_calender/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
sync_task_with_google_calender/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
sync_task_with_google_calender/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
sync_task_with_google_calender/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
sync_task_with_google_calender/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
sync_task_with_google_calender/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
sync_task_with_google_calender/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
sync_task_with_google_calender/static/description/assets/modules/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
sync_task_with_google_calender/static/description/assets/modules/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
sync_task_with_google_calender/static/description/assets/modules/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
sync_task_with_google_calender/static/description/assets/modules/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
sync_task_with_google_calender/static/description/assets/modules/5.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 MiB

BIN
sync_task_with_google_calender/static/description/assets/modules/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/10.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/11.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/12.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/13.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/14.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/15.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/16.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/17.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/18.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/19.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/20.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/7.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/8.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/9.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
sync_task_with_google_calender/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 KiB

BIN
sync_task_with_google_calender/static/description/banner.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
sync_task_with_google_calender/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

763
sync_task_with_google_calender/static/description/index.html

@ -0,0 +1,763 @@
<div style="background-color: #714B67; height: 810px; width: 100%; padding: 15px; position: relative;">
<!-- TITLE BAR -->
<div class="d-flex align-items-center justify-content-between"
style="border-bottom: 1px solid #875A7B; padding: 15px; display: flex; justify-content: space-between; align-items: center;">
<img src="assets/misc/cybrosys-logo.png" width="42" height="42" style="width: 42px; height: 42px;"/>
<div>
<div
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Community
</div>
<div
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Enterprise
</div>
<div
style="color: #7C7BAD; font-size: 14px; font-family: 'Montserrat', sans-serif; font-weight: bold; background-color: white; display: inline-block; padding: 3px 10px; border-radius: 50px;"
class="mr-2">
<i class="fa fa-check mr-1"></i>Odoo.Sh
</div>
</div>
</div>
<!-- END OF TITLE BAR -->
<div class="container" style="padding: 0rem 1.5rem 4rem !important">
<div class="row" style="height: 900px !important;">
<div class="col-sm-12 col-md-12 col-lg-12"
style="padding: 4rem 1rem !important; background-color: #714B67 !important; height: 600px !important; border-radius: 20px !important;">
<h1
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #FFFFFF !important; font-size: 3.5rem !important; text-align: center !important;">
Google Calendar Integration for Project and Task</h1>
<p
style="font-family: 'Montserrat', sans-serif !important; font-weight: 300 !important; color: #FFFFFF !important; font-size: 1.4rem !important; text-align: center !important;">
Google Calendar Synchronization With Odoo Project and Tasks app
</p>
<img src="./assets/screenshots/hero.gif" class="img-responsive" width="100%" height="auto"/>
</div>
</div>
<div class="row">
<div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin-bottom: 2rem !important">
<h2
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<i class="fa fa-compass mr-2"></i>Explore this module
</h2>
<div class="row">
<div class="col-md-6">
<a href="#overview" style="text-decoration: none !important;">
<div class="row"
style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;">
<div class="col-8">
<h3
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;">
Overview</h3>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;">
Learn more about this module</p>
</div>
<div class="col-4 text-right d-flex justify-content-end align-items-center">
<i class="fa fa-chevron-right" style="color: #714B67 !important;"></i>
</div>
</div>
</a>
</div>
<div class="col-md-6">
<a href="#features" style="text-decoration: none !important;">
<div class="row"
style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;">
<div class="col-8">
<h3
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;">
Features</h3>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;">
View features of this module</p>
</div>
<div class="col-4 text-right d-flex justify-content-end align-items-center">
<i class="fa fa-chevron-right" style="color: #714B67 !important;"></i>
</div>
</div>
</a>
</div>
<div class="col-md-6">
<a href="#screenshots" style="text-decoration: none !important;">
<div class="row"
style="background-color: #f5f2f5 !important; border-radius: 10px !important; margin: 1rem !important; padding: 1.5em !important; height: 100px !important;">
<div class="col-8">
<h3
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.2rem !important;">
Screenshots</h3>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #714B67 !important; font-size: 0.9rem !important;">
See key screenshots of this module</p>
</div>
<div class="col-4 text-right d-flex justify-content-end align-items-center">
<i class="fa fa-chevron-right" style="color: #714B67 !important;"></i>
</div>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="row" id="overview">
<div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin: 2rem 0 !important">
<h2
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<i class="fa fa-pie-chart mr-2"></i>Overview
</h2>
</div>
<div class="col-mg-12 pl-3">
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important; line-height: 30px !important;">
Google Calendar Integration for Project and Tasks odoo app helps users to sync project tasks with Google
calendar. Users have the option to sync tasks with Google or not and on creating tasks user and customer
both will get notified by email. Users can get all task information like name, description, create date
time, deadline, and attendees, If a user updates a task then google calendar events also get updated.
If a user deletes a task then google calendar events also get deleted.
</p>
</div>
</div>
<div class="row" id="features">
<div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin: 2rem 0 !important">
<h2
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<i class="fa fa-star mr-2"></i>Features
</h2>
</div>
<div class="col-md-6 pl-3 py-3 d-flex">
<div>
<img src="assets/icons/check.png">
</div>
<div>
<h4
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Sync project task with Google calendar</h4>
</div>
</div>
<div class="col-md-6 pl-3 py-3 d-flex">
<div>
<img src="assets/icons/check.png">
</div>
<div>
<h4
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Auto update task with Google calendar</h4>
</div>
</div>
<div class="col-md-6 pl-3 py-3 d-flex">
<div>
<img src="assets/icons/check.png">
</div>
<div>
<h4
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Auto delete task with Google calendar</h4>
</div>
</div>
<div class="col-md-6 pl-3 py-3 d-flex">
<div>
<img src="assets/icons/check.png">
</div>
<div>
<h4
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Email notification
</h4>
</div>
</div>
</div>
<div class="row" id="screenshots">
<div class="col-md-12" style="border-bottom: 1px solid #d5d5d5 !important; margin: 2rem 0 !important">
<h2
style="font-family: 'Montserrat', sans-serif !important; font-weight: 600 !important; color: #714B67 !important; font-size: 1.5rem !important;">
<i class="fa fa-image mr-2"></i>Screenshots
</h2>
</div>
<div class="col-lg-12 my-2">
<h4 class="mt-2"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Google Calendar Client Credential and API Configuration
</h4>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
User has to create a new project on Google Cloud Platform. Use this link
<a href="https://console.cloud.google.com/welcome?project=double-dolphin-394910" target="_blank">Google Cloud Platform</a> </p>
<img src="assets/screenshots/1.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Add a project name and click on "CREATE" button</p>
<img src="assets/screenshots/2.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
User have to navigate to "Google API Console" and click on "ENABLE APIS AND SERVICES".
</p>
<img src="assets/screenshots/3.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
</div>
<div class="col-lg-12 my-3">
<h4 class="mt-3"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Enable Google Calendar API
</h4>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Search for "Google Calendar API", Open and click "Enable" to use.
</p>
<img src="assets/screenshots/4.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
</div>
<div class="col-lg-12 my-3">
<h4 class="mt-3"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Create Credentials for Google Calendar API</h4>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Navigate to "Credentials" menu and click on "CREATE CREDENTIALS" button on header.
</p>
<img src="assets/screenshots/6.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Select "Google Calendar API" as api and "User Data" as data accessing and click "Next"
</p>
<img src="assets/screenshots/7.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Select "Web Application" as application type and enter name, Then give Authorized JavaScript origins, by Click on "Add URL", enter your odoo instance web url. Under "Authorized redirect
URIs" and enter your url with "/google_account/authentication". Then click on Create button.
</p>
<img src="assets/screenshots/8.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
</div>
<div class="col-lg-12 my-3">
<h4 class="mt-3"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Google Calendar API Credential
</h4>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
On clicking "Create" button user will get "Client ID" and "Client secret" key for Google calendar api.
</p>
<img src="assets/screenshots/9.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
</div>
<div class="col-lg-12 my-4">
<h4 class="mt-3"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
User Authentication
</h4>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Under Settings -> integration -> google calendar, add client id and client secret then save.
</p>
<img src="assets/screenshots/11.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Then goto Calendar module and confirm the synchronization
</p>
<img src="assets/screenshots/12.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Click on CREATE CREDENTIALS and select API key will generate API token, copy this.
</p>
<img src="assets/screenshots/10.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
Under Settings -> Users and Companies -> Users, go to the Sync of Project Task tab. Paste the API token into the Enter API Key field and add the user's email address. Then click the AUTHENTICATE button. If a success notification appears, click the REFRESH TOKEN button. The User token and Refresh token fields will be filled automatically.
</p>
<img src="assets/screenshots/13.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
</div>
<div class="col-lg-12 my-4">
<h4 class="mt-3"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Sync Project Task to Google Calendar
</h4>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
While creating project task user have to enable "Add In G-Calendar Event" and enter other task
information like name, customer, task due date, deadline, end date and description
</p>
<img src="assets/screenshots/14.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
User can see task with "Add In G-Calendar Event" is automatically linked to google calendar. Also, can
see
in chatter its status
</p>
<img src="assets/screenshots/15.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
On clicking google calendar event user can also see all task details like project and task name, create
date and time, attendee, description, and user.
</p>
<img src="assets/screenshots/16.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
</div>
<div class="col-lg-12 my-4">
<h4 class="mt-3"
style="font-family: 'Roboto', sans-serif !important; font-weight: 600 !important; color: #282F33 !important; font-size: 1.3rem !important;">
Update Project Task
</h4>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
On updating project task like user, customer, name, description, deadline, due date etc., google
calendar
event also changed. also can see in chatter its status
</p>
<img src="assets/screenshots/17.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
User can see updated google calendar event as per task.
</p>
<img src="assets/screenshots/18.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
If user delete project task, then google calender also get deleted.
</p>
<img src="assets/screenshots/19.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
<p
style="font-family: 'Roboto', sans-serif !important; font-weight: 400 !important; color: #282F33 !important; font-size: 1rem !important;">
User can see deleted google calendar event on delete of project task.
</p>
<img src="assets/screenshots/20.png" class="img-responsive img-thumbnail border" width="100%"
height="auto"/>
</div>
</div>
<!-- RELATED PRODUCTS -->
<div class="d-flex align-items-center"
style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/categories.png"/>
</div>
<h2 class="mt-2"
style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">
Related
Products
</h2>
</div>
<div class="row">
<div class="col-sm-12">
<div id="demo1" class="row carousel slide" data-ride="carousel">
<!-- The slideshow -->
<div class="carousel-inner" style="padding: 30px;">
<div class="carousel-item" style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/dynamic_accounts_report/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="//apps.odoocdn.com/apps/assets/15.0/account_day_book/assets/modules/dynamic_accounts_report.png?3e73b0c">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/custom_gantt_view/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="//apps.odoocdn.com/apps/assets/15.0/account_day_book/assets/modules/custom_gantt_view.png?3e73b0c">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/project_custom_gantt/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="//apps.odoocdn.com/apps/assets/15.0/account_day_book/assets/modules/project_custom_gantt.png?3e73b0c">
</div>
</a>
</div>
</div>
<div class="carousel-item active"
style="min-height: 198.656px;">
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/account_reports_xlsx/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="//apps.odoocdn.com/apps/assets/15.0/account_day_book/assets/modules/account_reports_xlsx.png?3e73b0c">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/base_accounting_kit/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="//apps.odoocdn.com/apps/assets/15.0/account_day_book/assets/modules/base_accounting_kit.gif?3e73b0c">
</div>
</a>
</div>
<div class="col-xs-12 col-sm-4 col-md-4 mb16 mt16"
style="float:left">
<a href="https://apps.odoo.com/apps/modules/15.0/hr_payroll_community/"
target="_blank">
<div style="border-radius:10px">
<img class="img img-responsive center-block"
style="border-radius: 0px;"
src="//apps.odoocdn.com/apps/assets/15.0/account_day_book/assets/modules/hr_payroll_community.png?3e73b0c">
</div>
</a>
</div>
</div>
</div>
<!-- Left and right controls -->
<a class="carousel-control-prev" href="#demo1" data-slide="prev"
style="width:35px; color:#000"> <span
class="carousel-control-prev-icon"><i
class="fa fa-chevron-left"
style="font-size:24px"></i></span>
</a> <a class="carousel-control-next" href="#demo1"
data-slide="next" style="width:35px; color:#000">
<span class="carousel-control-next-icon"><i
class="fa fa-chevron-right"
style="font-size:24px"></i></span>
</a>
</div>
</div>
</div>
<!-- END OF RELATED PRODUCTS -->
<!-- OUR SERVICES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/star.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our Services
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #1dd1a1 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/cogs.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Customization</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ff6b6b !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/wrench.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6462CD !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/lifebuoy.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Support</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #ffa801 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/user.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Hire
Odoo
Developer</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #54a0ff !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/puzzle.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Integration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #6d7680 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/update.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Migration</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #786fa6 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/consultation.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Consultancy</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #f8a5c2 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/training.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Implementation</h6>
</div>
<div class="col-lg-4 d-flex flex-column justify-content-center align-items-center my-4">
<div class="d-flex justify-content-center align-items-center mx-3 my-3"
style="background-color: #e6be26 !important; border-radius: 15px !important; height: 80px; width: 80px;">
<img src="assets/icons/license.png" class="img-responsive" height="48px" width="48px">
</div>
<h6 class="text-center" style="font-family: Montserrat, 'sans-serif' !important; font-weight: bold;">
Odoo
Licensing Consultancy</h6>
</div>
</div>
</div>
<!-- END OF OUR SERVICES -->
<!-- OUR INDUSTRIES -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/corporate.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Our
Industries
</h2>
</div>
<div class="container my-5">
<div class="row">
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/trading-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Trading
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easily procure
and
sell your products</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/pos-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
POS
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Easy
configuration
and convivial experience</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/education-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Education
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
A platform for
educational management</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/manufacturing-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Manufacturing
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Plan, track and
schedule your operations</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/ecom-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
E-commerce &amp; Website
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Mobile
friendly,
awe-inspiring product pages</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/service-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Service Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Keep track of
services and invoice</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/restaurant-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Restaurant
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
Run your bar or
restaurant methodically</p>
</div>
</div>
<div class="col-lg-3">
<div class="my-4 d-flex flex-column justify-content-center"
style="background-color: #f6f8f9 !important; border-radius: 0px; padding: 2rem !important; height: 250px !important;">
<img src="assets/icons/hotel-black.png" class="img-responsive mb-3" height="48px" width="48px">
<h5 style="font-family: Montserrat, sans-serif !important; color: #000 !important; font-weight: bold;">
Hotel Management
</h5>
<p style="font-family: Montserrat, sans-serif !important; font-size: 0.9rem !important;">
An
all-inclusive
hotel management application</p>
</div>
</div>
</div>
</div>
<!-- END OF OUR INDUSTRIES -->
<!-- SUPPORT -->
<div class="d-flex align-items-center" style="border-bottom: 2px solid #714B67; padding: 15px 0px;">
<div class="d-flex justify-content-center align-items-center mr-2"
style="background-color: #F5F5F5; border-radius: 0px; width: 40px; height: 40px;">
<img src="assets/misc/customer-support.png"/>
</div>
<h2 class="mt-2" style="font-family: 'Montserrat', sans-serif; font-size: 24px; font-weight: bold;">Support
</h2>
</div>
<div class="container mt-5">
<div class="row">
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4 d-flex justify-content-center align-items-center"
style="background-color: #714B67; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/support.png" height="48" width="48" style="width: 42px; height: 42px;"/>
</div>
<div>
<h4>Need Help?</h4>
<p style="line-height: 100%;">Got questions or need help? Get in touch.</p>
<a href="mailto:odoo@cybrosys.com">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">
odoo@cybrosys.com</p>
</a>
</div>
</div>
</div>
<div class="col-sm-12 col-md-6">
<div style="background-color: #F6F8F9; padding: 30px; display: flex; align-items: center;">
<div class="mr-4 d-flex justify-content-center align-items-center"
style="background-color: #2AC44D; display: inline-block; height: 70px; width: 70px; display: flex; align-items: center; justify-content: center;">
<img src="assets/misc/whatsapp.png" height="52" width="52" style="width: 52px; height: 52px;"/>
</div>
<div>
<h4>WhatsApp</h4>
<p style="line-height: 100%;">Say hi to us on WhatsApp!</p>
<a href="https://api.whatsapp.com/send?phone=918606827707">
<p style="font-weight: 400; font-size: 28px; line-height: 80%; color: #714B67;">+91 86068
27707</p>
</a>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 my-5 d-flex justify-content-center align-items-center">
<img src="assets/misc/logo.png" width="144" height="31"
style="width:144px; height: 31px; margin-top: 40px;"/>
</div>
</div>
</div>
<!-- END OF SUPPORT -->
</div>
</div>

28
sync_task_with_google_calender/views/project_task_views.xml

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- XML view to inherit from project.task.form view -->
<record id="view_task_form2" model="ir.ui.view">
<field name="name">
project.task.view.form.inherit.sync.task.with.google.calender
</field>
<field name="model">project.task</field>
<field name="inherit_id" ref="project.view_task_form2"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='extra_info']" position="after">
<!-- Add a new page for Google Calendar Task Event -->
<page string="Google Calender Task Event"
name="sync_google_cal_project_task"
attrs="{'invisible': [('is_add_in_gcalendar', '=', False)]}">
<!-- Group to display task_event and task_created -->
<group class="text-break">
<field name="task_event" readonly="1"/>
<field name="task_created" readonly="1"/>
</group>
</page>
</xpath>
<field name="partner_id" position="before">
<field name="is_add_in_gcalendar"/>
</field>
</field>
</record>
</odoo>

37
sync_task_with_google_calender/views/res_users_views.xml

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- XML view to inherit from project.task.form view -->
<record id="view_users_form" model="ir.ui.view">
<field name="name">
res.users.view.form.inherit.sync.task.with.google.calender
</field>
<field name="model">res.users</field>
<field name="inherit_id" ref="base.view_users_form"/>
<field name="arch" type="xml">
<xpath expr="//page[@name='access_rights']" position="after">
<!-- Add a new page for syncing Project Task -->
<page string="Sync of Project Task" name="sync_project_task">
<!-- Group to display fields related to synchronization -->
<group class="text-break">
<field name="api_key"/>
<field name="google_user_mail"/>
<field name="refresh_token" readonly="1"/>
<field name="user_token" readonly="1"/>
<field name="last_sync_date" readonly="1"/>
</group>
<group>
<!-- Button to trigger authentication -->
<button name="action_authenticate_button" string="AUTHENTICATE"
type="object" class="oe_highlight"
groups="base.group_system"/>
<!-- Button to refresh the token -->
<button name="action_refresh_button" string="REFRESH TOKEN"
type="object" class="oe_highlight"
groups="base.group_system"
style="float: right; margin-bottom: 10px; margin-right: 10px;"/>
</group>
</page>
</xpath>
</field>
</record>
</odoo>
Loading…
Cancel
Save