Skip to content

Instantly share code, notes, and snippets.

@Apkawa
Created November 24, 2011 09:33
Show Gist options
  • Save Apkawa/1390967 to your computer and use it in GitHub Desktop.
Save Apkawa/1390967 to your computer and use it in GitHub Desktop.
Set many views as wizard
import wizard
order_wizard = wizard.Wizard('order_wizard)
@order_wizard.register(step=1, url='/basket/')
def basket(request):
...
@order_wizard.register(step=2, url='/step_1/')
def step_1(request):
...
@order_wizard.register(step=3, url='/step_2/')
def step_2(request):
...
@order_wizard.register(step=4, url=None)
def finish(request):
...
# -*- coding: utf-8 -*-
from django.shortcuts import redirect
from django.utils.functional import wraps
class Wizard(object):
def __init__(self, prefix='wizard'):
self.prefix = prefix
self.step_map = {}
def get_step(self, request):
return request.session.get(self.prefix, 1)
def set_step(self, request, step):
request.session[self.prefix] = step
def validate_step(self, old_step, new_step):
if old_step >= new_step:
return True
if old_step < new_step and (old_step + 1 == new_step):
return True
return False
def register(self, step=1, step_url=None):
self.step_map[step] = step_url
def decorator(func):
@wraps(func)
def wrapper(request, *args, **kwargs):
if self.validate_step(self.get_step(request), step):
result = func(request, *args, **kwargs)
self.set_step(request, step)
return result
return redirect(self.step_map[self.get_step(request)])
return wrapper
return decorator
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment