the signature=True only adds a signature to the auth_* tables so that if a user creates an account for another user or creates a group, you can keep track of who did it.
The mything_archive table should be created by: auth.enable_record_versioning(db) This should be called after the mything table is defined. Does it work? On Sunday, 8 April 2012 22:08:47 UTC-5, tomt wrote: > > Hi, > Thanks for your response. I deleted the database as you suggested and > changed signature=False. The problem did go away and I was able to add > users without the error. > I then reverted to signature=True. While subsequent modifications did > show the signature, the 'mything_archive' was never created. > > - Tom > > On Sunday, April 8, 2012 9:04:14 AM UTC-6, Massimo Di Pierro wrote: >> >> Can you try again with mysql, delete the database and replace: >> >> auth.define_tables(signature=True) >> with >> auth.define_tables(signature=False) >> >> Does the problem does away? It looks like it does not like the self >> reference in auth_user. >> >> On Saturday, 7 April 2012 22:09:31 UTC-5, tomt wrote: >>> >>> Hi, >>> >>> I tried using your new versioning feature in trunk. >>> I created an app using a mysql database: >>> db = DAL('mysql://version:version@localhost/version') >>> When I used the admin function to define a new user >>> I received the following error: >>> ........................................ >>> <class 'gluon.contrib.pymysql.err.IntegrityError'> >>> (1452, u'Cannot add or update a child row: a foreign key constraint >>> fails >>> (`version/auth_user`, CONSTRAINT `auth_user_ibfk_1` >>> FOREIGN KEY (`created_by`) REFERENCES `auth_user` (`id`) ON DELETE >>> CASCADE)') >>> ........................................ >>> >>> I rebuilt the app to use sqlite instead of mysql: >>> db = DAL('sqlite://storage.sqlite') >>> >>> I was then able to add a user without the error >>> >>> I was using MySQL client version: 5.0.84 >>> >>> - any suggestions? - Tom >>> >>> On Thursday, April 5, 2012 4:16:04 PM UTC-6, Massimo Di Pierro wrote: >>>> >>>> This is how it works: >>>> >>>> # define auth >>>> auth = Auth(db, hmac_key=Auth.get_or_create_key()) >>>> auth.define_tables(username=True,signature=True) >>>> >>>> # define your own tables like >>>> db.define_table('mything',Field('name'),auth.signature) >>>> >>>> # than do: >>>> auth.enable_record_versioning(db) >>>> >>>> how does it work? every table, including auth_user will have an >>>> auth.signature including created_by, created_on, modified_by, modified_on, >>>> is_active fields. When a record of table mything (or any other table) is >>>> modified, a copy of the previous record is copied into mything_archive >>>> which references the current record. When a record is deleted, it is not >>>> actually deleted but is_active is set to False, all records with >>>> is_active==False are filtered out in searches except in appadmin. >>>> >>>> Pros: >>>> - your app will get full record archival for auditing purposes >>>> - could not be simpler. nothing else to do. Try with >>>> SQLFORM.grid(db.mything) for example. >>>> - does not break references and there is no need for uuids >>>> - does not slow down searches because archive is done in separate >>>> archive tables >>>> >>>> Cons: >>>> - uses lots of extra memory because every version of a record is stored >>>> (it would be more efficient to store changes only but that would make more >>>> difficult to do auditing). >>>> - slows down db(...).update(...) for multi record because it needs to >>>> copy all records needing update from the original table to the archive >>>> table. This requires selecting all the records. >>>> >>>> Comments? Suggestions? >>>> >>>> >>>> >>>> >>>> >>>> >>>>