diff --git a/src/calibre/db/tests/writing.py b/src/calibre/db/tests/writing.py index a8e5ab301e..c1c93137ef 100644 --- a/src/calibre/db/tests/writing.py +++ b/src/calibre/db/tests/writing.py @@ -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) diff --git a/src/calibre/db/write.py b/src/calibre/db/write.py index dc4112f990..fec35bab21 100644 --- a/src/calibre/db/write.py +++ b/src/calibre/db/write.py @@ -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) + +