[Zope] Private Product Objects (was: object icons)

Tres Seaver tseaver@palladion.com
Wed, 23 Feb 2000 15:30:49 -0600


Loren Stafford <lstaffor@dynalogic.com> writes:
> 
> Now that I've had breakfast and thought about this a little more, I see
> there is broader issue: how to handle the special needs of objects that are
> private to a product. My product is an event scheduler. (Terry, who started
> the "object icons" thread, may have a different situation. Jump in and tell
> us about your product, Terry.) The Scheduler product registers an
> catalog-aware Event class so user's can define scheduled events. The product
> keeps track of all Events in a ZCatalog "Schedule". Now, Schedule is a
> persistent object and has a class definition, but the one and only instance
> is created by the product and load time, if an instance doesn't already
> exist. The Schedule has some special usage requirements:
> 
> 1. There should be only one instance. That's why its class is not
> registered.

Hmm, I guess I don't see the necessity of making it a Singleton here.  Suppose
you need to segregate events into separate priority classes, or guarantee that,
when executed, the run with the permissions of different users?  Splitting up
the schedule _might_ not be a terrible thing to do.  Your default case could
then just require dropping a single instance of the Schedule class at the root
of your Zope hierarchy, and leaving it there.

> 
> 2. It probably shouldn't show up on users' navigation bars and folder lists.
> This probably is not a problem, because Schedule has a unique meta-type. But
> that's not a watertight solution. A standard method for marking it invisible
> would be better.

If Schedule derives from ZCatalog, as it seems, and the Event class uses the
well-known schedule ID as its default_catalog_id, then it isn't even necessary
to "contain" the events within the schedule object -- they will find it anywhere
above them in the tree by acquisition (think "uncle Schedule" instead of "papa
Schedule").

> 
> 3. If and when it does show up (as on the manage_main menu) it should be
> identified with the product (to avoid the "Whaz dis?" confusion). That's why
> I want it to have an icon that shows it is part Scheduler product.

Solved if Schedule is an "ordinary" ZClass.

> 
> 4. No one, not even a manager, should be able to delete it accidently. You
> can make an object undeletable by putting its ID in the list of reserved
> names, but I have found, during development of Scheduler, that this hack
> causes more problems than it's worth. I might settle for letting be deleted
> by a manager.

Again, solved for "ordinary" ZClass instances -- just set the permissions so.

> 
> 5. When the product is deleted (I mean really deleted, because you don't
> want to use it anymore), the Schedule should be deleted too. Failing this,
> it should at least be deletable (an iffy situation, if you use the
> reserved_names hack). On the other hand, if you are just updating the
> product code, you probably don't want to delete the Schedule object. It may
> contain scheduled events. This is complicated by the fact that when you load
> a product, Zope first deletes the old product. So a manage_beforeDelete
> method can't distinguish between a "real" delete and a code update. I've
> also discovered that any error in a product's manage_beforeDelete method
> makes the product not only undeletable, but (because of the implicit delete)
> unupdatable (un-update-able)!
> 
>   (Hmmm. There's an idea. You could make any object, including the Schedule,
> undeletable by giving it a manage_beforeDelete method that raises an error.)
> 
> 6. The Schedule need to have a "well known" ID (I think). This is for use in
> the default_catalog property of the events. I wouldn't want someone to
> change the ID of the Schedule arbitrarily. This may be the same problem as
> accidental deletion.

You can override the setId() method to prefent changing the id;  BasicUserFolder
does this::


    def _setId(self, id):
        if id != self.id:
            raise Globals.MessageDialog(
                title='Invalid Id',
                message='Cannot change the id of a UserFolder',
                action ='./manage_main',)

> 
> Anyway, I thought I'd mention this use case, so that changes to the Zope
> product API at least don't make implementation of such products any harder
> than they already are, and perhaps make them easier.
> 
> Got any suggestions for the short or long term?

Sounds like an interesting project!

Tres.
-- 
=========================================================
Tres Seaver         tseaver@palladion.com    713-523-6582
Palladion Software  http://www.palladion.com