Source Code
app.py
from albatross import *
import addressbook
class App(SimpleSessionFileApp):
'''AddressBook Albatross application'''
def __init__(self, base_url = '/', base_dir = '.'):
# Initialise base class
SimpleSessionFileApp.__init__(
self,
base_url = base_url,
template_path = base_dir,
start_page = ListPage.name,
secret = '-=secret=-',
session_appid = 'AdressBook',
session_dir = base_dir + '/sessions')
# Register page(s)
for page_class in (ListPage,):
self.register_page(page_class.name, page_class())
class ListPage:
name = 'list'
def page_enter(self, ctx):
# Sort by last_name by default
ctx.default_session_var('_sort', 'last_name')
def page_process(self, ctx):
if ctx.req_equals('sort'):
# Store the sort attribute in the session var
ctx.locals._sort = ctx.locals.sort
elif ctx.req_equals('clear_filter'):
# Set the filter string to None
ctx.locals.filter_string = None
def page_display(self, ctx):
# Get the list of people, sorting and filtering as necessary
ctx.locals.people = addressbook.get_all(
sort=ctx.locals._sort,
filter=getattr(ctx.locals, 'filter_string', None))
ctx.run_template('list.html')
# Create an application instance
app = App()
list.html
<html>
<head>
<title>Address Book</title>
</head>
<body>
<p>Sorted by <al-value expr="_sort" /></p>
<p>
<al-form method="post">
<al-input type="text" name="filter_string" />
<al-input type="submit" name="filter" value="Filter" />
<al-input type="submit" name="clear_filter" value="Clear" />
</al-form>
</p>
<table>
<tr>
<th><al-a href="sort=first_name">First Name</al-a></th>
<th><al-a href="sort=last_name">Last Name</al-a></th>
<th><al-a href="sort=email">Email</al-a></th>
</tr>
<al-for iter="iter" expr="people">
<al-exec expr="person = iter.value()" />
<tr>
<td><al-value expr="person.first_name" /></td>
<td><al-value expr="person.last_name" /></td>
<td><al-value expr="person.email" /></td>
</tr>
</al-for>
</table>
</body>
</html>
addressbook.py
class Person:
'''A person'''
def __init__(self, id, first_name, last_name, email):
self.id = id
self.first_name = first_name
self.last_name = last_name
self.email = email
# List of people in the "database"
_people = [
Person(1, 'Michael', 'Neel', 'a@b.c'),
Person(2, 'Andrew', 'McNamara', 'd@e.f'),
Person(3, 'Dave', 'Cole', 'g@h.i'),
Person(4, 'Matt', 'Goodall', 'j@k.l'),
Person(5, 'Sheila', 'King', 'm@n.o'),
Person(6, 'Gregory', 'Bond', 'p@q.r'),
]
def get_all(sort=None, filter=None):
'''
Get all people in the addressbook that match the optional filter,
optionally sorting the list by attribute name.
'''
# Use the full list to start with
people = _people
# Filter the people list to remove any that do not match
if filter:
filter = filter.lower()
people = [person for person in people if matches_filter(person, filter)]
# Sort the remaining list by attribute name
if sort:
dsu = [(getattr(person, sort), person) for person in people]
dsu.sort()
dsu = [item[1] for item in dsu]
people = dsu
return people
def matches_filter(person, filter):
'''
Return 1 (True) if the filter text appears in any of the attributes
of person
'''
if person.first_name.lower().find(filter) != -1 or \
person.last_name.lower().find(filter) != -1 or \
person.email.lower().find(filter) != -1:
return 1
return 0