From db50889a80f7a4fb2df9e3b4beda74f1e221f0c0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 24 Jan 2013 23:06:53 +0530 Subject: [PATCH] Add the news category --- src/calibre/db/categories.py | 10 ++++++---- src/calibre/db/fields.py | 30 ++++++++++++++++++++++++++++++ src/calibre/db/tests/metadata.db | Bin 236544 -> 237568 bytes 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/calibre/db/categories.py b/src/calibre/db/categories.py index ec4725ff9f..39ac38000b 100644 --- a/src/calibre/db/categories.py +++ b/src/calibre/db/categories.py @@ -53,8 +53,7 @@ class Tag(object): def find_categories(field_metadata): for category, cat in field_metadata.iteritems(): - if (cat['is_category'] and cat['kind'] not in {'user', 'search'} and - category != 'news'): + if (cat['is_category'] and cat['kind'] not in {'user', 'search'}): yield (category, cat['is_multiple'].get('cache_to_list', None), False) elif (cat['datatype'] == 'composite' and cat['display'].get('make_category', False)): @@ -102,8 +101,11 @@ def get_categories(dbcache, sort='name', book_ids=None, icon_map=None): book_ids = frozenset(book_ids) if book_ids else book_ids for category, is_multiple, is_composite in find_categories(fm): tag_class = create_tag_class(category, fm, icon_map) - cats = dbcache.fields[category].get_categories( - tag_class, book_rating_map, lang_map, book_ids) + if category == 'news': + cats = dbcache.fields['tags'].get_news_category(tag_class, book_ids) + else: + cats = dbcache.fields[category].get_categories( + tag_class, book_rating_map, lang_map, book_ids) if sort == 'popularity': key=attrgetter('count') elif sort == 'rating': diff --git a/src/calibre/db/fields.py b/src/calibre/db/fields.py index 4e73b5badf..5816880576 100644 --- a/src/calibre/db/fields.py +++ b/src/calibre/db/fields.py @@ -441,6 +441,34 @@ class SeriesField(ManyToOneField): val = self.table.id_map[item_id] return title_sort(val, order=tss, lang=lang) +class TagsField(ManyToManyField): + + def get_news_category(self, tag_class, book_ids=None): + news_id = None + ans = [] + for item_id, val in self.table.id_map.iteritems(): + if val == _('News'): + news_id = item_id + break + if news_id is None: + return ans + + news_books = self.table.col_book_map[news_id] + if book_ids is not None: + news_books = news_books.intersection(book_ids) + if not news_books: + return ans + for item_id, item_book_ids in self.table.col_book_map.iteritems(): + item_book_ids = item_book_ids.intersection(news_books) + if item_book_ids: + name = self.category_formatter(self.table.id_map[item_id]) + if name == _('News'): + continue + c = tag_class(name, id=item_id, sort=name, + id_set=item_book_ids, count=len(item_book_ids)) + ans.append(c) + return ans + def create_field(name, table): cls = { ONE_ONE : OneToOneField, @@ -455,6 +483,8 @@ def create_field(name, table): cls = FormatsField elif name == 'identifiers': cls = IdentifiersField + elif name == 'tags': + cls = TagsField elif table.metadata['datatype'] == 'composite': cls = CompositeField elif table.metadata['datatype'] == 'series': diff --git a/src/calibre/db/tests/metadata.db b/src/calibre/db/tests/metadata.db index 94748877b6203bb38b302551f2c80ff863b6059e..1a14791592919dcff2176473866e1f2cbe94c82b 100644 GIT binary patch delta 972 zcmZuvTS$~a6rS^cqkBnhtu#cfRVj_4=wgNxCb09?S?)%d8$s+t579$){xu(he&(Aw|M|Xi&Ya=2_hhw4vpVxL zJA@Dk#vp^b$||ViZew4TW07-yMdiW;m5Ub7UAUxTad~9^#Fr~GB;o=;kVFFUNOsvX zIMVG>5Rs8?OPw;DY?v}8i?b++A1PTlInQFVTO=z<+9FB!#CoE8J-^9*Aw&{VONpAr77SE9B{Wy#w_DsUYtuMeH1M;#OcV5rws*mASSri?}%~L=df8M zL{2T&3MWSYvN4k%W39*`la!If*8(p;RYGtmw~lWt7(`hbKZ;>DcWF!6R&$5N&NoY` zzopb>x(mGP~EOWx}M|5E3D_X#y@io$MKo% z5k{O5V+=DsFoyn~=D+EWGfbVSH)G#3MwP1;>-2R$HsM+~q-5WamNk5H`QACxsXA96 zUl*^$N6-iLu^H3V@Gg|=`sKI@8rHJP>@lVsTT!ZKFU24zu6mE5R9#(#TwNXHA)}FS z*TJbee?La>pdE0~XXR?bRCVVdT-tva-MH2XnVZSAEn>Cc)gq3L&o@tZ#s8;Uw*_#9 nGT)kUM74ry@lI!Sqkz(cFz#8@y2~g^3!V3cCTKQq8T954SS}tT delta 802 zcmah{TS!z<6usxJJCDRSro=epBhyGz2gMWv15F8Sn(SftF;31+OY?b$G$J%Vgsd2u z>PR5{1rkVg!y^Pa`jNjr)6{gN%!xn-@*|S6b1j1U>2TI&v(MUlpZ)0YhIR~xx=kT2 zK@iqCc1~|f4skuJ8VwE4h|A2#%g)Tp$~|PUSaJ`mnPJl*x3mQ7*b@4MAz@K$72bOyf^$4& z-WoBn!DAguR9|@eh_OdhbVBj{GLL!O%=#XpnwYuYJ0*xqBk~1&!YK?uMn1;Sjai;_ zAJTRsoixZ-TkT4t{eo<7ZEvWSosLKxAQvym^-lX0S#dZWio+F;VxooCDLdM&aWiR9 z2gWO7jpDC5Hr0r%C3yVn|5#N2=U68%c0<4hHt~(qe2CP6w?V%njhcjE$SZyU(X-8S zBs}Hspxyp1!u(yLX_ze2@Z(5k2NleNOfabl+aQy4wH$lt@_A&lih4YOG!?f$j=CFR zVhOca1({}&Q)A9hTQj2Q$XO(@Bl&m@^908v#}vo(Z)mz^)7~_Wk7Jo* zfn&|lp77s&s3E$KoV!9tZX%gJx{PRcw2iL<@p*c$#W2%#tU=O(QQHZ`(5E+GWA$#_ q!%znh&baa&kE