rrule_field = eim.subtype(text32K) rdate_field = eim.subtype(text32K) def sort_factory(separator, start_sort): def sort(s): divider = start_sort begin = u'' if start_sort: begin, divider, s = s.rpartition(unicode(divider)) return begin + divider + separator.join(sorted(s.split(separator))) return sort for t, separator, start_sort in zip([rrule_field, rdate_field], (';', ','), ('', ':')): f = sort_factory(separator, start_sort) eim.add_converter(t, str, f) eim.add_converter(t, unicode, f) class EventRecord(eim.Record): URI = "http://osafoundation.org/eim/event/0" uuid = eim.key(NoteRecord.uuid) # EventStamp.[allDay, anyTime, duration, startTime] dtstart = eim.field(text20, "Start time") duration = eim.field(text20, "Duration") # EventStamp.location location = eim.field(text256, "Location") # EventStamp.[recurrenceID, rruleset, etc.]
import random shuffler = random.Random(1) # fixed seed on purpose while True: shuffler.shuffle(words) ret += os.linesep + ' '.join(words) if len(ret) >= length: return ret[:length] def all_empty(obj, *attr_names): """True if obj.attr for all attr_names is in emptyValues.""" for attr in attr_names: if getattr(obj, attr) not in emptyValues: return False return True eim.add_converter(model.aliasableUUID, Item, getAliasForItem) eim.add_converter(model.aliasableUUID, Collection, getAliasForItem) # Hopefully someday we will be able to remove the following converters: # Cosmo will generate a value of None even if Chandler hasn't provided a # value for event status, so treat None as NoChange eim.add_converter(model.EventRecord.status, type(None), lambda x: eim.NoChange) # Cosmo will generate a value of empty string even if Chandler hasn't provided # a value for triage, so treat empty string as NoChange def emptyToNoChange(s): return s if s else eim.NoChange eim.add_converter(model.ItemRecord.triage, str, emptyToNoChange) eim.add_converter(model.ItemRecord.triage, unicode, emptyToNoChange)
while True: shuffler.shuffle(words) ret += os.linesep + ' '.join(words) if len(ret) >= length: return ret[:length] def all_empty(obj, *attr_names): """True if obj.attr for all attr_names is in emptyValues.""" for attr in attr_names: if getattr(obj, attr) not in emptyValues: return False return True eim.add_converter(model.aliasableUUID, Item, getAliasForItem) eim.add_converter(model.aliasableUUID, Collection, getAliasForItem) # Hopefully someday we will be able to remove the following converters: # Cosmo will generate a value of None even if Chandler hasn't provided a # value for event status, so treat None as NoChange eim.add_converter(model.EventRecord.status, type(None), lambda x: eim.NoChange) # Cosmo will generate a value of empty string even if Chandler hasn't provided # a value for triage, so treat empty string as NoChange def emptyToNoChange(s): return s if s else eim.NoChange