class GridOSBreakdown(PieStatSet): def __init__(self, app, name): super(GridOSBreakdown, self).__init__(app, name, None, "slot.os") self.os_records = Attribute(app, "os_breakdown") self.add_attribute(self.os_records) self.os_data = DashboardOSData(app) self.color_scheme = PieChartPage.GROUP2 self.has_total = True def get_records(self, session): os_records = self.os_records.get(session) if not os_records: os_records = self.os_data.get_records(session) self.os_records.set(session, os_records) return os_records def do_render(self, session): records = self.get_records(session) if len(records): return super(GridOSBreakdown, self).do_render(session) def render_title(self, session): return "Slot breakdown by OS" def do_get_items(self, session): # (index, (name, value)) return [(i, x) for i, x in enumerate(self.get_records(session))] def is_total(self, item): _, record = item return "total" in record[0] def render_item_title(self, session, item): _, record = item return record[0] def get_item_value(self, session, item): _, record = item return record[1] def render_item_value(self, session, item): return xml_escape(self.get_item_value(session, item)) def render_html_title(self, session, item): (_, (name, value)) = item os, _, state = rpartition(name, " ") return "There are %d %s slots with an OS of %s" % (value, state, os) def get_legend_class(self, session, this_item): items = self.do_get_items(session) real_index = 0 for item in items: if item[1][0] is this_item[1][0]: break if not self.is_total(item): real_index += 1 return "legend%s" % rgb_to_string(*(PieChartPage.color_schemes[self.color_scheme][real_index]))
class DashboardSummaryStats(DefinitionSet): def __init__(self, app, name, cls, columns, title): super(DashboardSummaryStats, self).__init__(app, name, None, title) self.record = Attribute(app, "totals") self.add_attribute(self.record) self.columns = columns self.sum_columns = [x.name for x in columns] self.sum_cls = cls self.data = DashboardSumData(app, self.sum_columns, self.sum_cls) self.title = None def render_title(self, session): return self.title def do_get_items(self, session): return self.columns def render_item_title(self, session, item): return item.title def get_item_value(self, session, item): record = self.get_record(session) value = record[self.get_item_index(item)] or 0 # if we want to show an average instead of an aggregate if getattr(item, "average", None): # the count of records is tucked away past the end of the normal fields total = record[len(self.columns)] if total: value = value / total else: value = 0 return value def get_item_index(self, item): return self.sum_columns.index(item.name) def get_record(self, session): record = self.record.get(session) if not record: record = self.data.get_record(session) self.record.set(session, record) return record
class DashboardPieSummarySet(PieStatSet): def __init__(self, app, name, cls, columns, title): super(DashboardPieSummarySet, self).__init__(app, name, None, title) self.record = Attribute(app, "totals") self.add_attribute(self.record) # XXX - consider using an ObjectSelector with SumSqlColumns as the data source self.columns = columns self.sum_columns = [x.name for x in columns] self.sum_cls = cls self.data = DashboardSumData(app, self.sum_columns, self.sum_cls) self.has_total = True self.color_scheme = PieChartPage.BLUES def do_get_items(self, session): return self.columns def get_item_index(self, item): return self.sum_columns.index(item.name) def is_total(self, item): index = self.get_item_index(item) return index == len(self.sum_columns) - 1 def render_item_title(self, session, item): return item.title def get_item_value(self, session, item): record = self.get_record(session) return record[self.get_item_index(item)] or 0 def get_legend_class(self, session, item): index = self.get_item_index(item) return "legend%s" % rgb_to_string(*(PieChartPage.color_schemes[self.color_scheme][index])) def get_record(self, session): record = self.record.get(session) if not record: record = self.data.get_record(session) self.record.set(session, record) return record
class GroupHelper(Widget): def __init__(self, app, name, negotiator): super(GroupHelper, self).__init__(app, name) self.negotiator = negotiator self.info = Attribute(app, "info") self.add_attribute(self.info) self.results = Attribute(app, "results") self.add_attribute(self.results) def get_config_info(self, session): info = self.info.get(session) if not info: negotiator = self.negotiator.get(session) info = self.get_group_info(session, negotiator) self.info.set(session, info) return info def get_group_info(self, session, negotiator): results = self.app.model.get_negotiator_group_names(negotiator) groups = results.data info = dict() if not results.exception: try: groups = self.split_group_names(groups) except: groups = [] if groups: for group in groups: info[group] = dict() self.results.set(session, results) return info def get_results(self, session): return self.get_config_info(session) def has_child(self, session, group): info = self.get_config_info(session) try: return info[group]['has_child'] except KeyError: info[group]['has_child'] = False for key in info: if key.startswith(group+"."): info[group]['has_child'] = True break self.info.set(session, info) return info[group]['has_child'] def get_parent(self, session, group): info = self.get_config_info(session) try: return info[group]['parent'] except KeyError: parent = "" for key in info: if key != group and group.startswith(key): if len(key) > len(parent): parent = key info[group]['parent'] = parent self.info.set(session, info) return info[group]['parent'] def get_siblings(self, session, node): info = self.get_config_info(session) siblings = list() (ng, _, _) = rpartition(node, ".") for group in info: (g, _, _) = rpartition(group, ".") if g == ng: siblings.append(group) return siblings def get_group_names(self, session): info = self.get_config_info(session) return list(info) def split_group_names(self, group_string): g_string = group_string.replace(", ", ",") if not "," in g_string: return g_string.split() return g_string.split(",") def get_config_for_groups(self, session, config, groups): info = self.get_config_info(session) needed_groups = [x for x in groups if not config in info[x]] if len(needed_groups) > 0: negotiator = self.negotiator.get(session) dynamic_results, static_results = self.app.model.get_negotiator_config_values(negotiator, needed_groups, config) if(config == "GROUP_QUOTA_DYNAMIC"): raw_configs = dynamic_results.data else: raw_configs = static_results.data try: for config in raw_configs: for group in raw_configs[config]: if raw_configs[config][group].error: info[group][config] = "" ##raw_configs[config][group].error elif raw_configs[config][group].got_data: info[group][config] = raw_configs[config][group].data['Value'] except: log.debug("Problem getting group config info", exc_info=True) self.info.set(session, info) return info def get_config_value(self, session, group, config): info = self.get_config_info(session) try: return info[group][config] except KeyError: try: info = self.get_config_for_groups(session, config, [group]) return info[group][config] except: return self.loading_indicator() def loading_indicator(self): return "<em>loading</em>" def get_unclaimed_dyn_quota(self, session, groups): info = self.get_config_info(session) total = 0.0 for group in groups: try: value = info[group]["GROUP_QUOTA_DYNAMIC"] except KeyError: info = self.get_config_for_groups(session, "GROUP_QUOTA_DYNAMIC", [group]) try: total = total + float(value) except: pass val = 1.0 - total val = max(0, val) val = min(1.0, val) return val