From 51bbe72ec27206ad70eb0f7d05749dc55366143b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 1 Mar 2013 14:13:40 +0530 Subject: [PATCH] Writing of ratings --- src/calibre/db/tables.py | 6 +++--- src/calibre/db/tests/writing.py | 14 +++++++++++++- src/calibre/db/write.py | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/calibre/db/tables.py b/src/calibre/db/tables.py index 90f5db9ac5..37a189bfb1 100644 --- a/src/calibre/db/tables.py +++ b/src/calibre/db/tables.py @@ -123,9 +123,8 @@ class ManyToOneTable(Table): def read_id_maps(self, db): for row in db.conn.execute('SELECT id, {0} FROM {1}'.format( - self.metadata['column'], self.metadata['table'])): - if row[1]: - self.id_map[row[0]] = self.unserialize(row[1]) + self.metadata['column'], self.metadata['table'])): + self.id_map[row[0]] = self.unserialize(row[1]) def read_maps(self, db): for row in db.conn.execute( @@ -218,3 +217,4 @@ class LanguagesTable(ManyToManyTable): ManyToManyTable.read_id_maps(self, db) lm = lang_map() self.lang_name_map = {x:lm.get(x, x) for x in self.id_map.itervalues()} + diff --git a/src/calibre/db/tests/writing.py b/src/calibre/db/tests/writing.py index c1c93137ef..fafbf3b1ec 100644 --- a/src/calibre/db/tests/writing.py +++ b/src/calibre/db/tests/writing.py @@ -159,7 +159,7 @@ class WritingTest(BaseTest): self.assertEqual(tuple(map(f.for_book, (1,2,3))), ('Two', 'Two', 'three')) del cache2 - # TODO: Test different column types rating, #rating, series, #series, + # TODO: Test different column types series, #series, # Enum self.assertFalse(cache.set_field('#enum', {1:'Not allowed'})) @@ -171,6 +171,18 @@ class WritingTest(BaseTest): self.assertEqual(c.field_for('#enum', i), val) del cache2 + # Rating + self.assertFalse(cache.set_field('rating', {1:6, 2:4})) + self.assertEqual(cache.set_field('rating', {1:0, 3:2}), {1, 3}) + self.assertEqual(cache.set_field('#rating', {1:None, 2:4, 3:8}), {1, 2, 3}) + cache2 = self.init_cache(cl) + for c in (cache, cache2): + for i, val in {1:None, 2:4, 3:2}.iteritems(): + self.assertEqual(c.field_for('rating', i), val) + for i, val in {1:None, 2:4, 3:8}.iteritems(): + self.assertEqual(c.field_for('#rating', 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 fec35bab21..1fe37b5e34 100644 --- a/src/calibre/db/write.py +++ b/src/calibre/db/write.py @@ -92,7 +92,7 @@ def get_adapter(name, metadata): elif dt == 'comments': ans = single_text elif dt == 'rating': - ans = lambda x: x if x is None else min(10., max(0., adapt_number(float, x))), + ans = lambda x: None if x in {None, 0} else min(10., max(0., adapt_number(float, x))) elif dt == 'enumeration': ans = single_text elif dt == 'composite':