enhance Book class (to allow non-identical Book copies to be made)
Historically, a new Book made from an old Book argument would contain the exact same BookItem objects as the original Book. That behavior is retained (even though I can't see that it is ever used), but now copies are possible where the BookItems are of the same number and type as the original, but not the exact same BookItem objects. (No "paper" options are copied.) In the process of doing that, the "save" method was slightly tweaked, so its recently-changed (for pylint reasons) strings have their XML terminator on the same (Python) line as the XML-start of the keyword, for more clarity. In the process of checking that a pathological case was noticed where the metric paper option could be Boolean in some cases (instead of the expected zero/one), so that was coped with also.
This commit is contained in:
parent
ed1fa65569
commit
4e3706072e
@ -52,7 +52,7 @@ from xml.sax.saxutils import escape
|
|||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# gramps modules
|
# Gramps modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
from ...const import GRAMPS_LOCALE as glocale
|
from ...const import GRAMPS_LOCALE as glocale
|
||||||
@ -83,6 +83,7 @@ class BookItem:
|
|||||||
def __init__(self, dbase, name):
|
def __init__(self, dbase, name):
|
||||||
"""
|
"""
|
||||||
Create a new empty BookItem.
|
Create a new empty BookItem.
|
||||||
|
TODO: it should be possible to make a non-empty BookItem, a copy
|
||||||
|
|
||||||
name: the book item is retrieved
|
name: the book item is retrieved
|
||||||
from the book item registry using name for lookup
|
from the book item registry using name for lookup
|
||||||
@ -153,15 +154,21 @@ class Book:
|
|||||||
Interface into the user-defined Book -- a collection of book items.
|
Interface into the user-defined Book -- a collection of book items.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, obj=None):
|
def __init__(self, obj=None, exact_copy=True):
|
||||||
"""
|
"""
|
||||||
Create a new empty Book.
|
Create a new empty Book.
|
||||||
|
|
||||||
obj: if not None, creates the Book from the values in
|
@param obj: if not None, creates the Book from obj, from the
|
||||||
obj, instead of creating an empty Book.
|
items in obj, instead of creating an empty Book.
|
||||||
|
@type obj: a :class:`.Book` instance
|
||||||
|
@param exact_copy: if True (and obj is not None) the exact same
|
||||||
|
BookItem objects will be in the new Book;
|
||||||
|
if False (and obj is not None) the same number
|
||||||
|
and same type of BookItem objects will be created
|
||||||
|
@type exact_copy: boolean
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.name = ""
|
self.name = "" # this is tested for, in several places
|
||||||
self.dbname = ""
|
self.dbname = ""
|
||||||
self.paper_name = None
|
self.paper_name = None
|
||||||
self.paper_orientation = None
|
self.paper_orientation = None
|
||||||
@ -170,10 +177,14 @@ class Book:
|
|||||||
self.paper_margins = None
|
self.paper_margins = None
|
||||||
self.paper_format = None
|
self.paper_format = None
|
||||||
self.paper_output = None
|
self.paper_output = None
|
||||||
|
self.item_list = []
|
||||||
if obj:
|
if obj:
|
||||||
self.item_list = obj.item_list
|
if exact_copy:
|
||||||
else:
|
self.item_list = obj.item_list
|
||||||
self.item_list = []
|
else:
|
||||||
|
for item in obj.get_item_list():
|
||||||
|
self.item_list.append(BookItem(item.dbase,
|
||||||
|
item.get_name()))
|
||||||
|
|
||||||
def set_name(self, name):
|
def set_name(self, name):
|
||||||
"""
|
"""
|
||||||
@ -481,8 +492,8 @@ class BookList:
|
|||||||
for name in sorted(self.bookmap): # enable a diff of archived copies
|
for name in sorted(self.bookmap): # enable a diff of archived copies
|
||||||
book = self.get_book(name)
|
book = self.get_book(name)
|
||||||
dbname = book.get_dbname()
|
dbname = book.get_dbname()
|
||||||
b_f.write(' <book name="%s" database="%s"'
|
b_f.write(' <book name="%s" database="%s">'
|
||||||
'>\n' % (name, dbname))
|
'\n' % (name, dbname))
|
||||||
for item in book.get_item_list():
|
for item in book.get_item_list():
|
||||||
b_f.write(' <item name="%s" '
|
b_f.write(' <item name="%s" '
|
||||||
'trans_name="%s">\n' % (
|
'trans_name="%s">\n' % (
|
||||||
@ -517,33 +528,36 @@ class BookList:
|
|||||||
option_type,
|
option_type,
|
||||||
value))
|
value))
|
||||||
|
|
||||||
b_f.write(' <style name="%s"'
|
b_f.write(' <style name="%s"/>'
|
||||||
'/>\n' % item.get_style_name())
|
'\n' % item.get_style_name())
|
||||||
b_f.write(' </item>\n')
|
b_f.write(' </item>\n')
|
||||||
if book.get_paper_name():
|
if book.get_paper_name():
|
||||||
b_f.write(' <paper name="%s"'
|
b_f.write(' <paper name="%s"/>'
|
||||||
'/>\n' % book.get_paper_name())
|
'\n' % book.get_paper_name())
|
||||||
if book.get_orientation() is not None: # 0 is legal
|
if book.get_orientation() is not None: # 0 is legal
|
||||||
b_f.write(' <orientation value="%s"'
|
b_f.write(' <orientation value="%s"/>'
|
||||||
'/>\n' % book.get_orientation())
|
'\n' % book.get_orientation())
|
||||||
if book.get_paper_metric() is not None: # 0 is legal
|
if book.get_paper_metric() is not None: # 0 is legal
|
||||||
b_f.write(' <metric value="%s"'
|
b_p_metric = book.get_paper_metric()
|
||||||
'/>\n' % book.get_paper_metric())
|
if isinstance(b_p_metric, bool):
|
||||||
|
b_p_metric = int(b_p_metric)
|
||||||
|
b_f.write(' <metric value="%s"/>'
|
||||||
|
'\n' % b_p_metric)
|
||||||
if book.get_custom_paper_size():
|
if book.get_custom_paper_size():
|
||||||
size = book.get_custom_paper_size()
|
size = book.get_custom_paper_size()
|
||||||
b_f.write(' <size value="%f %f"'
|
b_f.write(' <size value="%f %f"/>'
|
||||||
'/>\n' % (size[0], size[1]))
|
'\n' % (size[0], size[1]))
|
||||||
if book.get_margins():
|
if book.get_margins():
|
||||||
for pos in range(len(book.get_margins())):
|
for pos in range(len(book.get_margins())):
|
||||||
b_f.write(' <margin number="%s" '
|
b_f.write(' <margin number="%s" '
|
||||||
'value="%f"/>\n' % (
|
'value="%f"/>\n' % (
|
||||||
pos, book.get_margin(pos)))
|
pos, book.get_margin(pos)))
|
||||||
if book.get_format_name():
|
if book.get_format_name():
|
||||||
b_f.write(' <format name="%s"'
|
b_f.write(' <format name="%s"/>'
|
||||||
'/>\n' % book.get_format_name())
|
'\n' % book.get_format_name())
|
||||||
if book.get_output():
|
if book.get_output():
|
||||||
b_f.write(' <output name="%s"'
|
b_f.write(' <output name="%s"/>'
|
||||||
'/>\n' % book.get_output())
|
'\n' % book.get_output())
|
||||||
b_f.write(' </book>\n')
|
b_f.write(' </book>\n')
|
||||||
|
|
||||||
b_f.write('</booklist>\n')
|
b_f.write('</booklist>\n')
|
||||||
@ -559,7 +573,7 @@ class BookList:
|
|||||||
parser.parse(the_file)
|
parser.parse(the_file)
|
||||||
except (IOError, OSError, ValueError, SAXParseException, KeyError,
|
except (IOError, OSError, ValueError, SAXParseException, KeyError,
|
||||||
AttributeError):
|
AttributeError):
|
||||||
pass
|
LOG.debug("Failed to parse book list", exc_info=True)
|
||||||
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user