Funny Use of Google

Over the weekend I was writing some code in Google AppEngine and had a need to loop through all of the incoming request parameters so automatically update the contents of a model when there were request parameters which had the same name as the model attributes.

When I wrote the very first version of the AE chapters for the class – I had this bit about dumping parameters in one chapter. In the rewrite to send the book to O’Reilly, I felt that this detail was too much so I cut it out about a month ago. I also cleaned up old copies of the chapter on my hard drive and on the appenginelearn.com site.

So on Saturday, I am sitting here peeved that I had this all figured out once and had even written it up once – exactly what I wanted – and then lost it.

I figured that I had researched this once before – so I could figure it out again. I remember that there was no real documentation and I had to write stuff like dir() to hunt through methods. It was painful but I figured I could do it in an hour.

So I typed the following into Google:

appengine looping through request variables

I looked at the text of the second hit and it looked promising. Then I noticed the word “Michigan” in the text and then I noticed that it was *my chapter*. The lost chapter. So I clicked on the link (the PDF) and scrolled down and had my answer in about 45 seconds!

I had forgotten to remove the copy on my Michigan personal AFS space – which I had used while teaching the class – Google had found it, indexed it and knew *somehow* that it was what I needed.

Sweet!

Here is the code I used to loop throught the attributes from a request and update model values automatically:

# Loop through the request keys and see if they can be put
# into the model
def modelload(self, org, req, prefix = None):
self.debug("ORM LOAD "+str(org.__class__))
for key in req.params.keys():
value = self.web.request.get(key)
thetype = self.modeltype(org, key)
if ( thetype == "none" and prefix != None ) :
if ( not key.startswith(prefix) ) : continue
key = key[len(prefix):]
thetype = self.modeltype(org, key)
if ( thetype == "none" ) : continue
self.debug(key+" ("+thetype+") = "+value)
setattr(org,key,value)
def modeltype(self, obj, key):
try:
attr = str(type(getattr(obj.__class__, key)))
except :
return "none"
if attr.find("ext.db.StringProperty") > 0 : return "string"
if attr.find("ext.db.ReferenceProperty") > 0 : return "reference"
if attr.find("ext.db.DateTimeProperty")  > 0: return "datetime"
if attr.find("ext.db.IntegerProperty")  > 0: return "int"
return "none"

Here is the entire bit of code for folks who might be interested.

http://code.google.com/p/cloudcollab/source/browse/trunk/contrib/drchuck/wiscrowd/imsglobal/lti.py