import string
from twisted.application import service, strports
from nevow import appserver, inevow, rend, tags as T, loaders
class ResultsPage(rend.Page):
docFactory = loaders.xmlstr("""
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns:n="http://nevow.com/ns/nevow/0.1">
<body>
<form action=".">
<table border="1">
<thead>
<tr>
<th>Number</th>
<th>Letter</th>
</tr>
</thead>
<tfoot>
<tr>
<td colspan="2">
Showing <select
n:render="itemsPerPageOptions"
name="itemsPerPage"
onchange="this.form.submit();" /> items per page
</td>
</tr>
</tfoot>
<tbody n:render="sequence" n:data="alphabet">
<tr n:pattern="item" n:render="mapping">
<td><n:slot name="index" /></td>
<td><n:slot name="letter" /></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
""")
itemsPerPageChoices = range(10, 60, 10)
def beforeRender(self, ctx):
sess = inevow.ISession(ctx)
if not hasattr(sess, 'pagerPrefs'):
sess.pagerPrefs = dict(itemsPerPage = self.itemsPerPageChoices[0])
try:
itemsPerPage = abs(int(ctx.arg('itemsPerPage', 0)))
except ValueError: #when the submitted value can't be converted to int
itemsPerPage = 0
if itemsPerPage > 0 and itemsPerPage in self.itemsPerPageChoices:
sess.pagerPrefs['itemsPerPage'] = itemsPerPage
def render_itemsPerPageOptions(self, ctx, data):
options = [T.option(value=i)[i] for i in self.itemsPerPageChoices]
default = inevow.ISession(ctx).pagerPrefs.get('itemsPerPage')
#extract the default option tag and set it's selected attribute
options[self.itemsPerPageChoices.index(default)](selected="selected")
return ctx.tag.clear()[options]
def data_alphabet(self, ctx, name):
alphabet = string.ascii_lowercase
#a dummy dataset, in real life this might come from a DB.
data = [dict(index=i, letter=alphabet[i]) for i in range(len(alphabet))]
return data[:inevow.ISession(ctx).pagerPrefs.get('itemsPerPage')]
application = service.Application("items per page")
strports.service("8080", appserver.NevowSite(ResultsPage())).setServiceParent(application)