Very cool. A nice elegant mechanism to incorporate REST into turbogears/python.
Turbogears 2 is out. With some significant changes of the default components; sqlobject to sqlalchemy and kid to genshi. This site runs on Turbogears, I will have to upgrade and see what the change/break is.

Random ResultSet with SQLObject

Was trying to get a result set that was semi-random with only three result coming back using sqlobject. I over-engineered my first attempt into a mess, and sat back to think for a while. In the end I came up with:

 def randResultSet():
    resultSet = Table.select()
    count = resultSet.count()
    upper_bound = random.randint(3,count)
    lower_bound = upper_bound - 3;
    return resultSet[lower_bound: upper_bound]

Two very cool things. SQLObject's SelectResults object on the count() function does a quick query with COUNT rather than loading all the results the select() function returned. Which makes the count call cheap.

SQLObject loads the results lazily anyway, only doing the query when you actually want them. When combined with python's splicing this makes a semi-random result set pretty simple. With some fudging of the orderBy argument and reversed() it is random enough for human eyes.

Internal Redirect in CherryPy based on URL with Turbogears

For phoenix eats out I had to do an internal redirect with CherryPy based on the URL that was coming in, but only for the index page. I did it for all other cases in Apache, but decided with the index page to do it using Turbogears.

The main issue, which took me a while to workout, was that I was running CherryPy as a server locally on my dev machine, but in production I am using mod_proxy with apache. CherryPy gives you quick and easy access to the request headers as a dict, so it is easy to punch out and see what is going on. In my dev environment I set up phoenixeatsout.com in my /etc/hosts to resolve to localhost and wrote:

 if cherrypy.request.headers.get("Host") == 'www.phoenixeatsout.com':
    raise cherrypy.InternalRedirect('/restaurants/')

Which worked fine when I was running CherryPy as the http server. With mod_proxy that doesn't work as the host is always localhost:8000 or whatever host and port you are running CherryPy on that Apache connects to through mod_proxy. After pumping out the headers to the main page I changed it in production to:

reqHost = cherrypy.request.headers.get("X-Forwarded-Host")
if reqHost == 'www.phoenixeatsout.com':
    raise cherrypy.InternalRedirect('/restaurants/')

Because it is an internal redirect it slides to that controller without changing the URL to the user's eye. Quite neat.

More And fwiw the point versioning of the South Sea Republic, Cam Riley and Phoenix Eats Out codebase has gone from 1.3.64 to 1.4.0.

AttributeError: 'function' object has no attribute 'exposed'

I was getting the error while working on adding a new controller method to the Root controller in a Turbogears application:

AttributeError: 'function' object has no attribute 'exposed'

It perplexed me for a while until I realised I had not put @expose above the method. The incorrect method:

def restaurant_random(self, identifier, carryover, **params):
    raise cherrypy.InternalRedirect (path="/restaurants/?random=true")

and the corrected method:

@expose()
def restaurant_random(self, identifier, carryover, **params):
    raise cherrypy.InternalRedirect (path="/restaurants/?random=true")

Like most of these types of errors it was one of omission, and took a while to work out before discovering the simple solution.

Sourceforge on Turbogears

Sourceforge's front-end is now running Turbogears. Very cool. Especially in light of this article concerned about the tight coupling with the sourceforge codebase and its descendants.

For what it is worth, my little blog is running on Turbogears. I enjoy working with the framework. I must upgrade to Turbogears 2 so I can get rid of the kid templating system which is too restrictive.

Upgrading to Turbogears 2

The documentation wants you to upgrade via virtenv. Meh, too much hassle even though my install won't be supported. I did it through easy_install on OSX but there were some package clashes.

 sudo easy_install Turbogears2==2.0.3

That got me a couple of errors that simplejson had to be both 0.9.1 and >= 2.0. I solved that by using easy_install:

 easy_install simplejson==2.0.8

Running the easy_install for Turbogears2 again after that fixed the issue. Sweet. Next job is to update this blog from Turbogears 1.x to Turbogears2.

More: Previously with easy_install and turbogears 1.

More II: Not so quick. Running a Turbogears 2 project required Myghty to be installed.

 easy_install Myghty>=1.1

After that the project loaded and the webserver was running on 8085.

More II Paster requires virtualenv installed.
Running 'paster quickstart' didn't work for me. Turbogears 2 doesn't register with paster unless you install the virtual env package:

sudo easy_install virtualenv

After that running 'paster --help' showed tg2. To get quickstart etc:

sudo easy_install tg.devtools

and the remainder of the turbogears tools show.

More To get around the setuptools issue not upgrading on OSX read here.
It took me a while to work out how to use xi:include in genshi and turbogears. As it turns out the trick is in the template that is being imported in py:strip="" has to go into the body tag.

Updated the Website to Turbogears 1.1.1

I updated the ssr/camriley websites to Turbogears 1.1 from Turbogears 1.0. The main benefit was moving from kid templating to genshi which is html based rather than XML though most of the template substitutions seem to be XSLT based.

A couple of side effects from that is that templates end up being dependent on the ultimate parent template and you can't ignore the html/body tags correctly for multiple templates deep. Even with judicious use of py:strip="True" multiple html/body tags appear as does multiple css references.

Another side effect is that Turbogears 1.1.x uses a different sha1 hash than the previous one, so all the passwords are indecipherable. I think only adam and maybe john still log in. Send me an email and I will reset the password. Gilmae might, but knowing him he has already hacked the entire website already and taken care of it himself.
Next 10 articles

Most Popular on South Sea Republic

The articles that have been viewed the most:

Most Popular Restaurants in Phoenix

Phoenix Eats Out is the restaurant review site for Phoenix, Scottsdale and Old Town Scottsdale which lists the modernist and contemporary restaurants, taverns and bars in the greater Phoenix area. This is the list of the most popular restaurants pages from phoenixeatsout.com that have been viewed the most; My personal favourite restaurants in Phoenix are AZ88, Postinos, Bomberos with Grazie, Humble Pie, Orange Table, The Vig, Fez and others coming close behind. View the complete list with the photo-journalistic style images on phoenixeatsout.com

Most Popular Hikes in Arizona

Arizona is an outdoor state and has lots of hiking in the city and around the state. Phoenix is unusual for most cities in having several large mountains in the center of the city with great hiking. Anyone who comes to Phoenix has to do the Echo Canyon trail on Camelback and the Summit Hike on Squaw Peak or Piesta Peak. The views of the city, suburbs and surrounding mountains are wonderful from Camelback and Piesta Peak. For more experienced hikers there is the McDowell Mountains in North Scottsdale that has several difficult and strenuous hikes in Tom's Thumb and Bell Pass. Alternatively, you can hike the highest mountain in Arizona. At 12,600 feet Humphrey's Peak is a long and difficult hike.

Alternate Australian Constitutions

Between 2004 and 2009 this site, southsearepublic.org, was a constitutional blog based on scoop which focused on Australian and global constitutional issues. One of the strongest aspects of it was the development of constitutions by those involved in the blog. These constitutions are the outcome: The constitutions were built using principles from Montesquieu's separation of powers, the enlightnment's universal political rights and the ancient Athenian technology of sortition and choice by lot.

Archives For South Sea Republic

South Sea Republic started in 2004 as an Australian constitutional blog in 2004 based on scoop software. It was an immigrative outgrowth of Kuro5hin. The archives for each year since then; The articles are ordered by views.

Who Is Cam Riley

Cam Riley I am an Australian living in the United States as a permanent resident. I am a software developer by trade and mostly work in Java and jump between middleware and front end. I originally worked in the New York area of the United States in telecommunications before moving to Washington DC and working in a mix of telecommunications, energy and ITS. I started my own software company before heading out to Arizona and working with Shutterfly. Since then I have joined a startup in the Phoenix area and am thoroughly enjoying myself.

I do a lot of photography which I post on this website, but also on flickr. I have a photo-journalistic website which lists the modernist and contemporary restaurants in phoenix. I have a site on the Australian Flying Corps [AFC] which has been around since the 1990s and which I unfortunately lost the .org URL to during a life event; however, it is under the www.australianflyingcorps.com URL now. The AFC website has gone through several iterations since the 90s and the two most recent are Australian Flying Corps Archives(2004-2002) and Australian Flying Corps Archives(2002-1999) which are good places to start.

Websites Worth Reading

Websites of friends, colleagues and of interest;