Luca Olivetti wrote:
Max M wrote:
The management interface should show dangling links instead of just hiding them.
Not in the current implementation. The product currently deletes relations that no longer has valid objects. I did this so that you cannot remove an object with one meta_type and add one with another meta_type but the same id. This, I guess could seriously screw up the app.
Maybe I was doing something stupid (with all that banging my head on the wall trying to learn zope+cmf+zpt+writing python products all at once ;-) but this is not what I saw: before I implemented manage_beforeDelete in my objects, I deleted one, I went to the management interface of the mxmRelation and saw that the relation wasn't there anymore -- good. Then I created a new object with the same id and when I went to display it the old relation was still in place -- bad.
You are indeed right that it *can* happen. There is no way in Zope to subscribe to an object. So the relations class cannot know if an object is deleted before it tries to fetch it via the path. If the relations class cannot find an object it deletes it then. This means that if a new object is created between the old one being deleted and the next time the relations class tries to fetch it, that the link will still be there. That is not ideal of course.
Since I didn't know of manage_beforeDelete at the time, in my object creation method I just put a call to delete dangling relations :-)
The correct way to ensure that there are no dangling relations naturally is to create a method in any product being related to like (from the top of my head):: def manage_beforeDelete(self): self.relations.delete(self) Then things happens cleanly.
Well, there are not so many cases and with postgres (not that I'm an expert of it, it just happens that I read a tutorial about foreign keys and referential integrity ;-) you can define what happens when you delete a record another table depends on:
1) do nothing 2) cascade delete (i.e.delete the record and all records depending on it, useful for example if you're trying to delete an invoice and its lines) 3) don't allow deleting the record
and that's it. But, as you say, that's not possible without modifications to zope core.
I believe that will be more complex in Zope as objects are not as simple as tables and rows. regards Max M