Example #1
0
 def _from_row(owner_id, dashboard_id, row):
     res = Layout()
     res.layout_dict = dict(serialize.json_loads(row['layout_def']))
     res.layout_props = serialize.json_loads(row['layout_props']) if row['layout_props'] \
         else {'by_tile_id': {}}
     res.layout_props['by_tile_id'] = dict(res.layout_props['by_tile_id'])
     res.owner_id = owner_id
     res.dashboard_id = dashboard_id
     res.layout_id = row['layout_id']
     return res
Example #2
0
 def select(owner_id, dashboard_id):
     """Selects the :class:`Layout` associated with the dashboard"""
     row = c.dao.LayoutDAO.select(owner_id, dashboard_id)
     if not row:
         return None
     res = Layout()
     res.layout_dict = dict(serialize.json_loads(row['layout_def']))
     res.layout_props = serialize.json_loads(row['layout_props']) if row['layout_props'] \
         else {'by_tile_id': {}}
     res.layout_props['by_tile_id'] = dict(res.layout_props['by_tile_id'])
     res.owner_id = owner_id
     res.dashboard_id = dashboard_id
     res.layout_id = row['layout_id']
     return res
Example #3
0
def select_default_series_spec_options(report_id, series_spec_list):
    """Return default options for a list of :class:`SeriesSpec` objects
    as a list of dictionaries with the keys:

    * ``name`` - the suggested name of the series
    * ``color`` - the suggested color of the series

    """
    assert isinstance(series_spec_list, list)

    series_spec_vals = [
        serialize.mjson(series_spec_for_default_options(ss))
        for ss in series_spec_list
    ]
    series_spec_val_to_idxs = defaultdict(list)
    for i, ssv in enumerate(series_spec_vals):
        series_spec_val_to_idxs[ssv].append(i)

    res = [{} for _ in xrange(len(series_spec_list))]
    options_list = c.dao.OptionsDAO.select_multi(report_id, 'SeriesSpec',
                                                 series_spec_vals)
    for series_spec_raw, default_options_raw in options_list:
        for idx in series_spec_val_to_idxs[series_spec_raw]:
            if default_options_raw:
                res[idx] = serialize.json_loads(default_options_raw)
    return res
Example #4
0
    def test_custom_types(self):
        d = {
            'id': uuid.uuid1(),
            'id2': uuid.uuid4(),
            'dt': datetime.datetime.utcnow(),
            'da': datetime.datetime.utcnow(),
            'ss': SeriesSpec(2, 0, dict(op='eq', args=['monique'])),
        }
        self.assertEqual(d, serialize.json_loads(serialize.mjson(d)))

        dt = datetime.datetime.utcnow()
        self.assertEqual(util.datetime_from_date(dt.date()),
                         serialize.json_loads(serialize.mjson(dt.date())))

        ext_d = json.loads(
            serialize.json_dumps_external(util.dictwithout(d, 'ss')))
        self.assertEqual(d['id2'].hex, ext_d['id2'])
Example #5
0
 def __get__(self, obj, objtype):
     if not hasattr(obj, self.json_value_prop):
         raw_val = obj[self.column]
         if raw_val is None:
             setattr(obj, self.json_value_prop, self.default())
         else:
             setattr(obj, self.json_value_prop, serialize.json_loads(raw_val))
     return getattr(obj, self.json_value_prop)
Example #6
0
def parse_json(s):
    if not s or not s.strip():
        return None
    try:
        return serialize.json_loads(s)
    except:
        raise responses.ExceptionalResponse.bad_request(
            'Invalid json value <%s>' % s)
Example #7
0
 def select_all_dashboards_ordering(self, owner_id):
     current_ordering_raw = c.cass.execute_fst(
         """SELECT dashboard_id_ordering
                                                  FROM mqe.all_dashboards_properties
                                                  WHERE owner_id=?""",
         [owner_id])['dashboard_id_ordering']
     if current_ordering_raw:
         return serialize.json_loads(current_ordering_raw)
     return None
Example #8
0
def update_default_options(tile):
    """Include the tile's :data:`tile_options` in a pool of default options belonging
    to the owner of the tile"""
    series_specs = tile.series_specs()
    if not series_specs:
        return

    old_options_list = c.dao.OptionsDAO.select_multi(
        tile.report_id, 'SeriesSpec', [
            serialize.mjson(series_spec_for_default_options(ss))
            for ss in series_specs
        ])

    default_options_by_ss = {}
    for ss_do_raw, options_raw in old_options_list:
        ss_do = series_spec_for_default_options(
            serialize.json_loads(ss_do_raw))
        default_options_by_ss[ss_do] = serialize.json_loads(options_raw)

    colors = tile.tile_options.get('colors')
    to_set = []
    for i, ss in enumerate(series_specs):
        ss_do = series_spec_for_default_options(ss)
        old_options = default_options_by_ss.get(ss_do, {})
        new_options = {}

        name = ss.params.get('name')
        if name:
            new_options['name'] = name

        color = util.safeget(colors, i)
        if color:
            new_options['color'] = color

        if old_options.get('color') and not new_options.get('color'):
            new_options['color'] = old_options['color']

        if old_options != new_options:
            to_set.append(
                (serialize.mjson(ss_do), serialize.mjson(new_options)))

    if to_set:
        c.dao.OptionsDAO.set_multi(tile.report_id, 'SeriesSpec', to_set)
        log.debug('Updated default options from tile %s', tile)
Example #9
0
 def select_all_dashboards_ordering(self, owner_id):
     with cursor() as cur:
         cur.execute(
             """SELECT dashboard_id_ordering
                        FROM all_dashboards_properties
                        WHERE owner_id=?""", [owner_id])
         row = cur.fetchone()
         if row:
             return serialize.json_loads(row['dashboard_id_ordering'])
         return None
Example #10
0
 def update_user_data(self, d):
     """Update the ``mqe.user.user_data`` column holding a custom JSON-serializable dictionary.
     The ``d`` is a dictionary which items will be assigned to the ``user_data`` dictionary.
     """
     assert isinstance(d, dict)
     row = c.dao.UserDAO.select(self.user_id)
     user_data = serialize.json_loads(row['user_data'])
     user_data.update(d)
     c.dao.UserDAO.update_user_data(self.user_id,
                                    serialize.mjson(user_data))
     self['user_data'] = serialize.mjson(user_data)
     # clear cached value
     del self.user_data
Example #11
0
    def test_registering_custom_class(self):
        @serialize.json_type('A')
        class A(object):
            def __init__(self):
                self.a = 10

            def for_json(self):
                return {'a': self.a}

            @classmethod
            def from_rawjson(cls, x):
                return A()

        doc = serialize.json_loads(serialize.json_dumps({'obj': A()}))
        self.assertIsInstance(doc['obj'], A)
Example #12
0
    def get_tile_data(self, limit=None):
        """Called by :meth:`~mqe.tiles.Tile.get_tile_data`"""
        data = {}

        data['report_name'] = self.tile.report.report_name

        data['latest_extra_ri_data'] = {}
        latest_rid = self.tile.report.fetch_latest_instance_id(
            self.tile_options['tags'])
        if latest_rid is not None:
            latest_extra_ri_data = c.dao.ReportInstanceDAO.select_extra_ri_data(
                self.tile.report_id, latest_rid)
            if latest_extra_ri_data:
                data['latest_extra_ri_data'] = serialize.json_loads(
                    latest_extra_ri_data)

        data['series_data'] = []

        self.fill_tile_data(data, limit=limit)

        if data['series_data']:
            data['common_header'] = util.common_value(
                sd['common_header'] for sd in data['series_data']
                if sd.get('data_points'))

        data['generated_tile_title'] = self.generate_tile_title(data)
        data[
            'generated_tile_title_postfix'] = self.generate_tile_title_postfix(
            )

        self._set_combined_colors(data)

        drawer = create_drawer(self)
        drawer.process_tile_data(data)
        drawer.process_full_tile_data(data)

        return data
Example #13
0
    def desc(self, expand_content, expand_input=False):
        """Returns a dictionary describing the instance, containing at least ``id``, ``tags`` and
        ``created`` keys.

        :param bool expand_content: whether to include ``rows`` and ``header`` in the result
        :param bool expand_input: whether to include user input string under ``input`` key
        """
        d = OrderedDict()
        d['id'] = self.report_instance_id.hex
        d['tags'] = self.all_tags
        d['created'] = self.created.isoformat()
        if expand_content:
            if self.table is not None:
                d['rows'] = self._raw_rows_result(self.table.rows)
                d['header'] = self.table.header_idxs
            else:
                d['rows'] = []
                d['header'] = []
        if expand_input:
            if self.parsing_result_desc.get('input_is_json'):
                d['input'] = serialize.json_loads(self['input_string'])
            else:
                d['input'] = self['input_string']
        return d
Example #14
0
    def set(self, owner_id=None, dashboard_id=None, old_layout_id=None):
        """Set a new layout definition for the dashboard (replacing the existing one), using
        the current content of the :attr:`layout_dict`. The parameters are optional - if not
        specified, the current values of :attr:`owner_id`, :attr:`dashboard_id` and
        :attr:`layout_id` are used.

        :param owner_id: the owner ID of the dashboard
        :param dashboard_id: the dashboard's ID
        :param old_layout_id: ``None`` if this should be a new layout definition
            for the dashboard, ``layout_id`` of the existing layout otherwise
        :return: a ``layout_id`` of a newly set layout if the operation was successful,
            ``None`` otherwise (ie. when the passed ``old_layout_id`` didn't match the
            version in the database)
        """
        owner_id = owner_id or self.owner_id
        if not owner_id:
            raise ValueError('owner_id not set in Layout and not passed as an argument')
        dashboard_id = dashboard_id or self.dashboard_id
        if not dashboard_id:
            raise ValueError('dashboard_id not set in Layout and not passed as an argument')
        old_layout_id = old_layout_id or self.layout_id

        # a layout def is a layout_dict serialized as a list of items. The list is
        # sorted by tile creation time (but this assumption should not be generally made).
        new_layout_def = serialize.mjson(sorted(self.layout_dict.items(),
                                                key=lambda (tile_id, vo): tile_id.time))


        # Merge old layout_props with new data

        old_layout_props_row = c.dao.LayoutDAO.select(owner_id, dashboard_id, ['layout_props'])

        if not old_layout_props_row and old_layout_id:
            return None

        if old_layout_props_row and old_layout_props_row['layout_props']:
            old_layout_props = serialize.json_loads(old_layout_props_row['layout_props'])
        else:
            old_layout_props = {'by_tile_id': []}

        by_tile_id = {}
        old_by_tile_id = dict(old_layout_props['by_tile_id'])

        tile_ids_to_fetch = []
        for tile_id in self.layout_dict:
            if tile_id in old_by_tile_id:
                by_tile_id[tile_id] = old_by_tile_id[tile_id]
            elif tile_id in self._included_tiles:
                by_tile_id[tile_id] = self.props_of_tile(self._included_tiles[tile_id])
            else:
                tile_ids_to_fetch.append(tile_id)

        tile_dict = Tile.select_multi(dashboard_id, tile_ids_to_fetch)
        for tile_id, tile in tile_dict.items():
            by_tile_id[tile.tile_id] = self.props_of_tile(tile)


        # Compute data for sscreator and tpcreator

        sscs_data = set()
        master_data = set()
        for props in by_tile_id.values():
            if props.get('sscs'):
                #sscs_data.add((props['report_id'], tuple(props['tags'])))
                sscs_data.add(props['report_id'])
            if props.get('is_master'):
                master_data.add(props['report_id'])

        new_layout_props = serialize.mjson({'by_tile_id': by_tile_id.items()})


        # Set the new layout

        new_layout_id = gen_timeuuid()
        res = c.dao.LayoutDAO.set(owner_id, dashboard_id, old_layout_id, new_layout_id,
                         new_layout_def, new_layout_props)
        if not res:
            log.info('Setting new layout failed')
            return None

        # Insert layout_by_report for sscs and tpcreator

        c.dao.LayoutDAO.insert_layout_by_report_multi(owner_id, sscs_data, [], 'sscs',
                                                   dashboard_id, new_layout_id)
        c.dao.LayoutDAO.insert_layout_by_report_multi(owner_id, master_data, [], 'tpcreator',
                                                   dashboard_id, new_layout_id)

        self.layout_id = new_layout_id

        return new_layout_id
Example #15
0
 def value(self):
     if self.value_raw is not undefined:
         self.value_py = json_loads(self.value_raw)
     if self.value_py is not undefined:
         return self.value_py
     raise ValueError('No value set for DataPoint')
Example #16
0
 def fetch_extra_ri_data(self):
     """Fetch the ``extra_ri_data`` passed to :meth:`.process_input` - a custom JSON document"""
     raw_res = c.dao.ReportInstanceDAO.select_extra_ri_data(
         self.report_id, self.report_instance_id)
     return serialize.json_loads(raw_res) if raw_res is not None else None