Thank you

I like this concept and will try to do it this way.

Thanks for the input.

/Carsten

On May 25, 12:05 pm, bruno desthuilliers
<bruno.desthuilli...@gmail.com> wrote:
> On May 24, 11:00 pm, Carsten Jantzen <cars...@jantzens.net> wrote:
>
>
>
> > Not sure what you mean by detecting skill change using properties, I
> > havn't looked into that.
> > Could you point to some documentation about it.
>
> Python has a strong support for computed attributes[1], and offers a
> builtin "property" type for the most common use cases[2]. This let you
> turn a plain attribute into a computed one (using a getter/setter
> pair) without breaking client code. What I had in ming was to turn
> your "skill" fields into computed attributes (using either properties
> or a custom descriptor) to track change.
>
> Now having looked at django-audit implementation (http://
> code.google.com/p/django-audit/), I think their approach using the
> __setattr__ hook[3] would be better here. Here's a very Q&D and naïve
> implementation example:
>
> import datetime
>
> class SkillChange(models.Model):
>     player = models.ForeignKey(Player)
>     skill = models.CharField()
>     value = models.IntegerField()
>     date = models.DatetimeField()
>
> class Player(models.Model):
>    # your fields definitions here
>    skill_x = models.IntegerField()
>    skill_y = models.IntegerField()
>
>    # which fields we want to track
>    _tracked_fields = ['skill_x', 'skill_y']
>
>    def __init__(self, *args, **kw):
>        super(Player, self).__init__(*args, **kw)
>        self._changed = {}
>
>   def __setattr__(self, attr, value)
>       if attr in self._tracked_fields:
>           old_val = getattr(self, attr, None)
>           if old_val != value:
>              self._changed[attr] = value
>       super(Player, self).__setattr__(attr, value)
>
>   def save(self, *args, **kw):
>       super(Player, self).save(*args, **kw)
>       now = datetime.datetime.now()
>       for skill, value in self._changed.items():
>           SkillChange.objects.create(
>               player=self,
>               skill=skill,
>               value=value,
>               date=now
>               )
>       self._changed = {}
>
> Untested code, of course, it's just meant as a (possible) proof of
> concept. You'll probably have to deal with a few special cases like
> what happens when creating a new Player instance etc
>
> HTH
>
> [1]http://docs.python.org/release/2.6.7/reference/datamodel.html#impleme...
> [2]http://docs.python.org/release/2.6.7/library/functions.html#property
> [3]http://docs.python.org/release/2.6.7/reference/datamodel.html#object....

-- 
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