~stub/ubuntu/precise/calibre/devel

« back to all changes in this revision

Viewing changes to src/calibre/library/field_metadata.py

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2011-04-12 11:29:25 UTC
  • mfrom: (42.1.2 sid)
  • Revision ID: james.westby@ubuntu.com-20110412112925-c7171kt2bb5rmft4
Tags: 0.7.50+dfsg-2
* debian/control: Build with libpodofo-dev to enable PDF metadata.
  (Closes: #619632)
* debian/control: Add libboost1.42-dev build dependency. Apparently it is
  needed in some setups. (Closes: #619807)
* debian/rules: Call dh_sip to generate a proper sip API dependency, to
  prevent crashes like #616372 for partial upgrades.
* debian/control: Bump python-qt4 dependency to >= 4.8.3-2, which reportedly
  fixes crashes on startup. (Closes: #619701, #620125)

Show diffs side-by-side

added added

removed removed

Lines of Context:
3
3
 
4
4
@author: charles
5
5
'''
6
 
import copy
 
6
import copy, traceback
7
7
 
8
8
from calibre.utils.ordered_dict import OrderedDict
9
9
from calibre.utils.config import tweaks
16
16
    '''
17
17
 
18
18
    category_icons = ['authors', 'series', 'formats', 'publisher', 'rating',
19
 
                      'news',    'tags',   'custom:', 'user:',     'search',]
 
19
                      'news',    'tags',   'custom:', 'user:',     'search',
 
20
                      'identifiers']
20
21
    def __init__(self, icon_dict):
21
22
        for a in self.category_icons:
22
23
            if a not in icon_dict:
24
25
            self[a] = icon_dict[a]
25
26
 
26
27
category_icon_map = {
27
 
                    'authors'   : 'user_profile.png',
28
 
                    'series'    : 'series.png',
29
 
                    'formats'   : 'book.png',
30
 
                    'publisher' : 'publisher.png',
31
 
                    'rating'    : 'rating.png',
32
 
                    'news'      : 'news.png',
33
 
                    'tags'      : 'tags.png',
34
 
                    'custom:'   : 'column.png',
35
 
                    'user:'     : 'drawer.png',
36
 
                    'search'    : 'search.png'
 
28
                    'authors'    : 'user_profile.png',
 
29
                    'series'     : 'series.png',
 
30
                    'formats'    : 'book.png',
 
31
                    'publisher'  : 'publisher.png',
 
32
                    'rating'     : 'rating.png',
 
33
                    'news'       : 'news.png',
 
34
                    'tags'       : 'tags.png',
 
35
                    'custom:'    : 'column.png',
 
36
                    'user:'      : 'tb_folder.png',
 
37
                    'search'     : 'search.png',
 
38
                    'identifiers': 'id_card.png'
37
39
            }
38
40
 
39
41
 
80
82
 
81
83
    rec_index: the index of the field in the db metadata record.
82
84
 
 
85
    is_csp: field contains colon-separated pairs. Must also be text, is_multiple
 
86
 
83
87
    '''
84
88
 
85
89
    VALID_DATA_TYPES = frozenset([None, 'rating', 'text', 'comments', 'datetime',
98
102
                           'name':_('Authors'),
99
103
                           'search_terms':['authors', 'author'],
100
104
                           'is_custom':False,
101
 
                           'is_category':True}),
 
105
                           'is_category':True,
 
106
                           'is_csp': False}),
102
107
            ('series',    {'table':'series',
103
108
                           'column':'name',
104
109
                           'link_column':'series',
109
114
                           'name':_('Series'),
110
115
                           'search_terms':['series'],
111
116
                           'is_custom':False,
112
 
                           'is_category':True}),
 
117
                           'is_category':True,
 
118
                           'is_csp': False}),
113
119
            ('formats',   {'table':None,
114
120
                           'column':None,
115
121
                           'datatype':'text',
118
124
                           'name':_('Formats'),
119
125
                           'search_terms':['formats', 'format'],
120
126
                           'is_custom':False,
121
 
                           'is_category':True}),
 
127
                           'is_category':True,
 
128
                           'is_csp': False}),
122
129
            ('publisher', {'table':'publishers',
123
130
                           'column':'name',
124
131
                           'link_column':'publisher',
129
136
                           'name':_('Publishers'),
130
137
                           'search_terms':['publisher'],
131
138
                           'is_custom':False,
132
 
                           'is_category':True}),
 
139
                           'is_category':True,
 
140
                           'is_csp': False}),
133
141
            ('rating',    {'table':'ratings',
134
142
                           'column':'rating',
135
143
                           'link_column':'rating',
140
148
                           'name':_('Ratings'),
141
149
                           'search_terms':['rating'],
142
150
                           'is_custom':False,
143
 
                           'is_category':True}),
 
151
                           'is_category':True,
 
152
                           'is_csp': False}),
144
153
            ('news',      {'table':'news',
145
154
                           'column':'name',
146
155
                           'category_sort':'name',
150
159
                           'name':_('News'),
151
160
                           'search_terms':[],
152
161
                           'is_custom':False,
153
 
                           'is_category':True}),
 
162
                           'is_category':True,
 
163
                           'is_csp': False}),
154
164
            ('tags',      {'table':'tags',
155
165
                           'column':'name',
156
166
                           'link_column': 'tag',
161
171
                           'name':_('Tags'),
162
172
                           'search_terms':['tags', 'tag'],
163
173
                           'is_custom':False,
164
 
                           'is_category':True}),
 
174
                           'is_category':True,
 
175
                           'is_csp': False}),
 
176
            ('identifiers',   {'table':None,
 
177
                           'column':None,
 
178
                           'datatype':'text',
 
179
                           'is_multiple':',',
 
180
                           'kind':'field',
 
181
                           'name':_('Identifiers'),
 
182
                           'search_terms':['identifiers', 'identifier', 'isbn'],
 
183
                           'is_custom':False,
 
184
                           'is_category':True,
 
185
                           'is_csp': True}),
165
186
            ('author_sort',{'table':None,
166
187
                            'column':None,
167
188
                            'datatype':'text',
170
191
                           'name':None,
171
192
                           'search_terms':['author_sort'],
172
193
                           'is_custom':False,
173
 
                           'is_category':False}),
 
194
                           'is_category':False,
 
195
                           'is_csp': False}),
174
196
            ('au_map',    {'table':None,
175
197
                           'column':None,
176
198
                           'datatype':'text',
179
201
                           'name':None,
180
202
                           'search_terms':[],
181
203
                           'is_custom':False,
182
 
                           'is_category':False}),
 
204
                           'is_category':False,
 
205
                           'is_csp': False}),
183
206
            ('comments',  {'table':None,
184
207
                           'column':None,
185
208
                           'datatype':'text',
187
210
                           'kind':'field',
188
211
                           'name':_('Comments'),
189
212
                           'search_terms':['comments', 'comment'],
190
 
                           'is_custom':False, 'is_category':False}),
 
213
                           'is_custom':False,
 
214
                           'is_category':False,
 
215
                           'is_csp': False}),
191
216
            ('cover',     {'table':None,
192
217
                           'column':None,
193
218
                           'datatype':'int',
196
221
                           'name':None,
197
222
                           'search_terms':['cover'],
198
223
                           'is_custom':False,
199
 
                           'is_category':False}),
200
 
            ('flags',     {'table':None,
201
 
                           'column':None,
202
 
                           'datatype':'text',
203
 
                           'is_multiple':None,
204
 
                           'kind':'field',
205
 
                           'name':None,
206
 
                           'search_terms':[],
207
 
                           'is_custom':False,
208
 
                           'is_category':False}),
 
224
                           'is_category':False,
 
225
                           'is_csp': False}),
209
226
            ('id',        {'table':None,
210
227
                           'column':None,
211
228
                           'datatype':'int',
214
231
                           'name':None,
215
232
                           'search_terms':[],
216
233
                           'is_custom':False,
217
 
                           'is_category':False}),
218
 
            ('isbn',      {'table':None,
219
 
                           'column':None,
220
 
                           'datatype':'text',
221
 
                           'is_multiple':None,
222
 
                           'kind':'field',
223
 
                           'name':None,
224
 
                           'search_terms':['isbn'],
225
 
                           'is_custom':False,
226
 
                           'is_category':False}),
227
 
            ('lccn',      {'table':None,
228
 
                           'column':None,
229
 
                           'datatype':'text',
230
 
                           'is_multiple':None,
231
 
                           'kind':'field',
232
 
                           'name':None,
233
 
                           'search_terms':[],
234
 
                           'is_custom':False,
235
 
                           'is_category':False}),
 
234
                           'is_category':False,
 
235
                           'is_csp': False}),
 
236
            ('last_modified', {'table':None,
 
237
                           'column':None,
 
238
                           'datatype':'datetime',
 
239
                           'is_multiple':None,
 
240
                           'kind':'field',
 
241
                           'name':_('Date'),
 
242
                           'search_terms':['last_modified'],
 
243
                           'is_custom':False,
 
244
                           'is_category':False,
 
245
                           'is_csp': False}),
236
246
            ('ondevice',  {'table':None,
237
247
                           'column':None,
238
248
                           'datatype':'text',
241
251
                           'name':_('On Device'),
242
252
                           'search_terms':['ondevice'],
243
253
                           'is_custom':False,
244
 
                           'is_category':False}),
 
254
                           'is_category':False,
 
255
                           'is_csp': False}),
245
256
            ('path',      {'table':None,
246
257
                           'column':None,
247
258
                           'datatype':'text',
250
261
                           'name':None,
251
262
                           'search_terms':[],
252
263
                           'is_custom':False,
253
 
                           'is_category':False}),
 
264
                           'is_category':False,
 
265
                           'is_csp': False}),
254
266
            ('pubdate',   {'table':None,
255
267
                           'column':None,
256
268
                           'datatype':'datetime',
259
271
                           'name':_('Published'),
260
272
                           'search_terms':['pubdate'],
261
273
                           'is_custom':False,
262
 
                           'is_category':False}),
 
274
                           'is_category':False,
 
275
                           'is_csp': False}),
 
276
            ('marked',    {'table':None,
 
277
                           'column':None,
 
278
                           'datatype':'text',
 
279
                           'is_multiple':None,
 
280
                           'kind':'field',
 
281
                           'name': None,
 
282
                           'search_terms':['marked'],
 
283
                           'is_custom':False,
 
284
                           'is_category':False,
 
285
                           'is_csp': False}),
263
286
            ('series_index',{'table':None,
264
287
                             'column':None,
265
288
                             'datatype':'float',
268
291
                             'name':None,
269
292
                             'search_terms':['series_index'],
270
293
                             'is_custom':False,
271
 
                             'is_category':False}),
 
294
                             'is_category':False,
 
295
                           'is_csp': False}),
272
296
            ('sort',      {'table':None,
273
297
                           'column':None,
274
298
                           'datatype':'text',
277
301
                           'name':_('Title Sort'),
278
302
                           'search_terms':['title_sort'],
279
303
                           'is_custom':False,
280
 
                           'is_category':False}),
 
304
                           'is_category':False,
 
305
                           'is_csp': False}),
281
306
            ('size',      {'table':None,
282
307
                           'column':None,
283
308
                           'datatype':'float',
286
311
                           'name':_('Size (MB)'),
287
312
                           'search_terms':['size'],
288
313
                           'is_custom':False,
289
 
                           'is_category':False}),
 
314
                           'is_category':False,
 
315
                           'is_csp': False}),
290
316
            ('timestamp', {'table':None,
291
317
                           'column':None,
292
318
                           'datatype':'datetime',
295
321
                           'name':_('Date'),
296
322
                           'search_terms':['date'],
297
323
                           'is_custom':False,
298
 
                           'is_category':False}),
 
324
                           'is_category':False,
 
325
                           'is_csp': False}),
299
326
            ('title',     {'table':None,
300
327
                           'column':None,
301
328
                           'datatype':'text',
304
331
                           'name':_('Title'),
305
332
                           'search_terms':['title'],
306
333
                           'is_custom':False,
307
 
                           'is_category':False}),
 
334
                           'is_category':False,
 
335
                           'is_csp': False}),
308
336
            ('uuid',      {'table':None,
309
337
                           'column':None,
310
338
                           'datatype':'text',
313
341
                           'name':None,
314
342
                           'search_terms':[],
315
343
                           'is_custom':False,
316
 
                           'is_category':False}),
 
344
                           'is_category':False,
 
345
                           'is_csp': False}),
317
346
        ]
318
347
    # }}}
319
348
 
335
364
            self._tb_cats[k]['display'] = {}
336
365
            self._tb_cats[k]['is_editable'] = True
337
366
            self._add_search_terms_to_map(k, v['search_terms'])
338
 
        self._tb_cats['timestamp']['display'] = {
 
367
        for x in ('timestamp', 'last_modified'):
 
368
            self._tb_cats[x]['display'] = {
339
369
                        'date_format': tweaks['gui_timestamp_display_format']}
340
370
        self._tb_cats['pubdate']['display'] = {
341
371
                        'date_format': tweaks['gui_pubdate_display_format']}
441
471
        return l
442
472
 
443
473
    def add_custom_field(self, label, table, column, datatype, colnum, name,
444
 
                               display, is_editable, is_multiple, is_category):
 
474
                         display, is_editable, is_multiple, is_category,
 
475
                         is_csp=False):
445
476
        key = self.custom_field_prefix + label
446
477
        if key in self._tb_cats:
447
478
            raise ValueError('Duplicate custom field [%s]'%(label))
454
485
                             'colnum':colnum,      'display':display,
455
486
                             'is_custom':True,     'is_category':is_category,
456
487
                             'link_column':'value','category_sort':'value',
457
 
                             'is_editable': is_editable,}
 
488
                             'is_csp' : is_csp,     'is_editable': is_editable,}
458
489
        self._add_search_terms_to_map(key, [key])
459
490
        self.custom_label_to_key_map[label] = key
460
491
        if datatype == 'series':
466
497
                                 'colnum':None,        'display':{},
467
498
                                 'is_custom':False,    'is_category':False,
468
499
                                 'link_column':None,   'category_sort':None,
469
 
                                 'is_editable': False,}
 
500
                                 'is_editable': False, 'is_csp': False}
470
501
            self._add_search_terms_to_map(key, [key])
471
502
            self.custom_label_to_key_map[label+'_index'] = key
472
503
 
488
519
                        del self._search_term_map[k]
489
520
                del self._tb_cats[key]
490
521
 
 
522
    def _remove_grouped_search_terms(self):
 
523
        to_remove = [v for v in self._search_term_map
 
524
                        if isinstance(self._search_term_map[v], list)]
 
525
        for v in to_remove:
 
526
            del self._search_term_map[v]
 
527
 
 
528
    def add_grouped_search_terms(self, gst):
 
529
        self._remove_grouped_search_terms()
 
530
        for t in gst:
 
531
            try:
 
532
                self._add_search_terms_to_map(gst[t], [t])
 
533
            except ValueError:
 
534
                traceback.print_exc()
 
535
 
491
536
    def cc_series_index_column_for(self, key):
492
537
        return self._tb_cats[key]['rec_index'] + 1
493
538
 
501
546
                                'datatype':None,       'is_multiple':None,
502
547
                                'kind':'user',         'name':name,
503
548
                                'search_terms':st,     'is_custom':False,
504
 
                                'is_category':True}
 
549
                                'is_category':True,    'is_csp': False}
505
550
        self._add_search_terms_to_map(label, st)
506
551
 
507
552
    def add_search_category(self, label, name):
510
555
        self._tb_cats[label] = {'table':None,        'column':None,
511
556
                                'datatype':None,     'is_multiple':None,
512
557
                                'kind':'search',     'name':name,
513
 
                                'search_terms':[],    'is_custom':False,
514
 
                                'is_category':True}
 
558
                                'search_terms':[],   'is_custom':False,
 
559
                                'is_category':True,  'is_csp': False}
515
560
 
516
561
    def set_field_record_index(self, label, index, prefer_custom=False):
517
562
        if prefer_custom: