Narrative web: Sort problem with places. (#854)
* Narrative web: Sort problem with places. Fixes #10868. Places list is not sorted depending on the selected language. If you start gramps in english or another language then try to generated a narrative web report in another language, the navigation alphabet is incorrect. This is true for the place list and the person list. The problem was related to pyICU. * Narrative web: some pylint improvement.
This commit is contained in:
		
				
					committed by
					
						
						Paul Culley
					
				
			
			
				
	
			
			
			
						parent
						
							7e7dd68b58
						
					
				
				
					commit
					96fcef2a84
				
			@@ -316,6 +316,29 @@ def sort_people(dbase, handle_list, rlocale=glocale):
 | 
			
		||||
 | 
			
		||||
    return sorted_lists
 | 
			
		||||
 | 
			
		||||
def sort_places(dbase, handle_list, rlocale=glocale):
 | 
			
		||||
    """
 | 
			
		||||
    will sort the database place
 | 
			
		||||
    """
 | 
			
		||||
    pname_sub = defaultdict(list)
 | 
			
		||||
    sortnames = {}
 | 
			
		||||
 | 
			
		||||
    for place_handle in handle_list:
 | 
			
		||||
        place = dbase.get_place_from_handle(place_handle)
 | 
			
		||||
        pname = _pd.display(dbase, place)
 | 
			
		||||
        sortnames[place_handle] = pname
 | 
			
		||||
        pname_sub[pname].append(place_handle)
 | 
			
		||||
 | 
			
		||||
    sorted_lists = []
 | 
			
		||||
    temp_list = sorted(pname_sub, key=rlocale.sort_key)
 | 
			
		||||
 | 
			
		||||
    for name in temp_list:
 | 
			
		||||
        if isinstance(name, bytes):
 | 
			
		||||
            name = name.decode('utf-8')
 | 
			
		||||
        sorted_lists.append((name, pname_sub[name][0]))
 | 
			
		||||
 | 
			
		||||
    return sorted_lists
 | 
			
		||||
 | 
			
		||||
def sort_event_types(dbase, event_types, event_handle_list, rlocale):
 | 
			
		||||
    """
 | 
			
		||||
    sort a list of event types and their associated event handles
 | 
			
		||||
@@ -493,35 +516,23 @@ def first_letter(string, rlocale=glocale):
 | 
			
		||||
    # no special case
 | 
			
		||||
    return norm_unicode[0].upper()
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    import PyICU # pylint : disable=wrong-import-position
 | 
			
		||||
    PRIM_COLL = PyICU.Collator.createInstance(PyICU.Locale(COLLATE_LANG))
 | 
			
		||||
    PRIM_COLL.setStrength(PRIM_COLL.PRIMARY)
 | 
			
		||||
def primary_difference(prev_key, new_key, rlocale=glocale):
 | 
			
		||||
    """
 | 
			
		||||
    The PyICU collation doesn't work if you want to sort in another language
 | 
			
		||||
    So we use this method to do the work correctly.
 | 
			
		||||
 | 
			
		||||
    def primary_difference(prev_key, new_key, rlocale=glocale):
 | 
			
		||||
        """
 | 
			
		||||
        Try to use the PyICU collation.
 | 
			
		||||
        """
 | 
			
		||||
    Returns true if there is a primary difference between the two parameters
 | 
			
		||||
    See http://www.gramps-project.org/bugs/view.php?id=2933#c9317 if
 | 
			
		||||
    letter[i]+'a' < letter[i+1]+'b' and letter[i+1]+'a' < letter[i]+'b' is
 | 
			
		||||
    true then the letters should be grouped together
 | 
			
		||||
 | 
			
		||||
        return PRIM_COLL.compare(prev_key, new_key) != 0
 | 
			
		||||
    The test characters here must not be any that are used in contractions.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
except:
 | 
			
		||||
    def primary_difference(prev_key, new_key, rlocale=glocale):
 | 
			
		||||
        """
 | 
			
		||||
        The PyICU collation is not available.
 | 
			
		||||
 | 
			
		||||
        Returns true if there is a primary difference between the two parameters
 | 
			
		||||
        See http://www.gramps-project.org/bugs/view.php?id=2933#c9317 if
 | 
			
		||||
        letter[i]+'a' < letter[i+1]+'b' and letter[i+1]+'a' < letter[i]+'b' is
 | 
			
		||||
        true then the letters should be grouped together
 | 
			
		||||
 | 
			
		||||
        The test characters here must not be any that are used in contractions.
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
        return rlocale.sort_key(prev_key + "e") >= \
 | 
			
		||||
                   rlocale.sort_key(new_key + "f") or \
 | 
			
		||||
                   rlocale.sort_key(new_key + "e") >= \
 | 
			
		||||
                   rlocale.sort_key(prev_key + "f")
 | 
			
		||||
    return rlocale.sort_key(prev_key + "e") >= \
 | 
			
		||||
               rlocale.sort_key(new_key + "f") or \
 | 
			
		||||
               rlocale.sort_key(new_key + "e") >= \
 | 
			
		||||
               rlocale.sort_key(prev_key + "f")
 | 
			
		||||
 | 
			
		||||
def get_first_letters(dbase, handle_list, key, rlocale=glocale):
 | 
			
		||||
    """
 | 
			
		||||
@@ -565,12 +576,12 @@ def get_first_letters(dbase, handle_list, key, rlocale=glocale):
 | 
			
		||||
    index_list.sort(key=rlocale.sort_key)
 | 
			
		||||
    first = True
 | 
			
		||||
    prev_index = None
 | 
			
		||||
    for key in index_list[:]:   #iterate over a slice copy of the list
 | 
			
		||||
        if first or primary_difference(prev_index, key, rlocale):
 | 
			
		||||
    for nkey in index_list[:]:   #iterate over a slice copy of the list
 | 
			
		||||
        if first or primary_difference(prev_index, nkey, rlocale):
 | 
			
		||||
            first = False
 | 
			
		||||
            prev_index = key
 | 
			
		||||
            prev_index = nkey
 | 
			
		||||
        else:
 | 
			
		||||
            index_list.remove(key)
 | 
			
		||||
            index_list.remove(nkey)
 | 
			
		||||
 | 
			
		||||
    # return menu set letters for alphabet_navigation
 | 
			
		||||
    return index_list
 | 
			
		||||
 
 | 
			
		||||
@@ -64,7 +64,7 @@ from gramps.plugins.webreport.common import (get_first_letters, first_letter,
 | 
			
		||||
                                             primary_difference, _KEYPLACE,
 | 
			
		||||
                                             get_index_letter, FULLCLEAR,
 | 
			
		||||
                                             MARKER_PATH, OSM_MARKERS, MARKERS,
 | 
			
		||||
                                             html_escape)
 | 
			
		||||
                                             html_escape, sort_places)
 | 
			
		||||
 | 
			
		||||
_ = glocale.translation.sgettext
 | 
			
		||||
LOG = logging.getLogger(".NarrativeWeb")
 | 
			
		||||
@@ -181,21 +181,15 @@ class PlacePages(BasePage):
 | 
			
		||||
                    ]
 | 
			
		||||
                )
 | 
			
		||||
 | 
			
		||||
                # bug 9495 : incomplete display of place hierarchy labels
 | 
			
		||||
                def sort_by_place_name(obj):
 | 
			
		||||
                    """ sort by lower case place name. """
 | 
			
		||||
                    name = self.report.obj_dict[Place][obj][1]
 | 
			
		||||
                    return name.lower()
 | 
			
		||||
 | 
			
		||||
                handle_list = sorted(place_handles,
 | 
			
		||||
                                     key=lambda x: sort_by_place_name(x))
 | 
			
		||||
                handle_list = sort_places(self.r_db, place_handles,
 | 
			
		||||
                                          self.rlocale)
 | 
			
		||||
                first = True
 | 
			
		||||
 | 
			
		||||
                # begin table body
 | 
			
		||||
                tbody = Html("tbody")
 | 
			
		||||
                table += tbody
 | 
			
		||||
 | 
			
		||||
                for place_handle in handle_list:
 | 
			
		||||
                for (dummy_pname, place_handle) in handle_list:
 | 
			
		||||
                    place = self.r_db.get_place_from_handle(place_handle)
 | 
			
		||||
                    if place:
 | 
			
		||||
                        if place.get_change_time() > ldatec:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user