Hi, A quick question. How do I compare folder instances ?(or any instances as a matter of fact). Here is a simple code showing what I tried: <dtml-in "objectValues(['Folder'])"> <dtml-var "_.getitem('sequence-item')"> <dtml-var "images"> <dtml-var "_.getitem('sequence-item')==images"> </dtml-in> Here is now the resulting HTML <Folder instance at 85cf958> <Folder instance at 85cf958> 0 <Folder instance at 858a168> <Folder instance at 85cf958> 0 Why isn't the first comparison returning true? What I want to use is something like: <dtml-in "objectValues(['Folder'])"> <dtml-if "_.getitem('sequence-item')==images"> EQUAL <dtml-else> NOT EQUAL </dtml-if> </dtml-in> Thanks a lot in advance for your comments. Carl
Carl Robitaille wrote:
<dtml-var "_.getitem('sequence-item')"> <dtml-var "images"> <dtml-var "_.getitem('sequence-item')==images">
<Folder instance at 85cf958> <Folder instance at 85cf958>
Congratulations, you've just been bitten by the thing that confused me for half a day... You see, while they say <Folder instance at 85cf958>, they're actually lying ;-) The objects you're comparing are actually acquisition wrappers. IMHO, == should work with acquisition to make problems like the above not happen. I suggested this, and Jim Fulton agreed: http://zope.nipltd.com/public/lists/dev-archive.nsf/ByKey/08240A8E0D50AEE0 Sadly, nothing seems to have been done about it :( Maybe you should chuck it in the collector as a bug in the ExtensionClass? cheers, Chris PS: In the meantime, the following should work: <dtml-in "objectValues(['Folder'])"> <dtml-if "_.getattr(_.getitem('sequence-item'),'aq_base',_.getitem('sequence-item'))==_.getattr(images,'aq_base',images)"> EQUAL <dtml-else> NOT EQUAL </dtml-if> </dtml-in>
Hi Criss, Thanks a lot for your quick response!! Since I'm a new Zope user, I guess I'll just cut-paste the line you suggest without trying to understand for the moment.... ;-) Carl
Carl Robitaille wrote:
<dtml-var "_.getitem('sequence-item')"> <dtml-var "images"> <dtml-var "_.getitem('sequence-item')==images">
<Folder instance at 85cf958> <Folder instance at 85cf958>
Congratulations, you've just been bitten by the thing that confused me for half a day... You see, while they say <Folder instance at 85cf958>, they're actually lying ;-)
The objects you're comparing are actually acquisition wrappers.
IMHO, == should work with acquisition to make problems like the above not happen. I suggested this, and Jim Fulton agreed: http://zope.nipltd.com/public/lists/dev-archive.nsf/ByKey/08240A8E0D50AEE0
Sadly, nothing seems to have been done about it :( Maybe you should chuck it in the collector as a bug in the ExtensionClass?
cheers,
Chris
PS: In the meantime, the following should work:
<dtml-in "objectValues(['Folder'])">
<dtml-if "_.getattr(_.getitem('sequence-item'),'aq_base',_.getitem('sequence-item'))==_.getattr(images,'aq_base',images)"> EQUAL <dtml-else> NOT EQUAL </dtml-if>
</dtml-in>
Carl Robitaille wrote:
Hi Criss,
Thanks a lot for your quick response!! Since I'm a new Zope user, I guess I'll just cut-paste the line you suggest without trying to understand for the moment.... ;-)
Nih! Welcome to the deep end ;-) cheers, Chris
Hi, Just for the record, Criss' suggestion didn't work for me. I don't quite get why though.... Here's the code again, where images is a Folder: <dtml-in "objectValues(['Folder'])"> <dtml-if "_.getattr(_.getitem('sequence-item'),'aq_base',_.getitem('sequence-item'))==_.getattr(images,'aq_base',images)"> EQUAL <dtml-else> NOT EQUAL </dtml-if> </dtml-in> The error I get from Zope is: File /home/zope/Zope2/lib/python/DocumentTemplate/DT_Util.py, line 337, in eval (Object: _.getattr(_.getitem('sequence-item'),'aq_base',_.getitem('sequence-item'))==_.getattr(images,'aq_base',images)) (Info: images) File <string>, line 0, in ? File /home/zope/Zope2/lib/python/DocumentTemplate/DT_Util.py, line 140, in careful_getattr AttributeError: aq_base It's looks like aq_base is not available. I read Shane's Acquisition Understander How-To. I created the ExternalMethod that used aq_base and it works like a charm. I tried a lot of things even if I didn't have a good undersanding of the problem. The only time I got a valid code (Zope not complaining when hitting the Change button) was with that line: <dtml-if "_.getattr(_.getitem('sequence-item'),'images.aq_base',_.getitem('sequence-item'))==_.getattr(images,'images.aq_base',images)"> You probably know why it doesn't give the right result, but I don't have a clue. It's still not returning true when sequence-item is matching the images Folder. Is there anything I can read to understand what I'm dealing with? Or maybe somebody knows what I'm doing wrong... again.... Carl
Carl Robitaille wrote:
Hi Criss,
Thanks a lot for your quick response!! Since I'm a new Zope user, I guess I'll just cut-paste the line you suggest without trying to understand for the moment.... ;-)
Nih!
Welcome to the deep end ;-)
cheers,
Chris
Carl Robitaille wrote:
It's looks like aq_base is not available.
Yes, apparently it's not available in DTML for security reasons :-( You could write a really small external method to get it for you: <UNTESTED> def ex_aq_base(object): return getattr(object,'aq_base',object) </UNTESTED> Your other option is to stick it in the colelctor and hope Jim Fulton or someone else who understands it gets round to 'fixing' the ExtentionClass WRT to == and acquisition wrappers :-S cheers, Chris
participants (2)
-
Carl Robitaille -
Chris Withers