diff --git a/radicale_odoo_storage/__init__.py b/radicale_odoo_storage/__init__.py index a414349..9b9fd25 100644 --- a/radicale_odoo_storage/__init__.py +++ b/radicale_odoo_storage/__init__.py @@ -22,20 +22,39 @@ import threading from contextlib import contextmanager from odoorpc import ODOO from odoorpc.error import RPCError -from radicale.storage import Collection as RadicaleCollection +from radicale.storage import BaseCollection -class Collection(RadicaleCollection): +class Collection(BaseCollection): """ BaseCollection implementation for Odoo Radicale Storage """ odoo = False - def __init__(self, path, principal=None, folder=None, filesystem_path=None): + def __init__(self, path): """ Init function """ - super(Collection, self).__init__(path, principal, folder, filesystem_path) if not self.odoo: - self.odoo_connect() - self.odoo_init() + self.__class__.odoo_connect() + # self.odoo_init() + + attributes = path.strip('/').split('/') + self.tag = None + self.props = {} + if 'odoo-contact' in attributes: + self.tag = 'VADDRESSBOOK' + self.content_suffix = '.vcf' + self.props.update({'tag': 'VADDRESSBOOK', + 'D:displayname': 'Odoo contacts', + 'CR:addressbook-description': 'Contacts form your Odoo account'}) + elif 'odoo-calendar' in attributes: + self.tag = 'VCALENDAR' + self.content_suffix = '.ics' + self.props.update({'tag': 'VCALENDAR', + 'D:displayname': 'Odoo calendar', + 'C:calendar-description': 'Events form your Odoo calendar'}) + + self.path = path.strip('/') + self.owner = attributes[0] + self.is_principal = len(attributes) == 0 @classmethod def odoo_connect(cls): @@ -83,3 +102,48 @@ class Collection(RadicaleCollection): 'C:calendar-description': 'Events form your Odoo calendar'} self.create_collection(calendar_path, props=props) self.logger.info('Collection creation for Odoo Sync : %s' % calendar_path) + + + @classmethod + @contextmanager + def acquire_lock(cls, mode, user=None): + cls.user = user + yield + + @classmethod + def discover(cls, path, depth="0"): + """Discover a list of collections under the given ``path``. + + ``path`` is sanitized. + + If ``depth`` is "0", only the actual object under ``path`` is + returned. + + If ``depth`` is anything but "0", it is considered as "1" and direct + children are included in the result. + + The root collection "/" must always exist. + + """ + attributes = path.strip('/').split('/') or [] + if path and not cls.user: + cls.user = attributes[0] + + cls.logger.warning('Discover : %s (path), %s (depth), %s (cls.user), %s (attributes)' % + (path, depth, cls.user, attributes)) + yield cls(path) + contact_path = '%s/odoo-contact' % path + calendar_path = '%s/odoo-calendar' % path + yield cls(contact_path) + yield cls(calendar_path) + + def get_meta(self, key=None): + """Get metadata value for collection """ + if key == 'tag': + return self.tag + return self.props.get(key) + + @classmethod + def create_collection(cls, href, collection=None, props=None): + """ Create collection implementation : only warns ATM """ + cls.logger.error('Attemmpt to create a new collection for %s' % href)