def write_missing_housenumbers( self) -> Tuple[int, int, int, str, List[List[yattag.doc.Doc]]]: """ Calculate a write stat for the house number coverage of a relation. Returns a tuple of: todo street count, todo count, done count, percent and table. """ ongoing_streets, done_streets = self.get_missing_housenumbers() todo_count = 0 table = [] table.append([ util.html_escape(_("Street name")), util.html_escape(_("Missing count")), util.html_escape(_("House numbers")) ]) rows = [] for result in ongoing_streets: # street, only_in_ref row = [] row.append(result[0].to_html()) number_ranges = util.get_housenumber_ranges(result[1]) row.append(util.html_escape(str(len(number_ranges)))) doc = yattag.doc.Doc() if not self.get_config().get_street_is_even_odd( result[0].get_osm_name()): for index, item in enumerate( sorted(number_ranges, key=util.split_house_number_range)): if index: doc.text(", ") doc.asis(util.color_house_number(item).getvalue()) else: util.format_even_odd(number_ranges, doc) row.append(doc) todo_count += len(number_ranges) rows.append(row) # It's possible that get_housenumber_ranges() reduces the # of house numbers, e.g. 2, 4 and # 6 may be turned into 2-6, which is just 1 item. Sort by the 2nd col, which is the new # number of items. table += sorted(rows, reverse=True, key=lambda cells: int(cells[1].getvalue())) done_count = 0 for result in done_streets: number_ranges = util.get_housenumber_ranges(result[1]) done_count += len(number_ranges) if done_count > 0 or todo_count > 0: percent = "%.2f" % (done_count / (done_count + todo_count) * 100) else: percent = "100.00" # Write the bottom line to a file, so the index page show it fast. with self.get_files().get_housenumbers_percent_stream("w") as stream: stream.write(percent) return len(ongoing_streets), todo_count, done_count, percent, table
def write_missing_housenumbers( self) -> Tuple[int, int, int, str, List[List[yattag.doc.Doc]]]: """ Calculate a write stat for the house number coverage of a relation. Returns a tuple of: todo street count, todo count, done count, percent and table. """ ongoing_streets, done_streets = self.get_missing_housenumbers() todo_count = 0 table = [] table.append([ util.html_escape(_("Street name")), util.html_escape(_("Missing count")), util.html_escape(_("House numbers")) ]) for result in ongoing_streets: # street_name, only_in_ref row = [] row.append(util.html_escape(result[0])) number_ranges = util.get_housenumber_ranges(result[1]) row.append(util.html_escape(str(len(number_ranges)))) number_range_strings = [i.get_number() for i in number_ranges] doc = yattag.doc.Doc() if not self.get_config().get_street_is_even_odd(result[0]): for index, item in enumerate( sorted(number_range_strings, key=util.split_house_number)): if index: doc.text(", ") doc.asis(util.color_house_number(item).getvalue()) else: util.format_even_odd(number_ranges, doc) row.append(doc) todo_count += len(number_ranges) table.append(row) done_count = 0 for result in done_streets: number_ranges = util.get_housenumber_ranges(result[1]) done_count += len(number_ranges) if done_count > 0 or todo_count > 0: percent = "%.2f" % (done_count / (done_count + todo_count) * 100) else: percent = "100.00" # Write the bottom line to a file, so the index page show it fast. with self.get_files().get_housenumbers_percent_stream("w") as stream: stream.write(percent) return len(ongoing_streets), todo_count, done_count, percent, table
def numbered_streets_to_table( self, numbered_streets: util.NumberedStreets ) -> Tuple[List[List[yattag.doc.Doc]], int]: """Turns a list of numbered streets into a HTML table.""" todo_count = 0 table = [] table.append([ util.html_escape(tr("Street name")), util.html_escape(tr("Missing count")), util.html_escape(tr("House numbers")) ]) rows = [] for result in numbered_streets: # street, only_in_ref row = [] row.append(result[0].to_html()) number_ranges = util.get_housenumber_ranges(result[1]) row.append(util.html_escape(str(len(number_ranges)))) doc = yattag.doc.Doc() if not self.get_config().get_street_is_even_odd( result[0].get_osm_name()): for index, item in enumerate( sorted(number_ranges, key=util.split_house_number_range)): if index: doc.text(", ") doc.asis(util.color_house_number(item).getvalue()) else: util.format_even_odd(number_ranges, doc) row.append(doc) todo_count += len(number_ranges) rows.append(row) # It's possible that get_housenumber_ranges() reduces the # of house numbers, e.g. 2, 4 and # 6 may be turned into 2-6, which is just 1 item. Sort by the 2nd col, which is the new # number of items. table += sorted(rows, reverse=True, key=lambda cells: int(cells[1].getvalue())) return table, todo_count