[Chandler-dev] Re: Stamping as annotation issues

Phillip J. Eby pje at telecommunity.com
Mon Jul 17 16:37:49 PDT 2006


At 03:28 PM 7/17/2006 -0700, Grant Baillie wrote:
>Hi, Phillip
>
>So, I put together a try at doing the stamping-as-annotation thing, in
>
><http://svn.osafoundation.org/sandbox/grant/stamping/>
>
>There have been a couple of tricky things,
>
>1. We'd talked in the email thread about having a ref collection of
>all the items with a particular stamp. For the moment, the way you do
>that by defining a str, __collection_name__ in your annotation
>subclass, that says where to put the ListCollection. (In general, the
>code here is a little cheesy: I had to override _create_schema_item()
>to install the collection, but there's probably a better way). Having
>the collection feature be optional in this way was really kind of an
>API hack to get my little doctests running, though.

I think that probably the right thing to do here is to also subclass 
schema.AnnotationItem, and put the collection there.  Maybe something like 
this:

class StampItem(schema.AnnotationItem):
     stamped_items = schema.One(ListCollection)

class StampClass(schema.AnnotationClass):
     def _create_schema_item(cls, view):
         result = StampItem(None, view['Schema'])
         result.stamped_items = ListCollection(result)
         return result

class Stamp(schema.Annotation):
     ...
     @classmethod
     def getCollection(cls, repoView):
         return schema.itemFor(cls, repoView).stamped_items

And then, you should be able to assume self.collection is not None 
throughout the rest of the code, if I understand your intention correctly.


>2. In the implementation of Stamp.delete(), I had to go and del the
>Annotation's attributes. I'm not sure if I actually did that right :).

I thought removing a stamp was supposed to keep the attributes intact, and 
that if a stamp really needed to delete the attributes, it could do so by 
overriding remove() and deleting them before a super call to the original 
remove().  As you've written it, it's impossible for a stamp to retain 
values after removal.


>I've also started looking at implementing this in the rest of
>Chandler, but there's at least one sticky point: The recurrence
>implementation declares attributes that refer back to CalendarEvent 
>(Mixin). So, right now, there are things like
>
>class CalendarEventMixin(...):
>
>     occurrences = schema.Many("CalendarEventMixin",
>inverse=occurrenceFor, ...)
>
>
>So far as I can tell, there's no way for me to say
>
>class EventStamp(Stamp):
>
>     occurrences = schema.Many("EventStamp", inverse=....)
>
>since "EventStamp" isn't persisted directly by the repository. Or
>will the schema API magically take care of destination types that are
>Annotation classes?

I believe it should, though I wouldn't swear to this exact scenario; let me 
know if it doesn't work.  :)


>Actually, even if it did, I doubt it could
>decorate occurrences on the fly from a ref collection...

Well, it doesn't need to, but of course the items you get back will be the 
base items, not the stamp wrappers.


>I'm guessing
>I'd have to go through the code that uses things like occurrences and
>add the EventStamp() as needed.

Yes, to reference stamp attributes you have to cast to the appropriate 
stamp type.  This will require client code refactoring, but of course you 
statically know whether you are accessing a stamp attribute or not, so this 
just makes it more explicit.


>Maybe a better approach is to change
>occurrences to _occurrences, and make occurrences a property à la
>stamps.

I don't know enough about the code being refactored to guess.  :)


>Anyway, comments (or ideas about the last paragraph of stream-of- 
>consciousness) are welcome. Also, if you'd prefer to hash things out
>on chandler-dev@, that would be fine, too.

I'm cc:ing this to chandler-dev since I prefer to err on the side of 
putting things in the archives.  That way, people learn about stuff, and 
it's Google-able later too.  :)



More information about the chandler-dev mailing list