[IMP][WIP]Odoo storage plugin : CARDDav (RO) is enabled and works with several clients

This commit is contained in:
Fabien BOURGEOIS 2018-05-10 11:38:28 +02:00
parent 275205a169
commit 17fa3bba0c
1 changed files with 52 additions and 42 deletions

View File

@ -96,7 +96,6 @@ class Collection(BaseCollection):
def odoo_init(self):
""" Init Odoo collections if not found """
# TODO: disallow collection deletion ?
user_ids = self.odoo.env['res.users'].search([])
users = self.odoo.execute('res.users', 'read', user_ids, ['login', 'email'])
for user in users:
@ -149,10 +148,14 @@ class Collection(BaseCollection):
(path, depth, cls.user, attributes))
yield cls(path)
if len(attributes) == 1: # Got all if root is needed
contact_path = '%s/odoo-contact' % path
calendar_path = '%s/odoo-calendar' % path
contact_path = '%sodoo-contact' % path
calendar_path = '%sodoo-calendar' % path
yield cls(contact_path)
yield cls(calendar_path)
elif len(attributes) == 2: # Then we need children
collection = cls(path)
for item in collection.list():
yield collection.get(item)
def get_meta(self, key=None):
"""Get metadata value for collection """
@ -171,48 +174,71 @@ class Collection(BaseCollection):
""" Gets all contacts available from one Odoo login """
cls.logger.info('Get contacts for Odoo user %s' % login)
partner_ids = cls.odoo.env['res.partner'].search([])
cls.logger.debug(partner_ids)
return ['res.partner:%s' % pid for pid in partner_ids]
def sync(self, old_token=None):
""" Debug purpose """
token, ilist = super(Collection, self).sync(old_token)
self.logger.debug('Sync token : %s' % token)
self.logger.debug('Sync list : %s' % ilist)
return token, ilist
def list(self):
"""List collection items."""
# TODO : get all ICS from Odoo...
self.logger.warning('List collection %s' % self.path)
self.logger.warning('Collection tag %s' % self.tag)
self.logger.debug('List collection %s' % self.path)
self.logger.debug('Collection tag %s' % self.tag)
if self.tag:
if self.tag == 'VADDRESSBOOK':
for oid in self.__class__.get_contacts_from_odoo(self.owner):
yield oid
# for item in self.collection.list():
# yield item.uid + self.content_suffix
yield oid + self.content_suffix
def _get_with_metadata(self, href):
"""Fetch a single item from Odoo database"""
model, database_id = href.split(':')
fields = ['name', 'write_date', 'comment']
data = self.odoo.execute(model, 'read', [int(database_id)], fields)[0]
self.logger.warning(data)
database_id = int(database_id[:-len(self.content_suffix)])
# fields = ['name', 'write_date', 'comment', 'street', 'street2', 'zip',
# 'city', 'state_id' 'country_id']
# data = self.odoo.execute(model, 'read', [database_id], fields)[0]
data = self.odoo.env[model].browse([database_id])
if model == 'res.partner':
# last_modified = strftime("%a, %d %b %Y %H:%M:%S GMT",
# strptime(data.get('write_date'), '%Y-%m-%d %H:%M:%S'))
last_modified = strftime("%Y-%m-%dT%H:%M:%SZ",
strptime(data.get('write_date'), '%Y-%m-%d %H:%M:%S'))
self.logger.warning(last_modified)
last_modified = str(data.write_date)
vobject_item = vobject.vCard()
vobject_item.add('n')
vobject_item.n.value = vobject.vcard.Name(family=data.get('name'))
vobject_item.add('fn')
vobject_item.fn.value = data.get('name')
vobject_item.add('uid').value = database_id
vobject_item.fn.value = data.name
vobject_item.add('adr')
state_name = data.state_id.name if data.state_id else ''
country_name = data.country_id.name if data.country_id else ''
vobject_item.adr.value = vobject.vcard.Address(
street=' '.join([data.street or '', data.street2 or '']),
code=data.zip or '', city=data.city or '',
region=state_name, country=country_name)
if data.image:
vobject_item.add('photo;encoding=b;type=jpeg').value = data.image.replace('\n', '')
if data.phone:
vobject_item.add('tel').value = data.phone
if data.email:
vobject_item.add('email').value = data.email
if data.website:
vobject_item.add('url').value = data.website
if data.function:
vobject_item.add('role').value = data.function
if data.comment:
vobject_item.add('note').value = data.comment
if data.category_id:
categs = [categ.name for categ in data.category_id]
vobject_item.add('categories').value = categs
if data.parent_id:
vobject_item.add('org').value = [data.parent_id.name]
vobject_item.add('uid').value = href
vobject_item.add('rev').value = last_modified
self.logger.warning(vobject_item.name)
self.logger.warning([c for c in vobject_item.components()])
tag, start, end = xmlutils.find_tag_and_time_range(vobject_item)
self.logger.warning('Tag, start, end : %s %s %s' % (tag, start, end))
text = vobject_item.serialize()
etag = get_etag(text)
uid = get_uid_from_object(vobject_item)
self.logger.warning('Text, ETAG, UID : %s %s %s' % (text, etag, uid))
return Item(
self, href=href, last_modified=last_modified, etag=etag,
text=text, item=vobject_item, uid=href,
@ -224,17 +250,10 @@ class Collection(BaseCollection):
def get(self, href, verify_href=True):
item, metadata = self._get_with_metadata(href)
self.logger.warning(item)
self.logger.warning(item.serialize())
self.logger.warning(item.name)
self.logger.warning(item.last_modified)
self.logger.warning([c for c in item.components()])
self.logger.warning(metadata)
return item
def delete(self, href=None):
""" Can not delete collection but item, yes """
self.logger.warning(href)
if href is None:
# Delete the collection
self.logger.error('Attempt to delete collection %s' % self.path)
@ -243,21 +262,12 @@ class Collection(BaseCollection):
# Delete an item
raise NotImplementedError
# def serialize(self):
# """ Get the whole collection unicode """
# # TODO: CALENDAR
# self.logger.warning('From serialize : %s' % self.tag)
# if self.tag == "VADDRESSBOOK":
# self.logger.warning('HERE')
# self.logger.warning([item.serialize() for item in self.get_all()])
# return ''.join((item.serialize() for item in self.get_all()))
# return ''
@property
def last_modified(self):
""" Return last modified """
last = self.odoo.env[self.odoo_model].search([], limit=1, order='write_date desc')
last_fields = self.odoo.execute(self.odoo_model, 'read', last, ['write_date'])[0]
self.logger.info(last_fields)
return strftime("%a, %d %b %Y %H:%M:%S GMT",
strptime(last_fields.get('write_date'), '%Y-%m-%d %H:%M:%S'))
self.logger.debug(last_fields)
# return strftime("%a, %d %b %Y %H:%M:%S GMT",
# strptime(last_fields.get('write_date'), '%Y-%m-%d %H:%M:%S'))
return str(last_fields['write_date'])