[storm] python properties and storm properties...
Jamu Kakar
jamshed.kakar at canonical.com
Mon Mar 24 05:04:41 GMT 2008
Hi Jason,
Please CC the list when you respond to messages so that everyone can see
the complete thread.
Thanks,
J.
Jason R Briggs wrote:
> Thanks for that. I'd already come up with the former solution, but
> decided it wasn't the right answer since it then requires the column
> name to be changed -- thus the column is different from the actual
> property. Not a big deal, but I figured there might be a more elegant
> way. Your second solution might be the answer, thanks.
>
> Jamu Kakar wrote:
>> 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