From: Don A. <don...@co...> - 2006-01-25 13:53:34
|
Brian, I take this as no one having any objections, not that no one is interested. I'll apply the patch later today, test it, and commit to cvs. Don On Wed, 2006-01-25 at 05:18 -0800, Brian Matherly wrote: > Don, > =20 > No one seems to be interested in this topic. Does this mean it will be c= ommitted to CVS or will be left out? > =20 > Thanks, > =20 > ~Brian >=20 > ----- Original Message ---- > From: Brian Matherly <pez...@us...> > To: gra...@li... > Sent: Sun 22 Jan 2006 04:53:04 PM CST > Subject: [Gramps-devel] New Family Group Report Options >=20 > Greetings. > =20 > I have been playing around with the family group report. I have added so= me options for your consideration.=20 > =20 > The most significant option is the "Recursive" option. This option print= s a Family Group Report for every family (with a page break between) that i= s a decendant of the chosen family. One thing to note is that it prints the= se reports in a recursive fashion. This means that each generation is not c= ollected together. In other words, if you made a Detailed Decendant Report,= the people might come out in the following generation order: > 122223333333333344444 > In the Recursive Family Group Report the people would be in the followin= g generation order: > 123443432343234333233 > This might be a completely non-standard order for things. It would be ni= ce for some serious geneologists to chime in here (I only consider myself a= hobyist). I personally like this order because it keeps children in proxim= ity to their parents. Another reason I like it is because my uncle has some= binders with family group reports in this order. I find it easier to searc= h for people when they are in this order and there is no index. > =20 > Other options I added: > *Include Generation Numbers - print generation numbers at the top of eac= h report when creating a recursive report > *Include Parent Events - print all events for each parent; not just birt= h and death > *Include Parent Addresses - print all addresses for each parent > *Include Parent Alternate Names > *Include Parent Notes > *Print fields for missing information - By default fields are printed ev= en if there is no information. This option allow them to be omitted to save= space. > =20 > The default values are set for each option so that if nothing is changed= , the report will come out exactly as it did with the original report. > =20 > Attached is a patch that includes these changes. Please consider it for = inclusion in Gramps 2.0.10. Also, I would really appreciate any feedback ab= out the patch regarding style, features, gui labels, and anything else. > =20 > Regards, > =20 > ~Brian > =20 >=20 >=20 >=20 >=20 >=20 > -----Inline Attachment Follows----- >=20 > --- /usr/share/gramps/plugins/FamilyGroup.py 2005-12-11 20:38:56.00000= 0000 -0600 > +++ plugins/FamilyGroup.py 2006-01-22 16:12:50.000000000 -0600 > @@ -46,7 +46,7 @@ > import BaseDoc > import ReportOptions > from DateHandler import displayer as _dd > - > +import const > #-----------------------------------------------------------------------= - > # > # FamilyGroup > @@ -71,7 +71,7 @@ > """ > Report.Report.__init__(self,database,person,options_class) > =20 > - self.family =3D None > + self.family_handle =3D None > =20 > spouse_id =3D options_class.handler.options_dict['spouse_id'] > if spouse_id: > @@ -85,9 +85,18 @@ > this_spouse =3D database.get_person_from_handle(this_spo= use_handle) > this_spouse_id =3D this_spouse.get_gramps_id() > if spouse_id =3D=3D this_spouse_id: > - self.family =3D family > + self.family_handle =3D family_handle > break > =20 > + self.recursive =3D options_class.handler.options_dict['recur= sive'] > + self.missingInfo =3D options_class.handler.options_dict['missi= nginfo'] > + self.generations =3D options_class.handler.options_dict['gener= ations'] > + self.incParEvents =3D options_class.handler.options_dict['incPa= rEvents'] > + self.incParAddr =3D options_class.handler.options_dict['incPa= rAddr'] > + self.incParNotes =3D options_class.handler.options_dict['incPa= rNotes'] > + self.incParNames =3D options_class.handler.options_dict['incPa= rNames'] > + self.incRelDates =3D options_class.handler.options_dict['incRe= lDates'] > + > def define_table_styles(self): > """ > Define the table styles used by the report.=20 > @@ -151,84 +160,82 @@ > table.set_column_width(3,40) > self.doc.add_table_style('FGR-ChildTable',table) > =20 > - def dump_parent(self,person_handle): > - > - if not person_handle: > - return > - =20 > - person =3D self.database.get_person_from_handle(person_handle) > - =20 > - if person.get_gender() =3D=3D RelLib.Person.MALE: > - the_id =3D _("Husband") > - else: > - the_id =3D _("Wife") > - =20 > - self.doc.start_table(the_id,'FGR-ParentTable') > - self.doc.start_row() > - self.doc.start_cell('FGR-ParentHead',3) > - self.doc.start_paragraph('FGR-ParentName') > - self.doc.write_text(the_id + ': ') > - self.doc.write_text(person.get_primary_name().get_regular_name()= ) > - self.doc.end_paragraph() > - self.doc.end_cell() > - self.doc.end_row() > - =20 > - birth_handle =3D person.get_birth_handle() > - bdate =3D "" > - bplace =3D "" > - if birth_handle: > - birth =3D self.database.get_event_from_handle(birth_handle) > - bdate =3D birth.get_date() > - bplace_handle =3D birth.get_place_handle() > - if bplace_handle: > - bplace =3D self.database.get_place_from_handle(bplace_ha= ndle).get_title() > - =20 > - death_handle =3D person.get_death_handle() > - ddate =3D "" > - dplace =3D "" > - if death_handle: > - death =3D self.database.get_event_from_handle(death_handle) > - ddate =3D death.get_date() > - dplace_handle =3D death.get_place_handle() > - if dplace_handle: > - dplace =3D self.database.get_place_from_handle(dplace_ha= ndle).get_title() > - > + def dump_parent_event(self,name,event): > + place =3D "" > + date =3D "" > + if event: > + date =3D event.get_date() > + place_handle =3D event.get_place_handle() > + if place_handle: > + place =3D self.database.get_place_from_handle(place_hand= le).get_title() > self.doc.start_row() > self.doc.start_cell("FGR-TextContents") > self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(_("Birth")) > + self.doc.write_text(name) > self.doc.end_paragraph() > self.doc.end_cell() > self.doc.start_cell("FGR-TextContents") > self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(bdate) > + self.doc.write_text(date) > self.doc.end_paragraph() > self.doc.end_cell() > self.doc.start_cell("FGR-TextContentsEnd") > self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(bplace) > + self.doc.write_text(place) > self.doc.end_paragraph() > self.doc.end_cell() > self.doc.end_row() > =20 > + def dump_parent_line(self,name,text): > self.doc.start_row() > self.doc.start_cell("FGR-TextContents") > self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(_("Death")) > + self.doc.write_text(name) > self.doc.end_paragraph() > self.doc.end_cell() > - self.doc.start_cell("FGR-TextContents") > + self.doc.start_cell("FGR-TextContentsEnd",2) > self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(ddate) > + self.doc.write_text(text) > self.doc.end_paragraph() > self.doc.end_cell() > - self.doc.start_cell("FGR-TextContentsEnd") > - self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(dplace) > + self.doc.end_row() > + =20 > + def dump_parent(self,person_handle): > + > + if not person_handle: > + return > + > + person =3D self.database.get_person_from_handle(person_handle) > + > + if person.get_gender() =3D=3D RelLib.Person.MALE: > + the_id =3D _("Husband") > + else: > + the_id =3D _("Wife") > + > + self.doc.start_table(the_id,'FGR-ParentTable') > + self.doc.start_row() > + self.doc.start_cell('FGR-ParentHead',3) > + self.doc.start_paragraph('FGR-ParentName') > + self.doc.write_text(the_id + ': ') > + self.doc.write_text(person.get_primary_name().get_regular_name()= ) > self.doc.end_paragraph() > self.doc.end_cell() > self.doc.end_row() > =20 > + birth_handle =3D person.get_birth_handle() > + birth =3D None > + if birth_handle: > + birth =3D self.database.get_event_from_handle(birth_handle) > + if birth or self.missingInfo: > + self.dump_parent_event(_("Birth"),birth) > + > + death_handle =3D person.get_death_handle() > + death =3D None > + if death_handle: > + death =3D self.database.get_event_from_handle(death_handle) > + if death or self.missingInfo: > + self.dump_parent_event(_("Death"),death) > + > family_handle =3D person.get_main_parents_family_handle() > father_name =3D "" > mother_name =3D "" > @@ -236,36 +243,81 @@ > family =3D self.database.get_family_from_handle(family_handl= e) > father_handle =3D family.get_father_handle()=20 > if father_handle: > - father_name =3D self.database.get_person_from_handle(fat= her_handle).get_primary_name().get_regular_name() > + father =3D self.database.get_person_from_handle(father_h= andle) > + father_name =3D father.get_primary_name().get_regular_na= me() > + if self.incRelDates: > + birth_handle =3D father.get_birth_handle() > + birth =3D " " > + if birth_handle: > + birth =3D self.database.get_event_from_handle(bi= rth_handle).get_date() > + death_handle =3D father.get_death_handle() > + death =3D " " > + if death_handle: > + death =3D self.database.get_event_from_handle(de= ath_handle).get_date() > + if birth_handle or death_handle: > + father_name =3D "%s (%s - %s)" % (father_name,bi= rth,death) > mother_handle =3D family.get_mother_handle()=20 > if mother_handle: > - mother_name =3D self.database.get_person_from_handle(mot= her_handle).get_primary_name().get_regular_name() > + mother =3D self.database.get_person_from_handle(mother_h= andle) > + mother_name =3D mother.get_primary_name().get_regular_na= me() > + if self.incRelDates: > + birth_handle =3D mother.get_birth_handle() > + birth =3D " " > + if birth_handle: > + birth =3D self.database.get_event_from_handle(bi= rth_handle).get_date() > + death_handle =3D mother.get_death_handle() > + death =3D " " > + if death_handle: > + death =3D self.database.get_event_from_handle(de= ath_handle).get_date() > + if birth_handle or death_handle: > + mother_name =3D "%s (%s - %s)" % (mother_name,bi= rth,death) > + > + if self.missingInfo or father_name !=3D "": > + self.dump_parent_line(_("Father"),father_name) > + > + if self.missingInfo or mother_name !=3D "": > + self.dump_parent_line(_("Mother"),mother_name) > + > + if self.incParEvents: > + for event_handle in person.get_event_list(): > + event =3D self.database.get_event_from_handle(event_hand= le) > + evtName =3D event.get_name() > + if (evtName !=3D "Death") and (evtName !=3D "Birth"): > + self.dump_parent_event(evtName,event) > + > + if self.incParAddr: > + addrlist =3D person.get_address_list()[:] > + for addr in addrlist: > + location =3D "%s %s %s %s" % (addr.get_street(),addr.get= _city(), > + addr.get_state(),addr.get_cou= ntry()) > + date =3D addr.get_date() > + =20 > + self.doc.start_row() > + self.doc.start_cell("FGR-TextContents") > + self.doc.start_paragraph('FGR-Normal') > + self.doc.write_text(_("Address")) > + self.doc.end_paragraph() > + self.doc.end_cell() > + self.doc.start_cell("FGR-TextContents") > + self.doc.start_paragraph('FGR-Normal') > + self.doc.write_text(date) > + self.doc.end_paragraph() > + self.doc.end_cell() > + self.doc.start_cell("FGR-TextContentsEnd") > + self.doc.start_paragraph('FGR-Normal') > + self.doc.write_text(location) > + self.doc.end_paragraph() > + self.doc.end_cell() > + self.doc.end_row() > =20 > - self.doc.start_row() > - self.doc.start_cell("FGR-TextContents") > - self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(_("Father")) > - self.doc.end_paragraph() > - self.doc.end_cell() > - self.doc.start_cell("FGR-TextContentsEnd",2) > - self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(father_name) > - self.doc.end_paragraph() > - self.doc.end_cell() > - self.doc.end_row() > + if self.incParNotes and (person.get_note() !=3D ""): > + self.dump_parent_line(_("Notes"),person.get_note()) > =20 > - self.doc.start_row() > - self.doc.start_cell("FGR-TextContents") > - self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(_("Mother")) > - self.doc.end_paragraph() > - self.doc.end_cell() > - self.doc.start_cell("FGR-TextContentsEnd",2) > - self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(mother_name) > - self.doc.end_paragraph() > - self.doc.end_cell() > - self.doc.end_row() > + if self.incParNames: > + for alt_name in person.get_alternate_names(): > + type =3D const.NameTypesMap.find_value(alt_name.get_type= ()) > + name =3D alt_name.get_regular_name() > + self.dump_parent_line(type,name) > =20 > self.doc.end_table() > =20 > @@ -330,11 +382,15 @@ > death =3D self.database.get_event_from_handle(death_handle) > else: > death =3D None > - self.dump_child_event('FGR-TextChild1',_('Birth'),birth) > - if families =3D=3D 0: > - self.dump_child_event('FGR-TextChild2',_('Death'),death) > - else: > - self.dump_child_event('FGR-TextChild1',_('Death'),death) > + > + if self.missingInfo or birth !=3D None: > + self.dump_child_event('FGR-TextChild1',_('Birth'),birth) > + > + if self.missingInfo or death !=3D None: > + if families =3D=3D 0: > + self.dump_child_event('FGR-TextChild2',_('Death'),death) > + else: > + self.dump_child_event('FGR-TextChild1',_('Death'),death) > =20 > index =3D 1 > for family_handle in person.get_family_handle_list(): > @@ -352,59 +408,93 @@ > spouse_id =3D family.get_mother_handle() > else: > spouse_id =3D family.get_father_handle() > - self.doc.start_row() > - self.doc.start_cell('FGR-TextChild1') > - self.doc.start_paragraph('FGR-Normal') > - self.doc.end_paragraph() > - self.doc.end_cell() > - self.doc.start_cell('FGR-TextContents') > - self.doc.start_paragraph('FGR-Normal') > - self.doc.write_text(_("Spouse")) > - self.doc.end_paragraph() > - self.doc.end_cell() > - self.doc.start_cell('FGR-TextContentsEnd',2) > - self.doc.start_paragraph('FGR-Normal') > - if spouse_id: > - spouse =3D self.database.get_person_from_handle(spouse_i= d) > - self.doc.write_text(spouse.get_primary_name().get_regula= r_name()) > - self.doc.end_paragraph() > - self.doc.end_cell() > - self.doc.end_row() > + =20 > + if self.missingInfo or spouse_id: > + self.doc.start_row() > + self.doc.start_cell('FGR-TextChild1') > + self.doc.start_paragraph('FGR-Normal') > + self.doc.end_paragraph() > + self.doc.end_cell() > + self.doc.start_cell('FGR-TextContents') > + self.doc.start_paragraph('FGR-Normal') > + self.doc.write_text(_("Spouse")) > + self.doc.end_paragraph() > + self.doc.end_cell() > + self.doc.start_cell('FGR-TextContentsEnd',2) > + self.doc.start_paragraph('FGR-Normal') > + if spouse_id: > + spouse =3D self.database.get_person_from_handle(spou= se_id) > + spouse_name =3D spouse.get_primary_name().get_regula= r_name() > + if self.incRelDates: > + birth_handle =3D spouse.get_birth_handle() > + birth =3D " " > + if birth_handle: > + birth =3D self.database.get_event_from_handl= e(birth_handle).get_date() > + death_handle =3D spouse.get_death_handle() > + death =3D " " > + if death_handle: > + death =3D self.database.get_event_from_handl= e(death_handle).get_date() > + if birth_handle or death_handle: > + spouse_name =3D "%s (%s - %s)" % (spouse_nam= e,birth,death) > + self.doc.write_text(spouse_name) > + self.doc.end_paragraph() > + self.doc.end_cell() > + self.doc.end_row() > =20 > - if index =3D=3D families: > - self.dump_child_event('FGR-TextChild2',_("Married"),m) > - else: > - self.dump_child_event('FGR-TextChild1',_("Married"),m) > + if self.missingInfo or m: > + if index =3D=3D families: > + self.dump_child_event('FGR-TextChild2',_("Married"),= m) > + else: > + self.dump_child_event('FGR-TextChild1',_("Married"),= m) > =20 > - > - def write_report(self): > + def dump_family(self,family_handle,generation): > self.doc.start_paragraph('FGR-Title') > - self.doc.write_text(_("Family Group Report")) > + if self.recursive and self.generations: > + self.doc.write_text(_("Family Group Report - Generation %d")= % generation) > + else: > + self.doc.write_text(_("Family Group Report") ) > + self.doc.end_paragraph() > + =20 > + family =3D self.database.get_family_from_handle(family_handle) > + > + self.dump_parent(family.get_father_handle()) > + self.doc.start_paragraph("FGR-blank") > self.doc.end_paragraph() > + self.dump_parent(family.get_mother_handle()) > =20 > - if self.family: > - self.dump_parent(self.family.get_father_handle()) > + length =3D len(family.get_child_handle_list()) > + if length > 0: > self.doc.start_paragraph("FGR-blank") > self.doc.end_paragraph() > - self.dump_parent(self.family.get_mother_handle()) > + self.doc.start_table('FGR-Children','FGR-ChildTable') > + self.doc.start_row() > + self.doc.start_cell('FGR-ParentHead',4) > + self.doc.start_paragraph('FGR-ParentName') > + self.doc.write_text(_("Children")) > + self.doc.end_paragraph() > + self.doc.end_cell() > + self.doc.end_row() > + index =3D 1 > + for child_handle in family.get_child_handle_list(): > + self.dump_child(index,child_handle) > + index =3D index + 1 > + self.doc.end_table() > + > + if self.recursive: > + for child_handle in family.get_child_handle_list(): > + child =3D self.database.get_person_from_handle(child_han= dle) > + for child_family_handle in child.get_family_handle_list(= ): > + if child_family_handle !=3D family_handle: > + self.doc.page_break() > + self.dump_family(child_family_handle,(generation= +1)) > =20 > - length =3D len(self.family.get_child_handle_list()) > - if length > 0: > - self.doc.start_paragraph("FGR-blank") > - self.doc.end_paragraph() > - self.doc.start_table('FGR-Children','FGR-ChildTable') > - self.doc.start_row() > - self.doc.start_cell('FGR-ParentHead',4) > - self.doc.start_paragraph('FGR-ParentName') > - self.doc.write_text(_("Children")) > - self.doc.end_paragraph() > - self.doc.end_cell() > - self.doc.end_row() > - index =3D 1 > - for child_handle in self.family.get_child_handle_list(): > - self.dump_child(index,child_handle) > - index =3D index + 1 > - self.doc.end_table() > + def write_report(self): > + if self.family_handle: > + self.dump_family(self.family_handle,1) > + else: > + self.doc.start_paragraph('FGR-Title') > + self.doc.write_text(_("Family Group Report")) > + self.doc.end_paragraph() > =20 > #-----------------------------------------------------------------------= - > # > @@ -424,6 +514,14 @@ > # Options specific for this report > self.options_dict =3D { > 'spouse_id' : '', > + 'recursive' : 0, > + 'missinginfo' : 1, > + 'generations' : 1, > + 'incParEvents' : 0, > + 'incParAddr' : 0, > + 'incParNotes' : 0, > + 'incParNames' : 0, > + 'incRelDates' : 0, > } > =20 > self.options_help =3D { > @@ -432,6 +530,37 @@ > #[item[0] for item in self.get_spouses(None,= None)], > #False > ), > + 'recursive' : ("=3D0/1","Create reports for all decendant= s of this family.", > + ["Do not create reports for decendants","Cre= ate reports for decendants"], > + False), > + > + 'missinginfo' : ("=3D0/1","Whether to include fields for mi= ssing information.", > + ["Do not include missing info","Include miss= ing info"], > + True), > + > + 'generations' : ("=3D0/1","Whether to include the generatio= n on each report (recursive only).", > + ["Do not include the generation","Include th= e generation"], > + True), > + > + 'incParEvents' : ("=3D0/1","Whether to include events for pa= rents.", > + ["Do not include parental events","Include p= arental events"], > + True), > + > + 'incParAddr' : ("=3D0/1","Whether to include addresses for= parents.", > + ["Do not include parental addresses","Includ= e parental addresses"], > + True), > + =20 > + 'incParNotes' : ("=3D0/1","Whether to include notes for par= ents.", > + ["Do not include parental notes","Include pa= rental notes"], > + True), > + =20 > + 'incParNames' : ("=3D0/1","Whether to include alternate nam= es for parents.", > + ["Do not include parental names","Include pa= rental names"], > + True), > + =20 > + 'incRelDates' : ("=3D0/1","Whether to include dates for rel= atives.", > + ["Do not include dates of relatives","Includ= e dates of relatives"], > + True), > } > =20 > def get_spouses(self,database,person): > @@ -476,8 +605,48 @@ > spouse_index =3D index > index =3D index + 1 > self.spouse_menu.set_active(spouse_index) > + =20 > + # Recursive > + self.recursive_option =3D gtk.CheckButton(_("")) > + self.recursive_option.set_active(self.options_dict['recursive']) > + =20 > + # Missing Info > + self.missing_info_option =3D gtk.CheckButton(_("Print fields for= missing information")) > + self.missing_info_option.set_active(self.options_dict['missingin= fo']) > + =20 > + # Generations > + self.include_generations_option =3D gtk.CheckButton(_("Generatio= n numbers (recursive only)")) > + self.include_generations_option.set_active(self.options_dict['ge= nerations']) > + =20 > + # Parental Events > + self.include_par_events_option =3D gtk.CheckButton(_("Parent Eve= nts")) > + self.include_par_events_option.set_active(self.options_dict['inc= ParEvents']) > + =20 > + # Parental Addresses > + self.include_par_addr_option =3D gtk.CheckButton(_("Parent Addre= sses")) > + self.include_par_addr_option.set_active(self.options_dict['incPa= rAddr']) > + =20 > + # Parental Notes > + self.include_par_notes_option =3D gtk.CheckButton(_("Parent Note= s")) > + self.include_par_notes_option.set_active(self.options_dict['incP= arNotes']) > + =20 > + # Parental Names > + self.include_par_names_option =3D gtk.CheckButton(_("Alternate P= arent Names")) > + self.include_par_names_option.set_active(self.options_dict['incP= arNames']) > + =20 > + # Relatives Dates > + self.include_rel_dates_option =3D gtk.CheckButton(_("Dates of Re= latives (father, mother, spouse)")) > + self.include_rel_dates_option.set_active(self.options_dict['incR= elDates']) > =20 > dialog.add_option(_("Spouse"),self.spouse_menu) > + dialog.add_option(_("Recursive"),self.recursive_option) > + dialog.add_frame_option(_('Include'),'',self.include_generations= _option) > + dialog.add_frame_option(_('Include'),'',self.include_par_events_= option) > + dialog.add_frame_option(_('Include'),'',self.include_par_addr_op= tion) > + dialog.add_frame_option(_('Include'),'',self.include_par_notes_o= ption) > + dialog.add_frame_option(_('Include'),'',self.include_par_names_o= ption) > + dialog.add_frame_option(_('Include'),'',self.include_rel_dates_o= ption) > + dialog.add_frame_option(_('Missing Information'),'',self.missing= _info_option) > =20 > def parse_user_options(self,dialog): > """ > @@ -487,6 +656,15 @@ > spouse_index =3D self.spouse_menu.get_active() > if spouses: > self.options_dict['spouse_id'] =3D spouses[spouse_index][0] > + =20 > + self.options_dict['recursive'] =3D int(self.recursive_option.= get_active()) > + self.options_dict['missinginfo'] =3D int(self.missing_info_opti= on.get_active()) > + self.options_dict['generations'] =3D int(self.include_generatio= ns_option.get_active()) > + self.options_dict['incParEvents'] =3D int(self.include_par_event= s_option.get_active()) > + self.options_dict['incParAddr'] =3D int(self.include_par_addr_= option.get_active()) > + self.options_dict['incParNotes'] =3D int(self.include_par_notes= _option.get_active()) > + self.options_dict['incParNames'] =3D int(self.include_par_names= _option.get_active()) > + self.options_dict['incRelDates'] =3D int(self.include_rel_dates= _option.get_active()) > =20 > def make_default_style(self,default_style): > """Make default output style for the Family Group Report.""" >=20 >=20 >=20 >=20 >=20 > ------------------------------------------------------- > This SF.net email is sponsored by: Splunk Inc. Do you grep through log fi= les > for problems? Stop! Download the new AJAX search engine that makes > searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! > http://sel.as-us.falkag.net/sel?cmd=3Dlnk&kid=3D103432&bid=3D230486&dat= =3D121642 > _______________________________________________ > Gramps-devel mailing list > Gra...@li... > https://lists.sourceforge.net/lists/listinfo/gramps-devel >=20 --=20 Don Allingham <don...@co...> |