db.define_table('bursary_users',
                Field('forename', type='string', requires=IS_NOT_EMPTY()),
                Field('surname', type='string', requires=IS_NOT_EMPTY()),
                Field('studentId', type='string', requires=IS_NOT_EMPTY(), unique=True),
                Field('barcode', type='string', requires=IS_NOT_EMPTY(), unique=True),
                Field('email', type='string', requires=IS_EMAIL(), unique=True),
                Field('is_testuser', 'boolean'),
                format='%(studentId)s'
)
db.define_table('bursary_entries',
                Field('barcode', type='string', requires=[IS_IN_DB(db, 'bursary_users.barcode')]),
                Field('entry_time', type='datetime', default=request.now, readable=True, writable=False),
                Field('entry_location', type='string', readable=True, writable=False, requires=[IS_IN_DB(db, 'bursary_locations.bursary_location')]),
                Field('bursary_at_time', type='string', readable=True, writable=False, requires=[IS_IN_DB(db, 'bursary_users.bursary')]),
                format='%(barcode)s'
)grid = SQLFORM.grid(query,
                            create=False,
                            editable=False,
                            deletable=False,
                            details=False,
                            paginate=50,
                            fields=[
                                    db.bursary_entries.barcode,
                                    db.bursary_entries.entry_time,
                                    db.bursary_entries.entry_location
                                  ],
                            links=[
                                    dict(header='Forename', body=lambda row: db(db.bursary_users.barcode==row.barcode).select().first().forename),
                                    dict(header='Surname', body=lambda row: db(db.bursary_users.barcode==row.barcode).select().first().surname),
                                    dict(header='Email', body=lambda row: db(db.bursary_users.barcode==row.barcode).select().first().email)
                                                  ])