2007-04-17 Don Allingham <don@gramps-project.org>

* src/DataViews/_FamilyList.py: add marriage date column
	* src/GrampsDb/_DbUtils.py: add function for finding a marriage event
	* src/DisplayModels/_FamilyModel.py: add marriage date column
	* src/GrampsDbUtils/_GedcomParse.py: handle place form handing
	* src/GrampsDbUtils/_GedcomLex.py: handle place form handing
	* src/GrampsDbUtils/_WriteGedcom.py: handle note list
	* src/docgen/ODFDoc.py: escape special characters



svn: r8398
This commit is contained in:
Don Allingham 2007-04-18 02:12:40 +00:00
parent ec251900c5
commit 6edbffe3a3
10 changed files with 84 additions and 41 deletions

View File

@ -1,3 +1,12 @@
2007-04-17 Don Allingham <don@gramps-project.org>
* src/DataViews/_FamilyList.py: add marriage date column
* src/GrampsDb/_DbUtils.py: add function for finding a marriage event
* src/DisplayModels/_FamilyModel.py: add marriage date column
* src/GrampsDbUtils/_GedcomParse.py: handle place form handing
* src/GrampsDbUtils/_GedcomLex.py: handle place form handing
* src/GrampsDbUtils/_WriteGedcom.py: handle note list
* src/docgen/ODFDoc.py: escape special characters
2007-04-17 Benny Malengier <bm@cage.ugent.be> 2007-04-17 Benny Malengier <bm@cage.ugent.be>
* src/images/ * src/images/
* src/GrampsWidgets.py * src/GrampsWidgets.py

View File

@ -52,6 +52,7 @@ column_names = [
_('Father'), _('Father'),
_('Mother'), _('Mother'),
_('Relationship'), _('Relationship'),
_('Marriage Date'),
_('Last Changed'), _('Last Changed'),
] ]

View File

@ -123,8 +123,10 @@ class RelationshipView(PageView.PersonNavView):
self.redrawing = False self.redrawing = False
self.use_shade = Config.get(Config.RELATION_SHADE) self.use_shade = Config.get(Config.RELATION_SHADE)
self.toolbar_visible = Config.get(Config.TOOLBAR_ON) self.toolbar_visible = Config.get(Config.TOOLBAR_ON)
self.color = gtk.TextView().style.white self.color = gtk.TextView().style.white
self.child = None self.child = None
Config.client.notify_add("/apps/gramps/preferences/relation-shade", Config.client.notify_add("/apps/gramps/preferences/relation-shade",
self.shade_update) self.shade_update)
Config.client.notify_add("/apps/gramps/interface/editbutton", Config.client.notify_add("/apps/gramps/interface/editbutton",

View File

@ -43,8 +43,10 @@ import gtk
import const import const
import ToolTips import ToolTips
import GrampsLocale import GrampsLocale
import DateHandler
from BasicUtils import NameDisplay from BasicUtils import NameDisplay
import RelLib import RelLib
import GrampsDb
from _BaseModel import BaseModel from _BaseModel import BaseModel
@ -66,6 +68,7 @@ class FamilyModel(BaseModel):
self.column_father, self.column_father,
self.column_mother, self.column_mother,
self.column_type, self.column_type,
self.column_marriage,
self.column_change, self.column_change,
self.column_handle, self.column_handle,
self.column_tooltip, self.column_tooltip,
@ -77,13 +80,14 @@ class FamilyModel(BaseModel):
self.sort_father, self.sort_father,
self.sort_mother, self.sort_mother,
self.column_type, self.column_type,
self.sort_marriage,
self.sort_change, self.sort_change,
self.column_handle, self.column_handle,
self.column_tooltip, self.column_tooltip,
self.column_marker_text, self.column_marker_text,
self.column_marker_color, self.column_marker_color,
] ]
self.marker_color_column = 8 self.marker_color_column = 9
BaseModel.__init__(self, db, scol, order, tooltip_column=6, BaseModel.__init__(self, db, scol, order, tooltip_column=6,
search=search, skip=skip, sort_map=sort_map) search=search, skip=skip, sort_map=sort_map)
@ -124,6 +128,22 @@ class FamilyModel(BaseModel):
def column_type(self, data): def column_type(self, data):
return str(RelLib.FamilyRelType(data[5])) return str(RelLib.FamilyRelType(data[5]))
def column_marriage(self, data):
erlist = [ RelLib.EventRef().unserialize(d) for d in data[6] ]
event = GrampsDb.marriage_from_eventref_list(self.db, erlist)
if event:
return DateHandler.displayer.display(event.date)
else:
return u''
def sort_marriage(self, data):
erlist = [ RelLib.EventRef().unserialize(d) for d in data[6] ]
event = GrampsDb.marriage_from_eventref_list(self.db, erlist)
if event:
return "%09d" % event.date.get_sort_value()
else:
return u''
def column_id(self, data): def column_id(self, data):
return unicode(data[1]) return unicode(data[1])

View File

@ -704,7 +704,6 @@ class PeopleModel(gtk.GenericTreeModel):
else: else:
return u'' return u''
def column_int_id(self, data, node): def column_int_id(self, data, node):
return node return node

View File

@ -164,6 +164,13 @@ def remove_child_from_family(db, person_handle, family_handle, trans=None):
if need_commit: if need_commit:
db.transaction_commit(trans,_("Remove child from family")) db.transaction_commit(trans,_("Remove child from family"))
def marriage_from_eventref_list(db, eventref_list):
for eventref in eventref_list:
event = db.get_event_from_handle(eventref.ref)
if int(event.get_type()) == RelLib.EventType.MARRIAGE:
return event
else:
return None
def add_child_to_family(db, family, child, def add_child_to_family(db, family, child,
mrel=RelLib.ChildRefType(), mrel=RelLib.ChildRefType(),

View File

@ -253,6 +253,9 @@ def extract_date(text):
Converts the specified text to a RelLib.Date object. Converts the specified text to a RelLib.Date object.
""" """
dateobj = RelLib.Date() dateobj = RelLib.Date()
text = text.replace('BET ABT','EST BET') # Horrible hack for Tim Lyons
try: try:
# extract out the MOD line # extract out the MOD line
match = MOD.match(text) match = MOD.match(text)
@ -265,7 +268,7 @@ def extract_date(text):
# parse the range if we match, if so, return # parse the range if we match, if so, return
match = RANGE.match(text) match = RANGE.match(text)
if match: if match:
(cal1, data1, cal2, data2) = match.groups() (cal1, data1, ignore, cal2, data2) = match.groups()
cal = CALENDAR_MAP.get(cal1, RelLib.Date.CAL_GREGORIAN) cal = CALENDAR_MAP.get(cal1, RelLib.Date.CAL_GREGORIAN)

View File

@ -4141,7 +4141,7 @@ class GedcomParser(UpdateCallback):
""" """
self.gedsource = self.gedmap.get_from_source_tag(line.data) self.gedsource = self.gedmap.get_from_source_tag(line.data)
self.lexer.set_broken_conc(self.gedsource.get_conc()) self.lexer.set_broken_conc(self.gedsource.get_conc())
if line.data == "FTW": if line.data.strip() == "FTW":
self.is_ftw = True self.is_ftw = True
elif line.data == "Ancestry.com Family Trees": elif line.data == "Ancestry.com Family Trees":
self.is_ancestry_com = True self.is_ancestry_com = True
@ -4207,7 +4207,8 @@ class GedcomParser(UpdateCallback):
@param state: The current state @param state: The current state
@type state: CurrentState @type state: CurrentState
""" """
self.__parse_level(state, self.place_form, self.__undefined) sub_state = GedcomUtils.CurrentState(level=state.level+1)
self.__parse_level(sub_state, self.place_form, self.__undefined)
def __place_form(self, line, state): def __place_form(self, line, state):
""" """

View File

@ -722,8 +722,8 @@ class GedcomWriter(UpdateCallback):
else: else:
self.writeln("2 TYPE %s" % self.cnvtxt(the_name)) self.writeln("2 TYPE %s" % self.cnvtxt(the_name))
if attr.get_note(): for note in attr.get_note_list():
self.write_long_text("NOTE",2,self.cnvtxt(attr.get_note())) self.write_long_text("NOTE",2,self.cnvtxt(note))
for srcref in attr.get_source_references(): for srcref in attr.get_source_references():
self.write_source_ref(2,srcref) self.write_source_ref(2,srcref)
@ -764,8 +764,8 @@ class GedcomWriter(UpdateCallback):
continue continue
self.write_photo(photo,1) self.write_photo(photo,1)
if family.get_note(): for note in family.get_note_list():
self.write_long_text("NOTE",1,self.cnvtxt(family.get_note())) self.write_long_text("NOTE",1,self.cnvtxt(note))
self.write_change(1,family.get_change_time()) self.write_change(1,family.get_change_time())
self.update() self.update()
@ -809,8 +809,8 @@ class GedcomWriter(UpdateCallback):
for reporef in source.get_reporef_list(): for reporef in source.get_reporef_list():
self.write_reporef(reporef,1) self.write_reporef(reporef,1)
if source.get_note(): for note in source.get_note_list():
self.write_long_text("NOTE",1,self.cnvtxt(source.get_note())) self.write_long_text("NOTE",1,self.cnvtxt(note))
self.write_change(1,source.get_change_time()) self.write_change(1,source.get_change_time())
def write_repos(self): def write_repos(self):
@ -850,8 +850,8 @@ class GedcomWriter(UpdateCallback):
self.writeln("1 PHON %s" self.writeln("1 PHON %s"
% self.cnvtxt(addr.get_phone())) % self.cnvtxt(addr.get_phone()))
if repo.get_note(): for note in repo.get_note_list():
self.write_long_text("NOTE",1,self.cnvtxt(repo.get_note())) self.write_long_text("NOTE",1,self.cnvtxt(note))
def write_reporef(self,reporef,level): def write_reporef(self,reporef,level):
@ -866,9 +866,9 @@ class GedcomWriter(UpdateCallback):
self.writeln("%d REPO @%s@" % (level,repo_id) ) self.writeln("%d REPO @%s@" % (level,repo_id) )
if reporef.get_note(): for note in reporef.get_note_list():
self.write_long_text("NOTE",level+1, self.write_long_text("NOTE",level+1,
self.cnvtxt(reporef.get_note())) self.cnvtxt(note))
if reporef.get_call_number(): if reporef.get_call_number():
self.writeln("%d CALN %s" % self.writeln("%d CALN %s" %
@ -895,7 +895,7 @@ class GedcomWriter(UpdateCallback):
if restricted and self.exclnotes: if restricted and self.exclnotes:
primaryname = RelLib.Name (primaryname) primaryname = RelLib.Name (primaryname)
primaryname.set_note ('') primaryname.set_note_list ([])
if restricted and self.exclsrcs: if restricted and self.exclsrcs:
primaryname = RelLib.Name (primaryname) primaryname = RelLib.Name (primaryname)
@ -1070,8 +1070,8 @@ class GedcomWriter(UpdateCallback):
else: else:
self.writeln("2 TYPE %s" % self.cnvtxt(key)) self.writeln("2 TYPE %s" % self.cnvtxt(key))
if attr.get_note(): for note in attr.get_note_list():
self.write_long_text("NOTE",2,self.cnvtxt(attr.get_note())) self.write_long_text("NOTE", 2, self.cnvtxt(note))
for srcref in attr.get_source_references(): for srcref in attr.get_source_references():
self.write_source_ref(2,srcref) self.write_source_ref(2,srcref)
@ -1108,8 +1108,8 @@ class GedcomWriter(UpdateCallback):
if text: if text:
self.writeln("2 PLAC %s" self.writeln("2 PLAC %s"
% self.cnvtxt(text).replace('\r',' ')) % self.cnvtxt(text).replace('\r',' '))
if addr.get_note(): for note in addr.get_note_list():
self.write_long_text("NOTE",2,self.cnvtxt(addr.get_note())) self.write_long_text("NOTE", 2, self.cnvtxt(note))
for srcref in addr.get_source_references(): for srcref in addr.get_source_references():
self.write_source_ref(2,srcref) self.write_source_ref(2,srcref)
@ -1157,8 +1157,8 @@ class GedcomWriter(UpdateCallback):
self.writeln('2 FILE %s' % url.get_path()) self.writeln('2 FILE %s' % url.get_path())
if not restricted or not self.exclnotes: if not restricted or not self.exclnotes:
if person.get_note(): for note in person.get_note_list():
self.write_long_text("NOTE",1,self.cnvtxt(person.get_note())) self.write_long_text("NOTE", 1, self.cnvtxt(note))
self.write_change(1,person.get_change_time()) self.write_change(1,person.get_change_time())
@ -1267,8 +1267,8 @@ class GedcomWriter(UpdateCallback):
elif t == RelLib.AttributeType.MOTHER_AGE: elif t == RelLib.AttributeType.MOTHER_AGE:
self.writeln("2 WIFE") self.writeln("2 WIFE")
self.writeln("3 AGE %s" % self.cnvtxt(attr.get_value())) self.writeln("3 AGE %s" % self.cnvtxt(attr.get_value()))
if event.get_note(): for note in event.get_note_list():
self.write_long_text("NOTE",2,self.cnvtxt(event.get_note())) self.write_long_text("NOTE", 2, self.cnvtxt(note))
for srcref in event.get_source_references(): for srcref in event.get_source_references():
self.write_source_ref(2,srcref) self.write_source_ref(2,srcref)
@ -1302,8 +1302,8 @@ class GedcomWriter(UpdateCallback):
if ord.get_status() != RelLib.LdsOrd.STATUS_NONE: if ord.get_status() != RelLib.LdsOrd.STATUS_NONE:
self.writeln("2 STAT %s" % self.writeln("2 STAT %s" %
self.cnvtxt(lds_status[ord.get_status()])) self.cnvtxt(lds_status[ord.get_status()]))
if ord.get_note(): for note in ord.get_note_list():
self.write_long_text("NOTE",index+1,self.cnvtxt(ord.get_note())) self.write_long_text("NOTE", index+1, self.cnvtxt(note))
for srcref in ord.get_source_references(): for srcref in ord.get_source_references():
self.write_source_ref(index+1,srcref) self.write_source_ref(index+1,srcref)
@ -1368,8 +1368,8 @@ class GedcomWriter(UpdateCallback):
self.writeln("2 NPFX %s" % title) self.writeln("2 NPFX %s" % title)
if nick: if nick:
self.writeln('2 NICK %s' % nick) self.writeln('2 NICK %s' % nick)
if name.get_note(): for note in name.get_note_list():
self.write_long_text("NOTE",2,self.cnvtxt(name.get_note())) self.write_long_text("NOTE", 2, self.cnvtxt(note))
for srcref in name.get_source_references(): for srcref in name.get_source_references():
self.write_source_ref(2,srcref) self.write_source_ref(2,srcref)
@ -1392,8 +1392,9 @@ class GedcomWriter(UpdateCallback):
# Reference to the source # Reference to the source
self.writeln("%d SOUR @%s@" % (level,src.get_gramps_id())) self.writeln("%d SOUR @%s@" % (level,src.get_gramps_id()))
if ref.get_page() != "": if ref.get_page() != "":
page_text = self.cnvtxt(ref.get_page()) sep = "\n%d CONT " % (level+2)
self.writeln('%d PAGE %s' % (level+1,page_text)) page_text = self.cnvtxt(ref.get_page().replace('\n',sep))
self.writeln('%d PAGE %s' % (level+1, page_text))
conf = ref.get_confidence_level() conf = ref.get_confidence_level()
# Cap the maximum level # Cap the maximum level
conf = min(conf,RelLib.SourceRef.CONF_VERY_HIGH) conf = min(conf,RelLib.SourceRef.CONF_VERY_HIGH)
@ -1426,8 +1427,8 @@ class GedcomWriter(UpdateCallback):
if ref_text: if ref_text:
self.write_long_text("TEXT",level+1,self.cnvtxt(ref_text)) self.write_long_text("TEXT",level+1,self.cnvtxt(ref_text))
if ref.get_note(): for note in ref.get_note_list():
self.write_long_text("NOTE",level+1,self.cnvtxt(ref.get_note())) self.write_long_text("NOTE", level+1, self.cnvtxt(note))
def write_photo(self,photo,level): def write_photo(self,photo,level):
photo_obj_id = photo.get_reference_handle() photo_obj_id = photo.get_reference_handle()
@ -1465,9 +1466,8 @@ class GedcomWriter(UpdateCallback):
basename = os.path.basename (path) basename = os.path.basename (path)
self.writeln('%d FILE %s' % (level+1,os.path.join(self.images_path, self.writeln('%d FILE %s' % (level+1,os.path.join(self.images_path,
basename))) basename)))
if photo_obj.get_note(): for note in photo_obj.get_note_list():
self.write_long_text("NOTE",level+1, self.write_long_text("NOTE", level+1, self.cnvtxt(note))
self.cnvtxt(photo_obj.get_note()))
def write_place(self,place,level): def write_place(self,place,level):
if self.private and place.private: if self.private and place.private:
@ -1496,8 +1496,8 @@ def exportData(database,filename,person,option_box,callback=None):
try: try:
gw = GedcomWriter(database,person,0,filename,option_box,callback) gw = GedcomWriter(database,person,0,filename,option_box,callback)
ret = gw.export_data(filename) ret = gw.export_data(filename)
except AttributeError, msg: # except AttributeError, msg:
RunDatabaseRepair(msg) # RunDatabaseRepair(msg)
except Errors.DatabaseError, msg: except Errors.DatabaseError, msg:
ErrorDialog(_("Export failed"),str(msg)) ErrorDialog(_("Export failed"),str(msg))
return ret return ret

View File

@ -32,6 +32,7 @@ import time
import locale import locale
from cStringIO import StringIO from cStringIO import StringIO
from math import pi, cos, sin from math import pi, cos, sin
from xml.sax.saxutils import escape
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
@ -853,7 +854,7 @@ class ODFDoc(BaseDoc.BaseDoc):
self.start_paragraph(style_name) self.start_paragraph(style_name)
self.cntnt.write('<text:span text:style-name="GRAMPS-preformat">') self.cntnt.write('<text:span text:style-name="GRAMPS-preformat">')
self.cntnt.write(text) self.cntnt.write(escape(text))
self.cntnt.write('</text:span>') self.cntnt.write('</text:span>')
self.end_paragraph() self.end_paragraph()
elif format == 0: elif format == 0:
@ -997,7 +998,7 @@ class ODFDoc(BaseDoc.BaseDoc):
self.cntnt.write('<text:p text:style-name="X%s"> ' % pname) self.cntnt.write('<text:p text:style-name="X%s"> ' % pname)
self.cntnt.write('<text:span text:style-name="F%s">\n' % pname) self.cntnt.write('<text:span text:style-name="F%s">\n' % pname)
self.write_text('\n'.join(text)) self.write_text('\n'.join(escape(text)))
self.cntnt.write('</text:span>\n</text:p>\n</draw:text-box>\n') self.cntnt.write('</text:span>\n</text:p>\n</draw:text-box>\n')
self.cntnt.write('</draw:frame>\n') self.cntnt.write('</draw:frame>\n')
@ -1066,7 +1067,7 @@ class ODFDoc(BaseDoc.BaseDoc):
self.cntnt.write('<text:p text:style-name="F%s">' % para_name) self.cntnt.write('<text:p text:style-name="F%s">' % para_name)
self.cntnt.write('<text:span text:style-name="F%s"' % para_name) self.cntnt.write('<text:span text:style-name="F%s"' % para_name)
self.cntnt.write(' fo:max-height="%.2f">' % font.get_size() ) self.cntnt.write(' fo:max-height="%.2f">' % font.get_size() )
self.cntnt.write(text) self.cntnt.write(escape(text))
self.cntnt.write('</text:span></text:p>') self.cntnt.write('</text:span></text:p>')
self.cntnt.write('</draw:text-box>\n') self.cntnt.write('</draw:text-box>\n')
self.cntnt.write('</draw:frame>\n') self.cntnt.write('</draw:frame>\n')
@ -1124,7 +1125,7 @@ class ODFDoc(BaseDoc.BaseDoc):
self.cntnt.write('<draw:text-box>') self.cntnt.write('<draw:text-box>')
self.cntnt.write('<text:p text:style-name="X%s">' % para_name) self.cntnt.write('<text:p text:style-name="X%s">' % para_name)
self.cntnt.write('<text:span text:style-name="F%s">' % para_name) self.cntnt.write('<text:span text:style-name="F%s">' % para_name)
self.cntnt.write(text) self.cntnt.write(escape(text))
self.cntnt.write('</text:span>\n') self.cntnt.write('</text:span>\n')
self.cntnt.write('</text:p>\n') self.cntnt.write('</text:p>\n')
self.cntnt.write('</draw:text-box>') self.cntnt.write('</draw:text-box>')