Restrict writing of enum fields to allowed values only

This commit is contained in:
Kovid Goyal 2013-03-01 13:25:05 +05:30
parent 01641c8b6e
commit 376bcdddaa
2 changed files with 23 additions and 2 deletions

View File

@ -159,7 +159,17 @@ class WritingTest(BaseTest):
self.assertEqual(tuple(map(f.for_book, (1,2,3))), ('Two', 'Two', 'three'))
del cache2
# TODO: Test different column types
# TODO: Test different column types rating, #rating, series, #series,
# Enum
self.assertFalse(cache.set_field('#enum', {1:'Not allowed'}))
self.assertEqual(cache.set_field('#enum', {1:'One', 2:'One', 3:'Three'}), {1, 3})
self.assertEqual(cache.set_field('#enum', {1:None}), set([1]))
cache2 = self.init_cache(cl)
for c in (cache, cache2):
for i, val in {1:None, 2:'One', 3:'Three'}.iteritems():
self.assertEqual(c.field_for('#enum', i), val)
del cache2
def tests():
return unittest.TestLoader().loadTestsFromTestCase(WritingTest)

View File

@ -295,7 +295,8 @@ class Writer(object):
pass
# TODO: Remember to change commas to | when writing authors to sqlite
elif field.is_many:
self.set_books_func = many_one
self.set_books_func = (self.set_books_for_enum if dt ==
'enumeration' else many_one)
else:
self.set_books_func = (one_one_in_books if field.metadata['table']
== 'books' else one_one_in_other)
@ -311,3 +312,13 @@ class Writer(object):
allow_case_change)
return dirtied
def set_books_for_enum(self, book_id_val_map, db, field,
allow_case_change):
allowed = set(field.metadata['display']['enum_values'])
book_id_val_map = {k:v for k, v in book_id_val_map.iteritems() if v is
None or v in allowed}
if not book_id_val_map:
return set()
return many_one(book_id_val_map, db, field, False)