The replacement for translator.loadItemByUUID( ) is translator.withItemForUUID( ). The new method takes the same arguments as the old one, but can be used in two ways:

1) non-decorator: simply call withItemForUUID( ) as you called loadItemByUUID( ) before, but it won't return the item

   For example, in the NoteRecord.importer, what was:

        self.loadItemByUUID(record.uuid, pim.Note, icalUID=icalUID, body=body)

   becomes:

        self.withItemForUUID(record.uuid, pim.Note, icalUID=icalUID, body=body)


2) decorator: if your importer actually needs access to the item being loaded/created, you'll need to write a nested method which accepts the item as its argument, and decorate that method with self.withItemForUUID( )

   For example, in the ItemRecord.importer, what was:

item = self.loadItemByUUID(record.uuid, pim.ContentItem, displayName=record.title, createdOn=createdOn)
        if record.triage != "" and record.triage not in emptyValues:
                [... snip ...]
                item.doAutoTriageOnDateChange = (auto == "1")

   becomes:

@self.loadItemByUUID(record.uuid, pim.ContentItem, displayName=record.title, createdOn=createdOn)
        def do(item):
                if record.triage != "" and record.triage not in emptyValues:
                        [... snip ...]
                        item.doAutoTriageOnDateChange = (auto == "1")


Why do this? It turns out that in the case of multiple-inheritance, it's not always possible to upgrade the type of an item right away and it needs to be delayed. Changing the behavior in this way allows the underlying translator to delay the execution of the decorated nested methods until it's safe for them to run. If I've mischaracterized the problem and solution, I'm sure pje will let me know. :-)

~morgen
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

Open Source Applications Foundation "chandler-dev" mailing list
http://lists.osafoundation.org/mailman/listinfo/chandler-dev

Reply via email to