Cal

Great post; I think you summed up my feelings about django-reversion as 
well, although articulated extremely clearly.

If CuteModel (where does that name come from??) can address the issue of 
reverting a change to a record (or, even better, all changes made at one 
time to a record), then I think it will be a great alternative option for 
many folk.

Cheers,
Derek

On Tuesday, 11 September 2012 21:11:06 UTC+2, Cal Leeming [Simplicity Media 
Ltd] wrote:
>
> Thanks for letting me know about django-reversion, it has made for 
> interesting reading.
>
> From what I can see there are two big differences between them;
>
> * CuteModel is designed with performance/scalability in mind (as some of 
> our projects are tipping into the 700+mil row count and rising)
> * CuteModel is designed to be as simple and easy as possible - where as 
> django-reversion left me feeling a bit confused.
>
> Looking at django-reversion, it certainly looks close to cutemodel, but 
> there are a few differences;
>
> * Changes are serialized into the database, this adds a significant extra 
> size and CPU overhead (Version.serialized_data)
> * Object references are stored as a TextField, this is not good for 
> performance (Version.object_id)
> * Creates a new serialized object every time a row is added - this is 
> really really not good for performance(*.VERSION_ADD)
> * Requires an additional model for every model you have if you want to 
> store custom meta data (cutemodel only requires 1)
> * Uses signal rather than overriding the subclass - although this is 
> probably a better approach - thoughts anyone??
> * In some ways the API is quite nice, but in others it seems a bit clunky.
> * Requires you to create initial revisions dump - again, not good if you 
> have a lot of rows
>
> That being said - there are definitely some good points from that app, and 
> a lot of features that would be great for CuteModel, such as;
>
> * Grouping together field changes into a 'revision'
> * Better low level API support
> * Ability to revert a change
>
> I'm certainly going to add those into the todos list - thanks for your 
> feedback!
>
> Cal
>
> On Tue, Sep 11, 2012 at 2:46 PM, jondykeman <jondy...@gmail.com<javascript:>
> > wrote:
>
>> Hello,
>>
>> I am in a very similar situation. I would in an environment that deals 
>> with sensitive data collection. Everything has to be two-factor 
>> authenticated, in the secure server zone etc. As part of this we need 
>> logging of every action ever taken, by whom, when, and what the changes 
>> were.
>>
>> At first I implemented my own custom solution which was less than ideal, 
>> but it worked. That was a model of creating a new record for each field any 
>> time there was a change to the value, but via a lot of manual checking 
>> code. 
>>
>> I am not starting to migrate to a slicker solution. I am taking advantage 
>> of django-reversion.
>>
>> https://github.com/etianen/django-reversion
>>
>> This provides row level auditing out of the box, and then you just need 
>> to take advantage of the pre_commit_signal to track field changes as well.
>>
>> @receiver(reversion.pre_revision_commit)
>> def it_worked(sender, **kwargs):
>> currentVersion = kwargs.pop('versions')[0].field_dict
>> pastVersion = 
>> reversion.get_for_object(kwargs.pop('instances')[0])[0].field_dict
>>  changes = set(currentVersion.items()) - set(pastVersion.items())
>> changedVars = []
>> for var in changes:
>>  changedVars.append(var[0])
>> comment = "Changed: %s" % ", ".join(changedVars)
>> revision = kwargs.pop('revision')
>>  revision.comment = comment
>> revision.save()
>> kwargs['revision'] = revision
>>
>> Rather than the string tracking which fields I am going to switch to a 
>> dict of changed or not for each variable.
>>
>> I will check out cutemodel for sure and let you know.
>>
>> Thanks,
>>
>> JD
>>
>>
>> On Tuesday, September 11, 2012 3:46:54 AM UTC-6, Cal Leeming [Simplicity 
>> Media Ltd] wrote:
>>>
>>>
>>>
>>> On Mon, Sep 10, 2012 at 11:07 PM, Kurt Pruhs <kpr...@gmail.com> wrote:
>>>
>>>> Hey Cal,
>>>>
>>>> This looks like a great tool. I know I've implemented code like this in 
>>>> another project. I was planning on doing a field change audit module for 
>>>> an 
>>>> application I'm currently working on. I will definitely look at 
>>>> django-cutemodel and see if it works for what I need, and how I can 
>>>> contribute. 
>>>> My current project is a time clock system for human resources to manage 
>>>> hourly workers. We need field change auditing for security, we need the 
>>>> ability to produce reports from it, and ability to restore from audit 
>>>> history (in case of record tampering). 
>>>
>>>
>>> I think django-cutemodel would be a pretty good fit for this 
>>> requirement, although it doesn't yet have any sort of administration 
>>> interface to produce reports, and the documentation isn't exactly great.
>>>
>>> Restore from audit history functionality is something we need for 
>>> ourselves too, so I've raised an issue (will prob fix that sometime this 
>>> week);
>>> https://github.com/foxx/**django-cutemodel/issues/1<https://github.com/foxx/django-cutemodel/issues/1>
>>>  
>>>
>>> We also need to have the ability to bind the Django User objects 
>>> together with the event/field change - but some of our clients don't use 
>>> the Django built-in user/auth stuff - so I need to have a little think 
>>> about how to satisfy both.
>>> https://github.com/foxx/**django-cutemodel/issues/2<https://github.com/foxx/django-cutemodel/issues/2>
>>>  
>>>
>>> Basically, all actions are logged and nothing is deleted or 
>>>> over-written. When changes are made, the original record is marked as a 
>>>> parent archive. The modified record is a dup of the parent, but with the 
>>>> changes. 
>>>>
>>>
>>> The approach of duplicating the row individually could work in some 
>>> cases, but if there was any unique index constraints then I'm guessing the 
>>> rows would have to be moved into a different table. If this were the case, 
>>> you'd need twice the amount of tables, which in itself may be undesirable, 
>>> plus another which stores the change relationships, plus any changes would 
>>> have to be done twice.
>>>
>>> Instead, django-cutemodel doesn't require a sub-table for every model, 
>>> and the tables don't need to be modified if one of your models changes - it 
>>> has the following;
>>>
>>> - table map (stores unique table names) - allows for super fast lookup 
>>> instead of full text scan
>>> - model map (stores unique model + app + db names) - allows for super 
>>> fast lookup instead of full text scan
>>> - fieldchange (stores fieldname+old/new value, target model+pk, and 
>>> timestamp)
>>> - event (stores event message, log level, target model+pk and timestamp)
>>>
>>>
>>>> Anyway, I'm rambling. If you would like to chat about this let me know. 
>>>> I will update this group, or contact you when I start working on the 
>>>> change 
>>>> audit code
>>>>
>>>
>>> Sure thing, if you think of any additional changes please feel free to 
>>> fire them over (it'd be great to see others using this in the wild!)
>>>  
>>>
>>>>  
>>>> Kurt Pruhs
>>>> Utah State University
>>>> Programing & Design Team
>>>>
>>>>
>>>>
>>>>
>>>> On Monday, September 10, 2012 1:43:17 PM UTC-6, Cal Leeming [Simplicity 
>>>> Media Ltd] wrote:
>>>>>
>>>>> Hi guys,
>>>>>
>>>>> We have just released a new module that allows for lightweight/easy 
>>>>> relational event logging and auditing field changes.
>>>>>
>>>>> Our use case was to satisfy four main requirements;
>>>>>
>>>>> * Log events directly from models, whilst keeping a relational link to 
>>>>> the row that triggered the event
>>>>> * Keep track of field changes (storing the old/new value).
>>>>> * Provide a scalable/easy to use API that allowed access to this 
>>>>> information
>>>>> * Ensure module was a drop-in replacement (only change required is to 
>>>>> subclass CuteModel)
>>>>>
>>>>> The code itself has been dragged out of our existing projects, cleaned 
>>>>> up slightly, and released as open source.
>>>>>
>>>>> Full documentation and source code has been made available here:
>>>>> https://github.com/foxx/**django**-cutemodel<https://github.com/foxx/django-cutemodel>
>>>>>  
>>>>>
>>>>> Particular care has been made to ensure the code is able to scale up 
>>>>> to many millions of rows, and we have not yet had any issues.
>>>>>
>>>>> In future, we'd love to add some extra features and do a bit more tidy 
>>>>> up - so any testing/feedback/features suggestions/comments would be 
>>>>> appreciated.
>>>>>
>>>>> Cheers
>>>>>
>>>>> Cal
>>>>>
>>>>  -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "Django users" group.
>>>> To view this discussion on the web visit https://groups.google.com/d/**
>>>> msg/django-users/-/**OQzlNQjqtbYJ<https://groups.google.com/d/msg/django-users/-/OQzlNQjqtbYJ>
>>>> .
>>>> To post to this group, send email to django...@googlegroups.com.
>>>> To unsubscribe from this group, send email to django-users...@**
>>>> googlegroups.com.
>>>>
>>>> For more options, visit this group at http://groups.google.com/**
>>>> group/django-users?hl=en<http://groups.google.com/group/django-users?hl=en>
>>>> .
>>>>
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Django users" group.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msg/django-users/-/ZZF9MuCal70J.
>>
>> To post to this group, send email to django...@googlegroups.com<javascript:>
>> .
>> To unsubscribe from this group, send email to 
>> django-users...@googlegroups.com <javascript:>.
>> For more options, visit this group at 
>> http://groups.google.com/group/django-users?hl=en.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/django-users/-/csvT01soOo8J.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to