[storm] python properties and storm properties...

Jamu Kakar jamshed.kakar at canonical.com
Sun Mar 23 19:54:15 GMT 2008


Hi Jason,

Jason R Briggs wrote:
 > This might be a bit of a dumb question, but I have to admit I'm
 > struggling to find the right answer.

The only dumb question is the one you don't ask. :)

 > Is there a way to use a Storm property in a similar way to a python
 > property?  For example, in a normal class I can define a setter and
 > getter and then a property which uses those methods:
 >
 > def set_password(self, password):
 >     self._password = encrypt_password(self.username, password)
 >
 > def get_password(self):
 >     return self._password
 >
 > password = property(get_password, set_password)
 >
 > Can I do something similar with a storm property?

You can do this:

class Person(Storm):

     __storm_table__ = "person"

     id = Int(primary=True)
     password_hash = RawStr(allow_none=False)

     def set_password(self, password):
         self.password_hash = encrypt_password(self.username, password)

     def get_password(self):
         return self.password_hash

     password = property(get_password, set_password)

Another option is to create a custom property to do what you want
(useful if you need the behaviour in more than one place and don't
want to repeat the set/get property boilerplate):

from storm.variables import RawStrVariable
from storm.properties import SimpleProperty

class PasswordVariable(RawStrVariable):

     def parse_set(self, value, from_db):
         return super(PasswordVariable, 
self).parse_set(encrypt_password(value),
                                                        from_db)

class Password(SimpleProperty):

     variable_class = PasswordVariable

And then do:

class Person(Storm):

     __storm_table__ = "person"

     id = Int(primary=True)
     password = Password(allow_none=False)

I haven't tested either of these solutions, but I believe they will
both work.

Thanks,
J.



More information about the storm mailing list