forms: add a review & pay page to the checkout form wizard.
forms: remove an unused variable in the AbstractAddress model
form wizard: fix the 'previous' and 'first' checkout wizard buttons

Since previously the buttons weren't actually part of the form nothing happened when you pressed on them.
install django-lazysignup

The lazy signup app comes with it's own set of south migrations, which caused be a little bit of trouble when installing.  The end result was that I had to reset the south tables and clear all pre-existing migrations.  When I re-did the migrations I added the comments app to south.
views: refactor the get_continue_shopping_url method

Thanks to the is_safe_url method it's no longer necessary to rebuild the url using the path and query params.
views: refactor the show_cart view (slightly)
views: extract a _process_update_cart_form method from the show_cart view.

I'm attempting to make the show_cart view a little easier to understand since I'll be having to add even more code to it in the future.
views: extract a _get_cart_errors method from the show_cart view.

I'm now running the cart error check during every get request in addition to the 'checkout' post request.
views: decorate the show_cart view with an allow_lazy_user decorator.

When a lazy user is created that will indicate that the user is checking out as a guest.  Next I'm going to remove the special /checkout/guest url and move guests and logged-in users through the same checkout process.
views: refactor the checkout view

I realized that using a built-in form wizard wasn't going to be flexible enough for my checkout process, so I rolled by own stepper.  There is still a lot of work to do in these views, but it's a start.

The form data isn't actually being saved in the session yet, so as it stands this implementation doesn't do much of anything.
checkout: prevent out-of-order access to checkout urls

Prevent the user from skipping ahead in the checkout process.  They can move back, but cannot move more than 1 step ahead of the last successfully finished step.

If their cart is empty they will always be re-directed to the cart page.

If they haven't officially 'started' the checkout process they will be redirected to the /checkout/ url.  This is the url where a lazy user is created (if necessary) and the data dict is initialized.
checkout: for now, do not clear checkout data after the last step completes.  If, when starting a checkout process we detect that the last checkout completed successfully, start a new one.
checkout: save the validated contact form info in the database.

If the contact info page is requested again, bind some initial values to the form fields.
checkout: save validated data from the shipping and billing forms

I'm not going to save any data from the payment info form since I believe this to be a security risk.
checkout: add some navigation links to my checkout process

When the user clicks on one of these navigation link any unsaved data in the current form is lost.  Data is only saved when the 'submit' button is pushed.
checkout: add names for the steps in the checkout process + add css.
checkout: remove the redundant navigation bar

I think it was a little too much to see this navigation repeated at the top and bottom of the page.
checkout: give each page in the process a title
checkout-navigation: add a green check-mark beside the steps that are complete.
templates: tweak the names of my checkout submit buttons.

I like having the word "Save" in the button because this suggests that the info entered in the form will not be saved if the user navigates away from the page (using the nag buttons on the top).  This is indeed how my checkout works.