Index: boto/sdb/persist/property.py |
diff --git a/boto/sdb/persist/property.py b/boto/sdb/persist/property.py |
deleted file mode 100644 |
index 4776d35d6d73c3876fbe1db8ba13bd29a44dcdeb..0000000000000000000000000000000000000000 |
--- a/boto/sdb/persist/property.py |
+++ /dev/null |
@@ -1,371 +0,0 @@ |
-# Copyright (c) 2006,2007,2008 Mitch Garnaat http://garnaat.org/ |
-# |
-# Permission is hereby granted, free of charge, to any person obtaining a |
-# copy of this software and associated documentation files (the |
-# "Software"), to deal in the Software without restriction, including |
-# without limitation the rights to use, copy, modify, merge, publish, dis- |
-# tribute, sublicense, and/or sell copies of the Software, and to permit |
-# persons to whom the Software is furnished to do so, subject to the fol- |
-# lowing conditions: |
-# |
-# The above copyright notice and this permission notice shall be included |
-# in all copies or substantial portions of the Software. |
-# |
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
-# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- |
-# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT |
-# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
-# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
-# IN THE SOFTWARE. |
- |
-from boto.exception import SDBPersistenceError |
-from boto.sdb.persist.checker import StringChecker, PasswordChecker, IntegerChecker, BooleanChecker |
-from boto.sdb.persist.checker import DateTimeChecker, ObjectChecker, S3KeyChecker, S3BucketChecker |
-from boto.utils import Password |
- |
-class Property(object): |
- |
- def __init__(self, checker_class, **params): |
- self.name = '' |
- self.checker = checker_class(**params) |
- self.slot_name = '__' |
- |
- def set_name(self, name): |
- self.name = name |
- self.slot_name = '__' + self.name |
- |
-class ScalarProperty(Property): |
- |
- def save(self, obj): |
- domain = obj._manager.domain |
- domain.put_attributes(obj.id, {self.name : self.to_string(obj)}, replace=True) |
- |
- def to_string(self, obj): |
- return self.checker.to_string(getattr(obj, self.name)) |
- |
- def load(self, obj): |
- domain = obj._manager.domain |
- a = domain.get_attributes(obj.id, self.name) |
- # try to get the attribute value from SDB |
- if self.name in a: |
- value = self.checker.from_string(a[self.name], obj) |
- setattr(obj, self.slot_name, value) |
- # if it's not there, set the value to the default value |
- else: |
- self.__set__(obj, self.checker.default) |
- |
- def __get__(self, obj, objtype): |
- if obj: |
- try: |
- value = getattr(obj, self.slot_name) |
- except AttributeError: |
- if obj._auto_update: |
- self.load(obj) |
- value = getattr(obj, self.slot_name) |
- else: |
- value = self.checker.default |
- setattr(obj, self.slot_name, self.checker.default) |
- return value |
- |
- def __set__(self, obj, value): |
- self.checker.check(value) |
- try: |
- old_value = getattr(obj, self.slot_name) |
- except: |
- old_value = self.checker.default |
- setattr(obj, self.slot_name, value) |
- if obj._auto_update: |
- try: |
- self.save(obj) |
- except: |
- setattr(obj, self.slot_name, old_value) |
- raise |
- |
-class StringProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- ScalarProperty.__init__(self, StringChecker, **params) |
- |
-class PasswordProperty(ScalarProperty): |
- """ |
- Hashed password |
- """ |
- |
- def __init__(self, **params): |
- ScalarProperty.__init__(self, PasswordChecker, **params) |
- |
- def __set__(self, obj, value): |
- p = Password() |
- p.set(value) |
- ScalarProperty.__set__(self, obj, p) |
- |
- def __get__(self, obj, objtype): |
- return Password(ScalarProperty.__get__(self, obj, objtype)) |
- |
-class SmallPositiveIntegerProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'small' |
- params['signed'] = False |
- ScalarProperty.__init__(self, IntegerChecker, **params) |
- |
-class SmallIntegerProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'small' |
- params['signed'] = True |
- ScalarProperty.__init__(self, IntegerChecker, **params) |
- |
-class PositiveIntegerProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'medium' |
- params['signed'] = False |
- ScalarProperty.__init__(self, IntegerChecker, **params) |
- |
-class IntegerProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'medium' |
- params['signed'] = True |
- ScalarProperty.__init__(self, IntegerChecker, **params) |
- |
-class LargePositiveIntegerProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'large' |
- params['signed'] = False |
- ScalarProperty.__init__(self, IntegerChecker, **params) |
- |
-class LargeIntegerProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'large' |
- params['signed'] = True |
- ScalarProperty.__init__(self, IntegerChecker, **params) |
- |
-class BooleanProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- ScalarProperty.__init__(self, BooleanChecker, **params) |
- |
-class DateTimeProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- ScalarProperty.__init__(self, DateTimeChecker, **params) |
- |
-class ObjectProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- ScalarProperty.__init__(self, ObjectChecker, **params) |
- |
-class S3KeyProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- ScalarProperty.__init__(self, S3KeyChecker, **params) |
- |
- def __set__(self, obj, value): |
- self.checker.check(value) |
- try: |
- old_value = getattr(obj, self.slot_name) |
- except: |
- old_value = self.checker.default |
- if isinstance(value, str): |
- value = self.checker.from_string(value, obj) |
- setattr(obj, self.slot_name, value) |
- if obj._auto_update: |
- try: |
- self.save(obj) |
- except: |
- setattr(obj, self.slot_name, old_value) |
- raise |
- |
-class S3BucketProperty(ScalarProperty): |
- |
- def __init__(self, **params): |
- ScalarProperty.__init__(self, S3BucketChecker, **params) |
- |
- def __set__(self, obj, value): |
- self.checker.check(value) |
- try: |
- old_value = getattr(obj, self.slot_name) |
- except: |
- old_value = self.checker.default |
- if isinstance(value, str): |
- value = self.checker.from_string(value, obj) |
- setattr(obj, self.slot_name, value) |
- if obj._auto_update: |
- try: |
- self.save(obj) |
- except: |
- setattr(obj, self.slot_name, old_value) |
- raise |
- |
-class MultiValueProperty(Property): |
- |
- def __init__(self, checker_class, **params): |
- Property.__init__(self, checker_class, **params) |
- |
- def __get__(self, obj, objtype): |
- if obj: |
- try: |
- value = getattr(obj, self.slot_name) |
- except AttributeError: |
- if obj._auto_update: |
- self.load(obj) |
- value = getattr(obj, self.slot_name) |
- else: |
- value = MultiValue(self, obj, []) |
- setattr(obj, self.slot_name, value) |
- return value |
- |
- def load(self, obj): |
- if obj != None: |
- _list = [] |
- domain = obj._manager.domain |
- a = domain.get_attributes(obj.id, self.name) |
- if self.name in a: |
- lst = a[self.name] |
- if not isinstance(lst, list): |
- lst = [lst] |
- for value in lst: |
- value = self.checker.from_string(value, obj) |
- _list.append(value) |
- setattr(obj, self.slot_name, MultiValue(self, obj, _list)) |
- |
- def __set__(self, obj, value): |
- if not isinstance(value, list): |
- raise SDBPersistenceError('Value must be a list') |
- setattr(obj, self.slot_name, MultiValue(self, obj, value)) |
- str_list = self.to_string(obj) |
- domain = obj._manager.domain |
- if obj._auto_update: |
- if len(str_list) == 1: |
- domain.put_attributes(obj.id, {self.name : str_list[0]}, replace=True) |
- else: |
- try: |
- self.__delete__(obj) |
- except: |
- pass |
- domain.put_attributes(obj.id, {self.name : str_list}, replace=True) |
- setattr(obj, self.slot_name, MultiValue(self, obj, value)) |
- |
- def __delete__(self, obj): |
- if obj._auto_update: |
- domain = obj._manager.domain |
- domain.delete_attributes(obj.id, [self.name]) |
- setattr(obj, self.slot_name, MultiValue(self, obj, [])) |
- |
- def to_string(self, obj): |
- str_list = [] |
- for value in self.__get__(obj, type(obj)): |
- str_list.append(self.checker.to_string(value)) |
- return str_list |
- |
-class StringListProperty(MultiValueProperty): |
- |
- def __init__(self, **params): |
- MultiValueProperty.__init__(self, StringChecker, **params) |
- |
-class SmallIntegerListProperty(MultiValueProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'small' |
- params['signed'] = True |
- MultiValueProperty.__init__(self, IntegerChecker, **params) |
- |
-class SmallPositiveIntegerListProperty(MultiValueProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'small' |
- params['signed'] = False |
- MultiValueProperty.__init__(self, IntegerChecker, **params) |
- |
-class IntegerListProperty(MultiValueProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'medium' |
- params['signed'] = True |
- MultiValueProperty.__init__(self, IntegerChecker, **params) |
- |
-class PositiveIntegerListProperty(MultiValueProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'medium' |
- params['signed'] = False |
- MultiValueProperty.__init__(self, IntegerChecker, **params) |
- |
-class LargeIntegerListProperty(MultiValueProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'large' |
- params['signed'] = True |
- MultiValueProperty.__init__(self, IntegerChecker, **params) |
- |
-class LargePositiveIntegerListProperty(MultiValueProperty): |
- |
- def __init__(self, **params): |
- params['size'] = 'large' |
- params['signed'] = False |
- MultiValueProperty.__init__(self, IntegerChecker, **params) |
- |
-class BooleanListProperty(MultiValueProperty): |
- |
- def __init__(self, **params): |
- MultiValueProperty.__init__(self, BooleanChecker, **params) |
- |
-class ObjectListProperty(MultiValueProperty): |
- |
- def __init__(self, **params): |
- MultiValueProperty.__init__(self, ObjectChecker, **params) |
- |
-class HasManyProperty(Property): |
- |
- def set_name(self, name): |
- self.name = name |
- self.slot_name = '__' + self.name |
- |
- def __get__(self, obj, objtype): |
- return self |
- |
- |
-class MultiValue: |
- """ |
- Special Multi Value for boto persistence layer to allow us to do |
- obj.list.append(foo) |
- """ |
- def __init__(self, property, obj, _list): |
- self.checker = property.checker |
- self.name = property.name |
- self.object = obj |
- self._list = _list |
- |
- def __repr__(self): |
- return repr(self._list) |
- |
- def __getitem__(self, key): |
- return self._list.__getitem__(key) |
- |
- def __delitem__(self, key): |
- item = self[key] |
- self._list.__delitem__(key) |
- domain = self.object._manager.domain |
- domain.delete_attributes(self.object.id, {self.name: [self.checker.to_string(item)]}) |
- |
- def __len__(self): |
- return len(self._list) |
- |
- def append(self, value): |
- self.checker.check(value) |
- self._list.append(value) |
- domain = self.object._manager.domain |
- domain.put_attributes(self.object.id, {self.name: self.checker.to_string(value)}, replace=False) |
- |
- def index(self, value): |
- for x in self._list: |
- if x.id == value.id: |
- return self._list.index(x) |
- |
- def remove(self, value): |
- del(self[self.index(value)]) |