Afrigator ups its game
21 May
While Amatomu has been pretty good at regularly releasing small improvements to their aggregator, Afrigator has gone for a big bang, releasing their new version with new features today.
Afrigator quite cleverly also created an additional channel for community participation, having started a mailing list for people to hear about their new version beforehand, and to discuss it afterwards. Amatomu suddenly feels like a corporate in comparison (although we know otherwise).
Of interest to me is OpenID login support and a "private" aggregator of the feeds you particularly are interested in.
But, nothing dramatically exciting yet - Amatomu still leads in terms of the information they provide and the visualisation thereof.
I've moved TGOpenIDLogin onto Google Code so that the source code repository is accessible and other people can work on it. I've also created a TGOpenIDLogin discussion group, in case someone actually ends up using it and wants to know some things about it.
(TGOpenIDLogin is a TurboGears module that you can use to add OpenID logins to your TurboGears application without too much fuss. A previous post has information on how to use it.)
The Cape Town March 2007 GeekDinner was held last night, and I think it can be called a success. From my perspective, most of the geeks were mingling, there were lots of questions on the presentations, there was impromptu discussion and presentations in the form of open mic sessions, and so forth. I found it engaging, dynamic, and interactive.
The sessions worked well - we had one fifteen-to-twenty minute session on WAPA, the Wireless Access Provider Association - I guess we could call it the main attraction. This was given by David Jarvis, whose day job is running the wireless ISP Uninetwork. He explained that WAPA is an industry representative body for wireless access providers, to work together to ensure a sustainable wireless access service industry. They're there to self-regulate and live up to a code of conduct and to make sure they're all behaving properly, and ultimately would like proper legal recognition of this activity.
Then, a ten minute or so session announcing Teraco, the latest project by serial entrepreneurs Joe, Abraham (who are both behind the Frogfoot ISP and wireless access provider Amobia), and Matt Tagg (the guy behind Web Africa's success). Teraco is to be world-class vendor-neutral data centre in Cape Town, with N+1 redundancy throughout. They'll just provide the location - customers will need to get their own agreements to have their traffic carried from the multiple carriers in the centre, and customers will also be able to get direct links to other customers in the data centre.
Then, another ten minute or so session by Jonathan Endersby on a restaurant review site he'd like to work on, with full Web 2.0 buzzword compliance.
I gave a hopefully-very-short (and hopefully somewhat accurate) talk on OpenID, entitled OpenID in three minutes. There were quite a few questions during the talk and in the comments time though, so it was quite a bit more than three minutes.
Jeremy Thurgood gave a similarly quick talk on Erlang, a distributed, concurrent, robust, functional programming language with cool features like hot code upgrades and soft real-time scheduling. Andy Rabagliati did one on peering, and Morgan Collett talked about the Ubuntu-ZA community.
You can follow others' thoughts on the GeekDinner on the GeekDinner planet.
I was innocently trying to add OpenID to an application, following the advice on Damian Cugley's article on using OpenID with Turbogears and on the TurboGears' documentation site's article on OpenID with Identity when I realised that it was way too much like hard work to implement. Edit this page, put this there, and so forth. Why couldn't I just import something and have it Just Work?
Well, it seems, that's not hard at all, actually. Thus, TGOpenIDLogin, which Just Works (well, python-openid Just Works, and I just use that) when you transfer login and so forth to it. It's a turboGears controller that you can hook up into any TurboGears application and have it take care of logging in of people using OpenID.
It can't be simpler:
from tgopenidlogin.controllers import OpenIDLoginController
class Root(controllers.RootController):
...
openid = OpenIDLoginController(User, VisitIdentity)
login = openid.login
logout = openid.logout
It remembers where you were trying to go, and comes with a simple OpenID form to put on any page which will remember what page you were on when you tried to log in - it's tgopenidlogin.widgets.OpenIDLoginForm.
You need to pass in the model for your User and VisitIdentity objects so that it can create users and update user details from their OpenID server, and so that it can log them on. Your User model needs to support usernames of 255 characters long. You can also pass in the web path to the OpenIDLoginController (it defaults to "/openid" relative to your web app base). You can pass in your own OpenID store, or it'll use a SQLite store (well, if you have pysqlite2 installed). You can also set your OpenID trust_root, or it'll default to the base of your web application.
Nothing invalidates logging in with plain username and password if you still want that. Your current login page can have a separate form (using widgets.OpenIDLoginForm, for simplicity) or a link to the TGOpenIDLoginController - just don't put in login = openid.login in your controller...
Still quite a bit to do:
- It doesn't save original_parameters like the standard TurboGears login does. This will require storing the parameters somewhere - probably the session.
- The User/VisitIdentity stuff might only work with SQLAlchemy with assign_mapper and Elixir and maybe SQLObject - non-assign_mapper SQLAlchemy will need a separate handler. This is probably easiest handled by making it easy to inherit from the controller.
- The post-authentication action, redirecting to the target page, might not be useful for places that want full registration. Again, probably best to stub it out with a default implementation, and let people inherit from the controller and override.
- Oh, I haven't really tested interoperability. I just used the example server from python-openid, and one that just failed, and few pages without OpenID server links.