Thanks for the info. Kinda what I thought after staring at it some more. See below for what I came up with over the weekend. I think it is pretty sound and will test it today. class Topic ... ...<original stuff> ... def manage_copy(self, ids[], paste_id='', REQUEST=None): """A mangement interface for copying messages. Scenario: Topic Msg-1 *ids Msg-3 Msg-4 *ids Msg-5 Msg-2 *paste_id Msg-6 Result of Copy: Topic Msg-1 Msg-3 Msg-4 Msg-5 Msg-2 Copy-of-Msg-1 Copy-of-Msg-3 Copy-of-Msg-4 Copy-of-Msg-5 Msg-6 Notice that mesages selected in ids become branches. This is the intended result. There will also be a complimentary manage_move() that will copy then delete the mesages listed in ids. """ data=self.data ids=map(atoi, ids) for id in ids: # not sure about namespace of root_object so set this inside loop if paste_id != '': paste_id=atoi(paste_id) root_object=data[paste_id] else: root_object=self copyItems(id, root_object, ids) def copyItems(self, id, root_object, branches) data=self.data item=data[id] # Start copy title=item.title author=item.author body=item.body email=item.email notify=item.notify file=item.file submit=' Add ' # Make new message in root_object root_object.addMessage(title, author, body, email, notify, file, submit) for id in item.ids: if id not in branches: self.copyItems(id, item, branches) I also remembered about the CVS thing after I sent the message. That was a big help in deciding how to do the copy. I couldn't just move a message becaues of the line that says msg=msg.__of__(self). The original ID is bound in the namespace to it's parent so easy enough to just self.addMessage to create a new id and binding in the new spot, then delete the old messages. Not done yet, but the paste_id is selected by a modified Topic_manage_messages.dtml <INPUT TYPE="CHECKBOX" NAME="ids:list" VALUE="<!--#var id-->"> <INPUT TYPE="RADIO" NAME="paste_id" VALUE="<!--#var id-->"> at both places where it appears. Also still need to do some error checking so that a paste_id in the ids.sub_id (mangle) will raise an idiot error. I am psyched that I grok ;-) now. Zope rulz I don't quite know how to produce a patch but I will post all of the changes when I have them complete and working. Should be a couple of days. Karl ----- Original Message ----- From: Butch Landingin <butchland@yahoo.com>
Hi, I've been playing around with Confera for about 4 weeks now -- but I'm not the original developer nor am I an employee of Digital Creations (hint!hint!) so <YMMV>take the following with a grain of salt</YMMV>.
On April 11, 1999 "Karl & Mel" <llwo@dbtech.net> wrote:
I know that Confera is not supported, but I am using it as a base for an = extended version that would allow messages to be moved, reordered, = copied, paseted, etc. In otherwords turn Messages into folderish? = containerish? objects. I don't want to give up the indexing and = searching though. Which leads me to believe that I need to override the = 'setItem' and '__getitem__' maybe?
I think you'd probably need to add methods in the Message/Topic classes to remove a child message (i.e. id in the intSet self.ids) (this would be to implement a <cut> function) and reattaching itself to another message or topic (to implement a paste function)
You can *probably*(just a guess, I haven't fiddled around too much with this) use the setitem to paste messages to another message but it does'nt have to do the indexing because it would already have been indexed when it was added, but it also has to handle reorganizing the thread field of the message you are moving so that these reflect the new paths (note that if the message being moved has children (i.e. replies), their thread fields also have to be updated and so on recursively)
In the cut function, you can probably base it on the delItem function (just take out the unindexing and delete object parts)
As for the other functions (reodering,etc.), I don't have enough info to suggest anything...