def settings_header(self, request, tag): return tag( html.tr( html.th(u"Option"), html.th(u"Value"), html.th(u"Note"), ), )
def render_feed(feed): feed_title = feed[u'feed'][u'title'] feed_link = feed[u'feed'][u'link'] return tags.table( tags.tr(tags.th(tags.a(feed_title, href=feed_link))))([ tags.tr( tags.td(tags.a(entry[u'title'], href=entry[u'link']))) for entry in feed[u'entries'] ])
def format_revlist(revlist, name=None): table = tags.table(class_='inner') if name: table(tags.thead(tags.tr(tags.th(name, colspan="2")))) revs = tags.tbody() table(revs) for rev, revno in revlist: r = tags.tr() r(tags.td(str(revno))) r(tags.td(rev.message.splitlines()[0][:100], style="text-align: left")) revs(r) return table
def incidents_as_rows(incidents): attrs_incident = {"class": "incident"} attrs_number = {"class": "incident_number"} attrs_priority = {"class": "incident_priority"} attrs_rangers = {"class": "incident_rangers"} attrs_location = {"class": "incident_location"} attrs_types = {"class": "incident_types"} attrs_summary = {"class": "incident_summary"} yield tags.thead( tags.tr( tags.th(u"#", **attrs_number), tags.th(u"Priority", **attrs_priority), tags.th(u"Rangers", **attrs_rangers), tags.th(u"Location", **attrs_location), tags.th(u"Types", **attrs_types), tags.th(u"Summary", **attrs_summary), **attrs_incident ), **attrs_activity ) yield tags.tbody( tags.tr( tags.td( u"{0}".format(incident.number), **attrs_number ), tags.td( u"{0}".format(incident.priority), **attrs_priority ), tags.td(u"{0}".format( u", ".join(ranger.handle for ranger in incident.rangers) ), **attrs_rangers), tags.td(u"{0}".format( str(incident.location).decode("utf-8") ), **attrs_location), tags.td(u"{0}".format( u", ".join(incident.incident_types) ), **attrs_types), tags.td(u"{0}".format( incident.summaryFromReport() ), **attrs_summary), onclick=( 'window.open("/queue/incidents/{0}");' .format(incident.number) ), **attrs_incident ) for incident in sorted(incidents) )
def as_html(self): header = t.th(t.a(href=self._channel.link)(self._channel.title)) return t.table(t.tr(header))( [t.tr(t.td(t.a(href=item.link)(item.title))) for item in self._channel.items] )
def make_html(components, instances): table = tags.table(class_='main') heading_row = tags.tr() for heading in 'component', 'tip revno', 'unreleased revisions', 'latest release': heading_row(tags.th(heading)) for instance_name in sorted(instances): heading_row(tags.th(instance_name, class_="instance-name")) table(tags.thead(heading_row)) tbody = tags.tbody() for name, component in sorted(components.items()): row = tags.tr(class_="component") revs_between_ids = {} extra_rows = [] def td(*args, **kwargs): row(tags.td(*args, **kwargs)) td(name) td(str(component.tip_revno), class_='version') unreleased_count = len(component.unreleased_revisions) if unreleased_count: id_ = get_id() td( tags.a(str(unreleased_count), href='#', class_='highlight'), class_='version clickable', id=id_) sub_name = 'revs between %s (r%s) and tip (r%s)' % ( component.last_release, component.released_revno, component.tip_revno) extra_rows.append( tags.tr( tags.td( format_revlist(component.unreleased_revisions, name=sub_name), colspan=str(4 + len(instances))), class_='hidden', id="show-" + id_)) elif not component.last_release: td(u'\N{EM DASH}', class_='version') else: td(str(unreleased_count), class_='version') if component.last_release: td(component.last_release, class_='version') else: td(u'???', class_='version') for instance_name, instance in sorted(instances.items()): ver, location = instance.get(name, (None, None)) if ver is None: td(u'\N{EM DASH}', class_='version') elif ver == component.last_release: td(ver, class_='version') elif ver in component.release2revno: revno_low = component.release2revno[ver] sub_name = 'revs between %s (r%s) and %s (r%s)' % ( ver, revno_low, component.last_release, component.released_revno) revlist = [] for rev, revno in component.mainline_revs: if revno_low < revno < component.released_revno: revlist.append((rev, revno)) if revlist: id_ = get_id() revs_between_ids[revno_low] = id_ extra_rows.append( tags.tr( tags.td( format_revlist(revlist, name=sub_name), colspan=str(4 + len(instances))), class_='hidden branch-diff', id="show-" + id_)) td( tags.a(ver, href='#', class_='highlight'), class_='version clickable', id=id_) else: td(tags.span(ver, class_='highlight'), class_='version') elif location: try: branch = bzrlib.branch.Branch.open(location) except bzrlib.errors.NoSuchBranch: td(tags.span(ver, class_='highlight'), class_='version') else: branch.lock_read() try: # This utterly half-assed version of bzr missing # doesn't take merges into account! revno, revid = branch.last_revision_info() ver = ver.split('dev')[0] + 'dev' + str(revno) mainline_revids = dict( (rev.revision_id, revno) for rev, revno in component.mainline_revs) in_branch_revs = [] while revid not in mainline_revids: rev = branch.repository.get_revision(revid) if rev.message != 'post release bump': in_branch_revs.append((rev, revno)) revno -= 1 if not rev.parent_ids: break revid = rev.parent_ids[0] tables = [] if in_branch_revs: tables.append( format_revlist( in_branch_revs, 'in branch (with nick %s) but not tip' % branch.nick)) in_trunk_revs = [] lca_revno = revno for rev, revno in component.mainline_revs: if revno > lca_revno: in_trunk_revs.append((rev, revno)) if in_trunk_revs: tables.append( format_revlist( in_trunk_revs, 'in tip but not branch')) if tables: id_ = get_id() td( tags.a(ver, href='#', class_='highlight'), class_='version clickable', id=id_) extra_rows.append( tags.tr( tags.td( tables, colspan=str(4 + len(instances))), class_='hidden branch-diff', id="show-" + id_)) else: if branch.last_revision() == component.tip_revno: td(ver, class_='highlight version') else: td(ver, class_='version') finally: branch.unlock() else: td(tags.span(ver, class_='highlight'), class_='version') tbody(row, *extra_rows) table(tbody) html = tags.html( tags.head( tags.title("Deployment report"), tags.script( src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js', type='text/javascript'), tags.script( src='https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js', type='text/javascript'), tags.script(CDATA(js), type='text/javascript'), tags.style(CDATA(css), type="text/css"), ), tags.body( tags.h1("Deployment report"), table, ), ) html(xmlns="http://www.w3.org/1999/xhtml") return DOCTYPE + flatten(html)
def _render_results(self, req, cr): assert ICheckResults(cr) c = self._client sb = c.get_storage_broker() r = [] def add(name, value): r.append(tags.li(name + ": ", value)) add("Report", tags.pre("\n".join(self._html(cr.get_report())))) add( "Share Counts", "need %d-of-%d, have %d" % (cr.get_encoding_needed(), cr.get_encoding_expected(), cr.get_share_counter_good())) add("Happiness Level", str(cr.get_happiness())) add("Hosts with good shares", str(cr.get_host_counter_good_shares())) if cr.get_corrupt_shares(): badsharemap = [] for (s, si, shnum) in cr.get_corrupt_shares(): d = tags.tr( tags.td("sh#%d" % shnum), tags.td(tags.div(s.get_nickname(), class_="nickname"), tags.div(tags.tt(s.get_name()), class_="nodeid")), ) badsharemap.append(d) add( "Corrupt shares", tags.table( tags.tr( tags.th("Share ID"), tags.th((tags.div("Nickname"), tags.div("Node ID", class_="nodeid")), class_="nickname-and-peerid")), badsharemap)) else: add("Corrupt shares", "none") add("Wrong Shares", str(cr.get_share_counter_wrong())) sharemap_data = [] shares_on_server = dictutil.DictOfSets() # FIXME: The two tables below contain nickname-and-nodeid # table column markup which is duplicated with each other, # introducer.xhtml, and deep-check-results.xhtml. All of these # (and any other presentations of nickname-and-nodeid) should be combined. for shareid in sorted(cr.get_sharemap().keys()): servers = sorted(cr.get_sharemap()[shareid], key=lambda s: s.get_longname()) for i, s in enumerate(servers): shares_on_server.add(s, shareid) shareid_s = "" if i == 0: shareid_s = str(shareid) d = tags.tr( tags.td(shareid_s), tags.td(tags.div(s.get_nickname(), class_="nickname"), tags.div(tags.tt(s.get_name()), class_="nodeid"))) sharemap_data.append(d) add( "Good Shares (sorted in share order)", tags.table( tags.tr( tags.th("Share ID"), tags.th(tags.div("Nickname"), tags.div("Node ID", class_="nodeid"), class_="nickname-and-peerid")), sharemap_data)) add("Recoverable Versions", str(cr.get_version_counter_recoverable())) add("Unrecoverable Versions", str(cr.get_version_counter_unrecoverable())) # this table is sorted by permuted order permuted_servers = [ s for s in sb.get_servers_for_psi(cr.get_storage_index()) ] num_shares_left = sum( [len(shareids) for shareids in shares_on_server.values()]) servermap = [] for s in permuted_servers: shareids = list(shares_on_server.get(s, [])) shareids.reverse() shareids_s = [ tags.tt(str(shareid), " ") for shareid in sorted(shareids) ] d = tags.tr( tags.td(tags.div(s.get_nickname(), class_="nickname"), tags.div(tags.tt(s.get_name()), class_="nodeid")), tags.td(shareids_s), ) servermap.append(d) num_shares_left -= len(shareids) if not num_shares_left: break add( "Share Balancing (servers in permuted order)", tags.table( tags.tr( tags.th(tags.div("Nickname"), tags.div("Node ID", class_="nodeid"), class_="nickname-and-peerid"), tags.th("Share IDs")), servermap)) return tags.ul(r)
def make_html(components, instances): table = tags.table(class_='main') heading_row = tags.tr() for heading in 'component', 'tip revno', 'unreleased revisions', 'latest release': heading_row(tags.th(heading)) for instance_name in sorted(instances): heading_row(tags.th(instance_name, class_="instance-name")) table(tags.thead(heading_row)) tbody = tags.tbody() for name, component in sorted(components.items()): row = tags.tr(class_="component") revs_between_ids = {} extra_rows = [] def td(*args, **kwargs): row(tags.td(*args, **kwargs)) td(name) td(str(component.tip_revno), class_='version') unreleased_count = len(component.unreleased_revisions) if unreleased_count: id_ = get_id() td(tags.a(str(unreleased_count), href='#', class_='highlight'), class_='version clickable', id=id_) sub_name = 'revs between %s (r%s) and tip (r%s)' % ( component.last_release, component.released_revno, component.tip_revno) extra_rows.append( tags.tr(tags.td(format_revlist(component.unreleased_revisions, name=sub_name), colspan=str(4 + len(instances))), class_='hidden', id="show-" + id_)) elif not component.last_release: td(u'\N{EM DASH}', class_='version') else: td(str(unreleased_count), class_='version') if component.last_release: td(component.last_release, class_='version') else: td(u'???', class_='version') for instance_name, instance in sorted(instances.items()): ver, location = instance.get(name, (None, None)) if ver is None: td(u'\N{EM DASH}', class_='version') elif ver == component.last_release: td(ver, class_='version') elif ver in component.release2revno: revno_low = component.release2revno[ver] sub_name = 'revs between %s (r%s) and %s (r%s)' % ( ver, revno_low, component.last_release, component.released_revno) revlist = [] for rev, revno in component.mainline_revs: if revno_low < revno < component.released_revno: revlist.append((rev, revno)) if revlist: id_ = get_id() revs_between_ids[revno_low] = id_ extra_rows.append( tags.tr(tags.td(format_revlist(revlist, name=sub_name), colspan=str(4 + len(instances))), class_='hidden branch-diff', id="show-" + id_)) td(tags.a(ver, href='#', class_='highlight'), class_='version clickable', id=id_) else: td(tags.span(ver, class_='highlight'), class_='version') elif location: try: branch = bzrlib.branch.Branch.open(location) except bzrlib.errors.NoSuchBranch: td(tags.span(ver, class_='highlight'), class_='version') else: branch.lock_read() try: # This utterly half-assed version of bzr missing # doesn't take merges into account! revno, revid = branch.last_revision_info() ver = ver.split('dev')[0] + 'dev' + str(revno) mainline_revids = dict( (rev.revision_id, revno) for rev, revno in component.mainline_revs) in_branch_revs = [] while revid not in mainline_revids: rev = branch.repository.get_revision(revid) if rev.message != 'post release bump': in_branch_revs.append((rev, revno)) revno -= 1 if not rev.parent_ids: break revid = rev.parent_ids[0] tables = [] if in_branch_revs: tables.append( format_revlist( in_branch_revs, 'in branch (with nick %s) but not tip' % branch.nick)) in_trunk_revs = [] lca_revno = revno for rev, revno in component.mainline_revs: if revno > lca_revno: in_trunk_revs.append((rev, revno)) if in_trunk_revs: tables.append( format_revlist(in_trunk_revs, 'in tip but not branch')) if tables: id_ = get_id() td(tags.a(ver, href='#', class_='highlight'), class_='version clickable', id=id_) extra_rows.append( tags.tr(tags.td(tables, colspan=str(4 + len(instances))), class_='hidden branch-diff', id="show-" + id_)) else: if branch.last_revision() == component.tip_revno: td(ver, class_='highlight version') else: td(ver, class_='version') finally: branch.unlock() else: td(tags.span(ver, class_='highlight'), class_='version') tbody(row, *extra_rows) table(tbody) html = tags.html( tags.head( tags.title("Deployment report"), tags.script( src= 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js', type='text/javascript'), tags.script( src= 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.18/jquery-ui.min.js', type='text/javascript'), tags.script(CDATA(js), type='text/javascript'), tags.style(CDATA(css), type="text/css"), ), tags.body( tags.h1("Deployment report"), table, ), ) html(xmlns="http://www.w3.org/1999/xhtml") return DOCTYPE + flatten(html)
def incidents_as_rows(incidents): attrs_incident = {"class": "incident"} attrs_number = {"class": "incident_number"} attrs_priority = {"class": "incident_priority"} attrs_created = {"class": "incident_created"} attrs_state = {"class": "incident_state"} attrs_rangers = {"class": "incident_rangers"} attrs_location = {"class": "incident_location"} attrs_types = {"class": "incident_types"} attrs_summary = {"class": "incident_summary"} yield tags.thead( tags.tr( tags.th(u"#", **attrs_number), tags.th(u"Priority", **attrs_priority), tags.th(u"Created", **attrs_created), tags.th(u"State", **attrs_state), tags.th(u"Rangers", **attrs_rangers), tags.th(u"Location", **attrs_location), tags.th(u"Types", **attrs_types), tags.th(u"Summary", **attrs_summary), **attrs_incident ), **attrs_activity ) yield tags.tbody( tags.tr( tags.td( u"{0}".format(incident.number), **attrs_number ), tags.td( u"{0}".format(priority_name(incident.priority)), **attrs_priority ), tags.td( u"{0}".format(formatTime( incident.created, tz=tz, format=u"%d/%H:%M" )), **attrs_number ), tags.td( u"{0}".format(IncidentState.describe(incident.state)), **attrs_number ), tags.td( u"{0}".format( u", ".join( ranger.handle for ranger in incident.rangers ) ), **attrs_rangers ), tags.td( u"{0}".format(str(incident.location).decode("utf-8")), **attrs_location ), tags.td( u"{0}".format(u", ".join(incident.incident_types)), **attrs_types ), tags.td( u"{0}".format(incident.summaryFromReport()), **attrs_summary ), onclick=( u'window.open("/queue/incidents/{0}");' .format(incident.number) ), **attrs_incident ) for incident in sorted(incidents) )