57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
from odoo import http
|
|
from odoo.http import request
|
|
import logging
|
|
import caldav
|
|
from caldav.elements import dav, cdav
|
|
from datetime import datetime
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class CaldavController(http.Controller):
|
|
@http.route('/caldav_sync/sync', type='json', auth='user')
|
|
def sync(self, **kwargs):
|
|
# Fetch user credentials and server settings from Odoo
|
|
user = request.env.user
|
|
server_url = user.caldav_server_url
|
|
username = user.caldav_username
|
|
password = user.caldav_password
|
|
|
|
# Connect to the CalDAV server
|
|
client = caldav.DAVClient(url=server_url, username=username, password=password)
|
|
principal = client.principal()
|
|
calendars = principal.calendars()
|
|
|
|
for calendar in calendars:
|
|
events = calendar.events()
|
|
for event in events:
|
|
ical = event.icalendar()
|
|
self.sync_event(ical)
|
|
|
|
return {'status': 'success', 'message': 'Synchronization completed'}
|
|
|
|
@staticmethod
|
|
def sync_event(ical):
|
|
event = ical.subcomponents[0]
|
|
uid = event['UID']
|
|
start = event['DTSTART'].dt
|
|
end = event['DTEND'].dt
|
|
summary = event['SUMMARY']
|
|
description = event.get('DESCRIPTION', '')
|
|
location = event.get('LOCATION', '')
|
|
|
|
# Search for an existing event in Odoo
|
|
odoo_event = request.env['calendar.event'].search([('caldav_uid', '=', uid)], limit=1)
|
|
values = {
|
|
'name': summary,
|
|
'start': start,
|
|
'stop': end,
|
|
'description': description,
|
|
'location': location,
|
|
}
|
|
|
|
if odoo_event:
|
|
odoo_event.write(values)
|
|
else:
|
|
values['caldav_uid'] = uid
|
|
request.env['calendar.event'].create(values)
|