Skip to content

Instantly share code, notes, and snippets.

@fitzgen
Created November 7, 2010 21:43
Show Gist options
  • Save fitzgen/666876 to your computer and use it in GitHub Desktop.
Save fitzgen/666876 to your computer and use it in GitHub Desktop.
from django import http
import operator
import pickle
def copy_pickleable(a, b):
for k, v in a.iteritems():
try:
pickle.dumps(v)
b[k] = v
except TypeError:
pass
def generator_view(gen):
def wrapped(request):
if gen.__name__ in request.session:
g = pickle.loads(request.session[gen.__name__])
else:
g = gen()
g.next()
mockreq = http.HttpRequest()
copy_pickleable(request.__dict__, mockreq.__dict__)
mockreq.POST = {}
copy_pickleable(request.POST, mockreq.POST)
mockreq.GET = {}
copy_pickleable(request.GET, mockreq.GET)
mockreq.META = {}
copy_pickleable(request.META, mockreq.META)
response = g.send(mockreq)
request.session[gen.__name__] = pickle.dumps(g)
return response
return wrapped
@generator_view
def calc():
request = (yield)
while True:
op = None
while not op:
request = yield http.HttpResponse("""
<form method="POST">
<p>Operator:</p>
<p><input type="radio" name="operator" value="add" /> Add</p>
<p><input type="radio" name="operator" value="sub" /> Subtract</p>
<p><input type="radio" name="operator" value="mul" /> Multiply</p>
<p><input type="radio" name="operator" value="div" /> Divide</p>
<input type="submit" />
</form>
""")
if request.method == "POST" and "operator" in request.POST:
op = getattr(operator, request.POST["operator"], None)
symbol = ({
operator.add: "+",
operator.sub: "-",
operator.div: "/",
operator.mul: "*"
}[op])
first = None
while not first:
request = yield http.HttpResponse("""
<form method="POST">
<p>First operand:</p>
<p><input type="text" name="first" /></p>
<input type="submit" />
</form>
""")
if request.method == "POST":
try:
first = int(request.POST["first"])
except ValueError:
pass
second = None
while not second:
request = yield http.HttpResponse("""
<form method="POST">
<p>Second operand:</p>
<p><input type="text" name="second" /></p>
<input type="submit" />
</form>
""")
if request.method == "POST":
try:
second = int(request.POST["second"])
except ValueError:
pass
request = yield http.HttpResponse("""
<p>%(first)s %(symbol)s %(second)s = %(result)s</p>
<p><a href=".">Back</a></p>
""" % {
"first": first,
"second": second,
"result": op(first, second),
"symbol": symbol
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment