diff --git a/addons/base_calendar/base_calendar.py b/addons/base_calendar/base_calendar.py
index 9260d9c0730..168da55eaf7 100644
--- a/addons/base_calendar/base_calendar.py
+++ b/addons/base_calendar/base_calendar.py
@@ -27,6 +27,7 @@ from tools.translate import _
import base64
import pooler
import re
+import tools
import vobject
# O-1 Optional and can come only once
@@ -84,7 +85,7 @@ def get_attribute_mapping(cr, uid, calname, context={}):
if not res.get('uid', None):
res['uid'] = {}
res['uid']['field'] = 'id'
- res[attr]['type'] = "integer"
+ res['uid']['type'] = "integer"
return res
def map_data(cr, uid, obj):
@@ -170,12 +171,15 @@ class CalDAV(object):
self.__attribute__[name][type] = None
return True
- def parse_ics(self, cr, uid, child):
+ def parse_ics(self, cr, uid, child, cal_children=None, context=None):
att_data = []
for cal_data in child.getChildren():
if cal_data.name.lower() == 'attendee':
+ ctx = context.copy()
+ if cal_children:
+ ctx.update({'model': cal_children[cal_data.name.lower()]})
attendee = self.pool.get('basic.calendar.attendee')
- att_data.append(attendee.import_cal(cr, uid, cal_data))
+ att_data.append(attendee.import_cal(cr, uid, cal_data, context=ctx))
self.ical_set(cal_data.name.lower(), att_data, 'value')
continue
if cal_data.name.lower() == 'valarm':
@@ -230,7 +234,7 @@ class CalDAV(object):
data[map_field][0], vevent, context=context)
elif data[map_field]:
if map_type in ("char", "text"):
- vevent.add(field).value = str(data[map_field].encode('utf8'))
+ vevent.add(field).value = tools.ustr(data[map_field])
elif map_type in ('datetime', 'date') and data[map_field]:
if field in ('exdate'):
vevent.add(field).value = [parser.parse(data[map_field])]
@@ -239,12 +243,12 @@ class CalDAV(object):
elif map_type == "timedelta":
vevent.add(field).value = timedelta(hours=data[map_field])
elif map_type == "many2one":
- vevent.add(field).value = (data.get(map_field)[1]).encode('utf8')
+ vevent.add(field).value = tools.ustr(data.get(map_field)[1])
elif map_type in ("float", "integer"):
vevent.add(field).value = str(data.get(map_field))
elif map_type == "selection":
if not self.ical_get(field, 'mapping'):
- vevent.add(field).value = (data[map_field].encode('utf8')).upper()
+ vevent.add(field).value = (tools.ustr(data[map_field])).upper()
else:
for key1, val1 in self.ical_get(field, 'mapping').items():
if val1 == data[map_field]:
@@ -291,7 +295,7 @@ class CalDAV(object):
res = []
for child in parsedCal.getChildren():
if child.name.lower() in ('vevent', 'vtodo'):
- vals = self.parse_ics(cr, uid, child)
+ vals = self.parse_ics(cr, uid, child, context=context)
else:
vals = {}
continue
@@ -359,7 +363,7 @@ class Calendar(CalDAV, osv.osv):
if child.name.lower() in cal_children:
context.update({'model': cal_children[child.name.lower()]})
self.__attribute__ = get_attribute_mapping(cr, uid, child.name.lower(), context=context)
- val = self.parse_ics(cr, uid, child)
+ val = self.parse_ics(cr, uid, child, cal_children=cal_children, context=context)
obj = self.pool.get(cal_children[child.name.lower()])
if hasattr(obj, 'check_import'):
obj.check_import(cr, uid, [val], context=context)
@@ -638,7 +642,10 @@ class Attendee(CalDAV, osv.osv_memory):
'language': None, # Use: 0-1 Specify the language for text values in a property or property parameter.
}
- def import_cal(self, cr, uid, ical_data):
+ def import_cal(self, cr, uid, ical_data, context=None):
+ ctx = context.copy()
+ ctx.update({'model': context.get('model', None)})
+ self.__attribute__ = get_attribute_mapping(cr, uid, self._calname, ctx)
for para in ical_data.params:
if para.lower() == 'cn':
self.ical_set(para.lower(), ical_data.params[para][0]+':'+ \
@@ -652,7 +659,9 @@ class Attendee(CalDAV, osv.osv_memory):
def export_cal(self, cr, uid, model, attendee_ids, vevent, context={}):
attendee_object = self.pool.get(model)
- self.__attribute__ = get_attribute_mapping(cr, uid, self._calname, context)
+ ctx = context.copy()
+ ctx.update({'model': model})
+ self.__attribute__ = get_attribute_mapping(cr, uid, self._calname, ctx)
for attendee in attendee_object.read(cr, uid, attendee_ids, []):
attendee_add = vevent.add('attendee')
cn_val = ''
@@ -662,9 +671,10 @@ class Attendee(CalDAV, osv.osv_memory):
attendee_add.params[a_key] = [str(attendee[a_val['field']])]
elif a_val['type'] == 'boolean':
attendee_add.params[a_key] = [str(attendee[a_val['field']])]
- if a_val['field'] == 'cn':
+ if a_val['field'] == 'cn' and attendee[a_val['field']]:
cn_val = [str(attendee[a_val['field']])]
- attendee_add.params['CN'] = cn_val
+ if cn_val:
+ attendee_add.params['CN'] = cn_val
return vevent
Attendee()
diff --git a/addons/caldav/caldav.py b/addons/caldav/caldav.py
index 450b3a2bdd9..2d988456da2 100644
--- a/addons/caldav/caldav.py
+++ b/addons/caldav/caldav.py
@@ -215,6 +215,15 @@ request was delegated to"),
def do_decline(self, cr, uid, ids, context=None, *args):
self.write(cr, uid, ids, {'state': 'declined'}, context)
+ def create(self, cr, uid, vals, context={}):
+ if not vals.get("email") and vals.get("cn"):
+ cnval = vals.get("cn").split(':')
+ email = filter(lambda x:x.__contains__('@'), cnval)
+ vals['email'] = email[0]
+ vals['cn'] = vals.get("cn")
+ res = super(calendar_attendee, self).create(cr, uid, vals, context)
+ return res
+
calendar_attendee()
class res_alarm(osv.osv):
diff --git a/addons/caldav/caldav_view.xml b/addons/caldav/caldav_view.xml
index 06050f03b5a..559c45485cc 100644
--- a/addons/caldav/caldav_view.xml
+++ b/addons/caldav/caldav_view.xml
@@ -260,5 +260,9 @@
new
+
+