I agree that is people would normally use the feature. And that's a matter of deleting older archived records. What I am not sure is if it should be built-in into web2py.
If would be easy to do db(db.table_archive).delete() which event should trigger it? perhaps this is one of those actions should be called explicitly and not done automatically. On Tuesday, 10 April 2012 09:22:44 UTC-5, Richard wrote: > > Hi, > > It looks like a great new feature... I would suggest something. Instead of > copying every update, I would keep the records only once the it gets in a > particular state. In my case a records could have no review, can be > reviewed and approved, so I just want to keep the changes that occured once > the records have been reviewed. Before that it is only noise to me. I mean > if the records don't need a review process I don't need the audit trail and > if it needs a review or an approval I only need to audit the change after > it has been review once what happen before I don't care. I think it is a > really good trade off between size of the database and an audit trail > feature. But it means that you have to build a reviewing process feature... > It could be option maybe, I mean audit all vs audit after get the state > review. > > Thanks for this Massimo any way our lives can't be easier without you :) > > Richard > > On Tue, Apr 10, 2012 at 9:33 AM, Massimo Di Pierro < > massimo.dipie...@gmail.com> wrote: > >> Actually I was wrong. this is not the problem. Web2py does the right >> thing. Is there any way you can look into the mysql logs what is the sql >> string that causes the problem? >> >> >> On Tuesday, 10 April 2012 08:23:03 UTC-5, Massimo Di Pierro wrote: >>> >>> I figured this out. The table has a self reference and web2py inserts a >>> zero in it instead of NULL. Works for sqlite but not MySQL. >>> Changing zero with NULL may be treated as a bug fix it will constitute a >>> minor change of backward compatibility in case you incorrectly do >>> >>> db(db.table.reference_field==**0).select() >>> >>> while the correct thing to do would be >>> >>> db(~(db.table.reference_field>**0)).select() >>> >>> I will try fix it and then will ask for comments. >>> >>> On Monday, 9 April 2012 18:29:10 UTC-5, tomt wrote: >>>> >>>> I have declared the table in db.py with auth.signature, and uncommented >>>> auth.enable_record_versioning(**db), but the _archive table isn't >>>> created. >>>> - Tom >>>> >>>> On Monday, April 9, 2012 8:33:18 AM UTC-6, Massimo Di Pierro wrote: >>>>> >>>>> 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? >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >