From 84766698cb988e9c30a66735adf2a7e69d63a2f2 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 3 Mar 2011 14:52:51 +0000 Subject: [PATCH] Add identifiers to get_categories --- resources/images/id_card.png | Bin 0 -> 6483 bytes src/calibre/gui2/tag_view.py | 8 ++++++-- src/calibre/library/database2.py | 28 ++++++++++++++++++++++++++ src/calibre/library/field_metadata.py | 24 ++++++++++++---------- src/calibre/library/server/browse.py | 2 +- 5 files changed, 48 insertions(+), 14 deletions(-) create mode 100644 resources/images/id_card.png diff --git a/resources/images/id_card.png b/resources/images/id_card.png new file mode 100644 index 0000000000000000000000000000000000000000..80ac5fda116e91d0c4ad9315381c7e2fd360976c GIT binary patch literal 6483 zcmchc_di?z+s6;JDWR&VQZZ`OilSyeLRD>2nAsyztx`~ zW`YYc^fOHz;OgH;!tjnixQ6njve7H>h_Qb&kpgdqHvmBQRTSlQy(czJeO~H*&$=Yw zma_+gY1Jr#!?+*}%kU`C1u`oqtHsdHuBF;BT$SV7&rV6+ix`d166?kWF+JFf!Uayx zagrv_+t-YUHQ`S?f46(Sfus$P{!LY4?tQdxJ2TiESmSe-s~6534}H1J|8A`}W6Rtt z(44JxtO7?)uK1+6S=_9wzAJE7tn;m$&8RTS!tV^ zHltUcCE%o*{}$o6OiWC)vSs;H7%uD|eE4bm3PTOOxj1$3!4S zMg|}%#%|rZ#gj2)7$x9bv;K!nE#D?#QJwpSg8k~yM?pcsus7}P?O(rswGWRcupmg^ z|L1?ID0C3Vt2lb z1^%D_g8_md`M;3N1@p^7*E`gYhxY`x?r~2%=sI?EU)+JZhHKs4q3wRgYc<4sF;^F~ zW#7K=O_36^L+ii$-Ag9@a%kFjRBC_{;C9qUjyH7=ugp|CI0o$glnMXtrqsa4tr+yG znD+HCK5);EB}w9%nVrsbRZ*iAkK9D9%VcYrj}v)^J72M%LU$R;lRA;KbEi$)H+Vo#*|1E9Clf`Md=Ht$Jp1@;$O^fl({>5(ux$ax2{{C!m zwFOZ5UQqAdu&A>w8M^{-qwJ4$H+F%JY;wYHO32GV?V`fG@#<;orK(-M#llN#%9~Hz zBw4`JPP{J)FDWgRaa;J7z$&xA{$u;->>>cDH2&<{93YGSp1`omJ)Kfz?JF55^(75! zZfICpxV$x`@^+q zo{ws2N~xIga+j69EY5;B)gH%+W_{y-Q~KMtI(m8@J9F*7r{ed6VVYbTKwW{|m7@&M zW?7}%FCfBv;2Uh`7Nz%^h2DrkAvq&#TK1ak_a&Q2?j`GMZ3a2#Uv^97;!0|oo0~5# zE|S{M0|HG=Sv@Wlku{T>!HC?Jmb+H6KaE{nw%Xd-wga!uZj0K=?*A0k(9k$&>6rh! zu@R^Kv7n%1)03x2+kr%q5Lgi%K&PPYv4qZo?Fit1m^B031?|>iP#WoG&F|I9lnszi z0^e^=zbhDCCz|`#aup-*_2+3$zt`2pk+5N9E(WuOj+6a1w-v@b|3m`sd0E9mJY%xdl&bAWOOnYO1J#y zk1XMr4mcdB!xabwg51?f|K#N4(bhE1>U%<2nSgY>D1EY}2e<#z^VL_xh7 z5)xu!WhQmyxw)vZa#JZODe0^}+iH3Rh=P9UyG6+RF$dpR1 za0LqyMuyHeF(mr%Sc|2hB_`k)mv)raZz}Gv^o%ilvHnMeuHMKp`C9@iT*Ma2ZA3>B z0<*TZ2HM&~$#FPbDF&loW=J33_RR!gJrOdKVxsG^?X-7#4Vw?shhgI=k&NL?>c}bq z{Cp*s3YH6>*-i|!uj5Uq)K(Pv^{j6e-73J!^{xE2*qH61j8-IpidS`ie6^9Kakoy3 zMva2~8`Ng7qe?(917rCF$#sei5r+%V0WOJj0CvClw%~{E`l#r8Z5pB?YHE+z@Enq^!>r0zR4TA)N5La=F~Q zQl6QqJc>cTebU|fr5%x^z`-QBX?75liZ6__Nsqg!5MkIwHE;O12=x;{B!|c}o&jws zA6nOT*=Ag16GX4wxQB?74ew}AGe60Y^D;}OWGAUJ+k`^*dSW#{ssm9J-`lNV;)_i{0y$%@v~yNh!DaSO%BJ!760w-4ti}#Hd@tX92>E2!!|tW z0=CI(4})pLv|qeXaZ^c{ou_-~^+0}bec#9bKVVLhwF72E>qsy1eg11mzEj38_ulna z7yT72EBjJx{>S81MmuL0=yv%U2JVNAT~Qnq#HLmc0`T4RC~HgC=Cg{F3(VRFubUIl zFmL|FZk+*GRk#tC6`-B6Bf)K0XiKG;AoxSX&U&qEpI^wVURq3Sr_a?q+wZ7nC>i&3 z35iTOJoJ2mTv!ph8@>?T=k^?lO#0FUSGr&40vSy=ahx2NW0}4Vbm~y=Q9DrtLk}CL z1Vc2xzJ+Ojb)&BKm&#Ow31uIwSNbz_2&Z$cRJW0Sd&$F1C7g>{V`!d1P+Sr+odpB$3c;1xSf%(SGv`doZ1EtlL1aD2h4%`h*xokS;a>WX1u|a-x*V<_H5CwU8UYYPRLX8HU9!^#+y>n}1qkJh%Bildh z6aE{`GkS#}4y{am=HEdH46G9xd~O4ChX?rNC@2s|aV>}l0-)p(A%O19kYJQL1po`3 zVPf=m@yZ!|)BEc5#c)gnOQ@znpnu11r}z;aKSKw6xJZMVgjhtHBMKLq5Qtco?6Vi+ zw)IgUiBiw4uBHUa^ltzV;{UGRJ)YFos=a{jd~J@+oQs5lD5F$J4#>O~gYcaw*jEIHd7U}5jESRY_+_Y{2KM~&Ox zgTl$mh)0DuE_GjD1b$;T#DjdUOjoa2dqj7P$dt$B9=Xhd&+4g(dRnbwcZL*h2mlVPP) z?N=mEdkvlR7HGQQG#=hvie6&j3%6jq4Y{4M5B)1$dD`ngo=j{=i9#a;?`JL@9;hYr zcIW3SiwIQG6c1+{NLP1e_PR;m@|KzO>#(2%QU!cb)*>YGy!Y?B))R*_$h4EoRYH2n1Nw2rRW2b+_Pvizt@WOc~Eb;17a zBj09P;Js9V?dk&gQ^CA;6dX!(W9@0ehz~0dfib%E4N*|5|Jo96ueeI!Ic~z^a>^!6 z6owB&t?h7Bq za`Rp(Z*6_KD_S?X>4~FP2tf_3(#Z0}y$o#$#@x@-hOy8(j8ajl1~yq8{rS3wj7{1j zFO7C2p=`{XAQWzVy*fX7{Pc3?Fj~%kV8}SKikX(YV;*>deWfxCM=m@X)$*uq+d` zW&H@kWur$jQ9nN(eKQ6_LCL+t1&)KdeYE2J{~?OIBS9C8Gv=2 zDRA#iIQ3s`K~&@v-<4RI^O z9;vH$FRW7FP6IQ!mAckueo@3{tvrd^`Xq^3#oG~iWUKsH7RbM3hUq= z)mJwgU_veGvGyyHEdUC5ZqIC@rR_j=vh8ICjyr_|fg~mYLM#-Kb;VL8~w6(EO zh|{Taoz4F6!Ds$!_*)(=;x=mGrZ%^!)#2jxwY3_>u?q7FXIJ8&i?bsz@$tcS**;zN zVxwbYIsf^mTf7IkJK!s6lpQzMCGRd5qa7|GD_D}pQ%OTCddpTU&I^+8HpTl}Y;}!@ z0MDCXH>KNh3{FID?#vwuG@9(HoKYIuvYXs}Wb_5URGu;{hjbYaTbU$OU#aB!+|$On z%5y5e7UK0Z`)=HjtT6g%mU{rUpoKnH9*42mC5q_ZwK7r8HI9p%@`leez)lCPA3VA| zUYsznt^Uw>_|FCaK;;Ed5MaU=B>so#{7BvfQF!R|JC~O#o)|Fs;*=N6c>_~YQc_-C zgnvxQ&aYpV`;>1O{!91ClP6|o*-YVEY+nooe!(6oND2#Y=SAKn27K#1Ra8`LZMmP% z`WP7*l{m-qgbh@P{Tdy0Sdq9Eq*<&M3=BFz@K`XEcbUl83#Und>=jNq2d2IKeNK&= zOiT%7q2PhwWSlZJHI)?lW!$N#7*C5gl$V$1a-5*g4ucd7eiFRk3LB_38g%g2)YN^ikg^P=et&!)&DIt=M&8)_L5Cj=DRn_I*3?BSm-s4CN1~V}+ z0s1N`D&1fv(*#XMhlbpjdfpZ11Q@3-HTxZb`d=2LM3#hmYN;$z?uGgJ#O%K&CVXf8 zkBHi`ANg%HtYm|}$I**N>bNLtqP2R1Riwlaa2=OBIIu^TP^XFYg4Sd$m?k!&tA zO((I!Ed#6Qn0)W%8F9x^IL)iIUnQWgLRkM-D!yQKnVOpBY5zdMC0P=d@M)losAxG| z+grke=a=z4u=nur@bdC9F`1mGb?nc6gnK#vmHL(tG`=f6J>8lT{^f#5gsgF6!zoPL zz+enChWvbe8yg!z0K68AfI)IsbWI!4C5?@zAeDlbStqC_Gtx$a))06FQu*A}$9ZpN zw{yfD^#cO~t*orT6kAy>f}yIBia^2t?w|B!N{LEJ{+^t4tR621N6Yb!g)@^p;}ay~ zojZ4Mjg4F?r+?mRajE1>tZpUR;8WdLj!sr`TqkN)hqdG`K<-^dmge&gi3@`_4e~b# zN{=5u&eOKx?1i>1kS1K(nt*WZ(;NZZK_9lT%LXO{Z1f%!v z-8%qbU^ldb!JJ+MOzaQ&@V3qd64pj~dV0Qmd8nWa<^l$p^JxLuy}tfEt#6H!LHYBl zaVN6SJkTk@Vuu!Y2f|&Gxx^nn)YsQe3>TS3~Em@m}d9_PH_;r)Fq$a9PPZS<)XoBsjQ+m=S4J`ZMU@{z@$x=GtovaPTfmt<8*nJ9kWRJP#zqtOtImk2m34i!x`XRKGT|p zgRQFnajQI_5arH_70^l->qfz&^1Y9D=A9?MtfHk;ZED4*UVKBix^9DD4eBi6L>r^V zI_=4-n6XJxPg!ANd^~93CpQRH<2U{Vh;8HJuK=Mh*n6oW#UX8Rvlr z&PZw=$+Sc!teg%lBR{r)tPXc7YXU6)0 z(dW_3OqT4GlJ#ykmRFn{7lTL=82x~{D2U|s65eBELT8<{0~i~U(Wyl literal 0 HcmV?d00001 diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 92ed3bca67..0a65b8da67 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -1588,6 +1588,9 @@ class TagsModel(QAbstractItemModel): # {{{ else: prefix = '' category = tag.category if key != 'news' else 'tag' + if self.db.field_metadata[tag.category]['is_csp']: + add_colon = True + if tag.name and tag.name[0] == u'\u2605': # char is a star. Assume rating ans.append('%s%s:%s'%(prefix, category, len(tag.name))) else: @@ -1604,8 +1607,9 @@ class TagsModel(QAbstractItemModel): # {{{ n = name.replace(r'"', r'\"') if name.startswith('.'): n = '.' + n - ans.append('%s%s:"=%s%s"'%(prefix, category, - '.' if use_prefix else '', n)) + ans.append('%s%s:"=%s%s%s"'%(prefix, category, + '.' if use_prefix else '', n, + ':' if add_colon else '')) return ans def find_item_node(self, key, txt, start_path, equals_match=False): diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 556131b2c9..e72400a0bd 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -1493,6 +1493,34 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): # No need for ICU here. categories['formats'].sort(key = lambda x:x.name) + # Now do identifiers. This works like formats + categories['identifiers'] = [] + icon = None + if icon_map and 'identifiers' in icon_map: + icon = icon_map['identifiers'] + for ident in self.conn.get('SELECT DISTINCT type FROM identifiers'): + ident = ident[0] + if ids is not None: + count = self.conn.get('''SELECT COUNT(book) + FROM identifiers + WHERE type="%s" AND + books_list_filter(book)'''%ident, + all=False) + else: + count = self.conn.get('''SELECT COUNT(id) + FROM identifiers + WHERE type="%s"'''%ident, + all=False) + if count > 0: + categories['identifiers'].append(Tag(ident, count=count, icon=icon, + category='identifiers')) + + if sort == 'popularity': + categories['identifiers'].sort(key=lambda x: x.count, reverse=True) + else: # no ratings exist to sort on + # No need for ICU here. + categories['identifiers'].sort(key = lambda x:x.name) + #### Now do the user-defined categories. #### user_categories = dict.copy(self.clean_user_categories()) diff --git a/src/calibre/library/field_metadata.py b/src/calibre/library/field_metadata.py index d89322954f..ff38af6890 100644 --- a/src/calibre/library/field_metadata.py +++ b/src/calibre/library/field_metadata.py @@ -16,7 +16,8 @@ class TagsIcons(dict): ''' category_icons = ['authors', 'series', 'formats', 'publisher', 'rating', - 'news', 'tags', 'custom:', 'user:', 'search',] + 'news', 'tags', 'custom:', 'user:', 'search', + 'identifiers'] def __init__(self, icon_dict): for a in self.category_icons: if a not in icon_dict: @@ -24,16 +25,17 @@ class TagsIcons(dict): self[a] = icon_dict[a] category_icon_map = { - 'authors' : 'user_profile.png', - 'series' : 'series.png', - 'formats' : 'book.png', - 'publisher' : 'publisher.png', - 'rating' : 'rating.png', - 'news' : 'news.png', - 'tags' : 'tags.png', - 'custom:' : 'column.png', - 'user:' : 'tb_folder.png', - 'search' : 'search.png' + 'authors' : 'user_profile.png', + 'series' : 'series.png', + 'formats' : 'book.png', + 'publisher' : 'publisher.png', + 'rating' : 'rating.png', + 'news' : 'news.png', + 'tags' : 'tags.png', + 'custom:' : 'column.png', + 'user:' : 'tb_folder.png', + 'search' : 'search.png', + 'identifiers': 'id_card.png' } diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 0e132c7d11..182d3365bc 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -346,7 +346,7 @@ class BrowseServer(object): for category in sorted(categories, key=lambda x: sort_key(getter(x))): if len(categories[category]) == 0: continue - if category == 'formats': + if category == 'formats' or category == 'identifiers': continue meta = category_meta.get(category, None) if meta is None: