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#implementing-descriptors
[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.__setattr__



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