diff --git a/src/Date.py b/src/Date.py index 104367671..afd9bba57 100644 --- a/src/Date.py +++ b/src/Date.py @@ -155,6 +155,8 @@ class Date: return self.start.getYear() def getMonth(self): + if self.start.month == UNDEF: + return UNDEF return self.start.month+1 def getDay(self): @@ -407,6 +409,8 @@ class SingleDate: self.year = UNDEF def getMonth(self): + if self.month == UNDEF: + return UNDEF return self.month + 1 def setDay(self,val): diff --git a/src/GrampsParser.py b/src/GrampsParser.py index d8059fd1e..dd334d967 100644 --- a/src/GrampsParser.py +++ b/src/GrampsParser.py @@ -413,7 +413,7 @@ class GrampsParser: else: d = self.event.getDateObj() - d.set(attrs['val']) + d.set(u2l(attrs['val'])) def start_created(self,attrs): self.entries = int(attrs["people"]) + int(attrs["families"]) diff --git a/src/gramps_main.py b/src/gramps_main.py index 8199694ec..e2b4b8bf1 100755 --- a/src/gramps_main.py +++ b/src/gramps_main.py @@ -1284,8 +1284,8 @@ def redisplay_person_list(person): gender,bday.getQuoteDate(), dday.getQuoteDate(), sort.build_sort_name(name), - sort.build_sort_birth(bday), - sort.build_sort_death(dday)]) + sort.build_sort_event(bday), + sort.build_sort_event(dday)]) person_list.set_row_data(0,pos) @@ -1297,8 +1297,8 @@ def redisplay_person_list(person): gender,bday.getQuoteDate(), dday.getQuoteDate(), sort.build_sort_name(name), - sort.build_sort_birth(bday), - sort.build_sort_death(dday)]) + sort.build_sort_event(bday), + sort.build_sort_event(dday)]) person_list.set_row_data(0,pos2) @@ -1715,16 +1715,17 @@ def apply_filter(): bday = person.getBirth().getDateObj() dday = person.getDeath().getDateObj() - sort_bday = sort.build_sort_birth(bday) - sort_dday = sort.build_sort_death(dday) + sort_bday = sort.build_sort_event(bday) + sort_dday = sort.build_sort_event(dday) qbday = bday.getQuoteDate() qdday = dday.getQuoteDate() pid = person.getId() bsn = sort.build_sort_name name = person.getPrimaryName() - person_list.insert(0,[gname(name,0), pid, gender, qbday, qdday, - bsn(name), sort_bday, sort_dday]) + values = [gname(name,0), pid, gender, qbday, qdday, + bsn(name), sort_bday, sort_dday ] + person_list.insert(0,values) person_list.set_row_data(0,pos) if Config.hide_altnames: @@ -1734,8 +1735,9 @@ def apply_filter(): pos = (person,1) new_alt2col[person].append(pos) - person_list.insert(0,[gname(name,1), pid, gender, qbday, qdday, - bsn(name), sort_bday, sort_dday]) + values = [gname(name,1), pid, gender, qbday, qdday, + bsn(name), sort_bday, sort_dday] + person_list.insert(0,values) person_list.set_row_data(0,pos) else: diff --git a/src/plugins/WriteGedcom.py b/src/plugins/WriteGedcom.py index a59fed0a9..53e09bde5 100644 --- a/src/plugins/WriteGedcom.py +++ b/src/plugins/WriteGedcom.py @@ -38,17 +38,6 @@ import const from latin_ansel import latin_to_ansel from latin_utf8 import latin_to_utf8 -cnvtxt = latin_to_ansel - -active_person = None -topDialog = None -db = None - -people_list = [] -family_list = [] -source_list = [] -adopt_mode = 1 - _hmonth = [ "", "ELUL", "TSH", "CSH", "KSL", "TVT", "SHV", "ADR", "ADS", "NSN", "IYR", "SVN", "TMZ", "AAV", "ELL" ] @@ -62,151 +51,116 @@ _month = [ #------------------------------------------------------------------------- # -# +# Filters # #------------------------------------------------------------------------- -def entire_database(): - global people_list - global family_list - global source_list +def entire_database(database,person): + plist = database.getPersonMap().values() + flist = database.getFamilyMap().values() + slist = database.getSourceMap().values() + return (plist,flist,slist) + +def active_person_descendants(database,person): + plist = [] + flist = [] + slist = [] + descend(person,plist,flist,slist) + return (plist,flist,slist) - people_list = db.getPersonMap().values() - family_list = db.getFamilyMap().values() - source_list = db.getSourceMap().values() +def active_person_ancestors_and_descendants(database,person): + plist = [] + flist = [] + slist = [] + descend(person,plist,flist,slist) + ancestors(person,plist,flist,slist) + return (plist,flist,slist) + +def active_person_ancestors(database,person): + plist = [] + flist = [] + slist = [] + ancestors(person,plist,flist,slist) + return (plist,flist,slist) + +def interconnected(database,person): + plist = [] + flist = [] + slist = [] + walk(person,plist,flist,slist) #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- -def active_person_descendants(): - global people_list - global family_list - global source_list - - people_list = [] - family_list = [] - source_list = [] - descend(active_person) - -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def active_person_ancestors_and_descendants(): - global people_list - global family_list - global source_list - - people_list = [] - family_list = [] - source_list = [] - descend(active_person) - ancestors(active_person) - -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def active_person_ancestors(): - global people_list - global family_list - global source_list - - people_list = [] - family_list = [] - source_list = [] - ancestors(active_person) - -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def interconnected(): - global people_list - global family_list - global source_list - - people_list = [] - family_list = [] - source_list = [] - walk(active_person) - -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def descend(person): - if person == None or person in people_list: +def descend(person,plist,flist,slist): + if person == None or person in plist: return - people_list.append(person) + plist.append(person) add_persons_sources(person) for family in person.getFamilyList(): - add_familys_sources(family) - family_list.append(family) + add_familys_sources(family,slist) + flist.append(family) father = family.getFather() mother = family.getMother() - if father != None and father not in people_list: - people_list.append(father) - add_persons_sources(father) - if mother != None and mother not in people_list: - people_list.append(mother) - add_persons_sources(mother) + if father != None and father not in plist: + plist.append(father) + add_persons_sources(father,slist) + if mother != None and mother not in plist: + plist.append(mother) + add_persons_sources(mother,slist) for child in family.getChildList(): - descend(child) + descend(child,plist,flist,slist) #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- -def ancestors(person): - if person == None or person in people_list: +def ancestors(person,plist,flist,slist): + if person == None or person in plist: return - people_list.append(person) - add_persons_sources(person) + plist.append(person) + add_persons_sources(person,slist) family = person.getMainFamily() - if family == None or family in family_list: + if family == None or family in flist: return - add_familys_sources(family) - family_list.append(family) - ancestors(family.getMother()) - ancestors(family.getFather()) + add_familys_sources(family,slist) + family_list.append(family,flist) + ancestors(family.getMother(),plist,flist,slist) + ancestors(family.getFather(),plist,flist,slist) + #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- -def walk(person): - if person == None or person in people_list: +def walk(person,plist,flist,slist): + if person == None or person in plist: return - people_list.append(person) - add_persons_sources(person) + plist.append(person) + add_persons_sources(person,slist) families = person.getFamilyList() families.append(person.getMainFamily()) for f in person.getAltFamilyList(): families.append(f[0]) for family in families: - if family == None or family in family_list: + if family == None or family in flist: continue - add_familys_sources(family) - family_list.append(family) - walk(family.getFather()) - walk(family.getMother()) + add_familys_sources(family,slist) + flist.append(family) + walk(family.getFather(),plist,flist,slist) + walk(family.getMother(),plist,flist,slist) for child in family.getChildList(): - walk(child) + walk(child,plist,flist,slist) #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- -def add_persons_sources(person): +def add_persons_sources(person,slist): elist = person.getEventList()[:] elist.append(person.getBirth()) @@ -216,50 +170,50 @@ def add_persons_sources(person): continue for source_ref in event.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in source_list: - source_list.append(sbase) + if sbase != None and sbase not in slist: + slist.append(sbase) for event in person.getAddressList(): if private and event.getPrivacy(): continue for source_ref in event.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in source_list: - source_list.append(sbase) + if sbase != None and sbase not in slist: + slist.append(sbase) for event in person.getAttibuteList: if private and event.getPrivacy(): continue for source_ref in event.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in source_list: - source_list.append(sbase) + if sbase != None and sbase not in slist: + slist.append(sbase) for name in person.getNameList + [ person.getPrimaryName() ]: if private and name.getPrivacy(): continue for source_ref in name.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in source_list: - source_list.append(sbase) + if sbase != None and sbase not in slist: + slist.append(sbase) #------------------------------------------------------------------------- # # # #------------------------------------------------------------------------- -def add_familys_sources(family): +def add_familys_sources(family,slist): for event in family.getEventList(): if private and event.getPrivacy(): continue for source_ref in event.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in source_list: - source_list.append(sbase) + if sbase != None and sbase not in slist: + slist.append(sbase) for attr in family.getAttributeList(): if private and attr.getPrivacy(): continue for source_ref in attr.getSourceRefList(): sbase = source_ref.getBase() - if sbase != None and sbase not in source_list: - source_list.append(sbase) + if sbase != None and sbase not in slist: + slist.append(sbase) #------------------------------------------------------------------------- # @@ -282,85 +236,6 @@ def sortById(first,second): # # #------------------------------------------------------------------------- -def write_long_text(g,tag,level,note): - prefix = "%d %s" % (level,tag) - textlines = string.split(note,'\n') - if len(note) == 0: - g.write("%s\n" % prefix) - else: - for line in textlines: - ll = len(line) - while ll > 0: - brkpt = 70 - if ll > brkpt: - while (ll > brkpt and line[brkpt] in string.whitespace): - brkpt = brkpt+1 - if ll == brkpt: - g.write("%s %s\n" % (prefix,line)) - line = '' - else: - g.write("%s %s\n" % (prefix,line[0:brkpt+1])) - line = line[brkpt+1:] - else: - g.write("%s %s\n" % (prefix,line)) - line = "" - if len(line) > 0: - prefix = "%d CONC" % (level + 1) - else: - prefix = "%d CONT" % (level + 1) - ll = len(line) - -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def dump_event_stats(g,event): - dateobj = event.getDateObj() - if not dateobj.isEmpty(): - print_date(g,"2 DATE",dateobj) - elif dateobj.getText() != "": - g.write("2 DATE %s\n" % cnvtxt(dateobj.getText())) - if event.getPlaceName() != "": - g.write("2 PLAC %s\n" % cnvtxt(event.getPlaceName())) - if event.getCause() != "": - g.write("2 CAUS %s\n" % cnvtxt(event.getCause())) - if event.getNote() != "": - write_long_text(g,"NOTE",2,event.getNote()) - for srcref in event.getSourceRefList(): - write_source_ref(g,2,srcref) - -def print_date(g,prefix,date): - if date.get_calendar() == Date.GREGORIAN: - cal = '' - if date.isRange(): - val = "FROM %s TO %s" % (make_date(date.get_start_date(),_month), - make_date(date.get_stop_date(),_month)) - else: - val = make_date(date.get_start_date(),_month) - elif date.get_calendar() == Date.HEBREW: - cal = '@#HEBREW@ ' - if date.isRange(): - val = "FROM %s TO %s" % (make_date(date.get_start_date(),_hmonth), - make_date(date.get_stop_date(),_hmonth)) - else: - val = make_date(date.get_start_date(),_hmonth) - elif date.get_calendar() == Date.FRENCH: - cal = '@#FRENCH R@ ' - if date.isRange(): - val = "FROM %s TO %s" % (make_date(date.get_start_date(),_fmonth), - make_date(date.get_stop_date(),_fmonth)) - else: - val = make_date(date.get_start_date(),_fmonth) - else: - cal = '@#JULIAN@ ' - if date.isRange(): - val = "FROM %s TO %s" % (make_date(date.get_start_date(),_month), - make_date(date.get_stop_date(),_month)) - else: - val = make_date(date.get_start_date(),_month) - g.write("%s %s%s\n" % (prefix,cal,val)) - def make_date(subdate,mmap): retval = "" day = subdate.getDay() @@ -368,13 +243,12 @@ def make_date(subdate,mmap): year = subdate.getYear() mode = subdate.getModeVal() - print day,mon,year if day == Date.UNDEF: if mon == Date.UNDEF: retval = str(year) elif year == Date.UNDEF: retval = mmap[mon] - else: + else: retval = "%s %d" % (mmap[mon],year) elif mon == Date.UNDEF: retval = str(year) @@ -388,15 +262,14 @@ def make_date(subdate,mmap): if mode == Date.SingleDate.about: retval = "ABT %s" % retval elif mode == Date.SingleDate.before: - retval = "BEFORE" + " " + retval + retval = "BEF %s" % retval elif mode == Date.SingleDate.after: - retval = "AFTER" + " " + retval + retval = "AFT %s" % retval return retval def fmtline(text,limit,level): new_text = [] - text = cnvtxt(text) while len(text) > limit: new_text.append(text[0:limit-1]) text = text[limit:] @@ -405,395 +278,6 @@ def fmtline(text,limit,level): app = "\n%d CONC " % (level+1) return string.join(new_text,app) -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def probably_alive(person): - - if person == None: - return 1 - - if restrict == 0: - return 0 - - death = person.getDeath() - birth = person.getBirth() - - if death.getDate() != "": - return 0 - if birth.getDate() != "": - year = birth.getDateObj().getYear() - time_struct = time.localtime(time.time()) - current_year = time_struct[0] - if year != -1 and current_year - year > 110: - return 0 - return 1 - -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def write_person_name(g,name,nick): - firstName = cnvtxt(name.getFirstName()) - surName = cnvtxt(name.getSurname()) - suffix = cnvtxt(name.getSuffix()) - title = cnvtxt(name.getTitle()) - if suffix == "": - g.write("1 NAME %s /%s/\n" % (firstName,surName)) - else: - g.write("1 NAME %s /%s/, %s\n" % (firstName,surName, suffix)) - - if name.getFirstName() != "": - g.write("2 GIVN %s\n" % firstName) - if name.getSurname() != "": - g.write("2 SURN %s\n" % surName) - if name.getSuffix() != "": - g.write("2 NSFX %s\n" % suffix) - if name.getTitle() != "": - g.write("2 NPFX %s\n" % title) - if nick != "": - g.write('2 NICK %s\n' % nick) - if name.getNote() != "": - write_long_text(g,"NOTE",2,name.getNote()) - for srcref in name.getSourceRefList(): - write_source_ref(g,2,srcref) - -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def write_source_ref(g,level,ref): - if ref.getBase() == None: - return - g.write("%d SOUR @S%s@\n" % (level,ref.getBase().getId())) - if ref.getPage() != "": - g.write("%d PAGE %s\n" % (level+1,ref.getPage())) - - ref_text = ref.getText() - if ref_text != "" or ref.getDate().getDate() != "": - g.write('%d DATA\n' % (level+1)) - if ref_text != "": - write_long_text(g,"TEXT",level+2,ref_text) - if ref.getDate().getDate(): - g.write("%d DATE %s\n" % (level+2,ref.getDate().getSaveDate())) - if ref.getComments() != "": - write_long_text(g,"NOTE",level+1,ref.getComments()) - -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def write_person(g,person): - g.write("0 @I%s@ INDI\n" % person.getId()) - - write_person_name(g,person.getPrimaryName(),person.getNickName()) -# for name in person.getAlternateNames(): -# write_person_name(g,name,"") - - if person.getGender() == Person.male: - g.write("1 SEX M\n") - elif person.getGender() == Person.female: - g.write("1 SEX F\n") - - if not probably_alive(person): - - birth = person.getBirth() - if not (private and birth.getPrivacy()): - if birth.getSaveDate() != "" or birth.getPlaceName() != "": - g.write("1 BIRT\n") - dump_event_stats(g,birth) - - death = person.getDeath() - if not (private and death.getPrivacy()): - if death.getSaveDate() != "" or death.getPlaceName() != "": - g.write("1 DEAT\n") - dump_event_stats(g,death) - - uid = person.getPafUid() - if uid != "": - g.write("1 _UID %s\n" % uid) - - ad = 0 - for event in person.getEventList(): - if private and event.getPrivacy(): - continue - name = event.getName() - if const.personalConstantEvents.has_key(name): - val = const.personalConstantEvents[name] - else: - val = "" - if adopt_mode == 1 and val == "ADOP": - ad = 1 - g.write('1 ADOP\n') - fam = None - for f in person.getAltFamilyList(): - mrel = string.lower(f[1]) - frel = string.lower(f[2]) - if mrel=="adopted" or mrel=="adopted": - fam = f[0] - break - if fam: - g.write('2 FAMC @F%s@\n' % fam.getId()) - if mrel == frel: - g.write('3 ADOP BOTH\n') - elif mrel == "adopted": - g.write('3 ADOP WIFE\n') - else: - g.write('3 ADOP HUSB\n') - elif val != "" : - g.write("1 %s %s\n" % (cnvtxt(val),cnvtxt(event.getDescription()))) - else: - g.write("1 EVEN %s\n" % cnvtxt(event.getDescription())) - g.write("2 TYPE %s\n" % cnvtxt(event.getName())) - dump_event_stats(g,event) - - if adopt_mode == 1 and ad == 0 and len(person.getAltFamilyList()) != 0: - g.write('1 ADOP\n') - fam = None - for f in person.getAltFamilyList(): - mrel = string.lower(f[1]) - frel = string.lower(f[2]) - if mrel=="adopted" or mrel=="adopted": - fam = f[0] - break - if fam: - g.write('2 FAMC @F%s@\n' % fam.getId()) - if mrel == frel: - g.write('3 ADOP BOTH\n') - elif mrel == "adopted": - g.write('3 ADOP WIFE\n') - else: - g.write('3 ADOP HUSB\n') - - for attr in person.getAttributeList(): - if private and attr.getPrivacy(): - continue - name = attr.getType() - if const.personalConstantAttributes.has_key(name): - val = const.personalConstantAttributes[name] - else: - val = "" - if val != "" : - g.write("1 %s\n" % val) - else: - g.write("1 EVEN\n") - g.write("2 TYPE %s\n" % cnvtxt(name)) - g.write("2 PLAC %s\n" % cnvtxt(attr.getValue())) - if attr.getNote() != "": - write_long_text(g,"NOTE",2,attr.getNote()) - for srcref in attr.getSourceRefList(): - write_source_ref(g,2,srcref) - - for addr in person.getAddressList(): - if private and addr.getPrivacy(): - continue - g.write("1 RESI\n") - datestr = addr.getDateObj().getSaveDate() - if datestr != "": - g.write("2 DATE %s\n" % cnvtxt(datestr)) - write_long_text(g,"ADDR",2,addr.getStreet()) - if addr.getCity() != "": - g.write("3 CITY %s\n" % addr.getCity()) - if addr.getState() != "": - g.write("3 STAE %s\n" % addr.getState()) - if addr.getPostal() != "": - g.write("3 POST %s\n" % addr.getPostal()) - if addr.getCountry() != "": - g.write("3 CTRY %s\n" % addr.getCountry()) - if addr.getNote() != "": - write_long_text(g,"NOTE",3,addr.getNote()) - for srcref in addr.getSourceRefList(): - write_source_ref(g,3,srcref) - - family = person.getMainFamily() - if family != None and family in family_list: - g.write("1 FAMC @F%s@\n" % family.getId()) - - for family in person.getAltFamilyList(): - g.write("1 FAMC @F%s@\n" % family[0].getId()) - if adopt_mode == 0: - if string.lower(family[1]) == "adopted": - g.write("2 PEDI Adopted\n") - - for family in person.getFamilyList(): - if family != None and family in family_list: - g.write("1 FAMS @F%s@\n" % family.getId()) - - for url in person.getUrlList(): - g.write('1 OBJE\n') - g.write('2 FORM URL\n') - if url.get_description() != "": - g.write('2 TITL %s\n' % url.get_description()) - if url.get_path() != "": - g.write('2 FILE %s\n' % url.get_path()) - - if person.getNote() != "": - write_long_text(g,"NOTE",1,person.getNote()) - - -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def exportData(database, filename, progress, pbar, fbar, sbar): - - try: - g = open(filename,"w") - except IOError,msg: - msg = "%s\n%s" % (_("Could not create %s") % filename,str(msg)) - GnomeErrorDialog(msg) - progress.destroy() - return - except: - GnomeErrorDialog(_("Could not create %s") % filename) - progress.destroy() - return - - date = string.split(time.ctime(time.time())) - - g.write("0 HEAD\n") - g.write("1 SOUR GRAMPS\n") - g.write("2 VERS " + const.version + "\n") - g.write("2 NAME Gramps\n") - g.write("1 DEST GRAMPS\n") - g.write("1 DATE %s %s %s\n" % (date[2],string.upper(date[1]),date[4])) - if cnvtxt == latin_to_ansel: - g.write("1 CHAR ANSEL\n"); - else: - g.write("1 CHAR UTF-8\n"); - g.write("1 SUBM @SUBM@\n") - g.write("1 FILE %s\n" % filename) - g.write("1 GEDC\n") - g.write("2 VERS 5.5\n") - g.write('2 FORM LINEAGE-LINKED\n') - g.write("0 @SUBM@ SUBM\n") - owner = database.getResearcher() - if owner.getName() != "": - g.write("1 NAME " + cnvtxt(owner.getName()) +"\n") - else: - g.write('1 NAME Not Provided\n') - if owner.getAddress() != "": - cnt = 0 - g.write("1 ADDR " + cnvtxt(owner.getAddress()) + "\n") - if owner.getCity() != "": - g.write("2 CONT " + cnvtxt(owner.getCity()) + "\n") - cnt = 1 - if owner.getState() != "": - g.write("2 CONT " + cnvtxt(owner.getState()) + "\n") - cnt = 1 - if owner.getPostalCode() != "": - g.write("2 CONT " + cnvtxt(owner.getPostalCode()) + "\n") - cnt = 1 - if owner.getCountry() != "": - g.write("2 CONT " + cnvtxt(owner.getCountry()) + "\n") - cnt = 1 - if owner.getPhone() != "": - g.write("2 PHON " + cnvtxt(owner.getPhone()) + "\n") - cnt = 1 - if cnt == 0: - g.write('2 CONT Not Provided\n') - else: - g.write('1 ADDR Not Provided\n') - g.write('2 CONT Not Provided\n') - people_list.sort(sortById) - nump = float(len(people_list)) - index = 0.0 - for person in people_list: - write_person(g,person) - index = index + 1 - pbar.set_value((100*index)/nump) - while(events_pending()): - mainiteration() - pbar.set_value(100.0) - - nump = float(len(family_list)) - index = 0.0 - for family in family_list: - g.write("0 @F%s@ FAM\n" % family.getId()) - person = family.getFather() - if person != None: - g.write("1 HUSB @I%s@\n" % person.getId()) - - person = family.getMother() - if person != None: - g.write("1 WIFE @I%s@\n" % person.getId()) - - father = family.getFather() - mother = family.getMother() - if not probably_alive(father) or not probably_alive(mother): - for event in family.getEventList(): - if private and event.getPrivacy(): - continue - name = event.getName() - - if const.familyConstantEvents.has_key(name): - val = const.familyConstantEvents[name] - else: - val = "" - if val != "": - g.write("1 %s\n" % const.familyConstantEvents[name]) - else: - g.write("1 EVEN\n") - g.write("2 TYPE %s\n" % cnvtxt(name)) - - dump_event_stats(g,event) - - for person in family.getChildList(): - g.write("1 CHIL @I%s@\n" % person.getId()) - if adopt_mode == 2: - if person.getMainFamily() == family: - g.write('2 _FREL Natural\n') - g.write('2 _MREL Natural\n') - else: - for f in person.getAltFamilyList(): - if f[0] == family: - g.write('2 _FREL %s\n' % f[2]) - g.write('2 _MREL %s\n' % f[1]) - break - if adopt_mode == 3: - for f in person.getAltFamilyList(): - if f[0] == family: - g.write('2 _STAT %s\n' % f[2]) - break - - index = index + 1 - fbar.set_value((100*index)/nump) - while(events_pending()): - mainiteration() - fbar.set_value(100.0) - - nump = float(len(source_list)) - index = 0.0 - for source in source_list: - g.write("0 @S%s@ SOUR\n" % source.getId()) - if source.getTitle() != "": - g.write("1 TITL %s\n" % fmtline(source.getTitle(),248,1)) - if source.getAuthor() != "": - g.write("1 AUTH %s\n" % cnvtxt(source.getAuthor())) - if source.getPubInfo() != "": - g.write("1 PUBL %s\n" % cnvtxt(source.getPubInfo())) - if source.getTitle() != "": - g.write("1 ABBR %s\n" % cnvtxt(source.getTitle())) - if source.getCallNumber() != "": - g.write("1 CALN %s\n" % cnvtxt(source.getCallNumber())) - if source.getNote() != "": - write_long_text(g,"NOTE",1,source.getNote()) - index = index + 1 - sbar.set_value((100*index)/nump) - while(events_pending()): - mainiteration() - sbar.set_value(100.0) - - - g.write("0 TRLR\n") - g.close() - #------------------------------------------------------------------------- # # @@ -843,46 +327,6 @@ def ged_subdate(date): retval = "AFT %s" % retval return retval - -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def on_ok_clicked(obj): - global db - global topDialog - global restrict - global private - global cnvtxt - - restrict = topDialog.get_widget("restrict").get_active() - private = topDialog.get_widget("private").get_active() - filter_obj = topDialog.get_widget("filter").get_menu().get_active() - filter = filter_obj.get_data("filter") - - if topDialog.get_widget("ansel").get_active(): - cnvtxt = latin_to_ansel - else: - cnvtxt = latin_to_utf8 - - name = topDialog.get_widget("filename").get_text() - filter() - - utils.destroy_passed_object(obj) - - base = os.path.dirname(__file__) - glade_file = base + os.sep + "gedcomexport.glade" - progress = GladeXML(glade_file,"exportprogress") - progress.signal_autoconnect({"on_close_clicked":utils.destroy_passed_object}) - fbar = progress.get_widget("fbar") - pbar = progress.get_widget("pbar") - sbar = progress.get_widget("sbar") - closebtn = progress.get_widget("close") - closebtn.connect("clicked",utils.destroy_passed_object) - closebtn.set_sensitive(0) - exportData(db,name,progress.get_widget('exportprogress'),pbar,fbar,sbar) - closebtn.set_sensitive(1) #------------------------------------------------------------------------- # @@ -890,50 +334,541 @@ def on_ok_clicked(obj): # #------------------------------------------------------------------------- def writeData(database,person): - global db - global topDialog - global active_person - - db = database - active_person = person - - base = os.path.dirname(__file__) - glade_file = base + os.sep + "gedcomexport.glade" + GedcomWriter(database,person) + +#------------------------------------------------------------------------- +# +# +# +#------------------------------------------------------------------------- +class GedcomWriter: + def __init__(self,db,person): + self.db = db + self.person = person + self.restrict = 1 + self.private = 1 + self.cnvtxt = latin_to_ansel + self.people_list = [] + self.source_list = [] + self.family_list = [] + self.adopt_mode = 0 - dic = { - "destroy_passed_object" : utils.destroy_passed_object, - "on_ok_clicked" : on_ok_clicked - } + glade_file = "%s/gedcomexport.glade" % os.path.dirname(__file__) + + self.topDialog = GladeXML(glade_file,"gedcomExport") + self.topDialog.signal_autoconnect({ + "destroy_passed_object" : utils.destroy_passed_object, + "on_ok_clicked" : self.on_ok_clicked + }) + + filter_obj = self.topDialog.get_widget("filter") + myMenu = GtkMenu() + menuitem = GtkMenuItem(_("Entire Database")) + myMenu.append(menuitem) + menuitem.set_data("filter",entire_database) + menuitem.show() + name = person.getPrimaryName().getRegularName() + menuitem = GtkMenuItem(_("Ancestors of %s") % name) + myMenu.append(menuitem) + menuitem.set_data("filter",active_person_ancestors) + menuitem.show() + menuitem = GtkMenuItem(_("Descendants of %s") % name) + myMenu.append(menuitem) + menuitem.set_data("filter",active_person_descendants) + menuitem.show() + menuitem = GtkMenuItem(_("Ancestors and Descendants of %s") % name) + myMenu.append(menuitem) + menuitem.set_data("filter",active_person_ancestors_and_descendants) + menuitem.show() + menuitem = GtkMenuItem(_("People somehow connected to %s") % name) + myMenu.append(menuitem) + menuitem.set_data("filter",interconnected) + menuitem.show() + filter_obj.set_menu(myMenu) + + self.topDialog.get_widget("gedcomExport").show() + + def on_ok_clicked(self,obj): + + self.restrict = self.topDialog.get_widget("restrict").get_active() + self.private = self.topDialog.get_widget("private").get_active() - topDialog = GladeXML(glade_file,"gedcomExport") - topDialog.signal_autoconnect(dic) + filter_obj = self.topDialog.get_widget("filter").get_menu().get_active() + filter = filter_obj.get_data("filter") - filter_obj = topDialog.get_widget("filter") - myMenu = GtkMenu() - menuitem = GtkMenuItem(_("Entire Database")) - myMenu.append(menuitem) - menuitem.set_data("filter",entire_database) - menuitem.show() - name = active_person.getPrimaryName().getRegularName() - menuitem = GtkMenuItem(_("Ancestors of %s") % name) - myMenu.append(menuitem) - menuitem.set_data("filter",active_person_ancestors) - menuitem.show() - menuitem = GtkMenuItem(_("Descendants of %s") % name) - myMenu.append(menuitem) - menuitem.set_data("filter",active_person_descendants) - menuitem.show() - menuitem = GtkMenuItem(_("Ancestors and Descendants of %s") % name) - myMenu.append(menuitem) - menuitem.set_data("filter",active_person_ancestors_and_descendants) - menuitem.show() - menuitem = GtkMenuItem(_("People somehow connected to %s") % name) - myMenu.append(menuitem) - menuitem.set_data("filter",interconnected) - menuitem.show() - filter_obj.set_menu(myMenu) + if self.topDialog.get_widget("ansel").get_active(): + self.cnvtxt = latin_to_ansel + else: + self.cnvtxt = latin_to_utf8 + + name = self.topDialog.get_widget("filename").get_text() + + (self.people_list,self.family_list,self.source_list) = filter(self.db,self.person) + + utils.destroy_passed_object(obj) + + glade_file = "%s/gedcomexport.glade" % os.path.dirname(__file__) + + self.exprogress = GladeXML(glade_file,"exportprogress") + self.exprogress.signal_autoconnect({ + "on_close_clicked" : utils.destroy_passed_object + }) + + self.fbar = self.exprogress.get_widget("fbar") + self.pbar = self.exprogress.get_widget("pbar") + self.sbar = self.exprogress.get_widget("sbar") + self.progress = self.exprogress.get_widget('exportprogress') + + closebtn = self.exprogress.get_widget("close") + closebtn.connect("clicked",utils.destroy_passed_object) + closebtn.set_sensitive(0) + + self.export_data(name) + + closebtn.set_sensitive(1) + + def export_data(self,filename): + + try: + self.g = open(filename,"w") + except IOError,msg: + msg = "%s\n%s" % (_("Could not create %s") % filename,str(msg)) + GnomeErrorDialog(msg) + self.progress.destroy() + return + except: + GnomeErrorDialog(_("Could not create %s") % filename) + self.progress.destroy() + return + + date = string.split(time.ctime(time.time())) + + self.g.write("0 HEAD\n") + self.g.write("1 SOUR GRAMPS\n") + self.g.write("2 VERS " + const.version + "\n") + self.g.write("2 NAME Gramps\n") + self.g.write("1 DEST GRAMPS\n") + self.g.write("1 DATE %s %s %s\n" % (date[2],string.upper(date[1]),date[4])) + if self.cnvtxt == latin_to_ansel: + self.g.write("1 CHAR ANSEL\n"); + else: + self.g.write("1 CHAR UTF-8\n"); + self.g.write("1 SUBM @SUBM@\n") + self.g.write("1 FILE %s\n" % filename) + self.g.write("1 GEDC\n") + self.g.write("2 VERS 5.5\n") + self.g.write('2 FORM LINEAGE-LINKED\n') + self.g.write("0 @SUBM@ SUBM\n") + owner = self.db.getResearcher() + if owner.getName() != "": + self.g.write("1 NAME " + self.cnvtxt(owner.getName()) +"\n") + else: + self.g.write('1 NAME Not Provided\n') + + if owner.getAddress() != "": + cnt = 0 + self.g.write("1 ADDR " + self.cnvtxt(owner.getAddress()) + "\n") + if owner.getCity() != "": + self.g.write("2 CONT " + self.cnvtxt(owner.getCity()) + "\n") + cnt = 1 + if owner.getState() != "": + self.g.write("2 CONT " + self.cnvtxt(owner.getState()) + "\n") + cnt = 1 + if owner.getPostalCode() != "": + self.g.write("2 CONT " + self.cnvtxt(owner.getPostalCode()) + "\n") + cnt = 1 + if owner.getCountry() != "": + self.g.write("2 CONT " + self.cnvtxt(owner.getCountry()) + "\n") + cnt = 1 + if owner.getPhone() != "": + self.g.write("2 PHON " + self.cnvtxt(owner.getPhone()) + "\n") + cnt = 1 + if cnt == 0: + self.g.write('2 CONT Not Provided\n') + else: + self.g.write('1 ADDR Not Provided\n') + self.g.write('2 CONT Not Provided\n') + + self.people_list.sort(sortById) + nump = float(len(self.people_list)) + index = 0.0 + for person in self.people_list: + self.write_person(person) + index = index + 1 + self.pbar.set_value((100*index)/nump) + while(events_pending()): + mainiteration() + self.pbar.set_value(100.0) + + nump = float(len(self.family_list)) + index = 0.0 + for family in self.family_list: + self.g.write("0 @F%s@ FAM\n" % family.getId()) + person = family.getFather() + if person != None: + self.g.write("1 HUSB @I%s@\n" % person.getId()) + + person = family.getMother() + if person != None: + self.g.write("1 WIFE @I%s@\n" % person.getId()) + + father = family.getFather() + mother = family.getMother() + if not self.probably_alive(father) or not self.probably_alive(mother): + for event in family.getEventList(): + if self.private and event.getPrivacy(): + continue + name = event.getName() + + if const.familyConstantEvents.has_key(name): + val = const.familyConstantEvents[name] + else: + val = "" + if val != "": + self.g.write("1 %s\n" % const.familyConstantEvents[name]) + else: + self.g.write("1 EVEN\n") + self.g.write("2 TYPE %s\n" % self.cnvtxt(name)) + + self.dump_event_stats(event) + + for person in family.getChildList(): + self.g.write("1 CHIL @I%s@\n" % person.getId()) + if self.adopt_mode == 2: + if person.getMainFamily() == family: + self.g.write('2 _FREL Natural\n') + self.g.write('2 _MREL Natural\n') + else: + for f in person.getAltFamilyList(): + if f[0] == family: + self.g.write('2 _FREL %s\n' % f[2]) + self.g.write('2 _MREL %s\n' % f[1]) + break + if self.adopt_mode == 3: + for f in person.getAltFamilyList(): + if f[0] == family: + self.g.write('2 _STAT %s\n' % f[2]) + break + + index = index + 1 + self.fbar.set_value((100*index)/nump) + while(events_pending()): + mainiteration() + self.fbar.set_value(100.0) + + nump = float(len(self.source_list)) + index = 0.0 + for source in self.source_list: + self.g.write("0 @S%s@ SOUR\n" % source.getId()) + if source.getTitle() != "": + self.g.write("1 TITL %s\n" % fmtline(self.cnvtxt(source.getTitle()),248,1)) + if source.getAuthor() != "": + self.g.write("1 AUTH %s\n" % self.cnvtxt(source.getAuthor())) + if source.getPubInfo() != "": + self.g.write("1 PUBL %s\n" % self.cnvtxt(source.getPubInfo())) + if source.getTitle() != "": + self.g.write("1 ABBR %s\n" % self.cnvtxt(source.getTitle())) + if source.getCallNumber() != "": + self.g.write("1 CALN %s\n" % self.cnvtxt(source.getCallNumber())) + if source.getNote() != "": + write_long_text(g,"NOTE",1,source.getNote()) + index = index + 1 + self.sbar.set_value((100*index)/nump) + while(events_pending()): + mainiteration() + self.sbar.set_value(100.0) + + self.g.write("0 TRLR\n") + self.g.close() + + def write_person(self,person): + self.g.write("0 @I%s@ INDI\n" % person.getId()) + + self.write_person_name(person.getPrimaryName(),person.getNickName()) +# for name in person.getAlternateNames(): +# self.write_person_name(name,"") + + if person.getGender() == Person.male: + self.g.write("1 SEX M\n") + elif person.getGender() == Person.female: + self.g.write("1 SEX F\n") + + if not self.probably_alive(person): + + birth = person.getBirth() + if not (self.private and birth.getPrivacy()): + if birth.getSaveDate() != "" or birth.getPlaceName() != "": + self.g.write("1 BIRT\n") + self.dump_event_stats(birth) + + death = person.getDeath() + if not (self.private and death.getPrivacy()): + if death.getSaveDate() != "" or death.getPlaceName() != "": + self.g.write("1 DEAT\n") + self.dump_event_stats(death) + + uid = person.getPafUid() + if uid != "": + self.g.write("1 _UID %s\n" % uid) + + ad = 0 + for event in person.getEventList(): + if self.private and event.getPrivacy(): + continue + name = event.getName() + if const.personalConstantEvents.has_key(name): + val = const.personalConstantEvents[name] + else: + val = "" + if self.adopt_mode == 1 and val == "ADOP": + ad = 1 + self.g.write('1 ADOP\n') + fam = None + for f in person.getAltFamilyList(): + mrel = string.lower(f[1]) + frel = string.lower(f[2]) + if mrel=="adopted" or mrel=="adopted": + fam = f[0] + break + if fam: + self.g.write('2 FAMC @F%s@\n' % fam.getId()) + if mrel == frel: + self.g.write('3 ADOP BOTH\n') + elif mrel == "adopted": + self.g.write('3 ADOP WIFE\n') + else: + self.g.write('3 ADOP HUSB\n') + elif val != "" : + self.g.write("1 %s %s\n" % (self.cnvtxt(val),\ + self.cnvtxt(event.getDescription()))) + else: + self.g.write("1 EVEN %s\n" % self.cnvtxt(event.getDescription())) + self.g.write("2 TYPE %s\n" % self.cnvtxt(event.getName())) + + self.dump_event_stats(event) + + if self.adopt_mode == 1 and ad == 0 and len(person.getAltFamilyList()) != 0: + self.g.write('1 ADOP\n') + fam = None + for f in person.getAltFamilyList(): + mrel = string.lower(f[1]) + frel = string.lower(f[2]) + if mrel=="adopted" or mrel=="adopted": + fam = f[0] + break + if fam: + self.g.write('2 FAMC @F%s@\n' % fam.getId()) + if mrel == frel: + self.g.write('3 ADOP BOTH\n') + elif mrel == "adopted": + self.g.write('3 ADOP WIFE\n') + else: + self.g.write('3 ADOP HUSB\n') + + for attr in person.getAttributeList(): + if self.private and attr.getPrivacy(): + continue + name = attr.getType() + if const.personalConstantAttributes.has_key(name): + val = const.personalConstantAttributes[name] + else: + val = "" + if val != "" : + self.g.write("1 %s\n" % val) + else: + self.g.write("1 EVEN\n") + self.g.write("2 TYPE %s\n" % self.cnvtxt(name)) + self.g.write("2 PLAC %s\n" % self.cnvtxt(attr.getValue())) + if attr.getNote() != "": + self.write_long_text("NOTE",2,attr.getNote()) + for srcref in attr.getSourceRefList(): + self.write_source_ref(2,srcref) + + for addr in person.getAddressList(): + if self.private and addr.getPrivacy(): + continue + self.g.write("1 RESI\n") + datestr = addr.getDateObj().getSaveDate() + if datestr != "": + self.g.write("2 DATE %s\n" % self.cnvtxt(datestr)) + self.write_long_text("ADDR",2,addr.getStreet()) + if addr.getCity() != "": + self.g.write("3 CITY %s\n" % addr.getCity()) + if addr.getState() != "": + self.g.write("3 STAE %s\n" % addr.getState()) + if addr.getPostal() != "": + self.g.write("3 POST %s\n" % addr.getPostal()) + if addr.getCountry() != "": + self.g.write("3 CTRY %s\n" % addr.getCountry()) + if addr.getNote() != "": + self.write_long_text("NOTE",3,addr.getNote()) + for srcref in addr.getSourceRefList(): + self.write_source_ref(3,srcref) + + family = person.getMainFamily() + if family != None and family in self.family_list: + self.g.write("1 FAMC @F%s@\n" % family.getId()) + + for family in person.getAltFamilyList(): + self.g.write("1 FAMC @F%s@\n" % family[0].getId()) + if self.adopt_mode == 0: + if string.lower(family[1]) == "adopted": + self.g.write("2 PEDI Adopted\n") + + for family in person.getFamilyList(): + if family != None and family in self.family_list: + self.g.write("1 FAMS @F%s@\n" % family.getId()) + + for url in person.getUrlList(): + self.g.write('1 OBJE\n') + self.g.write('2 FORM URL\n') + if url.get_description() != "": + self.g.write('2 TITL %s\n' % url.get_description()) + if url.get_path() != "": + self.g.write('2 FILE %s\n' % url.get_path()) + + if person.getNote() != "": + self.write_long_text("NOTE",1,person.getNote()) + + def write_long_text(self,tag,level,note): + prefix = "%d %s" % (level,tag) + textlines = string.split(note,'\n') + if len(note) == 0: + g.write("%s\n" % prefix) + else: + for line in textlines: + ll = len(line) + while ll > 0: + brkpt = 70 + if ll > brkpt: + while (ll > brkpt and line[brkpt] in string.whitespace): + brkpt = brkpt+1 + if ll == brkpt: + self.g.write("%s %s\n" % (prefix,line)) + line = '' + else: + self.g.write("%s %s\n" % (prefix,line[0:brkpt+1])) + line = line[brkpt+1:] + else: + self.g.write("%s %s\n" % (prefix,line)) + line = "" + if len(line) > 0: + prefix = "%d CONC" % (level + 1) + else: + prefix = "%d CONT" % (level + 1) + ll = len(line) + + def dump_event_stats(self,event): + dateobj = event.getDateObj() + if not dateobj.isEmpty(): + self.print_date("2 DATE",dateobj) + elif dateobj.getText() != "": + self.g.write("2 DATE %s\n" % self.cnvtxt(dateobj.getText())) + if event.getPlaceName() != "": + self.g.write("2 PLAC %s\n" % self.cnvtxt(event.getPlaceName())) + if event.getCause() != "": + self.g.write("2 CAUS %s\n" % self.cnvtxt(event.getCause())) + if event.getNote() != "": + self.write_long_text("NOTE",2,event.getNote()) + for srcref in event.getSourceRefList(): + self.write_source_ref(2,srcref) + + def print_date(self,prefix,date): + start = date.get_start_date() + + if date.get_calendar() == Date.GREGORIAN: + cal = '' + if date.isRange(): + val = "FROM %s TO %s" % (make_date(start,_month), + make_date(date.get_stop_date(),_month)) + else: + val = make_date(start,_month) + elif date.get_calendar() == Date.HEBREW: + cal = '@#HEBREW@ ' + if date.isRange(): + val = "FROM %s TO %s" % (make_date(start,_hmonth), + make_date(date.get_stop_date(),_hmonth)) + else: + val = make_date(start,_hmonth) + elif date.get_calendar() == Date.FRENCH: + cal = '@#FRENCH R@ ' + if date.isRange(): + val = "FROM %s TO %s" % (make_date(start,_fmonth), + make_date(date.get_stop_date(),_fmonth)) + else: + val = make_date(start,_fmonth) + else: + cal = '@#JULIAN@ ' + if date.isRange(): + val = "FROM %s TO %s" % (make_date(start,_month), + make_date(date.get_stop_date(),_month)) + else: + val = make_date(start,_month) + self.g.write("%s %s%s\n" % (prefix,cal,val)) + + def write_person_name(self,name,nick): + firstName = self.cnvtxt(name.getFirstName()) + surName = self.cnvtxt(name.getSurname()) + suffix = self.cnvtxt(name.getSuffix()) + title = self.cnvtxt(name.getTitle()) + if suffix == "": + self.g.write("1 NAME %s /%s/\n" % (firstName,surName)) + else: + self.g.write("1 NAME %s /%s/, %s\n" % (firstName,surName, suffix)) + + if name.getFirstName() != "": + self.g.write("2 GIVN %s\n" % firstName) + if name.getSurname() != "": + self.g.write("2 SURN %s\n" % surName) + if name.getSuffix() != "": + self.g.write("2 NSFX %s\n" % suffix) + if name.getTitle() != "": + self.g.write("2 NPFX %s\n" % title) + if nick != "": + self.g.write('2 NICK %s\n' % nick) + if name.getNote() != "": + self.write_long_text("NOTE",2,name.getNote()) + for srcref in name.getSourceRefList(): + self.write_source_ref(2,srcref) + + def write_source_ref(self,level,ref): + if ref.getBase() == None: + return + self.g.write("%d SOUR @S%s@\n" % (level,ref.getBase().getId())) + if ref.getPage() != "": + self.g.write("%d PAGE %s\n" % (level+1,ref.getPage())) + + ref_text = ref.getText() + if ref_text != "" or ref.getDate().getDate() != "": + self.g.write('%d DATA\n' % (level+1)) + if ref_text != "": + self.write_long_text("TEXT",level+2,ref_text) + if ref.getDate().getDate(): + self.g.write("%d DATE %s\n" % (level+2,ref.getDate().getSaveDate())) + if ref.getComments() != "": + self.write_long_text("NOTE",level+1,ref.getComments()) + + def probably_alive(self,person): + + if person == None: + return 1 + + if self.restrict == 0: + return 0 + + death = person.getDeath() + birth = person.getBirth() + + if death.getDate() != "": + return 0 + if birth.getDate() != "": + year = birth.getDateObj().getYear() + time_struct = time.localtime(time.time()) + current_year = time_struct[0] + if year != -1 and current_year - year > 110: + return 0 + return 1 - topDialog.get_widget("gedcomExport").show() #------------------------------------------------------------------------- # diff --git a/src/sort.py b/src/sort.py index bc359e576..99427ef91 100644 --- a/src/sort.py +++ b/src/sort.py @@ -19,7 +19,7 @@ # import string -from Date import compare_dates +from Date import compare_dates, UNDEF #------------------------------------------------------------------------- # @@ -35,7 +35,7 @@ def build_sort_name(n): # # #------------------------------------------------------------------------- -def build_sort_birth(n): +def build_sort_event(n): y = n.start.year if y < 0: y = 9999 @@ -47,23 +47,6 @@ def build_sort_birth(n): d = 99 return "%04d%02d%02d" % (y,m,d) -#------------------------------------------------------------------------- -# -# -# -#------------------------------------------------------------------------- -def build_sort_death(n): - y = n.start.year - if y == -1: - y = 9999 - m = n.start.month - if m == -1: - m = 99 - d = n.start.day - if d == -1: - d = 99 - return "%04d%02d%02d" % (y,m,d) - #------------------------------------------------------------------------- # #