Advanced Authentication in TurboGears 2 – Part 2

This post is the second of three posts about advanced authentication in TurboGears 2. In Part 1, the first post, we learn how to manually configure authentication and authorization in a TurboGears project. The same results can be achieved using the quickstart command, however, configuring the authentication middleware manually give us more control and allow us to easily add support for other authentication methods.

Part 2 is about adding support for FacebookConnect which allow users to login to a website using their Facebook acounts. You should read and complete the 9 steps from Part 1 before start following the instructions below. A working TurboGears 2 project including all changes introduced in Part 1 can be downloaded from GitHub.

After you have downloaded the project from GitHub or completed the steps in Part 1, let’s continue the process by adding FacebookConnect support:

Continue reading

Advanced Authentication in TurboGears 2 – Part 1

TurboGears is one of the best python web frameworks you can find this days. I could start listing its features but this post is already long enough and you can read about them in the official TurboGears website. Also, if you are interested in what the title of this post says it is about, you may already know one or two things about TurboGears. So let’s get to the point: Authentication.

Authentication is the act of verifying that somebody is really who he/she claims to be, is about finding who you are. Authorization, on the other hand, is the act of granting access to given resources depending on who would use them. For example, allowing registered members to leave comments on a blog, or allowing your friends to see your pictures while others cannot. In other words, finding what you may do (Authentication and Authorization in TurboGears 2).

TurboGears 2 uses two frameworks to deal with authentication and authorization. Together, these frameworks, are part of a robust, extendable and pluggable system that works in almost any situation but can be extended to suit your needs if it doesn’t. The two frameworks are repoze.who and repoze.what:

  • repoze.who, a framework for authentication in WSGI applications. You normally don’t have to care about it because by default TG2 applications ship all the code to set it up (as long as you had selected such an option when you created the project), but if you need something more advanced you are at the right place.
  • repoze.what, the successor of tg.ext.repoze.who and tgext.authorization (used in unstable TG2 releases), is a framework for authorization that is mostly compatible with the TurboGears 1.xIdentity authentication, identification and authorization system.

Normal authentication, using username and password, can be easily enabled in existing TurboGears applications and is even easier to get if you’re creating a new project. However, if you need support for other authentication methods like Facebook Connect, Sign in with Twitter or any other OAuth based authentication method, you’ll be expending a few hours of your time playing with the authentication and authorization system.

This post is about how to create a TurboGears 2 project with support for standard username and password login, Facebook Connect and Sign in with Twitter, all at the same time. There will be a lot of code to show and thus the post will be long so I have split it in three parts: Read Part 1: Using a .INI file to configure authentication and authorization middleware in TurboGears.

jQuery TimePicker

jQuery TimePicker is a plugin to help users easily input time entries. It works by allowing the user to type times in a free format or selecting them from a dropdown menu.

The plugin will automatically convert all time entries to a format that can be changed passing the timeFormat option; the default value is hh:mm p which will give something like ’02:16 PM’. The following are a few examples of the supported “formats”:

  • 1234 will be converted to 12:34 AM
  • 1234 p will be converted to 12:34 PM
  • 456 will be converted to 04:56 AM
  • 1656 will be converted to 04:56 PM
  • 1:1 P will be converted to 01:10 PM
  • 1:9 A will be converted to 01:09 AM
  • 8:59 will be converted to 08:59 PM
  • 1:20:30 will be converted to 01:20:30 PM
  • 46 will be converted to 05:00 AM (4 hours plus 60 minutes)

There are other supported formats, all inspired by the behavior of a similar timepicker used in Google Calendar. To see more, check the options page.

How to Use

To use jQuery TimePicker you’ll need to include two files: jquery.timepicker.js and jquery.timepicker.css. Then you can use the following code to initialize the plugin:

$(document).ready(function(){
    $('input.timepicker').timepicker({});
});

Options

  • timeFormat: this is the format of time string displayed in the input field and the menu items in the combobox. Available modifiers are: h, hh, H, HH, m, mm, s, ss, p.
  • minTime: a Date object. Only the time parts (getHours, getMinutes) of the object are important. Time entries before minTime won’t be displayed/allowed.
  • minHour: int. Ignored if minTime is set.
  • minMinutes: int. Ignored if minTime is set.
  • maxTime: a Date object. Time entries after maxTime won’t be displayed.
  • maxHour: int. Ignored if maxTime is set.
  • maxMinutes: int. Ignored if maxTime is set.
  • starTime: a Date object. The time of the first item in the combobox when the input field is empty. If the input field is not empty the first item will be the next allowed time entry.
  • startHour: int. Ignored if startTime is set.
  • startMinutes: int. Ignored if startTime is set.
  • interval: int. Time separation in minutes between each time entry.
  • dropdown: boolean. Whether the dropdown should be displayed or not.
  • scrollbar: boolean. Whether the scrollbars are shown or not.
  • change: a callback called when the value of the input field changes. A Date object with the selected time is passed to the callback.

Bugs

The Plugin has been tested in Firefox 3.6, Google Chrome, Safari (Windows) and IE 7.
Bugs reports, comments and new features suggestions are welcome at GitHub, in the comments sections of this post or through the contact page of this blog.

Download

Latest version of jQuery TimePicker can be downloaded from GitHub.

Flot – Una librería gráfica para jQuery

Es sorprendente la cantidad de alternativas para crear gráficos en un sitio web. Cuando empecé a investigar sobre el tema no esperaba encontrar tanto, pero la verdad es que hay opciones para todos los gustos:

Luego de probar Google Chart API (la unica opción de la lista que no requiere JavaScript) y gRaphael decidí quedarme con Flot, una librearía gráfica para jQuery. Gráficos atractivos, sintaxis intuitiva (es como usar cualquier otro plugin de jQuery), soporte para eventos y la posibilidad de ser extendida a través de plugins, son varias de las características que hicieron de esta librería mi elección para crear gráficos para la web. Vea un ejemplo completo

Deshabilitar WP-SynHighlight en el contenido mostrado en los feeds

WP-SynHighlight es un plugin para WordPress que permite mostrar codigo fuente con sintaxis resaltada en el contenido de los posts. Este plugin hace uso de GeShi para resaltar el código y por tanto soporta todos los lenguajes soportados por GeShi.

Hoy estaba revisando como se ven los posts  en este blog cuando son leidos desde un  FeedReader como Google Reader o Liferea. El problema con resaltar el código con una solución del lado del servidor como WP-SynHighlight es que no importa como se acceda el contenido, WordPress siempre va a incluir en la respuesta una cantidad de elementos HTML con el mero objetivo de mejorar la presentación. Creo que cuando un usuario está leyendo el contenido a través de un FeedReader está mas interesado en la estructura y el contenido, no tanto su presentación, de otro modo iría directamente a la fuente. Así, enviar contenido con código fuente resaltado a quienes usan FeedReaders me parece innecesario porque a) sin las hojas de estilo utilizadas en el sitio fuente el contenido no aparece realmente resaltado y b) los elementos HTML que antes permitían resaltar el código ahora dificultan que el lector lo manipule: un simple copy-paste da como resultado código mal formado y numeros de línea entre las linea de código. Vea como evitarlo…