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('bursary', requires=IS_IN_SET(['Free school meals','Bursary','Disabled'])),
Field('notes', type='text'),
format='%(studentId)s'
)
db.define_table('bursary_entries',
Field('barcode', 'reference bursary_users', requires = [IS_IN_DB(db, 'bursary_users.barcode')]),
Field('entry_date', type='datetime', default=request.now, readable=False, writable=False),
format='%(barcode)s'
)
type='string', requires=IS_IN_DB(db,'bursary_users.barcode')
If you want to have strict DB-constraints, you can:
db.define_table('barcode',
Field('code', type='string', unique=True, notnull=True), # consider just 'code', not 'barcode' - it's necessary to prevent possible hard-to-catch bugs during SQLFORMs processing
format='%(code)s'
)
db.define_table('bursary_users',
...
Field('barcode', type='reference barcode', notnull=True, unique=True),
...)
db.define_table('bursary_entries',
db.bursary_users.barcode.clone(), # - .clone() is undocumented, but why?
Field('entry_date', type='datetime', default=request.now, readable=False, writable=False),
format='%(barcode)s'
)
#be careful - above code could break your existing db-tables
# this solution require additional logic to process insert in bursary_users, look for One form for multiple tables
def new_user():
#this would be invoked before insert in db.bursary_users
def reg_bar_code(form):
new_code = form.vars.pop('code', None) #get user input for db.barcode.code
#any additional logic goes here
form.vars.barcode = db.barcode.insert(code = new_code) # returns id of new_code
# so, form.vars.barcode would be used to insert in db.bursary_users.barcode
db.bursary_users.barcode.writable = False
db.barcode.code.label = 'barcode' #
form=SQFORM.factory(db.barcode, db.bursary_users)
if form.process(onvalidation = reg_bar_code).accepted:
db.bursary_users.insert(**db.bursary_users._filter_fields(form.vars)) ....