mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Port calibredb custom_columns
This commit is contained in:
parent
f0155f4b2a
commit
7ebd16989d
@ -4,19 +4,89 @@
|
|||||||
|
|
||||||
from __future__ import absolute_import, division, print_function, unicode_literals
|
from __future__ import absolute_import, division, print_function, unicode_literals
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
from calibre import prints
|
||||||
|
from calibre.db.legacy import LibraryDatabase
|
||||||
|
from calibre.library.custom_columns import CustomColumns
|
||||||
|
|
||||||
readonly = False
|
readonly = False
|
||||||
version = 0 # change this if you change signature of implementation()
|
version = 0 # change this if you change signature of implementation()
|
||||||
|
no_remote = True
|
||||||
|
|
||||||
|
|
||||||
def implementation(db, notify_changes, *args):
|
def implementation(db, notify_changes, *args):
|
||||||
is_remote = notify_changes is not None
|
raise NotImplementedError()
|
||||||
is_remote
|
|
||||||
|
|
||||||
|
|
||||||
def option_parser(get_parser, args):
|
def option_parser(get_parser, args):
|
||||||
pass
|
parser = get_parser(
|
||||||
|
_(
|
||||||
|
'''\
|
||||||
|
%prog add_custom_column [options] label name datatype
|
||||||
|
|
||||||
|
Create a custom column. label is the machine friendly name of the column. Should
|
||||||
|
not contain spaces or colons. name is the human friendly name of the column.
|
||||||
|
datatype is one of: {0}
|
||||||
|
'''
|
||||||
|
).format(', '.join(sorted(CustomColumns.CUSTOM_DATA_TYPES)))
|
||||||
|
)
|
||||||
|
|
||||||
|
parser.add_option(
|
||||||
|
'--is-multiple',
|
||||||
|
default=False,
|
||||||
|
action='store_true',
|
||||||
|
help=_(
|
||||||
|
'This column stores tag like data (i.e. '
|
||||||
|
'multiple comma separated values). Only '
|
||||||
|
'applies if datatype is text.'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
parser.add_option(
|
||||||
|
'--display',
|
||||||
|
default='{}',
|
||||||
|
help=_(
|
||||||
|
'A dictionary of options to customize how '
|
||||||
|
'the data in this column will be interpreted. This is a JSON '
|
||||||
|
' string. For enumeration columns, use '
|
||||||
|
'--display="{\\"enum_values\\":[\\"val1\\", \\"val2\\"]}"'
|
||||||
|
'\n'
|
||||||
|
'There are many options that can go into the display variable.'
|
||||||
|
'The options by column type are:\n'
|
||||||
|
'composite: composite_template, composite_sort, make_category,'
|
||||||
|
'contains_html, use_decorations\n'
|
||||||
|
'datetime: date_format\n'
|
||||||
|
'enumeration: enum_values, enum_colors, use_decorations\n'
|
||||||
|
'int, float: number_format\n'
|
||||||
|
'text: is_names, use_decorations\n'
|
||||||
|
'\n'
|
||||||
|
'The best way to find legal combinations is to create a custom '
|
||||||
|
'column of the appropriate type in the GUI then look at the '
|
||||||
|
'backup OPF for a book (ensure that a new OPF has been created '
|
||||||
|
'since the column was added). You will see the JSON for the '
|
||||||
|
'"display" for the new column in the OPF.'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
|
||||||
|
def do_add_custom_column(db, label, name, datatype, is_multiple, display):
|
||||||
|
num = db.create_custom_column(
|
||||||
|
label, name, datatype, is_multiple, display=display
|
||||||
|
)
|
||||||
|
prints('Custom column created with id: %s' % num)
|
||||||
|
|
||||||
|
|
||||||
def main(opts, args, dbctx):
|
def main(opts, args, dbctx):
|
||||||
raise NotImplementedError('TODO: implement this')
|
if len(args) < 3:
|
||||||
|
raise SystemExit(_('You must specify label, name and datatype'))
|
||||||
|
do_add_custom_column(
|
||||||
|
dbctx.db, args[0], args[1], args[2], opts.is_multiple,
|
||||||
|
json.loads(opts.display)
|
||||||
|
)
|
||||||
|
# Update the stored field_metadata
|
||||||
|
dbctx.db.close()
|
||||||
|
db = LibraryDatabase(dbctx.db.library_path)
|
||||||
|
m = db.field_metadata.all_metadata()
|
||||||
|
db.new_api.set_pref('field_metadata', m)
|
||||||
return 0
|
return 0
|
||||||
|
@ -4,19 +4,45 @@
|
|||||||
|
|
||||||
from __future__ import absolute_import, division, print_function, unicode_literals
|
from __future__ import absolute_import, division, print_function, unicode_literals
|
||||||
|
|
||||||
readonly = False
|
from pprint import pformat
|
||||||
|
|
||||||
|
from calibre import prints
|
||||||
|
|
||||||
|
readonly = True
|
||||||
version = 0 # change this if you change signature of implementation()
|
version = 0 # change this if you change signature of implementation()
|
||||||
|
|
||||||
|
|
||||||
def implementation(db, notify_changes, *args):
|
def implementation(db, notify_changes, *args):
|
||||||
is_remote = notify_changes is not None
|
return db.backend.custom_column_label_map
|
||||||
is_remote
|
|
||||||
|
|
||||||
|
|
||||||
def option_parser(get_parser, args):
|
def option_parser(get_parser, args):
|
||||||
pass
|
parser = get_parser(
|
||||||
|
_(
|
||||||
|
'''\
|
||||||
|
%prog custom_columns [options]
|
||||||
|
|
||||||
|
List available custom columns. Shows column labels and ids.
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
)
|
||||||
|
parser.add_option(
|
||||||
|
'-d',
|
||||||
|
'--details',
|
||||||
|
default=False,
|
||||||
|
action='store_true',
|
||||||
|
help=_('Show details for each column.')
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
|
||||||
def main(opts, args, dbctx):
|
def main(opts, args, dbctx):
|
||||||
raise NotImplementedError('TODO: implement this')
|
for col, data in dbctx.run('custom_columns').iteritems():
|
||||||
|
if opts.details:
|
||||||
|
prints(col)
|
||||||
|
print()
|
||||||
|
prints(pformat(data))
|
||||||
|
print('\n')
|
||||||
|
else:
|
||||||
|
prints(col, '(%d)'%data['num'])
|
||||||
return 0
|
return 0
|
||||||
|
@ -4,19 +4,67 @@
|
|||||||
|
|
||||||
from __future__ import absolute_import, division, print_function, unicode_literals
|
from __future__ import absolute_import, division, print_function, unicode_literals
|
||||||
|
|
||||||
|
from calibre import prints
|
||||||
|
from calibre.db.legacy import LibraryDatabase
|
||||||
|
|
||||||
readonly = False
|
readonly = False
|
||||||
version = 0 # change this if you change signature of implementation()
|
version = 0 # change this if you change signature of implementation()
|
||||||
|
no_remote = True
|
||||||
|
|
||||||
|
|
||||||
def implementation(db, notify_changes, *args):
|
def implementation(db, notify_changes, *args):
|
||||||
is_remote = notify_changes is not None
|
raise NotImplementedError()
|
||||||
is_remote
|
|
||||||
|
|
||||||
|
|
||||||
def option_parser(get_parser, args):
|
def option_parser(get_parser, args):
|
||||||
pass
|
parser = get_parser(
|
||||||
|
_(
|
||||||
|
'''\
|
||||||
|
%prog remove_custom_column [options] label
|
||||||
|
|
||||||
|
Remove the custom column identified by label. You can see available
|
||||||
|
columns with the custom_columns command.
|
||||||
|
'''
|
||||||
|
)
|
||||||
|
)
|
||||||
|
parser.add_option(
|
||||||
|
'-f',
|
||||||
|
'--force',
|
||||||
|
default=False,
|
||||||
|
action='store_true',
|
||||||
|
help=_('Do not ask for confirmation')
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
|
||||||
|
def do_remove_custom_column(db, label, force):
|
||||||
|
if not force:
|
||||||
|
q = raw_input(
|
||||||
|
_('You will lose all data in the column: %s.'
|
||||||
|
' Are you sure (y/n)? ') % label
|
||||||
|
)
|
||||||
|
if q.lower().strip() != _('y'):
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
db.delete_custom_column(label=label)
|
||||||
|
except KeyError:
|
||||||
|
raise SystemExit(
|
||||||
|
_(
|
||||||
|
'No column named %s found. You must use column labels, not titles.'
|
||||||
|
' Use calibredb custom_columns to get a list of labels.'
|
||||||
|
) % label
|
||||||
|
)
|
||||||
|
prints('Column %r removed.' % label)
|
||||||
|
|
||||||
|
|
||||||
def main(opts, args, dbctx):
|
def main(opts, args, dbctx):
|
||||||
raise NotImplementedError('TODO: implement this')
|
if len(args) < 1:
|
||||||
|
raise SystemExit(_('Error: You must specify a column label'))
|
||||||
|
|
||||||
|
do_remove_custom_column(dbctx.db, args[0], opts.force)
|
||||||
|
# Update the stored field_metadata
|
||||||
|
dbctx.db.close()
|
||||||
|
db = LibraryDatabase(dbctx.db.library_path)
|
||||||
|
m = db.field_metadata.all_metadata()
|
||||||
|
db.new_api.set_pref('field_metadata', m)
|
||||||
return 0
|
return 0
|
||||||
|
@ -20,10 +20,9 @@ from calibre.utils.serialize import MSGPACK_MIME
|
|||||||
|
|
||||||
COMMANDS = (
|
COMMANDS = (
|
||||||
'list', 'add', 'remove', 'add_format', 'remove_format', 'show_metadata',
|
'list', 'add', 'remove', 'add_format', 'remove_format', 'show_metadata',
|
||||||
'set_metadata', 'export', 'catalog',
|
'set_metadata', 'export', 'catalog', 'saved_searches', 'add_custom_column',
|
||||||
'saved_searches',
|
'custom_columns', 'remove_custom_column',
|
||||||
# 'add_custom_column',
|
# 'set_custom', 'restore_database',
|
||||||
# 'custom_columns', 'remove_custom_column', 'set_custom', 'restore_database',
|
|
||||||
# 'check_library', 'list_categories', 'backup_metadata', 'clone', 'embed_metadata',
|
# 'check_library', 'list_categories', 'backup_metadata', 'clone', 'embed_metadata',
|
||||||
# 'search'
|
# 'search'
|
||||||
)
|
)
|
||||||
|
@ -695,7 +695,7 @@ class LibraryDatabase(object):
|
|||||||
self.new_api.delete_custom_column(label, num)
|
self.new_api.delete_custom_column(label, num)
|
||||||
|
|
||||||
def create_custom_column(self, label, name, datatype, is_multiple, editable=True, display={}):
|
def create_custom_column(self, label, name, datatype, is_multiple, editable=True, display={}):
|
||||||
self.new_api.create_custom_column(label, name, datatype, is_multiple, editable=editable, display=display)
|
return self.new_api.create_custom_column(label, name, datatype, is_multiple, editable=editable, display=display)
|
||||||
|
|
||||||
def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None, display=None,
|
def set_custom_column_metadata(self, num, name=None, label=None, is_editable=None, display=None,
|
||||||
notify=True, update_last_modified=False):
|
notify=True, update_last_modified=False):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user