def withItemForUUID(self, alias, itype=Item, **attrs): """Handle recurrence modification aliases.""" uuid, recurrence_id = splitUUID(alias) if not recurrence_id: return super(SharingTranslator, self).withItemForUUID(uuid, itype, **attrs) occurrence = self.getItemForAlias(alias) master = self.getItemForAlias(uuid) master_recur = Recurrence(master) add_on = itype if itype is not Item else None # recurrence triage is a special case if add_on is Triage and 'manual' in attrs and 'manual_timestamp' in attrs: status, timestamp = attrs['manual'], attrs['manual_timestamp'] if status is eim.Inherit: master_recur.clear_occurrence_triage(recurrence_id) else: master_recur.triage_occurrence(recurrence_id, timestamp, status) del attrs['manual'] del attrs['manual_timestamp'] for name, value in attrs.items(): if value is eim.Inherit: occurrence.remove_change(add_on, name) elif value is not eim.NoChange: occurrence.modify(add_on, name, value) value = occurrence if add_on is None else add_on(occurrence) if issubclass(itype, Extension): if not itype.installed_on(occurrence) and attrs: value.add() def decorator(func): try: return func(value) except Exception, e: self.recordFailure(e)