[Zope] Bizarre changes in the meaning of "self" (mixed DTML/python scripts)

Erik M Norvelle norvelle@Ag.arizona.edu
Sun, 5 May 2002 13:52:37 -0700 (MST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-851401618-1020631957=:24573
Content-Type: TEXT/PLAIN; charset=US-ASCII

Greetings:

I am developing a calendar product, which allows for the addition of event
objects to the main calendar object.  The problem I am having is that
after I use DTML scripts to perform calls to python code, the meaning of
the "self" variable in the python code undergoes a strange change.  I'll
do my best to describe the problem below (Note that all goes well until
step 5, where things get weird)

1) For instance, assume I have added (via ZMI) an instance of my ZCalendar
product (call it MyCalendar).  ZCalendar is coded as a Python package.
2) The default method (index_html) provides a listing of all the currently
registered events, as well as provides a button to add a new event.
3) That button calls a DTML method (called add_event) on the MyCalendar
instance.  add_event.dtml has a form whose action is to collect
information about the new event, and then (when the Submit button is
clicked) call a method called "addEvent" on the MyCalendar object.
4) addEvent takes the information collected by the add_event DTML Method,
and creates a new ZCalEvent object, and inserts it into a Folder called
'Events'.  No surprises there, and everything works just fine until then.
5) Once addEvent is finished adding the new event, it performs the command
"return self.index_html(REQUEST)".  The idea here is that I want the user
taken back to the main Calendar view after adding an event.  I do *NOT*
want them taken to any part of the management interface.
6) By the time we get here, the URL has become
"http://localhost:8080/MyCalendar/addEvent", and thus Zope interprets
"self" as referring to the method instance of "addEvent".  Zope still
manages (via acquisition) to find the index_html method, but the resulting
call is something like "MyCalendar.addEvent.index_html(REQUEST)", rather
than "MyCalendar.index_html(REQUEST)"
7) Needless to say, entities which are visible to MyCalendar are not
visible to addEvent, and so when Zope gets to index_html, it reports an
AttributeError.  There are a variety of refrences I make in index_html
which only make sense when it is being called on MyCalendar, and not when
it is being called on the addEvent method instance.

The way I eventually got around this is to change addEvent to perform a
redirect instead of a return: "REQUEST.REPONSE.redirect(REQUEST['URL1']
+ '/index_html')".  This works, but is an egregious hack, since it depends
upon the (potentially unpredictable) value of REQUEST['URL1'], which might
or might not be correct in all instances.

How can I do things the "correct" way, and make sure that in the context
of MyCalendar.addEvent, "self" refers to "MyCalendar" and not its
"addEvent" method (as is normal in all OOP languages I have ever met so
far).

Attached is a copy of the code I have so far (with the ugly hack
included).  If anyone can take a look and tell me how to avoid this
situation, I would appreciate it greatly!  Direct replies to me at
norvelle@ag.arizona.edu would be most welcome, since this is such a
high-traffic list.

TKA,
Erik Norvelle

Support Systems Analyst, Sr.
The University of Arizona




---559023410-851401618-1020631957=:24573
Content-Type: APPLICATION/octet-stream; name="ZCalendar.tgz"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.GSO.4.32.0205051352370.24573@Ag.arizona.edu>
Content-Description: Archive containing Python Zope Product
Content-Disposition: attachment; filename="ZCalendar.tgz"

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
nH8NCuhUValLtvqAq8avTBchucrzhU6xa7b5mKXXvWLznIqqaknRBxDq4qbv
af5Wl5sujovNvBnzgR99mAiOGkyuRm89zXBW2TXVOAHgWXXFHHPJjFr6SA1K
0tooScU0GeJE562dIl0zMVAr/kSPfD0svcjTVFINFVo0kR719E50M1112U3V
8jyHbWQ2+b3L6YlgU+Y87Rwt59Ll/k2hD1BboqYRT+k0rCu76sZps2dUK8VM
b3A113vMJeGqhh5Bq2nn3It6yj2npOv8H3f1H1P/2wsdqv53gP1fEBxM/ydE
wup/WCj3XP1Lal5/cTQtr/UFn0PaPqKO9dbKCpYXIurSc3Au6Du1T9ua6fzz
WqK9/8WrjO7qf8HmpKdO0P92m4Pp/0RIRP2P3eCMlL9oa4kwBchb/Xuk94tG
T5hw7up+04QJTP8z/X9+iV7/K7DAuJYRy/4nONX1Py/Ff7Qx/seEyJ1zyq/N
zhwKYzF7xnWllfR/gDkOSAeU4qiTp130v+T6qbOnErLz3qyvXYDvS625/tpS
chr+PLT38c30m4zW6+b7CbGOhn9c2je/BkBvWmDG7LK011MMxgnZI//1dwv9
6tMZpVOrb932wKZfLvuVzVg6quiKlxfOGTOpenvlq/94d9rtV3D7F3YmpX1Q
O+LI+9O///q2vQVb3yFHXrpt3YzjxrpbvpV82Xx/2ZtfkEX59n5lB+9YaHhi
ZOezK0oPzc/yHVo6clLeH+4evnPjmNee5f+RO7Tgjf+s3nHJex3fHj8o59Et
ZP3644cOX7nwT/+bsiF9xY/a+5Evn9sxMD9p+9JPPxx28MCBHf/55KWK7064
duO+B55f7DdNTR5el9z6xdP/88u8dmda3cbK30+dOeyFvbc/9bfFOVdtunry
Q88deMzwxIaxNcP3vP3Zd37knfLJRzs7U/dXjDz09qmVD8798SNrjVsfDe7Y
ddlX3Fu23Vv2NZfMg7qeUVZe+tS0xbedpaYOK/rxr/XFxPf9P6r9ny9U8D9O
G9r/Gf4vQULn59YQR14rm5ovHolh/4sLE0Cs9z+HIITY/6gWYPt/EiLS/n97
b/b/R9ppXzCp1zvtY21JZOZKZq48W6+r59O2zm5LLP9/PCaAmPofjnX+fydv
czL9nwjpC/0vCInV/wyuwOAKCYYrXDBzQVT8b5x4wGL6fyT7H8R/EWyF6P8X
eKb/EyGS/ud7o/9DSbuQ/4t+2uNF2kVz6z1pl46JxSVReEgkSUpgU5ff1O6B
GPN+kfjc3ebzIbOHyXWLy9uI6ltkQo8+BV3siOluE8pcdeGozgtCovn/40UD
GUv/FxYWqPrfgf7/Aifz/yRE+kL/O/gz1v8OK89beZrVVWeq/8Xoj7Iqslqt
4p5GJKJTpoF2LyyCxVDPuLmwuSXQADtOPY1+T2zjE8NKMKxEnxufuhceE8Mw
46dyw7UYnNOFn2rJ0jQcxv4TdwBYzP0fNl7V/05R/zP/f2IkskGlrGdKrTvW
lGhKjplSLlJTytkeARe3RNX/cdoAGov/Rd7/J9ichSL/kyAw/29i5FzU/5Kh
gs0CbBZg0sei1/8a5u44lhFL/xfwfAj/i8NRyPR/QiQM/heCHQ5E/O/cQ98B
4Gq38b9Z/eEft+mU4TGi4n9TuAyzd+W/FxCSVCHif+/ZUnFd9Q2D73j+vRXt
2+3ul428vSlnwlDLi78zPnzzLEP+Dbvv4nKOrPvhkaebDr9428O3Oa1G483r
UmdvmLb7znG/HZjxyMJLxg85tP7QqPf2flWedTTrjcI312TlffTx6m1H39nm
njNm4MJln368+eOS3xue7Hxqe/8N17/99i7byer7/raL3/yLsZ3Bms4h/3x8
+1BL5bCyl/ot2/MX8/X++dtfvmPOfd83bDM9lJv82k82lN78X3cLricGPP35
7BNNH77768ZhJxfV/aLt6s1VM+0/+M3/7Ry+9YbLBr5Qfcn6a0oHvFW2YL3z
wXf/9ciM1X+dt9LbbxLZuuahoYYtnuZnPxj48IjdVvd1KZ0vr8ou2lNw7JUp
a4oP/3TMM8d9p161Wx77xv05S1qveHJPc8q8xY7NKcd+80pG5ws/Ef6UW/no
8q/sgRz6Grzz+obD2ystP7YMOvza2n1DN6b92fDk4W/89a57PEtO+Ebm9qsa
f/+yph9O8z7weSV3+LVbN761b9eixld+/pe1qV8u33/667saDn70zPLhOfte
bGvMfOXu52YZrvzWNeTSO5/aM+vZU+mH+KMls2xFRan7/uj/tbfxyL2e+eum
j858yfzpr4QF9089NuWTJQX7k7auXnb/fflNw0/sOXBwUN7WBw/x/GfDf3Z7
1eP3Duw3nizIO/rmlvr3d6w/fs++3/17o+Wgp2z4N4+8/vCrz6+yvF9duXzF
ps9OvJMdnPVl57d/NuAPDZ/XHTswd/Hk7205OeLDTeVjVu1vq8jLSjr13+N+
+8yQreVjxjwwc+ZHJ7f2/+ALx5q1X1UcO13rPkF+erLk6RVfCM4ftKzp3Fud
vTu3Ick6xfLzo2u/x62+6/iug9CTz0V09bkvUdf/CfL/OpwFofYfQWD7/xIi
8cT/KPb/3hvte4//YeYq9qLCkD9MmDBhwoQJEyZMmDBhwoQJEyZMmDBhwoQJ
EyZMmDBhwoQJEyZMmDBhwuQikf8H7GQDCQBAAQA=
---559023410-851401618-1020631957=:24573--