adding column delete on save

This commit is contained in:
Blake Eggleston
2012-11-24 17:33:14 -08:00
parent 301aa5c1df
commit 2cbf582b0d
5 changed files with 32 additions and 24 deletions

View File

@@ -12,6 +12,7 @@ class BaseValueManager(object):
self.initial_value = value
self.value = value
@property
def deleted(self):
return self.value is None and self.initial_value is not None

View File

@@ -24,7 +24,7 @@ class BaseModel(object):
value_mngr = column.value_manager(self, column, values.get(name, None))
self._values[name] = value_mngr
#TODO: note any deferred or only fields so they're not deleted
#TODO: note any absent fields so they're not deleted
@classmethod
def column_family_name(cls):
@@ -75,13 +75,16 @@ class ModelMetaClass(type):
def __new__(cls, name, bases, attrs):
"""
"""
#move column definitions into _columns dict
#move column definitions into columns dict
#and set default column names
_columns = OrderedDict()
columns = OrderedDict()
primary_keys = OrderedDict()
pk_name = None
def _transform_column(col_name, col_obj):
_columns[col_name] = col_obj
columns[col_name] = col_obj
if col_obj.primary_key:
primary_keys[col_name] = col_obj
col_obj.set_column_name(col_name)
#set properties
_get = lambda self: self._values[col_name].getval()
@@ -112,7 +115,7 @@ class ModelMetaClass(type):
#check for duplicate column names
col_names = set()
for k,v in _columns.items():
for v in columns.values():
if v.db_field_name in col_names:
raise ModelException("{} defines the column {} more than once".format(name, v.db_field_name))
col_names.add(v.db_field_name)
@@ -128,11 +131,12 @@ class ModelMetaClass(type):
#create db_name -> model name map for loading
db_map = {}
for field_name, col in _columns.items():
for field_name, col in columns.items():
db_map[col.db_field_name] = field_name
#add management members to the class
attrs['_columns'] = _columns
attrs['_columns'] = columns
attrs['_primary_keys'] = primary_keys
attrs['_db_map'] = db_map
attrs['_pk_name'] = pk_name
attrs['_dynamic_columns'] = {}

View File

@@ -432,7 +432,25 @@ class QuerySet(object):
cur = conn.cursor()
cur.execute(qs, field_values)
#TODO: delete deleted / nulled fields
#TODO: delete deleted / nulled columns
deleted = [k for k,v in instance._values.items() if v.deleted]
if deleted:
import ipdb; ipdb.set_trace()
del_fields = [self.model._columns[f] for f in deleted]
del_fields = [f.db_field_name for f in del_fields if not f.primary_key]
pks = self.model._primary_keys
qs = ['DELETE {}'.format(', '.join(del_fields))]
qs += ['FROM {}'.format(self.column_family_name)]
qs += ['WHERE']
eq = lambda col: '{0} = :{0}'.format(v.db_field_name)
qs += [' AND '.join([eq(f) for f in pks.values()])]
qs = ' '.join(qs)
pk_dict = dict([(v.db_field_name, getattr(instance, k)) for k,v in pks.items()])
cur.execute(qs, pk_dict)
def create(self, **kwargs):
return self.model(**kwargs).save()

View File

@@ -10,7 +10,7 @@ from cqlengine import columns
class TestModel(Model):
count = columns.Integer()
text = columns.Text()
class TestModelIO(BaseCassEngTestCase):
@classmethod
@@ -54,11 +54,6 @@ class TestModelIO(BaseCassEngTestCase):
tm2 = TestModel.objects(id=tm.pk).first()
self.assertIsNone(tm2)
def test_nullable_columns_are_saved_properly(self):
"""
Tests that nullable columns save without any trouble
"""
def test_column_deleting_works_properly(self):
"""
"""

View File

@@ -78,16 +78,6 @@ class TestQuerySetOperation(BaseCassEngTestCase):
query2 = query1.filter(expected_result__gte=1)
assert len(query2._where) == 2
def test_queryset_slicing(self):
"""
Check that the limit and start is implemented as iterator slices
"""
def test_proper_delete_behavior(self):
"""
Tests that deleting the contents of a queryset works properly
"""
def test_the_all_method_clears_where_filter(self):
"""
Tests that calling all on a queryset with previously defined filters returns a queryset with no filters