Note that I have very little experience with Python so some of the code may not be optimal or true Python style.
See list of all articles here