fix StatisticsChart.py chart output, improve code
svn: r3961
This commit is contained in:
		@@ -1,3 +1,11 @@
 | 
			
		||||
2005-01-25 Eero Tamminen <eerot@sf>
 | 
			
		||||
	* src/plugins/StatisticsChart.py:
 | 
			
		||||
	  - Comment out debug output
 | 
			
		||||
	  - Bugfix: each chart to its own page
 | 
			
		||||
	  - Move comparison function to report class
 | 
			
		||||
	  - Make strings about missing information more consistent/clearer
 | 
			
		||||
	  - Use capitalized gender names instead of Gramps (lowercase) consts
 | 
			
		||||
 | 
			
		||||
2005-01-24  Don Allingham  <dallingham@users.sourceforge.net>
 | 
			
		||||
	* gramps.spec.in: pkill gconfd to fix settings
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -57,18 +57,10 @@ from DateHandler import displayer as _dd
 | 
			
		||||
 | 
			
		||||
#------------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# Module globals
 | 
			
		||||
# Global options and their names
 | 
			
		||||
#
 | 
			
		||||
#------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
# needs to be global for the lookup_value_compare()
 | 
			
		||||
_lookup_items = {}
 | 
			
		||||
 | 
			
		||||
# needs to be global for python sort
 | 
			
		||||
def lookup_value_compare(a, b):
 | 
			
		||||
    "compare given keys according to corresponding _lookup_items values"
 | 
			
		||||
    return cmp(_lookup_items[a],_lookup_items[b])
 | 
			
		||||
 | 
			
		||||
class _options:
 | 
			
		||||
    # sort type identifiers
 | 
			
		||||
    SORT_VALUE = 0
 | 
			
		||||
@@ -152,12 +144,10 @@ class Extract:
 | 
			
		||||
        # TODO: why there's no Person.getGenderName?
 | 
			
		||||
        # It could be used by getDisplayInfo & this...
 | 
			
		||||
        if person.gender == Person.male:
 | 
			
		||||
            gender = const.male
 | 
			
		||||
        elif person.gender == Person.female:
 | 
			
		||||
            gender = const.female
 | 
			
		||||
        else:
 | 
			
		||||
            gender = const.unknown
 | 
			
		||||
        return [gender]
 | 
			
		||||
            return [_("Men")]
 | 
			
		||||
        if person.gender == Person.female:
 | 
			
		||||
            return [_("Women")]
 | 
			
		||||
        return [_("Gender unknown")]
 | 
			
		||||
 | 
			
		||||
    def get_year(self, event):
 | 
			
		||||
	"return year for given event"
 | 
			
		||||
@@ -166,7 +156,7 @@ class Extract:
 | 
			
		||||
            year = date.get_year()
 | 
			
		||||
            if year:
 | 
			
		||||
                return [str(year)]
 | 
			
		||||
        return [_("Date missing/inaccurate")]
 | 
			
		||||
        return [_("Date(s) missing")]
 | 
			
		||||
        
 | 
			
		||||
    def get_month(self, event):
 | 
			
		||||
	"return month for given event"
 | 
			
		||||
@@ -175,7 +165,7 @@ class Extract:
 | 
			
		||||
            month = date.get_month()
 | 
			
		||||
            if month:
 | 
			
		||||
                return [_dd._months[month]]
 | 
			
		||||
        return [_("Date missing/inaccurate")]
 | 
			
		||||
        return [_("Date(s) missing")]
 | 
			
		||||
 | 
			
		||||
    def get_cause(self, event):
 | 
			
		||||
	"return cause for given event"
 | 
			
		||||
@@ -198,14 +188,14 @@ class Extract:
 | 
			
		||||
	death = self.get_death(person)
 | 
			
		||||
	if not death:
 | 
			
		||||
            return self.estimate_age(person)
 | 
			
		||||
        return [_("Dead")]
 | 
			
		||||
        return [_("Already dead")]
 | 
			
		||||
 | 
			
		||||
    def get_death_age(self, person):
 | 
			
		||||
	"return age at death for given person, if dead"
 | 
			
		||||
	death = self.get_death(person)
 | 
			
		||||
	if death:
 | 
			
		||||
            return self.estimate_age(person)
 | 
			
		||||
        return [_("Alive")]
 | 
			
		||||
        return [_("Still alive")]
 | 
			
		||||
 | 
			
		||||
    def marriage_age(self, person):
 | 
			
		||||
        return "TODO: Marriage age stat unimplemented"
 | 
			
		||||
@@ -229,7 +219,7 @@ class Extract:
 | 
			
		||||
        age = ReportUtils.estimate_age(self.db, person)
 | 
			
		||||
        if age[0] < 0 or age[1] < 0:
 | 
			
		||||
            # inadequate information
 | 
			
		||||
            return [_("Missing information")]
 | 
			
		||||
            return [_("Date(s) missing")]
 | 
			
		||||
        if age[0] == age[1]:
 | 
			
		||||
            # exact year
 | 
			
		||||
            return [str(age[0])]
 | 
			
		||||
@@ -272,7 +262,7 @@ class Extract:
 | 
			
		||||
	    if obj:
 | 
			
		||||
		value = data_func(obj)	# e.g. get_year()
 | 
			
		||||
	    else:
 | 
			
		||||
		value = [_("Information missing")]
 | 
			
		||||
		value = [_("Personal information missing")]
 | 
			
		||||
            # list of information found
 | 
			
		||||
            for key in value:
 | 
			
		||||
                if key in chart[1].keys():
 | 
			
		||||
@@ -299,11 +289,11 @@ class Extract:
 | 
			
		||||
	- Dict of values with their counts
 | 
			
		||||
	(- Method)
 | 
			
		||||
        """
 | 
			
		||||
	self.db = db	# store for methods
 | 
			
		||||
	self.db = db	# store for use by methods
 | 
			
		||||
 | 
			
		||||
        data = []
 | 
			
		||||
        ext = self.extractors
 | 
			
		||||
        # initialize data
 | 
			
		||||
        # which methods to use
 | 
			
		||||
        for key in options:
 | 
			
		||||
            if options[key] and key in self.extractors:
 | 
			
		||||
                # localized data title, value dict and method
 | 
			
		||||
@@ -405,14 +395,17 @@ class StatisticsChart(Report.Report):
 | 
			
		||||
            else:
 | 
			
		||||
                heading = "Persons born %(year_from)04d-%(year_to)04d: %(title)s" % mapping
 | 
			
		||||
            self.data.append((heading, table[1], lookup))
 | 
			
		||||
	    # DEBUG
 | 
			
		||||
	    print heading
 | 
			
		||||
	    print table[1]
 | 
			
		||||
	#DEBUG
 | 
			
		||||
	#print heading
 | 
			
		||||
	#print table[1]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def lookup_compare(self, a, b):
 | 
			
		||||
        "compare given keys according to corresponding lookup values"
 | 
			
		||||
        return cmp(self.lookup_items[a], self.lookup_items[b])
 | 
			
		||||
 | 
			
		||||
    def index_items(self, data, sort, reverse):
 | 
			
		||||
        """creates & stores a sorted index for the items"""
 | 
			
		||||
        global _lookup_items
 | 
			
		||||
 | 
			
		||||
        # sort by item keys
 | 
			
		||||
        index = data.keys()
 | 
			
		||||
@@ -422,10 +415,10 @@ class StatisticsChart(Report.Report):
 | 
			
		||||
 | 
			
		||||
        if sort == _options.SORT_VALUE:
 | 
			
		||||
            # set for the sorting function
 | 
			
		||||
            _lookup_items = data
 | 
			
		||||
            self.lookup_items = data
 | 
			
		||||
        
 | 
			
		||||
            # then sort by value
 | 
			
		||||
            index.sort(lookup_value_compare)
 | 
			
		||||
            index.sort(self.lookup_compare)
 | 
			
		||||
            if reverse:
 | 
			
		||||
                index.reverse()
 | 
			
		||||
 | 
			
		||||
@@ -468,12 +461,10 @@ class StatisticsChart(Report.Report):
 | 
			
		||||
    def write_report(self):
 | 
			
		||||
        "output the selected statistics..."
 | 
			
		||||
 | 
			
		||||
        self.doc.start_page()
 | 
			
		||||
        
 | 
			
		||||
        for data in self.data:
 | 
			
		||||
            self.doc.start_page()
 | 
			
		||||
            self.output_chart(data[0], data[1], data[2])
 | 
			
		||||
            
 | 
			
		||||
        self.doc.end_page()    
 | 
			
		||||
            self.doc.end_page()    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def output_chart(self, title, data, lookup):
 | 
			
		||||
@@ -499,7 +490,7 @@ class StatisticsChart(Report.Report):
 | 
			
		||||
 | 
			
		||||
        # start output
 | 
			
		||||
        self.doc.center_text('SC-title', title, width/2, 0)
 | 
			
		||||
        print title
 | 
			
		||||
        #print title
 | 
			
		||||
 | 
			
		||||
        yoffset = pt2cm(self.doc.style_list['SC-Title'].get_font().get_size())
 | 
			
		||||
        for key in lookup:
 | 
			
		||||
@@ -513,7 +504,7 @@ class StatisticsChart(Report.Report):
 | 
			
		||||
            # right align the text to the value
 | 
			
		||||
            x = start - pt2cm(self.doc.string_width(font, key)) - 1.0
 | 
			
		||||
            self.doc.draw_text('SC-text', key, x, yoffset)
 | 
			
		||||
            print key + ":",
 | 
			
		||||
            #print key + ":",
 | 
			
		||||
        
 | 
			
		||||
            value = data[key]
 | 
			
		||||
            stop = start + (size * value / max_value)
 | 
			
		||||
@@ -523,7 +514,7 @@ class StatisticsChart(Report.Report):
 | 
			
		||||
                    (start, yoffset + row_h))
 | 
			
		||||
            self.doc.draw_path('SC-bar', path)
 | 
			
		||||
            self.doc.draw_text('SC-text', str(value), stop + 0.5, yoffset)
 | 
			
		||||
            print "%d/%d" % (value, max_value)
 | 
			
		||||
            #print "%d/%d" % (value, max_value)
 | 
			
		||||
 | 
			
		||||
        return
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user