def __init__(self, app, name): super(StatChartPage, self).__init__(app, name) self.rosemary_class = Parameter(app, "rcls") self.add_parameter(self.rosemary_class) self.rosemary_package = Parameter(app, "rpkg") self.add_parameter(self.rosemary_package) param = StringParameter(app, "sigparam") self.object_signature = ListParameter(app, "signature", param) self.add_parameter(self.object_signature) param = Parameter(app, "param") self.stats = ListParameter(app, "stat", param) self.add_parameter(self.stats) self.mode = Parameter(app, "mode") self.add_parameter(self.mode) # In seconds self.duration = IntegerParameter(app, "duration") self.duration.default = 600 self.add_parameter(self.duration) self.interval = IntegerParameter(app, "interval") self.interval.default = -1 self.add_parameter(self.interval) self.method = Parameter(app, "method") self.method.default = "avg" self.add_parameter(self.method) self.samples = BooleanParameter(app, "samples") self.add_parameter(self.samples) self.container_width = IntegerParameter(app, "width") self.container_width.default = 360 self.add_parameter(self.container_width) self.container_height = IntegerParameter(app, "height") self.container_height.default = 100 self.add_parameter(self.container_height) self.total_property = Parameter(app, "tp") self.add_parameter(self.total_property) self.type = Parameter(app, "type") self.add_parameter(self.type) self.maxsamp = IntegerParameter(app, "maxsamp") self.maxsamp.default = 0 self.add_parameter(self.maxsamp) self.cache = ImageCache()
class ObjectSelectorTaskForm(FoldingFieldSubmitForm): def __init__(self, app, name, task): super(ObjectSelectorTaskForm, self).__init__(app, name) self.task = task self.cls = task.selector.cls item = IntegerParameter(app, "item") self.ids = ListParameter(app, "id", item) self.add_parameter(self.ids) self.selection = SessionAttribute(self, "selection") self.content = self.SelectionList(app, "fields") self.replace_child(self.content) self.app.form_page.modes.add_mode(self) def do_process(self, session): # If the selection list is zero length, # set cancel state and let processing complete. if self.get_selection(session) == 0: self.cancel(session) super(ObjectSelectorTaskForm, self).do_process(session) def get_selection(self, session): selection = list() self.selection.set(session, selection) for id in self.ids.get(session): try: item = self.cls.get_object_by_id(session.cursor, id) selection.append(item) except: pass return len(selection) def process_submit(self, session): selection = self.selection.get(session) self.task.invoke(session, selection) self.task.exit_with_redirect(session) def render_title(self, session): return self.task.get_title(session) class SelectionList(ItemSet): def do_get_items(self, session): return self.parent.selection.get(session) def render_item_content(self, session, item): # already escaped in get_item_content return self.parent.task.get_item_content(session, item) def render_item_class(self, session, item): return "item"
def __init__(self, app, name, exchange): super(ExchangeKeysField, self).__init__(app, name) self.title = "Initial bindings" self.exchange = exchange name = StringParameter(app, "name") self.names = ListParameter(app, "names", name) self.add_parameter(self.names) value = StringParameter(app, "value") self.values = ListParameter(app, "values", value) self.add_parameter(self.values) self.count = IntegerParameter(app, "count") self.count.default = 3 self.add_parameter(self.count) self.inputs_container_tmpl = WidgetTemplate(self, "input_container_html") self.inputs_tmpl = WidgetTemplate(self, "inputs_html")
def __init__(self, app, name, task): super(EditDynamicQuotaForm, self).__init__(app, name, task) self.field_tmpl = WidgetTemplate(self, "field_html") self.unclaimed_tmpl = WidgetTemplate(self, "unclaimed_html") quota = Parameter(app, "quota") self.add_parameter(quota) self.quotas = ListParameter(app, "quotas", quota) self.add_parameter(self.quotas) self.group_leader = Parameter(app, "group_leader") self.add_parameter(self.group_leader) self.chart = PriorityPieChart \ (app, "chart", self.object, self.group_helper, self.group_leader) self.add_child(self.chart)
def __init__(self, app, name, task): super(ObjectSelectorTaskForm, self).__init__(app, name) self.task = task self.cls = task.selector.cls item = IntegerParameter(app, "item") self.ids = ListParameter(app, "id", item) self.add_parameter(self.ids) self.selection = SessionAttribute(self, "selection") self.content = self.SelectionList(app, "fields") self.replace_child(self.content) self.app.form_page.modes.add_mode(self)
def __init__(self, app, name): super(FlashFullPage, self).__init__(app, name) self.updater = Widget(app, "updater") self.updater.update_enabled = True self.add_child(self.updater) param = StringParameter(app, "sigparam") self.object_signature = ListParameter(app, "signature", param) self.add_parameter(self.object_signature) self.rosemary_class = Parameter(app, "rcls") self.add_parameter(self.rosemary_class) self.rosemary_package = Parameter(app, "rpkg") self.add_parameter(self.rosemary_package) self.object = self.ObjectAttribute(app, "object") self.add_attribute(self.object) param = Parameter(app, "param") self.stats = ListParameter(app, "stat", param) self.add_parameter(self.stats) self.container_width = IntegerParameter(app, "width") self.container_width.default = 360 self.add_parameter(self.container_width) self.container_height = IntegerParameter(app, "height") self.container_height.default = 100 self.add_parameter(self.container_height) self.mode = Parameter(app, "mode") self.add_parameter(self.mode) self.chart_type = Parameter(app, "type") self.add_parameter(self.chart_type) self.flash_chart = self.GenericChart(app, "chart", self.object) self.add_child(self.flash_chart) self.total_property = Parameter(app, "tp") self.add_parameter(self.total_property)
class EditDynamicQuotaForm(GroupForm): def __init__(self, app, name, task): super(EditDynamicQuotaForm, self).__init__(app, name, task) self.field_tmpl = WidgetTemplate(self, "field_html") self.unclaimed_tmpl = WidgetTemplate(self, "unclaimed_html") quota = Parameter(app, "quota") self.add_parameter(quota) self.quotas = ListParameter(app, "quotas", quota) self.add_parameter(self.quotas) self.group_leader = Parameter(app, "group_leader") self.add_parameter(self.group_leader) self.chart = PriorityPieChart \ (app, "chart", self.object, self.group_helper, self.group_leader) self.add_child(self.chart) def render_title(self, session): return "Edit Dynamic Group Quota" def render_submit_content(self, session): return "Change percentage" def render_form_class(self, session): return "priorityForm" def render_data_col_header(self, session): return "Percent" def render_all_group_values(self, session): group_leader = self.group_leader.get(session) groups = self.group_helper.get_siblings(session, group_leader) info = self.group_helper.get_config_for_groups(session, "GROUP_QUOTA_DYNAMIC", groups) values = [] dynamic_groups = [] try: dynamic_groups = ["%s" % x for x in groups if info[x]["GROUP_QUOTA_DYNAMIC"] != ""] except: log.error("Error when loading dynamic group values for quota editing.") for group in sorted(groups): if(group in dynamic_groups): values.append(self.render_quota_value(session, group)) # values.reverse() values.append(self.render_unclaimed_value(session, "Unclaimed")) return values def render_all_group_names(self, session): group_leader = self.group_leader.get(session) groups = self.group_helper.get_siblings(session, group_leader) info = self.group_helper.get_config_for_groups(session, "GROUP_QUOTA_DYNAMIC", groups) values = [] dynamic_groups = [] try: dynamic_groups = ["%s" % x for x in groups if info[x]["GROUP_QUOTA_DYNAMIC"] != ""] except: log.error("Error when loading dynamic group names for quota editing.") for group in sorted(groups): if(group in dynamic_groups): values.append(group) values.append("Unclaimed") return values def render_groups(self, session): writer = Writer() group_leader = self.group_leader.get(session) groups = self.group_helper.get_siblings(session, group_leader) info = self.group_helper.get_config_for_groups(session, "GROUP_QUOTA_DYNAMIC", groups) dynamic_groups = [] try: dynamic_groups = ["%s" % x for x in groups if info[x]["GROUP_QUOTA_DYNAMIC"] != ""] except: log.error("Error when loading dynamic groups for quota editing.") for group in sorted(groups): if(group in dynamic_groups): self.field_tmpl.render(writer, session, group) self.unclaimed_tmpl.render(writer, session, "Unclaimed") return writer.to_string() def render_quota_name(self, session, group): return self.quotas.path def render_quota_value(self, session, group): value = self.group_helper.get_config_value(session, group, "GROUP_QUOTA_DYNAMIC") try: return round(float(value) * 100.0, 2) except: return 0.0 def render_unclaimed_value(self, session, group): group_leader = self.group_leader.get(session) groups = self.group_helper.get_siblings(session, group_leader) unclaimed = self.group_helper.get_unclaimed_dyn_quota \ (session, groups) return round(float(unclaimed) * 100.0, 2) def render_chart_id(self, session): return self.chart.render_id(session) def _invoke_tasks(self, session): negotiator = self.negotiator.get(session) quotas = self.quotas.get(session) group_names = self.group_names.get(session) original_values = self.original_values.get(session) info = self.group_helper.get_config_info(session) changed = False for group, new_value, original_value in zip(group_names, quotas, original_values): if group == "Unclaimed": continue quota = self.check_quota(new_value, original_value) if quota: self.task.invoke(session, negotiator, "GROUP_QUOTA_DYNAMIC_" + group, quota) info[group]["GROUP_QUOTA_DYNAMIC"] = quota changed = True if changed: self.task.reconfig(negotiator) self.app.model.update_negotiator_config_value(negotiator) def process_submit(self, session): call_async(None, self._invoke_tasks, session) self.task.exit_with_redirect(session) def check_quota(self, quota, original): try: pri = float(quota) except: return None if pri < 0.0 or pri > 100.0: return '0' try: original = float(original) except: original = 0 if pri == original: return None return str(pri / 100)
class FlashFullPage(HtmlPage): def __init__(self, app, name): super(FlashFullPage, self).__init__(app, name) self.updater = Widget(app, "updater") self.updater.update_enabled = True self.add_child(self.updater) param = StringParameter(app, "sigparam") self.object_signature = ListParameter(app, "signature", param) self.add_parameter(self.object_signature) self.rosemary_class = Parameter(app, "rcls") self.add_parameter(self.rosemary_class) self.rosemary_package = Parameter(app, "rpkg") self.add_parameter(self.rosemary_package) self.object = self.ObjectAttribute(app, "object") self.add_attribute(self.object) param = Parameter(app, "param") self.stats = ListParameter(app, "stat", param) self.add_parameter(self.stats) self.container_width = IntegerParameter(app, "width") self.container_width.default = 360 self.add_parameter(self.container_width) self.container_height = IntegerParameter(app, "height") self.container_height.default = 100 self.add_parameter(self.container_height) self.mode = Parameter(app, "mode") self.add_parameter(self.mode) self.chart_type = Parameter(app, "type") self.add_parameter(self.chart_type) self.flash_chart = self.GenericChart(app, "chart", self.object) self.add_child(self.flash_chart) self.total_property = Parameter(app, "tp") self.add_parameter(self.total_property) def render_content(self, session): self.flash_chart.stats = self.stats.get(session) self.flash_chart.mode = self.mode.get(session) self.flash_chart.chart_type = self.chart_type.get(session) return self.flash_chart.render(session) class ObjectAttribute(Attribute): def get(self, session): obj = super(FlashFullPage.ObjectAttribute, self).get(session) if not obj: rpackage = self.widget.rosemary_package.get(session) rclass = self.widget.rosemary_class.get(session) signature = self.widget.object_signature.get(session) rosemary_package = self.app.model._packages_by_name[rpackage] rosemary_class = rosemary_package._classes_by_name[rclass] cursor = self.app.database.get_read_cursor() obj = rosemary_class.get_object_by_signature(cursor, signature) self.set(session, obj) return obj class GenericChart(StatFlashChart): def render_width(self, session): return self.parent.container_width.get(session) def render_height(self, session): return self.parent.container_height.get(session) def render_img_href(self, session): params = self.get_href_params(session) params.append("width=%i" % self.render_width(session)) params.append("height=%i" % self.render_height(session)) return escape_entity("%s?" % self.get_chart_name(session) + ";".join(params)) def render_href(self, session): params = self.get_href_params(session) params.append("width=%i" % self.render_width(session)) params.append("height=%i" % self.render_height(session)) params.append("high=1") tp = self.parent.total_property.get(session) if tp: params.append("tp=%s" % tp) return escape_entity("%s?" % self.get_flash_name(session) + ";".join(params))
class StatChartPage(Page): # handles stats.png request def __init__(self, app, name): super(StatChartPage, self).__init__(app, name) self.rosemary_class = Parameter(app, "rcls") self.add_parameter(self.rosemary_class) self.rosemary_package = Parameter(app, "rpkg") self.add_parameter(self.rosemary_package) param = StringParameter(app, "sigparam") self.object_signature = ListParameter(app, "signature", param) self.add_parameter(self.object_signature) param = Parameter(app, "param") self.stats = ListParameter(app, "stat", param) self.add_parameter(self.stats) self.mode = Parameter(app, "mode") self.add_parameter(self.mode) # In seconds self.duration = IntegerParameter(app, "duration") self.duration.default = 600 self.add_parameter(self.duration) self.interval = IntegerParameter(app, "interval") self.interval.default = -1 self.add_parameter(self.interval) self.method = Parameter(app, "method") self.method.default = "avg" self.add_parameter(self.method) self.samples = BooleanParameter(app, "samples") self.add_parameter(self.samples) self.container_width = IntegerParameter(app, "width") self.container_width.default = 360 self.add_parameter(self.container_width) self.container_height = IntegerParameter(app, "height") self.container_height.default = 100 self.add_parameter(self.container_height) self.total_property = Parameter(app, "tp") self.add_parameter(self.total_property) self.type = Parameter(app, "type") self.add_parameter(self.type) self.maxsamp = IntegerParameter(app, "maxsamp") self.maxsamp.default = 0 self.add_parameter(self.maxsamp) self.cache = ImageCache() def get_content_type(self, session): return self.samples.get(session) and "text/plain" or "image/png" def get_object_property(self, session, property): rpackage = self.rosemary_package.get(session) rclass = self.rosemary_class.get(session) signature = self.object_signature.get(session) rosemary_package = self.app.model._packages_by_name[rpackage] cls = rosemary_package._classes_by_name[rclass] cursor = self.app.database.get_read_cursor() object = cls.get_object_by_signature(cursor, signature) return object.get_value(property) def get_adapter_stats(self, session): rpackage = self.rosemary_package.get(session) rclass = self.rosemary_class.get(session) rosemary_package = self.app.model._packages_by_name[rpackage] rosemary_class = rosemary_package._classes_by_name[rclass] signature = self.object_signature.get(session) stats = [getattr(rosemary_class, x) for x in self.stats.get(session)] adapters = dict() for stat in stats: filters = list() if self.user_selection.get(session) is not None and self.user_selection.get(session).lower() != "<none>" and self.user_selection.get(session) != "": filters.append(self.UserFilter(rosemary_class, self.user_selection.get(session))) if self.group_selection.get(session) is not None and self.group_selection.get(session).lower() != "<none>" and self.group_selection.get(session) != "": filters.append(self.UserFilter(rosemary_class, self.group_selection.get(session))) adapters[stat] = SamplesSqlAdapter(self.app, rosemary_class, signature, session, filters) return (adapters, stats) class UserFilter(SqlFilter): def __init__(self, cls, value): table = cls.sql_samples_table fmt = "(%s like '%s')" args = (table.user.identifier, value) self.text = fmt % args def emit(self): return self.text # builds an object that is similar to a RosemaryStatistic that can # be used later in the chart rendering to give values to the chart items class Pseudostat(object): def __init__(self, statname): name, title = statname.split('|') self.name = name self.title = title self.short_title = None def get_cache_control(self, session): return "no-cache" def gen_filename(self, session): return session.marshal() def get_cached(self, session, recent): filename = self.gen_filename(session) chart, args = self.cache.find_recent(filename, 30) if args: last_recent, samples, xy = args if recent == last_recent: return chart def get_cached_samples(self, session, recent): branch = session.branch() self.samples.set(branch, False) filename = self.gen_filename(branch) chart, args = self.cache.get_current(filename) if args: return (args['samples'], args['title_xy']) def cache_it(self, session, chart, args): filename = self.gen_filename(session) writer = self.cache.create_cache_file(filename, args) chart.write(writer) def get_interval(self, session, duration, width): interval = self.interval.get(session) if interval != -1: return interval else: max_samples = int(width * 1.5) return max(int(duration / max_samples), 1) def render_samples(self, session, recent): c = {(1,0,0): "red", (0,0,1): "blue", (0,1,0): "green"} cached_samples, title_xy = self.get_cached_samples(session, recent) if cached_samples: rets = dict() for stat in cached_samples: ret = dict() ret["color"] = c[cached_samples[stat][1]] ret["points"] = cached_samples[stat][0] ret["xy"] = title_xy[cached_samples[stat][1]] rets[stat.name] = ret return str(rets)
class ExchangeKeysField(FormField): def __init__(self, app, name, exchange): super(ExchangeKeysField, self).__init__(app, name) self.title = "Initial bindings" self.exchange = exchange name = StringParameter(app, "name") self.names = ListParameter(app, "names", name) self.add_parameter(self.names) value = StringParameter(app, "value") self.values = ListParameter(app, "values", value) self.add_parameter(self.values) self.count = IntegerParameter(app, "count") self.count.default = 3 self.add_parameter(self.count) self.inputs_container_tmpl = WidgetTemplate(self, "input_container_html") self.inputs_tmpl = WidgetTemplate(self, "inputs_html") def init(self): """ we added parameters directly to the FormField instead of adding FormInputs. XXX should this logic be moved up to FormField? """ super(ExchangeKeysField, self).init() for param in self.parameters: self.form.form_params.add(param) def render_title(self, session): return self.title def render_input_fields(self, session, *args): count = self.count.get(session) writer = Writer() for i in range(count): self.inputs_tmpl.render(writer, session, i) return writer.to_string() def render_inputs(self, session, *args): writer = Writer() self.inputs_container_tmpl.render(writer, session, *args) return writer.to_string() def render_n_name(self, session, i): return self.names.path def render_v_name(self, session, i): return self.values.path def render_n_value(self, session, i): names = self.names.get(session) return len(names) > i and xml_escape(names[i]) or "" def render_v_value(self, session, i): values = self.values.get(session) return len(values) > i and xml_escape(values[i]) or "" def get_exchange(self, session): exchange_string = self.exchange.get(session) if exchange_string: if exchange_string == "Default exchange": exchange_string = "" obj = self.form.object.get(session) cls = self.app.model.org_apache_qpid_broker.Exchange vhostid = obj._class._name == "Vhost" and obj._id or obj._vhostRef_id exchanges = cls.get_selection(session.cursor, name=exchange_string, _vhostRef_id=vhostid) if len(exchanges): return exchanges[0] return None def get(self, session): ret_dict = dict() exchange = self.get_exchange(session) if exchange: if exchange.type == "headers" or exchange.type == "xml": names = self.names.get(session) values = self.values.get(session) for name, value in zip(names, values): if name: ret_dict[name] = value return ret_dict def validate(self, session): exchange = self.get_exchange(session) names = self.names.get(session) values = self.values.get(session) if exchange: if exchange.type == "headers": if not "x-match" in names: error = FormError("x-match argument is required for this exchange") self.form.errors.add(session, error) for i in range(len(names)): if names[i]: if names[i] == "x-match": if not values[i] == "all" and not values[i] == "any": error = FormError("Argument name x-match must have a value of <i>all</i> or <i>any</i>") self.form.errors.add(session, error) else: if not values[i]: error = FormError("Missing argument value for name: %s" % names[i]) self.form.errors.add(session, error) for i in range(len(values)): if values[i]: if not names[i]: error = FormError("Missing argument name for value: %s" % values[i]) self.form.errors.add(session, error) elif exchange.type == "xml": if not "xquery" in names: error = FormError("xquery argument is required for this exchange") self.form.errors.add(session, error)