* src/GenericFilter.py: implement short-circuit if only rule is
Everyone * src/NameDisplay.py: optimization * src/PeopleModel.py: optimization of data building svn: r5810
This commit is contained in:
parent
997be85261
commit
77a4023f9e
@ -1,5 +1,9 @@
|
|||||||
2006-01-20 Don Allingham <don@gramps-project.org>
|
2006-01-20 Don Allingham <don@gramps-project.org>
|
||||||
* src/GrampsDb/_GrampsBSDDB.py: remove function call in find_surname
|
* src/GrampsDb/_GrampsBSDDB.py: remove function call in find_surname
|
||||||
|
* src/GenericFilter.py: implement short-circuit if only rule is
|
||||||
|
Everyone
|
||||||
|
* src/NameDisplay.py: optimization
|
||||||
|
* src/PeopleModel.py: optimization of data building
|
||||||
|
|
||||||
2006-01-20 Alex Roitman <shura@gramps-project.org>
|
2006-01-20 Alex Roitman <shura@gramps-project.org>
|
||||||
* src/GrampsDb/_GrampsBSDDB.py (transaction_begin,
|
* src/GrampsDb/_GrampsBSDDB.py (transaction_begin,
|
||||||
|
@ -95,6 +95,9 @@ class Rule:
|
|||||||
def __init__(self,list):
|
def __init__(self,list):
|
||||||
self.set_list(list)
|
self.set_list(list)
|
||||||
|
|
||||||
|
def is_empty(self):
|
||||||
|
return False
|
||||||
|
|
||||||
def prepare(self,db):
|
def prepare(self,db):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -136,6 +139,9 @@ class Everyone(Rule):
|
|||||||
category = _('General filters')
|
category = _('General filters')
|
||||||
description = _('Matches everyone in the database')
|
description = _('Matches everyone in the database')
|
||||||
|
|
||||||
|
def is_empty(self):
|
||||||
|
return True
|
||||||
|
|
||||||
def apply(self,db,person):
|
def apply(self,db,person):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@ -1902,6 +1908,9 @@ class GenericFilter:
|
|||||||
self.logical_op = 'and'
|
self.logical_op = 'and'
|
||||||
self.invert = False
|
self.invert = False
|
||||||
|
|
||||||
|
def is_empty(self):
|
||||||
|
return len(self.flist) == 1 and self.flist[0].is_empty()
|
||||||
|
|
||||||
def set_logical_op(self,val):
|
def set_logical_op(self,val):
|
||||||
if val in GenericFilter.logical_functions:
|
if val in GenericFilter.logical_functions:
|
||||||
self.logical_op = val
|
self.logical_op = val
|
||||||
|
@ -29,7 +29,7 @@ Class handling language-specific displaying of names.
|
|||||||
# GRAMPS modules
|
# GRAMPS modules
|
||||||
#
|
#
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
import RelLib
|
from RelLib import Name
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
@ -64,107 +64,28 @@ class NameDisplay:
|
|||||||
def sorted(self,person):
|
def sorted(self,person):
|
||||||
"""
|
"""
|
||||||
Returns a text string representing the L{RelLib.Person} instance's
|
Returns a text string representing the L{RelLib.Person} instance's
|
||||||
L{RelLib.Name} in a manner that should be used for displaying a sorted
|
L{Name} in a manner that should be used for displaying a sorted
|
||||||
name.
|
name.
|
||||||
|
|
||||||
@param person: L{RelLib.Person} instance that contains the
|
@param person: L{RelLib.Person} instance that contains the
|
||||||
L{RelLib.Name} that is to be displayed. The primary name is used for
|
L{Name} that is to be displayed. The primary name is used for
|
||||||
the display.
|
the display.
|
||||||
@type person: L{RelLib.Person}
|
@type person: L{RelLib.Person}
|
||||||
@returns: Returns the L{RelLib.Person} instance's name
|
@returns: Returns the L{RelLib.Person} instance's name
|
||||||
@rtype: str
|
@rtype: str
|
||||||
"""
|
"""
|
||||||
name = person.get_primary_name()
|
name = person.get_primary_name()
|
||||||
if name.sort_as == RelLib.Name.FNLN:
|
if name.sort_as == Name.FNLN:
|
||||||
return self._fnln(name)
|
return self._fnln(name)
|
||||||
elif name.sort_as == RelLib.Name.PTFN:
|
elif name.sort_as == Name.PTFN:
|
||||||
return self._ptfn(name)
|
return self._ptfn(name)
|
||||||
elif name.sort_as == RelLib.Name.FN:
|
elif name.sort_as == Name.FN:
|
||||||
return name.first_name
|
return name.first_name
|
||||||
else:
|
else:
|
||||||
return self._lnfn(name)
|
return self._lnfn(name)
|
||||||
|
|
||||||
def sorted_name(self,name):
|
def _empty(self,name):
|
||||||
"""
|
return name.first_name
|
||||||
Returns a text string representing the L{RelLib.Name} instance
|
|
||||||
in a manner that should be used for displaying a sorted
|
|
||||||
name.
|
|
||||||
|
|
||||||
@param name: L{RelLib.Name} instance that is to be displayed.
|
|
||||||
@type name: L{RelLib.Name}
|
|
||||||
@returns: Returns the L{RelLib.Name} string representation
|
|
||||||
@rtype: str
|
|
||||||
"""
|
|
||||||
if name.sort_as == RelLib.Name.FNLN:
|
|
||||||
return self._fnln(name)
|
|
||||||
elif name.sort_as == RelLib.Name.PTFN:
|
|
||||||
return self._ptfn(name)
|
|
||||||
elif name.sort_as == RelLib.Name.FN:
|
|
||||||
return name.first_name
|
|
||||||
else:
|
|
||||||
return self._lnfn(name)
|
|
||||||
|
|
||||||
def display_given(self,person):
|
|
||||||
name = person.get_primary_name()
|
|
||||||
if name.patronymic:
|
|
||||||
return "%s %s" % (name.first_name, name.patronymic)
|
|
||||||
else:
|
|
||||||
return name.first_name
|
|
||||||
|
|
||||||
def display(self,person):
|
|
||||||
"""
|
|
||||||
Returns a text string representing the L{RelLib.Person} instance's
|
|
||||||
L{RelLib.Name} in a manner that should be used for normal displaying.
|
|
||||||
|
|
||||||
@param person: L{RelLib.Person} instance that contains the
|
|
||||||
L{RelLib.Name} that is to be displayed. The primary name is used for
|
|
||||||
the display.
|
|
||||||
@type person: L{RelLib.Person}
|
|
||||||
@returns: Returns the L{RelLib.Person} instance's name
|
|
||||||
@rtype: str
|
|
||||||
"""
|
|
||||||
name = person.get_primary_name()
|
|
||||||
if name.display_as == RelLib.Name.LNFN:
|
|
||||||
return self._lnfn(name,"")
|
|
||||||
else:
|
|
||||||
return self._fnln(name,"")
|
|
||||||
|
|
||||||
def display_formal(self,person):
|
|
||||||
"""
|
|
||||||
Returns a text string representing the L{RelLib.Person} instance's
|
|
||||||
L{RelLib.Name} in a manner that should be used for normal displaying.
|
|
||||||
|
|
||||||
@param person: L{RelLib.Person} instance that contains the
|
|
||||||
L{RelLib.Name} that is to be displayed. The primary name is used for
|
|
||||||
the display.
|
|
||||||
@type person: L{RelLib.Person}
|
|
||||||
@returns: Returns the L{RelLib.Person} instance's name
|
|
||||||
@rtype: str
|
|
||||||
"""
|
|
||||||
name = person.get_primary_name()
|
|
||||||
if name.display_as == RelLib.Name.LNFN:
|
|
||||||
return self._lnfn(name,'')
|
|
||||||
else:
|
|
||||||
return self._fnln(name,'')
|
|
||||||
|
|
||||||
def display_name(self,name):
|
|
||||||
"""
|
|
||||||
Returns a text string representing the L{RelLib.Name} instance
|
|
||||||
in a manner that should be used for normal displaying.
|
|
||||||
|
|
||||||
@param name: L{RelLib.Name} instance that is to be displayed.
|
|
||||||
@type name: L{RelLib.Name}
|
|
||||||
@returns: Returns the L{RelLib.Name} string representation
|
|
||||||
@rtype: str
|
|
||||||
"""
|
|
||||||
if name == None:
|
|
||||||
return ""
|
|
||||||
elif name.display_as == RelLib.Name.LNFN:
|
|
||||||
return self._lnfn(name)
|
|
||||||
elif name.display_as == RelLib.Name.PTFN:
|
|
||||||
return self._ptfn(name)
|
|
||||||
else:
|
|
||||||
return self._fnln(name)
|
|
||||||
|
|
||||||
def _ptfn(self,name):
|
def _ptfn(self,name):
|
||||||
"""
|
"""
|
||||||
@ -224,21 +145,6 @@ class NameDisplay:
|
|||||||
else:
|
else:
|
||||||
return "%s %s, %s" % (first, last, name.suffix)
|
return "%s %s, %s" % (first, last, name.suffix)
|
||||||
|
|
||||||
def name_grouping(self,db,person):
|
|
||||||
return self.name_grouping_name(db,person.primary_name)
|
|
||||||
|
|
||||||
def name_grouping_name(self,db,pn):
|
|
||||||
sv = pn.sort_as
|
|
||||||
if pn.group_as:
|
|
||||||
return pn.group_as
|
|
||||||
if sv <= RelLib.Name.LNFN:
|
|
||||||
val = pn.surname
|
|
||||||
elif sv == RelLib.Name.PTFN:
|
|
||||||
val = pn.patronymic
|
|
||||||
else:
|
|
||||||
val = pn.first_name
|
|
||||||
return db.get_name_group_mapping(val)
|
|
||||||
|
|
||||||
def _lnfn(self,name,nickname=u""):
|
def _lnfn(self,name,nickname=u""):
|
||||||
"""
|
"""
|
||||||
Prints the Western style last name, first name style.
|
Prints the Western style last name, first name style.
|
||||||
@ -249,9 +155,6 @@ class NameDisplay:
|
|||||||
|
|
||||||
first = name.first_name
|
first = name.first_name
|
||||||
|
|
||||||
if nickname:
|
|
||||||
first = '%s "%s"' % (first,nickname)
|
|
||||||
|
|
||||||
if name.patronymic:
|
if name.patronymic:
|
||||||
first = "%s %s" % (first, name.patronymic)
|
first = "%s %s" % (first, name.patronymic)
|
||||||
|
|
||||||
@ -274,5 +177,103 @@ class NameDisplay:
|
|||||||
else:
|
else:
|
||||||
return "%s %s" % (last, first)
|
return "%s %s" % (last, first)
|
||||||
|
|
||||||
|
fn_array = { Name.FNLN : _fnln,
|
||||||
|
Name.PTFN : _ptfn,
|
||||||
|
Name.FN : _empty,
|
||||||
|
}
|
||||||
|
|
||||||
|
def sorted_name(self,name):
|
||||||
|
"""
|
||||||
|
Returns a text string representing the L{Name} instance
|
||||||
|
in a manner that should be used for displaying a sorted
|
||||||
|
name.
|
||||||
|
|
||||||
|
@param name: L{Name} instance that is to be displayed.
|
||||||
|
@type name: L{Name}
|
||||||
|
@returns: Returns the L{Name} string representation
|
||||||
|
@rtype: str
|
||||||
|
"""
|
||||||
|
return self.fn_array.get(name.sort_as,self._lnfn)(name)
|
||||||
|
|
||||||
|
def display_given(self,person):
|
||||||
|
name = person.get_primary_name()
|
||||||
|
if name.patronymic:
|
||||||
|
return "%s %s" % (name.first_name, name.patronymic)
|
||||||
|
else:
|
||||||
|
return name.first_name
|
||||||
|
|
||||||
|
def display(self,person):
|
||||||
|
"""
|
||||||
|
Returns a text string representing the L{RelLib.Person} instance's
|
||||||
|
L{Name} in a manner that should be used for normal displaying.
|
||||||
|
|
||||||
|
@param person: L{RelLib.Person} instance that contains the
|
||||||
|
L{Name} that is to be displayed. The primary name is used for
|
||||||
|
the display.
|
||||||
|
@type person: L{RelLib.Person}
|
||||||
|
@returns: Returns the L{RelLib.Person} instance's name
|
||||||
|
@rtype: str
|
||||||
|
"""
|
||||||
|
name = person.get_primary_name()
|
||||||
|
if name.display_as == Name.LNFN:
|
||||||
|
return self._lnfn(name,"")
|
||||||
|
else:
|
||||||
|
return self._fnln(name,"")
|
||||||
|
|
||||||
|
def display_formal(self,person):
|
||||||
|
"""
|
||||||
|
Returns a text string representing the L{RelLib.Person} instance's
|
||||||
|
L{Name} in a manner that should be used for normal displaying.
|
||||||
|
|
||||||
|
@param person: L{RelLib.Person} instance that contains the
|
||||||
|
L{Name} that is to be displayed. The primary name is used for
|
||||||
|
the display.
|
||||||
|
@type person: L{RelLib.Person}
|
||||||
|
@returns: Returns the L{RelLib.Person} instance's name
|
||||||
|
@rtype: str
|
||||||
|
"""
|
||||||
|
name = person.get_primary_name()
|
||||||
|
if name.display_as == Name.LNFN:
|
||||||
|
return self._lnfn(name,'')
|
||||||
|
else:
|
||||||
|
return self._fnln(name,'')
|
||||||
|
|
||||||
|
def display_name(self,name):
|
||||||
|
"""
|
||||||
|
Returns a text string representing the L{Name} instance
|
||||||
|
in a manner that should be used for normal displaying.
|
||||||
|
|
||||||
|
@param name: L{Name} instance that is to be displayed.
|
||||||
|
@type name: L{Name}
|
||||||
|
@returns: Returns the L{Name} string representation
|
||||||
|
@rtype: str
|
||||||
|
"""
|
||||||
|
if name == None:
|
||||||
|
return ""
|
||||||
|
elif name.display_as == Name.LNFN:
|
||||||
|
return self._lnfn(name)
|
||||||
|
elif name.display_as == Name.PTFN:
|
||||||
|
return self._ptfn(name)
|
||||||
|
else:
|
||||||
|
return self._fnln(name)
|
||||||
|
|
||||||
|
def name_grouping(self,db,person):
|
||||||
|
return self.name_grouping_name(db,person.primary_name)
|
||||||
|
|
||||||
|
|
||||||
|
sort_field = (Name.get_surname, Name.get_surname,
|
||||||
|
Name.get_first_name, Name.get_patronymic,
|
||||||
|
Name.get_first_name)
|
||||||
|
|
||||||
|
def name_grouping_name(self,db,pn):
|
||||||
|
if pn.group_as:
|
||||||
|
return pn.group_as
|
||||||
|
sv = pn.sort_as
|
||||||
|
if sv <= Name.LNFN:
|
||||||
|
return db.get_name_group_mapping(pn.surname)
|
||||||
|
elif sv == Name.PTFN:
|
||||||
|
return db.get_name_group_mapping(pn.patronymic)
|
||||||
|
else:
|
||||||
|
return db.get_name_group_mapping(pn.first_name)
|
||||||
|
|
||||||
displayer = NameDisplay()
|
displayer = NameDisplay()
|
||||||
|
@ -28,11 +28,15 @@
|
|||||||
from gettext import gettext as _
|
from gettext import gettext as _
|
||||||
import time
|
import time
|
||||||
import cgi
|
import cgi
|
||||||
import sets
|
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
import locale
|
import locale
|
||||||
|
|
||||||
|
try:
|
||||||
|
set()
|
||||||
|
except:
|
||||||
|
from sets import Set as set
|
||||||
|
|
||||||
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# GTK modules
|
# GTK modules
|
||||||
@ -132,7 +136,7 @@ class PeopleModel(gtk.GenericTreeModel):
|
|||||||
if not self.db.is_open():
|
if not self.db.is_open():
|
||||||
return
|
return
|
||||||
|
|
||||||
if data_filter:
|
if data_filter and not data_filter.is_empty():
|
||||||
keys = data_filter.apply(self.db)
|
keys = data_filter.apply(self.db)
|
||||||
if self.invert_result:
|
if self.invert_result:
|
||||||
handle_list = self.db.get_person_handles(sort_handles=False)
|
handle_list = self.db.get_person_handles(sort_handles=False)
|
||||||
@ -142,7 +146,7 @@ class PeopleModel(gtk.GenericTreeModel):
|
|||||||
else:
|
else:
|
||||||
keys = self.db.get_person_handles(sort_handles=False)
|
keys = self.db.get_person_handles(sort_handles=False)
|
||||||
|
|
||||||
flist = sets.Set(keys)
|
flist = set(keys)
|
||||||
if skip and skip in flist:
|
if skip and skip in flist:
|
||||||
flist.remove(skip)
|
flist.remove(skip)
|
||||||
|
|
||||||
@ -152,15 +156,17 @@ class PeopleModel(gtk.GenericTreeModel):
|
|||||||
|
|
||||||
ngn = NameDisplay.displayer.name_grouping_name
|
ngn = NameDisplay.displayer.name_grouping_name
|
||||||
nsn = NameDisplay.displayer.sorted_name
|
nsn = NameDisplay.displayer.sorted_name
|
||||||
|
|
||||||
while node:
|
while node:
|
||||||
if node[0] in flist:
|
n,d = node
|
||||||
primary_name = node[1][_NAME_COL]
|
if n in flist:
|
||||||
surname = unicode(ngn(self.db,primary_name))
|
primary_name = d[_NAME_COL]
|
||||||
self.sortnames[node[0]] = unicode(nsn(primary_name))
|
surname = ngn(self.db,primary_name)
|
||||||
if self.temp_sname_sub.has_key(surname):
|
self.sortnames[n] = nsn(primary_name)
|
||||||
self.temp_sname_sub[surname].append(node[0])
|
try:
|
||||||
else:
|
self.temp_sname_sub[surname].append(n)
|
||||||
self.temp_sname_sub[surname] = [node[0]]
|
except:
|
||||||
|
self.temp_sname_sub[surname] = [n]
|
||||||
node = cursor.next()
|
node = cursor.next()
|
||||||
cursor.close()
|
cursor.close()
|
||||||
|
|
||||||
@ -169,11 +175,9 @@ class PeopleModel(gtk.GenericTreeModel):
|
|||||||
self.build_sub_entry(name)
|
self.build_sub_entry(name)
|
||||||
|
|
||||||
def build_sub_entry(self,name):
|
def build_sub_entry(self,name):
|
||||||
slist = map(lambda x: (self.sortnames[x],x),self.temp_sname_sub[name])
|
self.temp_sname_sub[name].sort(locale.strcoll)
|
||||||
slist.sort(self.byname)
|
|
||||||
entries = map(lambda x: x[1], slist)
|
|
||||||
val = 0
|
val = 0
|
||||||
for person_handle in entries:
|
for person_handle in self.temp_sname_sub[name]:
|
||||||
tpl = (name,val)
|
tpl = (name,val)
|
||||||
self.temp_iter2path[person_handle] = tpl
|
self.temp_iter2path[person_handle] = tpl
|
||||||
self.temp_path2iter[tpl] = person_handle
|
self.temp_path2iter[tpl] = person_handle
|
||||||
@ -185,9 +189,6 @@ class PeopleModel(gtk.GenericTreeModel):
|
|||||||
self.path2iter = self.temp_path2iter
|
self.path2iter = self.temp_path2iter
|
||||||
self.sname_sub = self.temp_sname_sub
|
self.sname_sub = self.temp_sname_sub
|
||||||
|
|
||||||
def byname(self,f,s):
|
|
||||||
return locale.strcoll(f[0],s[0])
|
|
||||||
|
|
||||||
def on_get_flags(self):
|
def on_get_flags(self):
|
||||||
'''returns the GtkTreeModelFlags for this particular type of model'''
|
'''returns the GtkTreeModelFlags for this particular type of model'''
|
||||||
return gtk.TREE_MODEL_ITERS_PERSIST
|
return gtk.TREE_MODEL_ITERS_PERSIST
|
||||||
|
Loading…
Reference in New Issue
Block a user