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 + +