def update(c_id): """Normalize the form POST and setup the json view config object.""" if not auth(authtype='update'): flash('You do not have access to update dashboards.', 'error') return redirect(url_for('jsondash.dashboard')) viewjson = adapter.read(c_id=c_id) if not viewjson: flash('Could not find view: {}'.format(c_id), 'error') return redirect(url_for('jsondash.dashboard')) form_data = request.form view_url = url_for('jsondash.view', c_id=c_id) edit_raw = 'edit-raw' in request.form now = str(dt.now()) if edit_raw: try: conf = form_data.get('config') data = validate_raw_json(conf, date=now, id=c_id) data = db.reformat_data(data, c_id) except InvalidSchemaError as e: flash(str(e), 'error') return redirect(view_url) except (TypeError, ValueError) as e: flash('Invalid JSON config. "{}"'.format(e), 'error') return redirect(view_url) else: modules = db.format_charts(form_data) layout = form_data['mode'] # Disallow any values if they would cause an invalid layout. if layout == 'grid' and modules and modules[0].get('row') is None: flash( 'Cannot use grid layout without ' 'specifying row(s)! Edit JSON manually ' 'to override this.', 'error') return redirect(view_url) category = form_data.get('category', '') category_override = form_data.get('category_new', '') category = category_override if category_override != '' else category data = dict( category=category if category != '' else 'uncategorized', name=form_data['name'], layout=layout, modules=modules, id=c_id, date=now, ) # Update metadata, but exclude some fields that should never # be overwritten by user, once the view has been created. data.update(**metadata(exclude=['created_by'])) # Possibly override global user, if configured and valid. data.update(**check_global()) # Update db if edit_raw: adapter.update(c_id, data=data, fmt_charts=False) else: adapter.update(c_id, data=data) flash('Updated view "{}"'.format(c_id)) return redirect(view_url)
def update(c_id): """Normalize the form POST and setup the json view config object.""" if not auth(authtype='update'): flash('You do not have access to update dashboards.', 'error') return redirect(url_for('jsondash.dashboard')) viewjson = adapter.read(c_id=c_id) if not viewjson: flash('Could not find view: {}'.format(c_id), 'error') return redirect(url_for('jsondash.dashboard')) form_data = request.form view_url = url_for('jsondash.view', c_id=c_id) edit_raw = 'edit-raw' in request.form now = str(dt.now()) if edit_raw: try: conf = form_data.get('config') data = validate_raw_json(conf, date=now, id=c_id) data = db.reformat_data(data, c_id) except InvalidSchemaError as e: flash(str(e), 'error') return redirect(view_url) except (TypeError, ValueError) as e: flash('Invalid JSON config. "{}"'.format(e), 'error') return redirect(view_url) else: modules = db.format_charts(form_data) layout = form_data['mode'] # Disallow any values if they would cause an invalid layout. if layout == 'grid' and modules and modules[0].get('row') is None: flash('Cannot use grid layout without ' 'specifying row(s)! Edit JSON manually ' 'to override this.', 'error') return redirect(view_url) category = form_data.get('category', '') category_override = form_data.get('category_new', '') category = category_override if category_override != '' else category data = dict( category=category if category != '' else 'uncategorized', name=form_data['name'], layout=layout, modules=modules, id=c_id, date=now, ) # Update metadata, but exclude some fields that should never # be overwritten by user, once the view has been created. data.update(**metadata(exclude=['created_by'])) # Possibly override global user, if configured and valid. data.update(**check_global()) # Update db if edit_raw: adapter.update(c_id, data=data, fmt_charts=False) else: adapter.update(c_id, data=data) flash('Updated view "{}"'.format(c_id)) return redirect(view_url)
def make_fake_dashboard(name='Random chart', max_charts=10): """Generate fake dashboard data with a specific number of random charts. Args: name (str): The name of the new dashboard (default: {'Random chart'}) max_charts (int): Max number of charts to make (default: {10}) Returns: dict: The chart configuration. """ charts = ImmutableMultiDict( [make_fake_chart_data() for _ in range(max_charts)]) return dict( name=name, created_by='global', date=dt.now(), category=choice(list(settings.CHARTS_CONFIG.keys())), modules=db.format_charts(charts), id=str(uuid1()), layout='freeform', )
def create(): """Normalize the form POST and setup the json view config object.""" if not auth(authtype='create'): flash('You do not have access to create dashboards.', 'error') return redirect(url_for('jsondash.dashboard')) data = request.form new_id = str(uuid.uuid1()) d = dict( name=data['name'], modules=db.format_charts(data), date=str(dt.now()), id=new_id, layout=data.get('mode', 'grid'), ) d.update(**metadata()) # Possibly override global user, if configured and valid. d.update(**check_global()) # Add to DB adapter.create(data=d) flash('Created new dashboard "{}"'.format(data['name'])) return redirect(url_for('jsondash.view', c_id=new_id))
def make_fake_dashboard(name='Random chart', max_charts=10): """Generate fake dashboard data with a specific number of random charts. Args: name (str): The name of the new dashboard (default: {'Random chart'}) max_charts (int): Max number of charts to make (default: {10}) Returns: dict: The chart configuration. """ charts = ImmutableMultiDict([ make_fake_chart_data() for _ in range(max_charts)] ) return dict( name=name, created_by='global', date=dt.now(), category=choice(list(settings.CHARTS_CONFIG.keys())), modules=db.format_charts(charts), id=str(uuid1()), layout='freeform', )
def test_format_charts_invalid(): data = {'Foo': json.dumps(dict())} res = db.format_charts(data) assert res == []
def test_format_charts(): data = {'module_': json.dumps(dict()), 'name': 'foo'} res = db.format_charts(data) assert isinstance(res, list) assert res != [] assert len(res) == 1