diff --git a/gramps2/ChangeLog b/gramps2/ChangeLog index 288643499..ed49ae3fc 100644 --- a/gramps2/ChangeLog +++ b/gramps2/ChangeLog @@ -1,3 +1,10 @@ +2006-01-24 Don Allingham + * src/DisplayModels.py: Fix column handling for repositories + * src/RepositoryView.py: Columns for repositories + * src/GrampsDb/_GrampsDbBase.py: default columns settings for repositories + * src/GrampsDb/_ReadGedcom.py: Import repository information + * src/RelLib/_Event.py: check Event type values + 2006-01-23 Don Allingham * src/DisplayTabs.py: Add source ref model/tab * src/PeopleModel.py: specify handle column diff --git a/gramps2/src/DisplayModels.py b/gramps2/src/DisplayModels.py index 82464af37..6809aed3e 100644 --- a/gramps2/src/DisplayModels.py +++ b/gramps2/src/DisplayModels.py @@ -646,6 +646,7 @@ class RepositoryModel(BaseModel): self.column_id, self.column_type, self.column_home_url, + self.column_street, self.column_postal_code, self.column_city, self.column_county, @@ -662,6 +663,7 @@ class RepositoryModel(BaseModel): self.column_id, self.column_type, self.column_home_url, + self.column_street, self.column_postal_code, self.column_city, self.column_county, @@ -699,34 +701,58 @@ class RepositoryModel(BaseModel): return data[4].get_city() except: return u'' + + def column_street(self,data): + try: + if data[5]: + return data[5][0].get_street() + else: + return u'' + except: + return u'' def column_county(self,data): try: - return data[4].get_county() + if data[5]: + return data[5][0].get_county() + else: + return u'' except: return u'' def column_state(self,data): try: - return data[4].get_state() + if data[5]: + return data[5][0].get_state() + else: + return u'' except: return u'' def column_country(self,data): try: - return data[4].get_country() + if data[5]: + return data[5][0].get_country() + else: + return u'' except: return u'' def column_postal_code(self,data): try: - return data[4].get_postal_code() + if data[5]: + return data[5][0].get_postal_code() + else: + return u'' except: return u'' def column_phone(self,data): try: - return data[4].get_phone() + if data[5]: + return data[5][0].get_phone() + else: + return u'' except: return u'' @@ -737,11 +763,16 @@ class RepositoryModel(BaseModel): return unicode(data[6]) def column_home_url(self,data): - return unicode(data[7]) + if data[6]: + urllist = data[6] + return unicode(urllist[0].path) + else: + return u"" def column_tooltip(self,data): - try: - t = ToolTips.TipFromFunction(self.db, lambda: self.db.get_repository_from_handle(data[0])) - except: - log.error("Failed to create tooltip.", exc_info=True) - return t + return "" +# try: +# t = ToolTips.TipFromFunction(self.db, lambda: self.db.get_repository_from_handle(data[0])) +# except: +# log.error("Failed to create tooltip.", exc_info=True) +# return t diff --git a/gramps2/src/GrampsDb/_GrampsDbBase.py b/gramps2/src/GrampsDb/_GrampsDbBase.py index e8dafdccc..03efffd50 100644 --- a/gramps2/src/GrampsDb/_GrampsDbBase.py +++ b/gramps2/src/GrampsDb/_GrampsDbBase.py @@ -1666,7 +1666,7 @@ class GrampsDbBase(GrampsDBCallback): Returns the Repository display common information stored in the database's metadata. """ - default = [(1,0,200),(1,1,75),(0,5,100),(0,6,100),(1,2,100),(1,3,250),(0,4,100),(0,7,100),(0,8,100),(0,9,100),(0,10,100)] + default = [(1,0,200),(1,1,75),(0,5,100),(0,6,100),(1,2,100),(1,3,250),(1,4,100),(0,7,100),(0,8,100),(0,9,100),(0,10,100)] return self._get_columns(REPOSITORY_COL_KEY,default) def _delete_primary_from_reference_map(self, handle, transaction): diff --git a/gramps2/src/GrampsDb/_ReadGedcom.py b/gramps2/src/GrampsDb/_ReadGedcom.py index 81c2d4588..ad2f9c389 100644 --- a/gramps2/src/GrampsDb/_ReadGedcom.py +++ b/gramps2/src/GrampsDb/_ReadGedcom.py @@ -70,6 +70,10 @@ from _GedcomInfo import * from _GedTokens import * from QuestionDialog import ErrorDialog, WarningDialog +addr_re = re.compile('(.+)([\n\r]+)(.+)\s*,(.+)\s+(\d+)\s*(.*)') +addr2_re = re.compile('(.+)([\n\r]+)(.+)\s*,(.+)\s+(\d+)') +addr3_re = re.compile('(.+)([\n\r]+)(.+)\s*,(.+)') + #------------------------------------------------------------------------- # # latin/utf8 conversions @@ -329,6 +333,8 @@ class Reader: self.transtable2 = self.transtable[0:128] + ('?' * 128) self.cnv = lambda s: unicode(s) self.broken_conc = False + self.cnt = 0 + self.index = 0 def set_charset_fn(self,cnv): self.cnv = cnv @@ -340,14 +346,15 @@ class Reader: if len(self.current_list) <= 1 and not self.eof: self.readahead() try: - d = self.current_list.pop() - return d + self.current = self.current_list.pop() + return self.current except: return None def readahead(self): while len(self.current_list) < 5: line = self.f.readline() + self.index += 1 if line == "": self.f.close() self.eof = True @@ -365,18 +372,18 @@ class Reader: except: level = 0 - data = (level,tokens.get(line[1],TOKEN_UNKNOWN),val,line[1]) + data = (level,tokens.get(line[1],TOKEN_UNKNOWN),val,line[1],self.index) if data[1] == TOKEN_CONT: l = self.current_list[0] - self.current_list[0] = (l[0],l[1],l[2]+'\n'+data[2],l[3]) + self.current_list[0] = (l[0],l[1],l[2]+'\n'+data[2],l[3],l[4]) elif data[1] == TOKEN_CONC: l = self.current_list[0] if self.broken_conc: new_value = "%s %s" % (l[2],data[2]) else: new_value = l[2] + data[2] - self.current_list[0] = (l[0],l[1],new_value,l[3]) + self.current_list[0] = (l[0],l[1],new_value,l[3],l[4]) else: self.current_list.insert(0,data) @@ -403,7 +410,7 @@ class GedcomParser: self.smap = {} self.note_map = note_map self.refn = {} - self.added = {} + self.added = set() self.gedmap = GedcomInfoDB() self.gedsource = self.gedmap.get_from_source_tag('GEDCOM 5.5') self.def_src = RelLib.Source() @@ -419,6 +426,12 @@ class GedcomParser: self.sid2id = {} self.lid2id = {} self.fid2id = {} + self.rid2id = {} + + self.repo_func = { + TOKEN_NAME : self.func_repo_name, + TOKEN_ADDR : self.func_repo_addr, + } self.name_func = { TOKEN_ALIA : self.func_name_alia, @@ -480,7 +493,6 @@ class GedcomParser: self.lexer = Reader(filename) self.filename = filename - self.index = 0 self.backoff = 0 self.override = codeset @@ -570,22 +582,20 @@ class GedcomParser: # EOF ? if next_line == None: - self.index += 1 self.text = ""; self.backoff = 0 - msg = _("Premature end of file at line %d.\n") % self.index + msg = _("Premature end of file at line %d.\n") % next_line[4] self.errmsg(msg) self.error_count = self.error_count + 1 self.groups = (-1, TOKEN_UNKNOWN, "","") return self.groups self.groups = next_line - self.index += 1 self.backoff = 0 return self.groups def barf(self,level): - msg = _("Line %d was not understood, so it was ignored.") % self.index + msg = _("Line %d was not understood, so it was ignored.") % self.groups[4] self.errmsg(msg) self.error_count = self.error_count + 1 self.ignore_sub_junk(level) @@ -603,9 +613,9 @@ class GedcomParser: #self.trans.set_batch(not use_trans) self.db.disable_signals() t = time.time() - self.index = 0 self.fam_count = 0 self.indi_count = 0 + self.repo_count = 0 self.source_count = 0 try: self.parse_header() @@ -739,7 +749,7 @@ class GedcomParser: gid = matches[3] gid = gid[1:-1] self.person = self.find_or_create_person(self.map_gid(gid)) - self.added[self.person.get_handle()] = 1 + self.added.add(self.person.get_handle()) self.parse_individual(self.person) if len(self.person.get_source_references()) == 0: sref = RelLib.SourceRef() @@ -747,6 +757,14 @@ class GedcomParser: self.person.add_source_reference(sref) self.db.commit_person(self.person, self.trans) del self.person + elif matches[2] == "REPO": + self.repo_count = self.repo_count + 1 + self.repo = self.find_or_create_repository(matches[3][1:-1]) + self.repo.set_type((RelLib.Repository.UNKNOWN,"")) + self.added.add(self.repo.get_handle()) + self.parse_repository(self.repo) + self.db.commit_repository(self.repo, self.trans) + del self.repo elif matches[2] in ["SUBM","SUBN","REPO"]: self.ignore_sub_junk(1) elif matches[1] in (TOKEN_SUBM,TOKEN_SUBN,TOKEN_OBJE,TOKEN__EVENT_DEFN): @@ -813,6 +831,24 @@ class GedcomParser: family.set_gramps_id(gramps_id) return family + def find_or_create_repository(self,gramps_id): + repository = RelLib.Repository() + intid = self.rid2id.get(gramps_id) + if self.db.has_repository_handle(intid): + repository.unserialize(self.db.get_raw_repository_data(intid)) + else: + intid = self.find_repository_handle(gramps_id) + repository.set_handle(intid) + repository.set_gramps_id(gramps_id) + return repository + + def find_repository_handle(self,gramps_id): + intid = self.rid2id.get(gramps_id) + if not intid: + intid = create_id() + self.rid2id[gramps_id] = intid + return intid + def find_family_handle(self,gramps_id): intid = self.fid2id.get(gramps_id) if not intid: @@ -867,7 +903,7 @@ class GedcomParser: return place def parse_cause(self,event,level): - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: self.backup() @@ -878,7 +914,7 @@ class GedcomParser: self.barf(1) def parse_note_data(self,level): - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: self.backup() @@ -894,7 +930,7 @@ class GedcomParser: mrel = (RelLib.Person.CHILD_BIRTH,'') frel = (RelLib.Person.CHILD_BIRTH,'') - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: self.backup() @@ -922,7 +958,7 @@ class GedcomParser: def parse_family(self): self.addr = None note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < 1: @@ -972,7 +1008,7 @@ class GedcomParser: self.db.commit_person(child, self.trans) elif matches[1] == TOKEN_NCHI: a = RelLib.Attribute() - a.set_type("Number of Children") + a.set_type((RelLib.Attribute.NUM_CHILD,'')) a.set_value(matches[2]) self.family.add_attribute(a) elif matches[1] == TOKEN_SOUR: @@ -996,11 +1032,14 @@ class GedcomParser: try: event.set_type((ged2fam[matches[3]],'')) except: - val = ged2fam_custom.has_key(matches[3]) - if val: - event.set_type((RelLib.Event.CUSTOM,val)) + if ged2fam_custom.has_key(matches[3]): + event.set_type((RelLib.Event.CUSTOM,ged2fam_custom[matches[3]])) + elif matches[3]: + event.set_type((RelLib.Event.CUSTOM,matches[3])) else: - event.set_type((RelLib.Event.CUSTOM,matches[1])) + event.set_type((RelLib.Event.UNKNOWN,'')) + if matches[2] and not event.get_description(): + event.set_description(matches[2]) self.parse_family_event(event,2) if event.get_type()[0] == RelLib.Event.MARRIAGE: self.family.set_relationship((RelLib.Family.MARRIED,'')) @@ -1029,7 +1068,7 @@ class GedcomParser: return u"" else: if old_note: - note = "%s\n%s%s" % (old_note,matches[2]) + note = "%s\n%s" % (old_note,matches[2]) else: note = matches[2] task(note) @@ -1060,7 +1099,7 @@ class GedcomParser: def parse_optional_note(self,level): note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: @@ -1079,7 +1118,7 @@ class GedcomParser: def parse_famc_type(self,level,person): ftype = (RelLib.Person.CHILD_BIRTH,'') note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: @@ -1155,7 +1194,7 @@ class GedcomParser: filename = "" title = "" note = "" - while 1: + while True: matches = self.get_next() if matches[1] == TOKEN_FORM: form = matches[2].lower() @@ -1193,7 +1232,7 @@ class GedcomParser: def parse_residence(self,address,level): note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: @@ -1223,7 +1262,7 @@ class GedcomParser: def parse_address(self,address,level): first = 0 note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: if matches[1] == TOKEN_PHON: @@ -1260,7 +1299,7 @@ class GedcomParser: def parse_ord(self,lds_ord,level): note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: self.backup() @@ -1294,7 +1333,7 @@ class GedcomParser: def parse_person_event(self,event,level): note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: if note: @@ -1359,7 +1398,7 @@ class GedcomParser: def parse_adopt_event(self,event,level): note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: if note != "": @@ -1405,7 +1444,7 @@ class GedcomParser: def parse_adopt_famc(self,level): mrel = RelLib.Person.CHILD_ADOPTED frel = RelLib.Person.CHILD_ADOPTED - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: self.backup() @@ -1421,7 +1460,7 @@ class GedcomParser: def parse_person_attr(self,attr,level): note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: self.backup() @@ -1462,7 +1501,7 @@ class GedcomParser: def parse_family_event(self,event,level): note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: if note: @@ -1472,10 +1511,7 @@ class GedcomParser: elif matches[1] == TOKEN_TYPE: etype = event.get_type() if etype[0] == RelLib.Event.CUSTOM: - try: - event.set_type((ged2fam[matches[2]],'')) - except: - event.set_type((RelLib.Event.CUSTOM,matches[2])) + event.set_type((RelLib.Event.CUSTOM,matches[2])) else: note = 'Status = %s\n' % matches[2] elif matches[1] == TOKEN_DATE: @@ -1517,7 +1553,7 @@ class GedcomParser: def parse_source_reference(self,source,level): """Reads the data associated with a SOUR reference""" note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: @@ -1554,7 +1590,7 @@ class GedcomParser: """Parses the source data""" date = "" note = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: self.backup() @@ -1586,11 +1622,10 @@ class GedcomParser: line = self.lexer.read() if line[1] != TOKEN_HEAD: raise Errors.GedcomError("%s is not a GEDCOM file" % self.filename) - self.index += 1 def parse_header_source(self): genby = "" - while 1: + while True: matches = self.get_next() if int(matches[0]) < 1: self.backup() @@ -1642,7 +1677,7 @@ class GedcomParser: self.barf(2) def parse_ftw_schema(self,level): - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: @@ -1656,7 +1691,7 @@ class GedcomParser: self.barf(2) def parse_ftw_indi_schema(self,level): - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: @@ -1667,7 +1702,7 @@ class GedcomParser: ged2gramps[matches[1]] = label def parse_label(self,level): - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: @@ -1680,7 +1715,7 @@ class GedcomParser: return None def parse_ftw_fam_schema(self,level): - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: @@ -1688,15 +1723,17 @@ class GedcomParser: return else: label = self.parse_label(level+1) - ged2fam[matches[3]] = label + ged2fam_custom[matches[3]] = label return None def ignore_sub_junk(self,level): - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: self.backup() return +# else: +# print self.lexer.current return def ignore_change_data(self,level): @@ -1707,7 +1744,7 @@ class GedcomParser: self.backup() def parse_place_form(self,level): - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: @@ -1718,7 +1755,7 @@ class GedcomParser: def parse_date(self,level): date = DateStruct() - while 1: + while True: matches = self.get_next() if int(matches[0]) < level: @@ -1812,7 +1849,7 @@ class GedcomParser: prefix = self.db.iprefix index = 0 new_pmax = self.db.pmap_index - for pid in self.added.keys(): + for pid in self.added: index = index + 1 if self.refn.has_key(pid): val = self.refn[pid] @@ -1988,7 +2025,7 @@ class GedcomParser: event_ref = RelLib.EventRef() event_ref.set_reference_handle(event.handle) - event_ref.set_rol((RelLib.EventRef.PRIMARY,'')) + event_ref.set_role((RelLib.EventRef.PRIMARY,'')) state.person.add_event_ref(event_ref) def func_person_deat(self,matches,state): @@ -2018,7 +2055,7 @@ class GedcomParser: (t,n) = event.get_type() if t == RelLib.Event.CUSTOM and n in self.attrs: attr = RelLib.Attribute() - attr.set_type((self.gedattr[n],'')) + attr.set_type((RelLib.Event.CUSTOM,self.gedattr[n])) attr.set_value(event.get_description()) state.person.add_attribute(attr) else: @@ -2055,7 +2092,7 @@ class GedcomParser: n = matches[3].strip() if self.gedattr.has_key(n): attr = RelLib.Attribute() - attr.set_type((self.gedattr[n],'')) + attr.set_type((RelLib.Event.CUSTOM,self.gedattr[n])) attr.set_value(matches[2]) state.person.add_attribute(attr) self.parse_person_attr(attr,2) @@ -2166,6 +2203,60 @@ class GedcomParser: sref = self.handle_source(matches,state.level+1) state.name.add_source_reference(sref) + def parse_repository(self,repo): + state = CurrentState() + state.repo = repo + + while True: + matches = self.get_next() + + if int(matches[0]) < 1: + self.backup() + if state.get_text(): + state.repo.set_note(state.get_text()) + return + else: + func = self.repo_func.get(matches[1],self.skip_record) + func(matches,state) + + def func_repo_name(self,matches,state): + state.repo.set_name(matches[2]) + + def func_repo_addr(self,matches,state): + addr = RelLib.Address() + matched = False + + match = addr_re.match(matches[2]) + if match: + groups = match.groups() + addr.set_street(groups[0].strip()) + addr.set_city(groups[2].strip()) + addr.set_state(groups[3].strip()) + addr.set_postal_code(groups[4].strip()) + addr.set_country(groups[5].strip()) + matched = True + + match = addr2_re.match(matches[2]) + if match: + groups = match.groups() + addr.set_street(groups[0].strip()) + addr.set_city(groups[2].strip()) + addr.set_state(groups[3].strip()) + addr.set_postal_code(groups[4].strip()) + matched = True + + match = addr3_re.match(matches[2]) + if match: + groups = match.groups() + addr.set_street(groups[0].strip()) + addr.set_city(groups[2].strip()) + addr.set_state(groups[3].strip()) + matched = True + + if not matched: + addr.set_street(matches[2]) + state.repo.add_address(addr) + def skip_record(self,matches,state): self.ignore_sub_junk(2) diff --git a/gramps2/src/RelLib/_Event.py b/gramps2/src/RelLib/_Event.py index 3f5d6ed61..57819eb10 100644 --- a/gramps2/src/RelLib/_Event.py +++ b/gramps2/src/RelLib/_Event.py @@ -305,6 +305,8 @@ class Event(PrimaryObject,SourceNote,MediaBase,DateBase,PlaceBase): the_type = (the_type,'') else: the_type = (Event.CUSTOM,the_type) + assert(type(the_type[0]) == int) + assert(type(the_type[1]) == unicode or type(the_type[1]) == str) self.type = the_type def get_type(self): diff --git a/gramps2/src/RepositoryView.py b/gramps2/src/RepositoryView.py index 44a4eec1f..6f1a7f986 100644 --- a/gramps2/src/RepositoryView.py +++ b/gramps2/src/RepositoryView.py @@ -53,6 +53,7 @@ column_names = [ _('ID'), _('Type'), _('Home URL'), + _('Street'), _('ZIP/Postal Code'), _('City'), _('County'),