From 67cb93a28cd4f297e82c57a862db6ce37d08a119 Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Sun, 5 Dec 2010 17:58:56 +0000 Subject: [PATCH] 3719: Pedigree View: should display engagement date if no marriage known; added markup dates to family view to show fallback dates, and invalid dates; pedigreeview shows abbrev. date with markup, and tooltip details svn: r16250 --- src/gen/lib/eventtype.py | 8 +++ src/gen/lib/family.py | 2 +- src/gen/utils/fallback.py | 50 +++++++++++++++++ src/gui/views/treemodels/familymodel.py | 23 +++++--- src/plugins/lib/libformatting.py | 72 ++++++++++++++++++------- src/plugins/view/familyview.py | 4 +- src/plugins/view/pedigreeview.py | 3 +- 7 files changed, 133 insertions(+), 29 deletions(-) diff --git a/src/gen/lib/eventtype.py b/src/gen/lib/eventtype.py index cbdd600e7..db6217b92 100644 --- a/src/gen/lib/eventtype.py +++ b/src/gen/lib/eventtype.py @@ -247,6 +247,14 @@ class EventType(GrampsType): """ return self.value == self.MARRIAGE + def is_marriage_fallback(self): + """ + Returns True if EventType is a marriage fallback, False + otherwise. + """ + return self.value in [self.ENGAGEMENT, + self.MARR_ALT] + def is_divorce(self): """ Returns True if EventType is DIVORCE, False otherwise. diff --git a/src/gen/lib/family.py b/src/gen/lib/family.py index d4086db84..28344937f 100644 --- a/src/gen/lib/family.py +++ b/src/gen/lib/family.py @@ -379,7 +379,7 @@ class Family(SourceBase, NoteBase, MediaBase, AttributeBase, LdsOrdBase, father and mother in the relationship. """ return self.type - + def set_father_handle(self, person_handle): """ Set the database handle for :class:`~gen.lib.person.Person` that corresponds to male of the diff --git a/src/gen/utils/fallback.py b/src/gen/utils/fallback.py index 77b1299ba..35f378bb0 100644 --- a/src/gen/utils/fallback.py +++ b/src/gen/utils/fallback.py @@ -68,3 +68,53 @@ def get_death_or_fallback(db, person, format=None): return event return None +def get_marriage_ref(db, family): + """ + Return a reference to the primary MARRIAGE event of the family. + """ + from gen.lib import EventType, EventRoleType + for event_ref in family.get_event_ref_list(): + event = db.get_event_from_handle(event_ref.ref) + if (event and event.get_type() == EventType.MARRIAGE and + (event_ref.get_role() == EventRoleType.FAMILY or + event_ref.get_role() == EventRoleType.PRIMARY)): + return event_ref + return None + +def get_primary_event_ref_list(db, family): + """ + Return a reference to the primary events of the family. + """ + from gen.lib import EventRoleType + retval = [] + for event_ref in family.get_event_ref_list(): + event = db.get_event_from_handle(event_ref.ref) + if (event and + (event_ref.get_role() == EventRoleType.FAMILY or + event_ref.get_role() == EventRoleType.PRIMARY)): + retval.append(event_ref) + return retval + +def get_marriage_or_fallback(db, family, format=None): + """ + Get a MARRIAGE event from a family, or fallback to an + event around the time of marriage. + """ + from gen.lib import EventRoleType + marriage_ref = get_marriage_ref(db, family) + if marriage_ref: # regular marriage found + event = db.get_event_from_handle(marriage_ref.ref) + if event: + return event + # now search the event list for fallbacks + for event_ref in get_primary_event_ref_list(db, family): + if event_ref: + event = db.get_event_from_handle(event_ref.ref) + if (event + and event.type.is_marriage_fallback() + and (event_ref.role == EventRoleType.FAMILY or + event_ref.role == EventRoleType.PRIMARY)): + if format: + event.date.format = format + return event + return None diff --git a/src/gui/views/treemodels/familymodel.py b/src/gui/views/treemodels/familymodel.py index cc9829b27..b4393c805 100644 --- a/src/gui/views/treemodels/familymodel.py +++ b/src/gui/views/treemodels/familymodel.py @@ -48,8 +48,10 @@ import DateHandler from gen.display.name import displayer as name_displayer import gen.lib from gen.lib import EventRoleType - from gui.views.treemodels.flatbasemodel import FlatBaseModel +import config + +invalid_date_format = config.get('preferences.invalid-date-format') #------------------------------------------------------------------------- # @@ -144,18 +146,23 @@ class FamilyModel(FlatBaseModel): return unicode(gen.lib.FamilyRelType(data[5])) def column_marriage(self, data): - erlist = [gen.lib.EventRef().unserialize(item) for item in data[6]] - erlist = [x for x in erlist if x.get_role()==EventRoleType.FAMILY or - x.get_role()==EventRoleType.PRIMARY] - event = self.db.marriage_from_eventref_list(erlist) + from gen.utils import get_marriage_or_fallback + family = self.db.get_family_from_handle(data[0]) + event = get_marriage_or_fallback(self.db, family, "%s") if event: - return DateHandler.displayer.display(event.date) + if event.date.format: + return event.date.format % DateHandler.displayer.display(event.date) + elif not DateHandler.get_date_valid(event): + return invalid_date_format % DateHandler.displayer.display(event.date) + else: + return "%s" % DateHandler.displayer.display(event.date) else: return u'' def sort_marriage(self, data): - erlist = [gen.lib.EventRef().unserialize(item) for item in data[6]] - event = self.db.marriage_from_eventref_list(erlist) + from gen.utils import get_marriage_or_fallback + family = self.db.get_family_from_handle(data[0]) + event = get_marriage_or_fallback(self.db, family) if event: return "%09d" % event.date.get_sort_value() else: diff --git a/src/plugins/lib/libformatting.py b/src/plugins/lib/libformatting.py index f21d7273a..3de4625bc 100644 --- a/src/plugins/lib/libformatting.py +++ b/src/plugins/lib/libformatting.py @@ -40,7 +40,7 @@ from cgi import escape import gen.lib import DateHandler from gen.display.name import displayer as name_displayer -from gen.utils import get_birth_or_fallback, get_death_or_fallback +from gen.utils import get_birth_or_fallback, get_death_or_fallback, get_marriage_or_fallback #------------------------------------------------------------------------- # @@ -56,28 +56,64 @@ class FormattingHelper(object): self._text_cache = {} self._markup_cache = {} - def format_relation(self, family, line_count): + def format_relation(self, family, line_count, use_markup=False): """ Format a relation between parents of a family """ + if not family: + return "" + if use_markup: + if family.handle in self._markup_cache: + if line_count in self._markup_cache[family.handle]: + return self._markup_cache[family.handle][line_count] + else: + if family.handle in self._text_cache: + if line_count in self._text_cache[family.handle]: + return self._text_cache[family.handle][line_count] + text = "" - for event_ref in family.get_event_ref_list(): - event = self.dbstate.db.get_event_from_handle(event_ref.ref) - if event and event.get_type() == gen.lib.EventType.MARRIAGE and \ - (event_ref.get_role() == gen.lib.EventRoleType.FAMILY or - event_ref.get_role() == gen.lib.EventRoleType.PRIMARY ): - if line_count < 3: - return DateHandler.get_date(event) - name = str(event.get_type()) - text += name - text += "\n" - text += DateHandler.get_date(event) - text += "\n" - text += self.get_place_name(event.get_place_handle()) - if line_count < 5: - return text - break + marriage = get_marriage_or_fallback(self.dbstate.db, family) + if marriage and use_markup and marriage.get_type() != gen.lib.EventType.MARRIAGE: + mdate = "%s %s" % (marriage.get_type().get_abbreviation(), + escape(DateHandler.get_date(marriage))) + mplace = "%s" % escape(self.get_place_name(marriage.get_place_handle())) + name = "%s" % str(marriage.get_type()) + elif marriage and use_markup: + mdate = "%s %s" % (marriage.get_type().get_abbreviation(), + escape(DateHandler.get_date(marriage))) + mplace = escape(self.get_place_name(marriage.get_place_handle())) + name = str(marriage.get_type()) + elif marriage: + mdate = "%s %s" % (marriage.get_type().get_abbreviation(), + DateHandler.get_date(marriage)) + mplace = self.get_place_name(marriage.get_place_handle()) + name = str(marriage.get_type()) + else: + mdate = "" + mplace = "" + name = "" + + if line_count >= 1: + text += mdate + text += "\n" + if line_count >= 2: + text += name + text += "\n" + if line_count >= 3: + text += mplace + text += "\n" + if not text: text = str(family.get_relationship()) + + if use_markup: + if not family.handle in self._markup_cache: + self._markup_cache[family.handle] = {} + self._markup_cache[family.handle][line_count] = text + else: + if not family.handle in self._text_cache: + self._text_cache[family.handle] = {} + self._text_cache[family.handle][line_count] = text + return text def get_place_name(self, place_handle): diff --git a/src/plugins/view/familyview.py b/src/plugins/view/familyview.py index 69ae1813e..2e807cd50 100644 --- a/src/plugins/view/familyview.py +++ b/src/plugins/view/familyview.py @@ -73,6 +73,7 @@ class FamilyView(ListView): COL_TAGS = 5 COL_CHAN = 6 # name of the columns + MARKUP_COLS = [COL_MARDATE] COLUMN_NAMES = [ _('ID'), _('Father'), @@ -114,7 +115,8 @@ class FamilyView(ListView): signal_map, dbstate.db.get_family_bookmarks(), Bookmarks.FamilyBookmarks, nav_group, multiple=True, - filter_class=FamilySidebarFilter) + filter_class=FamilySidebarFilter, + markup=FamilyView.MARKUP_COLS) self.func_list.update({ 'J' : self.jump, diff --git a/src/plugins/view/pedigreeview.py b/src/plugins/view/pedigreeview.py index 3430b57b9..411bab722 100644 --- a/src/plugins/view/pedigreeview.py +++ b/src/plugins/view/pedigreeview.py @@ -1218,11 +1218,12 @@ class PedigreeView(NavigationView): ((self.tree_style == 1 and positions[i][2]) or (self.tree_style in [0, 2] and (level+1) < size)): if lst[i] and lst[i][2]: - text = self.format_helper.format_relation(lst[i][2], 1) + text = self.format_helper.format_relation(lst[i][2], 1, True) else: text = " " label = gtk.Label(text) label.set_justify(gtk.JUSTIFY_LEFT) + label.set_use_markup(True) label.set_line_wrap(True) label.set_alignment(0.1, 0.5) if self.tree_style in [0, 2]: