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 <jondyke...@gmail.com> 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-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.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
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