Feb 13

My Django Advent Article

When asked to write for Django Advent I was given an excuse to publish some of the ideas I've had related to Django projects and reusable app conventions and best pratices.

I was honored to be invited to post an article for a special series Django Advent created by Rob Hudson and Idan Gazit. The title of my article is "Everything I hate about Mingus" and in it I discuss:

"... obstacles faced and lessons learned managing an application that relies on so many reusable apps, and experiences in managing a small, open source project."

The Django Advent project is only a week old and already has a handful of terrific articles, from various authors, covering the new features in Django 1.2 which is the next stable release expected to ship in early March.

Django Advent also features one non-1.2 related article every Friday (which is how I snuck in). There are more than 10 articles left in the queue, with more being added I believe. Make sure to check it out and subscribe to the - Django Advent RSS feed.

Thanks Rob and Idan for inviting me. It was a pleasure.

Feb 11

Django-nonrel

A Non-relational backend support for Django via the new multi-db SQL compiler layer. They are currently working on a MongoDB backend, so you can use Django's ORM directly instead of a 3rd-party ORM.

Visit: http://bitbucket.org/wkornewald/django-nonrel/wiki/Home

Feb 11

Integrating mongoDB and Django

I take a quick look at a tumblelog application that integrates Django and mongoDB.

After listening to Mike Dirolf talk about mongoDB at a recent Django-NYC meetup I was left wanting to learn more about mongoDB and how I could integrate it into my Django projects.

Overview

This screencast will quickly review places to learn more about mongoDB, and a few available Python APIs for working with mongoDB, particularly mongoengine. It also discuss a project that shows us how to leverage all the great things about Django and also integrate a NOSQL database into the mix.

I stumbled onto the mongoEngine project about a month ago and have been meaning to post this screencast since then. What I like most about mongoEngine is that the classes structure looks and feels a lot like Django's models. I also really like its query API which also looks and feels a lot like Django's QuerySet API.

Finally, I take a look at a Django powered tumblog project that uses mongoDB in the backend. This particular project leverages a custom authentication backend for handling application authentication, Django forms, Django views, templates, urls, etc. Essentially it uses everything but the ORM.

This is not an extremely detailed tutorial -- my goal is to open up the discussion around a topic I'm not very unfamiliar with myself (NOSQL databases). What you see in the screencast is the result of about one hour of playing around with the various projects I discuss.

What brought it all together for me was finding a project that integrates both mongoDB and Django. I found that in Django-Mumblr, which I discuss in the screencast.

One thing I didn't mention in the screencast is the Django authentication support built into mongoEngine. I had planned to review it, but because of the length of the video I decided to leave it out. So, make sure to check that out if you're interested in integrating Django and mongoDB.

I've included the video below, but it's much better viewed full-screen or over at the blip.tv -- check it out. And special thanks to Harry Marr for both the mongoEngine and Django-Mumblr projects.

Links referenced in the screencast:

Feb 10

Eleven Django blog engines you should know

Bored of hearing about Mingus? Check out these awesome Django blog engines.

About two years ago Michael Trier blogged "Where's the Django Blog?". James Bennett later followed up with Where is the Django Blog Application in which he discusess why there is no "definitive" Django blog engine. More recently Daniel Greenfeld asked Show me your open source Django blog in which he defines various requirements needed for a project. Ever since reading that post I've been meaning to write this post.

Below are a few blog engines I selected that I believe you should be aware of, sorted by most recently updated. If the author provided a description I used that. If not, I summarized what I know about the project. If you have your own blog engine we should be aware of, please post the name and url in the comments.

Byteflow is not included because the project site is down at the time of this post.

Biblion

Tagline: The eldarion.com blog app intended to be suitable for site-level company and project blogs.

Source:http://github.com/eldarion/biblion

Last updated: Feb 9, 2010

Live example:http://eldarion.com/blog/

Description: Biblion was the eldarion.com blog which we've extracted and open sourced. It is currently positioned as being used for site/project blogs such as eldarion.com and pinaxproject.com. We intend for this app to replace the internal Pinax blog app once we've made it feature complete.

Notable features:

  • support for multiple channels (e.g. technical vs business)
  • use of Creole as markup format
  • Atom feeds
  • previewing of blog posts before publishing
  • optional ability to announce new posts on twitter

Django-article

Tagline: Sophisticated blogging engine for Django-powered sites.

Source:http://bitbucket.org/codekoala/django-articles/

Last updated: February 08, 2010

Live example:codekoala.com

Description: Author Josh VanderLinden. Sophisticated blogging engine for Django-powered sites.

Notable features:

  • Tags for articles, with a tag cloud template tag
  • Auto-completion for tags in the Django admin
  • Ability to post in the future
  • Article expiration facilities
  • Allows articles to be written in plain text/HTML or using Markdown, ReStructured Text, or Textile markup
  • Related articles
  • Follow-up articles
  • Disqus comments
  • Article archive, with pagination
  • Internationalization-ready
  • Detects links in articles and creates a per-article index for you
  • Word count
  • RSS feeds for the latest articles
  • RSS feeds for the latest articles by tag

Flother

Tagline: The Python- and Django-based code for the website running flother.com

Source:http://github.com/flother/flother

Last updated: February 01, 2010

Live example:http://www.flother.com/blog/

Description: Flother is the personal web site for Matt Riggott. It's been through many iterations but now it runs on Python 2.5 and Django 1.1 and is in active development. This is the complete source code, released under the GPL v3.0.

Notable features:

  • six main apps within the project
  • Akismet-moderated comments
  • Entries are formatted using Markdown and can be public, private, or draft.
  • Draft entries can be previewed on the site by admin users.
  • photos and places apps ( currently in active development and will see a full geocoded photo library with an option to import from Flickr.)
  • Thumbnails of images are created and displayed in the admin. A Javascript-based interface for using files in blog entries is provided
  • Google's AJAX API is used (server-side) to perform a site-wide search and return results on the site itself.

Basic-Blog

Tagline: Simple prebuilt applications.

Source:http://github.com/nathanborror/django-basic-apps

Last updated: February 01, 2010

Live example:http://nathanborror.com/

Description: A terrific example of a basic blog engine. The basic-apps project is a great demonstration in creating reusable apps. When taking into consideration the larger "basic-apps" project there are even more features available that integrate with the basic-blog app. Django-Mingus uses the basic-blog, basic-media, and basic-inlines apps for its core blogging engine.

Notable features: This app provides posts, categories, tags, comments, markdown support, and a basic template system.

Hello-Newman

Tagline: na.

Source:http://github.com/gregnewman/hello-newman

Last updated: January 24, 2010

Live example:http://gregnewman.org/

Description: My segregated blog platform that replaced 20seven.org under the new domain gregnewman.org.

Notable features: Since there isn't a list to pull from, here's what I pulled from a quick review of Newman's site and the code - entries, categories, "distractions", hit tracking, and a concept of "journals".

Banjo

Tagline: Banjo is a blogging application with bells and whistles, written using the Django framework.

Source:http://getbanjo.com/

Last updated: January 2010

Live example:getbanjo.com/blog/ ... I assume.

Description: Banjo is suitable for any blog, but is most appropriate for people who wish to integrate a blog into an existing Django application, such as a Satchmo store or a forum.

We have released Banjo as an open-source application with extremely liberal "BSD" licensing. So you can use it for business or personal sites with no concerns.""

Notable features:

  • Multiblog capable from the start.
  • Skinning is built in.
  • Trackback and Pingback are supported.
  • Posting via XML-RPC.

djangotechblog

Tagline: A blogging engine for django, with techies in mind.

Source:http://code.google.com/p/djangotechblog/

Last updated: Dec 21, 2009

Live example:http://www.willmcgugan.com/

Description: A versatile blogging engine aimed at coders. Author Will McGugan.

Notable features: Read Lowdown on Django-Techblog.

Django-YABA

Tagline: Yet Another Blog Application.

Source:http://github.com/f4nt/django-yaba/

Last updated: November 03, 2009

Live example:http://www.f4ntasmic.com - this is now a blogspot blog. You should read the author's post More Changes which details some updates regarding the YABA project.

Description: From the author, " I wanted something a bit more flexible though, so I decided to build it with the idea of being able to plug it anywhere with minimal configuration. I'm going to leverage YAML ( http://www.yaml.de/en/ ) for the theme of the blog, so that you can have a fairly pretty blog out of the box within minutes. Anyways, let me know if you have any questions."

Notable features:

  • Dynamic Themes
  • WYSIWG Editor
  • Blog Posts
  • RSS Feed
  • BlogRoll
  • Articles
  • Comments
  • Social Media
  • Search
  • Galleries

Shifting Bits

Tagline: A Django Based Blog.

Source:http://github.com/paltman/shiftingbits/

Last updated:November 01, 2009

Live example:http://paltman.com/

Description: Read: Shifting Bits - Another Blog Engine and Sifting Bits Makes Progress.

Notable features:

  • Basic blog post mode driven using generic date based views with redirects so that the WordPress url date format (numbered month versus the prettier and django default of short month name) get mapped properly so that none of your links break.
  • WordPress to Django Migration Script
  • Tagging via django-tagging
  • Comments via the new django.contrib.comments and using the live markdown preview editor, wmd.
  • Full RSS feeds (both latest feeds and by tag)

Mighty Lemon

Tagline: A Django blog. Formerly Oebfare by brosner.

Source:http://github.com/mightylemon/mightylemon

Last updated: April 20,2009

Live example:http://www.willmcgugan.com/

Description: oebfareMighty Lemon is the source code that runs the blog at http://oebfare.comjustinlilly.com(?). The code is freely available for you to use however you want.

Notable features:

  • markdown support
  • pygments (code highlighting)
  • django-comment-utils (commenting)
  • django-tagging (tagging)
  • django-mailer (mailing)
  • django-gravatar (gravatars for comments)
  • django-elsewhere (social networks)

Coltrane

Tagline: Coltrane.

Source:http://code.google.com/p/coltrane-blog/

Last updated: Oct 12, 2008

Live example:b-list.org ... I may be wrong.

Description: This is the project referenced throughout the excellent Practical Django Projects. James Bennett is the author of both the book and the blog engine.

Notable features: Since there isn't a list to pull from, here's what I pulled from a quick review of the code - posts, tagging, categories, and comments.

Conclusion

So when asking "where is the Django blog engine" today, there are a few choices available to you. Will there ever be a "defacto" Django blog engine? I don't think so. Is there room for one? I do think so, but it would take an collective effort to create it, and support it. What the team is doing with Django-CMS is the level of effort that is needed. And that's a lot of work. As the author of Mingus (make sure to check out the contributors) I enjoy hacking on it. But Mingus is and always be a concept project; a hobby.

So take a look at the above. There's a ton of terrific stuff in there. If you were looking to start a Django powered blog, now you have at least the eleven Django powered blog engines mentioned above, and Mingus :). Thanks to the authors for their contributions to open source.

Feb 08

That apps that power Mingus 0.9

More Mingus means more apps. Let's take a look at what's changed and what has been added.

Extending my previous post The apps that power Django-Mingus, the best way to discuss what has changed in Mingus is to discuss the new apps.

Well, wait just one second

Ok, maybe the best way to begin is to quickly discuss a few higher level updates. The first, and one I'm very proud of, is that Mingus was recently added to Transifix and now has both Spanish and French translations included thus far. To be honest, Transifix wasn't the reason these two languages were added (two developers contributed them before Transifix came into the picture), but I can see it helping in getting the rest. Getting Mingus translated probably wouldn't have been possible if:

  • I didn't focus on providing at least the basic pipeline for internationalization (templates, admin/models where possible)
  • And if Pablo Marti and Florent Messa didn't come in and clean up where I left off. Thanks to those two Mingus now has Spanish and French translations.

The fact is that so many apps (and I'm to blame here for some of my apps in the past as well) just don't do the basic i18n legwork that gets your app 80-90% of the way there. It's so easy, so go read up on Django Internationalization now before you forget. I won't produce an open source Django app without doing so ever again.

The most evasive change, believe it or not, was adding WYSIWYG support to blog posts. It was only invasive in that I sat on the fence on whether or not I thought this feature should be added to Mingus or just handled by the employing developer. I gave into the demands (those one or two people) and added support now for TinyMCE, CKEditor, YUI, Markdown, Textile, restructuredText, and raw HTML. All of this can be set dynamically via the admin (no settings.py changes!). Django-Markup was the first app I integrated to help with this feature, and then added Django-WYSIWYG, and then Django-TinyMCE borrowing some ideas from skevy. The funnies part about it all, Github now graphs my project as 98% javascript because of simply adding WYSIWYG support. The rest is 1% Python and 1% PHP (wtf?). Anyway...

Probably the best thing to come out of Mingus 0.9 is the community that helped get it there. Developers (handles) like acdha, richleland, hotsyk, danfairs, mikl, scelis, pmarti and thoas, as well as skevy, and jefftriplett, and the others helped make Mingus a better product by forking it on their own, adding features, forking a reusable app it uses and updating those, etc. Speaking of those other reusable apps, of course we can't forget to thank all the authors of those reusable apps as well. And finally, github made following commits, forks, branches, and merging updates a cake.

Other than that there were a slew of changes, but nothing too horrible if you're looking to upgrade on your own. A few apps we'll discuss soon have been added, the location/handling of static media in the project has been updated -- I discuss that below when reviewing Django-StaticFile. I've begun maintaing a docs/CHANGELOG file for these types of details, something I should have done since day one -- lesson learned. You can always reference the project's git commit log for the finer details. For anyone looking to migrate from an already existing, older version of Mingus there are three key changes to note:

  • Two new columns have been added to basic.blog.models.Settings and Mingus provides postgres SQL migrations for these (no South yet, sorry)
  • Permalinks have been updated to be more international friendly (previously the month was a character sequence and now is a digit sequence). The detail view has logic to support legacy urls with raising a 404 but your Disqus comments won't be smart enough to know the difference between the new and the old URL (disqus uses the URL as a key look for your comments). So if your comments disappear on you then you know why. A solution to fix this is to write a Disqus migration, or fork the basic-apps code Mingus uses and revert back to the older pattern, or update the templates where they populate the url, or do like I did and add a "My url scheme changed, if you'd like to see older comments click here" type solution. Not pretty, but works for me. So you have a few options available to you.
  • Static media directory move mentioned above, but you may have customized that anyway.

For those coders out there looking to syntax highlight your code well Django-Markup pygmentizes your text by default (not knowing that though I had previously added a pygmentize filter to the templates but that has been removed to reduce redundancy). If you're using the Django-Markup editors (markdown or reStructuredTex) this should work for you.

I also added Google Code's prettify highlighter as an alternative. To enjoy the benefits of google-code highlighting your markup needs to specify a class="prettyprint" attribute. It uses the Google CDN to deliver the JS so if you don't have access to the internets you won't see any highlighting. The related CSS is included in Mingus if you'd like to customize it to you compliment your templates.

To help better understand Mingus, and the references above, I plan on screencasting/posting these tidbits asmy schedule provides. The rest of the updates were mostly harmless refactoring of code, template updates, some i18n love, regular maintenance, bug support, and what have you. So let's see what goodies we have now...

The new digs

Without further ado, here are Mingus 0.9 additions (and one removal):

Django-StaticFiles

Source:Django-StaticFiles

Description: A Django app that provides helpers for serving static files, used in Pinax.

Notes: How to handle serving static media in your project is always a good way to fire up a discussion. Managing them in a Django reusable app even more so. This project exists to resolve all those headaches. Jannis Leidel created this project in reflex to these static media management woes the Pinax team dealt with. It's one of those projects I believe should be considered for a contrib app as it resolves a common issue every Django project will most likely run into.

Django-DbTemplates

Source:Django-DbTemplates

Description: Django template loader for database stored templates with extensible cache backend.

Notes: Yet another project created by Jannis Leidel. The name is self-explanatory -- DbTemplates allows you to create templates in your database instead of the the file system, which allows editing via the Django admin. DbTemplates also allows you to override existing templates on the file-system by creating a new Template record. The benefit here is that you can allow edit access to those users who should not have access to the server. The negative is that source control is lost. Leveraging Django-Reversion is the suggestion solution to solve that versioning issue. I guess you'll see that in Mingus 1.0 :)

Currently Mingus does not have this enabled in the TEMPLATE_LOADERS settings, but the application is installed with Mingus by default. I'll most likely change this in HEAD so it's enabled by default. To enable this yourself all you need to do is specify the TEMPLATE_LOADER. Below is an example:

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
    'dbtemplates.loader.load_template_source',
)

Django-Slimmer

Source:Django-Slimmer

Description: Html compression as middleware and view decorators.

Notes: Middleware that slims down your HTTPResponse by removing extra white-space. This module is a django conversion of CheckoutableTemplates Zope package. Related, David Cramer published a post Spaceless HTML in Django which details his solution using Django Middleware for a similar perforance enhancement. You'll note that in the comments some readers noted alternative solutions as well. So far Django-Slimmer hasn't introduced anything but great results.

Django-Cropper

Source:Django-Cropper

Description: Integration of jCrop with the Django admin.

Notes:Simon Willison initially released this nice little reusable to make image cropping in the admin easy. It's a terrific tool that allows you to easily crop images in the admin using JQuery and JQuery-Crop. I tried to integrate it with the Mingus project, and it worked well, but there were two issue I ran into so I forked it. First, Willison raised the issue I mentioned above regarding what to do with your static files when releasing a reusable app, "... no idea what I should do with the static file dependencies though.". The second was the location of the ImageField "uploads" parameter which I like to set, if possible, in my project's media/uploads/[projectname] directory. I forked the repo to include these changes. Willison noted that this project was not a complete project and it's even highlighted here. Maybe Chris Adams post Django: reliably saving URLs to a file field provides the answer?

Django-Request

Project site:Django-Request

Description: A statistics module for django. It stores requests in a database for admins to see, it can also be used to get statistics on who is online etc.

Notes: Created by Kyle Fuller, Django-Request is the one app I'm most concerned about including is also one of the kewlest. Django-request provides analytics on (you guessed it) any http request your application handles. It provides a lot of customization (I setup a few ignore rules that live in local_settings.py), and integrates Flot graphical plots. The "overview" view looks really amazing and is a great example on how you can customize the Django admin to fit your needs. The reason I'm concerned about using Django-Request is that it's database write intense, plus the overview page executes analytics on all your request records which unless kept tidy could become very expensive. But for a blog like mine, I'm not concerned just yet. To remove it all you need to do is comment out the middleware reference. It also provides a few management commands to dump old records. So, it's nice like that.

Update: Mingus and Django-Request have had a love/hate relationship. I'm mostly kidding here, but there have a been a few bumps in the road, all of which I've submitted patches (via my own fork) for or logged issues. Kyle has been terrific about getting the fixes in. If you're detailed you'll note that as of 0.9.5 I removed django-request from Mingus altogether. Then when 0.9.6 was announced we found another bug. So you'll see the updated migration SQL in the 0.9.7 tag. Anyway, it's a really interesting app that shows off some of the many cool things you can do with Django itself (management commands, admin customization, etc). So it's back in Mingus for your enjoyment. This is what happens though when you're running beta software -- It's part of the game. Thanks Kyle for your work, and thanks for those users who helped track down the bugs.

Django-Memcache-Status

Source:Django-Memcache-Status

Description: Django admin extension that displays statistics about your memcached instances.

Notes:Martin Mahner is the author of this project. He provides a perfect, concise README file that details exactly what this project provides, so go check that out since it has nice screenshots and all that jazz.

Django-Bitly

Source:

Description: A Django app that manages bit.ly links to local objects.

Notes: This is the app used by django-twitter (below) to create bit.ly short urls when posting to twitter (Mingus allows you to fire off a twitter message when publishing a new blog post). The project provides additional features as well, so make sure to check it out. The Discovery Creative team is the author.

Django-WYSIWYG

Source:Django-WYSIWYG

Description: A Django application for making Django textareas rich text editors. Certainly as a template tag and possibly as a form widget.

Notes:Daniel Greenfield is the author of this project. Because I'm a masochist I wanted to not only support Textile, Markdown, reStructureText, raw HTML, and TinyMCE so I added Django-WYSIWYG. By default the app renders the YUI WYSIWYG editor editor via the yahoo CDN. I've added the configuration settings to settings.py so it defaults CKEditor. If you'd like for it to render the YUI WYSIWYG editor then just remove the DJANGO_WYSIWYG settings from settings.py.

Django-TinyMCE

Source:Django-TinyMCE

Notes: The first request I received for a WYSIWYG editor was for TinyMCE. It's a very successful project, and has numerous extensions and customization features. Some people just love their TinyMCE so it was hard to ignore it even knowing that it's younger, sexier competitor (CKEditor) was already included with Django-WYSIWYG. Mingus provides the basic implementation only, and that's all it will ever support. There appears to be multiple authors, so thanks to all of them.

Django-Twitter

Source:Django-Twitter

Description: Twitter Django Integration.

Notes:Adam Miskiewicz is the author of this little utility app. I'm pretty sure he created it for a Mingus blog that has not yet launched. I'm itchin to see it though when it does. The application itself provides a model for adding your twitter auth via the Django admin and a signal for creating the bit.ly url for your object, and then the posting to twitter as well. Django-Twitter is tightly coupled to django-bitly and if you haven't set the required bit.ly settings values in your settings.py file then publishing tweets post publishing won't work. Also, now that I think of it (and I just checked this out to confirm) it will post a tweet regardless of whether your post is set to Public or not. So yea, there's that as well :/

As I'm writing this I can't allow myself to complete this post without fixing the above issue so I've gone and created 0.9.2 tag for a fix, which includes a new signal in basic.blog to handle the posting, and it also decouples the need for bit.ly configuration. If you don't set your bit.ly credentials in settings.py it will then revert to using Site.domain + get_absolute_url() of the instance itself. At this point I'm considering refactoring django-twitter out of the mix in a later Mingus version as it now feels more like a basic-twitter app could handle this and is better suited as an addition to basic apps. That being said, Adam did a great job getting the initial legwork done. Thanks adam.

Python-Twitter

Source:Python-Twitter

Description: A python wrapper around the Twitter API.

Notes: Used by django-twitter to post the tweets, of course. There appears to be multiple authors, so thanks to all of them.

South

Source:South

Description: Intelligent schema migrations for Django apps.

Notes: I removed South as a requirement, not added it. None of the apps used in Mingus use South as their default migration tool, if they provide any migrations at all. It's sad actually. It should be the defacto Django migration solution. Does anyone disagree?

What's next?

Well, before we can talk about 1.0 we need to discuss the near future, which includes supporting bug fixes and producing screencast tutorials. For now, those are the things I'm going to focus on. I'm thinking a "5 Days of Mingus" series, or something like that. For the near future, that's my goal. What is not next is adding anymore text editors to the project :)

What's up for 1.0?

  • mobile theme
  • docs site (more docs) reST/sphinx
  • more test/test runner
  • theme support (switching via admin)
  • template update/clean up css
  • project site
  • pylint/code quality
  • fabric/deploy helper
  • 1.2 support
  • A select few app additions that make sense (Django-Reversion, Django-DataTrans maybe, etc.)

How can you contribute?

Just keep forking baby... just keep forking. It's as simple as that. Fork, feature branch, test, merge, pull request. Repeat.

When will this all happen?

There will be no rush on pushing out a 1.0 release. Heck, if 1.0 were released by DjangoCon 2010 I'd be happy. I'm not ditching Mingus (it's the blog engine I use for my own personal site so I'm eating my own dog food), but as of recent my evenings and weekend schedule got plenty busy (new baby and home). It will be a "get to it when I can (or if others do)" type thing.

If you follow this project already you know I try very hard to resolve any issue that are filed as quickly as possible given my schedule. And I'll work with the rest of the contributors (who continue to develop on it) to progress the project as best as possible. Take a look at Mingus Network if you'd like to see who else is actively hacking on Mingus; there's some great stuff going on there.

With Mingus already being as feature rich as it probably will ever need to be, despite the few todo items listed above, the 1.0 release will be focused on stabilization, and proper project packaging.

Sites using Mingus today

One of the most motivating aspects of Mingus is seeing Mingus powered blogs go live in the wild. Below is a list of the blogs I'm aware of that are currently running Mingus (in no order). I'm sure I've missed a few. If so please comment with the URL of your Mingus powered blog:

Note: Additions to my original list:

Thanks to everyone who has launched a Mingus blog on their own. I hope it's been an enjoyable experience.

Thanks again

Finally, thanks to all those people who submitted issues, suggested ideas, committed code, evolved their own fork, etc. Your contributions in whatever form are greatly appreciated. I've added as many people as I could to the AUTHORS file that is packaged with Mingus. If you feel you were missed, just ping me and I'll make sure to add you. In the bigger picture of things I realize Mingus is an itsy, bitsy, tiny blip on the map but it's a fun project and I'm very happy to have passionate contributors and users of the project -- Django makes it easy doesn't it? Thanks again!