1) fix problem in rtf metadata writer -- categories isn't a standard option.

2) fix book/base.py to always return a default. That is what python is supposed to do.
3) add ability to code 'key in mi' (the __iter__ function) (base.py)
4) add has_key() to base.py
5) have rename refuse to allow & characters in author names
This commit is contained in:
Charles Haley 2010-09-30 09:45:18 +01:00
parent fa9c23031e
commit bb97bd6cab
4 changed files with 25 additions and 9 deletions

View File

@ -133,6 +133,12 @@ class Metadata(object):
# Don't abuse this privilege # Don't abuse this privilege
self.__dict__[field] = val self.__dict__[field] = val
def __iter__(self):
return object.__getattribute__(self, '_data').iterkeys()
def has_key(self, key):
return key in object.__getattribute__(self, '_data')
def deepcopy(self): def deepcopy(self):
m = Metadata(None) m = Metadata(None)
m.__dict__ = copy.deepcopy(self.__dict__) m.__dict__ = copy.deepcopy(self.__dict__)
@ -140,12 +146,10 @@ class Metadata(object):
return m return m
def get(self, field, default=None): def get(self, field, default=None):
if default is not None: try:
try: return self.__getattribute__(field)
return self.__getattribute__(field) except AttributeError:
except AttributeError: return default
return default
return self.__getattribute__(field)
def get_extra(self, field): def get_extra(self, field):
_data = object.__getattribute__(self, '_data') _data = object.__getattribute__(self, '_data')

View File

@ -125,7 +125,7 @@ def create_metadata(stream, options):
au = u', '.join(au) au = u', '.join(au)
author = au.encode('ascii', 'ignore') author = au.encode('ascii', 'ignore')
md += r'{\author %s}'%(author,) md += r'{\author %s}'%(author,)
if options.category: if options.get('category', None):
category = options.category.encode('ascii', 'ignore') category = options.category.encode('ascii', 'ignore')
md += r'{\category %s}'%(category,) md += r'{\category %s}'%(category,)
comp = options.comment if hasattr(options, 'comment') else options.comments comp = options.comment if hasattr(options, 'comment') else options.comments
@ -180,7 +180,7 @@ def set_metadata(stream, options):
src = pat.sub(r'{\\author ' + author + r'}', src) src = pat.sub(r'{\\author ' + author + r'}', src)
else: else:
src = add_metadata_item(src, 'author', author) src = add_metadata_item(src, 'author', author)
category = options.category category = options.get('category', None)
if category != None: if category != None:
category = category.encode('ascii', 'replace') category = category.encode('ascii', 'replace')
pat = re.compile(base_pat.replace('name', 'category'), re.DOTALL) pat = re.compile(base_pat.replace('name', 'category'), re.DOTALL)

View File

@ -6,6 +6,7 @@ __license__ = 'GPL v3'
from PyQt4.Qt import Qt, QDialog, QTableWidgetItem, QAbstractItemView from PyQt4.Qt import Qt, QDialog, QTableWidgetItem, QAbstractItemView
from calibre.ebooks.metadata import author_to_author_sort from calibre.ebooks.metadata import author_to_author_sort
from calibre.gui2 import error_dialog
from calibre.gui2.dialogs.edit_authors_dialog_ui import Ui_EditAuthorsDialog from calibre.gui2.dialogs.edit_authors_dialog_ui import Ui_EditAuthorsDialog
class tableItem(QTableWidgetItem): class tableItem(QTableWidgetItem):
@ -109,6 +110,12 @@ class EditAuthorsDialog(QDialog, Ui_EditAuthorsDialog):
if col == 0: if col == 0:
item = self.table.item(row, 0) item = self.table.item(row, 0)
aut = unicode(item.text()).strip() aut = unicode(item.text()).strip()
amper = aut.find('&')
if amper >= 0:
error_dialog(self.parent(), _('Invalid author name'),
_('Author names cannot contain & characters.')).exec_()
aut = aut.replace('&', '%')
self.table.item(row, 0).setText(aut)
c = self.table.item(row, 1) c = self.table.item(row, 1)
c.setText(author_to_author_sort(aut)) c.setText(author_to_author_sort(aut))
item = c item = c

View File

@ -505,7 +505,12 @@ class TagsModel(QAbstractItemModel): # {{{
key = item.parent.category_key key = item.parent.category_key
# make certain we know about the item's category # make certain we know about the item's category
if key not in self.db.field_metadata: if key not in self.db.field_metadata:
return return False
if key == 'authors':
if val.find('&') >= 0:
error_dialog(self.tags_view, _('Invalid author name'),
_('Author names cannot contain & characters.')).exec_()
return False
if key == 'search': if key == 'search':
if val in saved_searches().names(): if val in saved_searches().names():
error_dialog(self.tags_view, _('Duplicate search name'), error_dialog(self.tags_view, _('Duplicate search name'),