py3: misc fixes. calibre GUI now starts under python 3

This commit is contained in:
Kovid Goyal 2019-04-10 14:31:53 +05:30
parent d6b6d4c892
commit 8569717d98
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
14 changed files with 45 additions and 19 deletions

View File

@ -152,8 +152,11 @@ class DBPrefs(dict): # {{{
def write_serialized(self, library_path):
try:
to_filename = os.path.join(library_path, 'metadata_db_prefs_backup.json')
data = json.dumps(self, indent=2, default=to_json)
if not isinstance(data, bytes):
data = data.encode('utf-8')
with open(to_filename, "wb") as f:
f.write(json.dumps(self, indent=2, default=to_json))
f.write(data)
except:
import traceback
traceback.print_exc()

View File

@ -75,7 +75,7 @@ class Tag(object):
def find_categories(field_metadata):
for category, cat in iteritems(field_metadata):
for category, cat in field_metadata.iter_items():
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

View File

@ -632,7 +632,7 @@ class Parser(SearchQueryParser): # {{{
text_fields = set()
field_metadata = {}
for x, fm in iteritems(self.field_metadata):
for x, fm in self.field_metadata.iter_items():
if x.startswith('@'):
continue
if fm['search_terms'] and x not in {'series_sort', 'id'}:

View File

@ -128,13 +128,19 @@ class USBMS(CLI, Device):
driveinfo = None
driveinfo = self._update_driveinfo_record(driveinfo, prefix,
location_code, name)
data = json.dumps(driveinfo, default=to_json)
if not isinstance(data, bytes):
data = data.encode('utf-8')
with lopen(os.path.join(prefix, self.DRIVEINFO), 'wb') as f:
f.write(json.dumps(driveinfo, default=to_json))
f.write(data)
fsync(f)
else:
driveinfo = self._update_driveinfo_record({}, prefix, location_code, name)
data = json.dumps(driveinfo, default=to_json)
if not isinstance(data, bytes):
data = data.encode('utf-8')
with lopen(os.path.join(prefix, self.DRIVEINFO), 'wb') as f:
f.write(json.dumps(driveinfo, default=to_json))
f.write(data)
fsync(f)
return driveinfo

View File

@ -132,8 +132,10 @@ class JsonCodec(object):
self.field_metadata = field_metadata or FieldMetadata()
def encode_to_file(self, file_, booklist):
file_.write(json.dumps(self.encode_booklist_metadata(booklist),
indent=2, encoding='utf-8'))
data = json.dumps(self.encode_booklist_metadata(booklist), indent=2, encoding='utf-8')
if not isinstance(data, bytes):
data = data.encode('utf-8')
file_.write(data)
def encode_booklist_metadata(self, booklist):
result = []

View File

@ -45,7 +45,7 @@ def get_plugin_updates_available(raise_error=False):
return None
display_plugins = read_available_plugins(raise_error=raise_error)
if display_plugins:
update_plugins = filter(filter_upgradeable_plugins, display_plugins)
update_plugins = list(filter(filter_upgradeable_plugins, display_plugins))
if len(update_plugins) > 0:
return update_plugins
return None
@ -589,7 +589,7 @@ class PluginUpdaterDialog(SizePersistedDialog):
def _finished(self, *args):
if self.model:
update_plugins = filter(filter_upgradeable_plugins, self.model.display_plugins)
update_plugins = list(filter(filter_upgradeable_plugins, self.model.display_plugins))
self.gui.recalc_update_label(len(update_plugins))
def _plugin_current_changed(self, current, previous):

View File

@ -19,7 +19,7 @@ from calibre.utils.icu import sort_key
from calibre.utils.config import tweaks
from calibre.utils.date import now
from calibre.utils.localization import localize_user_manual_link
from polyglot.builtins import iteritems, unicode_type, range
from polyglot.builtins import unicode_type, range
box_values = {}
last_matchkind = CONTAINS_MATCH
@ -174,7 +174,7 @@ def create_date_tab(self, db):
w.h1 = h = QHBoxLayout()
l.addLayout(h)
self.date_field = df = add(_("&Search the"), QComboBox(w))
vals = [((v['search_terms'] or [k])[0], v['name'] or k) for k, v in iteritems(db.field_metadata) if v.get('datatype', None) == 'datetime']
vals = [((v['search_terms'] or [k])[0], v['name'] or k) for k, v in db.field_metadata.iter_items() if v.get('datatype', None) == 'datetime']
for k, v in sorted(vals, key=lambda k_v: sort_key(k_v[1])):
df.addItem(v, k)
h.addWidget(df)

View File

@ -202,7 +202,7 @@ def get_val_for_textlike_columns(index_):
class RatingDelegate(QStyledItemDelegate, UpdateEditorGeometry): # {{{
def __init__(self, *args, **kwargs):
QStyledItemDelegate.__init__(self, *args, **kwargs)
QStyledItemDelegate.__init__(self, *args)
self.is_half_star = kwargs.get('is_half_star', False)
self.table_widget = args[0]
self.rf = QFont(rating_font())

View File

@ -1090,8 +1090,11 @@ class EditRules(QWidget): # {{{
'type': self.model.pref_name,
'rules': self.model.rules_as_list(for_export=True)
}
data = json.dumps(rules, indent=2)
if not isinstance(data, bytes):
data = data.encode('utf-8')
with lopen(path, 'wb') as f:
f.write(json.dumps(rules, indent=2))
f.write(data)
def import_rules(self):
files = choose_files(self, 'import-coloring-rules', _('Choose file to import from'),

View File

@ -129,9 +129,11 @@ class ThreadedJob(BaseJob):
if not os.path.exists(log_dir):
os.makedirs(log_dir)
fd, path = tempfile.mkstemp(suffix='.json', prefix='log-', dir=log_dir)
data = json.dumps(logs, ensure_ascii=False, indent=2)
if not isinstance(data, bytes):
data = data.encode('utf-8')
with os.fdopen(fd, 'wb') as f:
f.write(json.dumps(logs, ensure_ascii=False,
indent=2).encode('utf-8'))
f.write(data)
self.consolidated_log = path
self.log = None

View File

@ -200,8 +200,11 @@ class BookmarkManager(QWidget):
self, 'export-viewer-bookmarks', _('Export bookmarks'),
filters=[(_('Saved bookmarks'), ['calibre-bookmarks'])], all_files=False, initial_filename='bookmarks.calibre-bookmarks')
if filename:
data = json.dumps(self.get_bookmarks(), indent=True)
if not isinstance(data, bytes):
data = data.encode('utf-8')
with lopen(filename, 'wb') as fileobj:
fileobj.write(json.dumps(self.get_bookmarks(), indent=True))
fileobj.write(data)
def import_bookmarks(self):
files = choose_files(self, 'export-viewer-bookmarks', _('Import bookmarks'),

View File

@ -493,13 +493,14 @@ class FieldMetadata(object):
def iteritems(self):
for key in self._tb_cats:
yield (key, self._tb_cats[key])
iter_items = iteritems
def custom_iteritems(self):
for key, meta in iteritems(self._tb_custom_fields):
yield (key, meta)
def items(self):
return list(iteritems(self))
return list(self.iter_items())
def is_custom_field(self, key):
return key.startswith(self.custom_field_prefix)

View File

@ -81,8 +81,11 @@ class DBPrefs(dict):
def write_serialized(self, library_path):
try:
to_filename = os.path.join(library_path, 'metadata_db_prefs_backup.json')
data = json.dumps(self, indent=2, default=to_json)
if not isinstance(data, bytes):
data = data.encode('utf-8')
with open(to_filename, "wb") as f:
f.write(json.dumps(self, indent=2, default=to_json))
f.write(data)
except:
import traceback
traceback.print_exc()

View File

@ -230,8 +230,11 @@ class Container(ContainerBase):
self.commit()
for name in excluded_names:
os.remove(self.name_path_map[name])
data = json.dumps(self.book_render_data, ensure_ascii=False)
if not isinstance(data, bytes):
data = data.encode('utf-8')
with lopen(os.path.join(self.root, 'calibre-book-manifest.json'), 'wb') as f:
f.write(json.dumps(self.book_render_data, ensure_ascii=False).encode('utf-8'))
f.write(data)
def create_cover_page(self, input_fmt):
templ = '''