Example #1
0
    def calculate(self):
        if 'calculator' not in request.form or \
                not Calculator.query.filter_by(
                    template=request.form['calculator']):
            return Response(json.dumps(
                {
                    'message': "Dict not okay. You must supply a valid "
                               "calculator in the POST request."
                }
            )), 404

        template_name = request.form['calculator']
        template = os.path.join('formulae', template_name)

        variables, success = helpers.get_template_variables(template)

        if not success:
            return Response(json.dumps(
                {
                    'message': "Can't find calculator {:}".format(
                        template_name)
                }
            )), 404

        # Check that all variables are present in the POST'd form
        form_schema = Schema(
            {v: Coerce(float) for v in variables},
            required=True,
            extra=True
        )

        supplied = set([k for k, v in request.form.iteritems() if v])

        try:
            formula_vars = form_schema(request.form)
        except MultipleInvalid:
            missing = list(variables - supplied)
            return Response(json.dumps(
                {
                    'missing': missing
                }
            )), 400

        # Evaluate the formula with the variables!
        return render_template(template, **formula_vars)
Example #2
0
    def get_calculator_variables(self, cid):
        calculator = Calculator.query.get(cid)

        if not calculator:
            return Response("Can't find calculator #{:}".format(cid)), 404

        template = os.path.join('formulae', calculator.template)

        variables, success = helpers.get_template_variables(template)

        if not success:
            return Response(
                "Can't find calculator {:}".format(calculator)), 404

        # TODO is there a way to get `labels` straight out of the template?
        labels = ast.literal_eval(render_template(template, get_labels=True))
        labels['calculator'] = (calculator.template, )

        return 'You need to supply {:} in the post request to {:}'.format(
            {k: v[0]
             for k, v in labels.iteritems()},
            url_for('Endpoint:calculate', _external=True))
Example #3
0
    def calculate(self):
        if 'calculator' not in request.form or \
                not Calculator.query.filter_by(
                    template=request.form['calculator']):
            return Response(
                json.dumps({
                    'message':
                    "Dict not okay. You must supply a valid "
                    "calculator in the POST request."
                })), 404

        template_name = request.form['calculator']
        template = os.path.join('formulae', template_name)

        variables, success = helpers.get_template_variables(template)

        if not success:
            return Response(
                json.dumps({
                    'message':
                    "Can't find calculator {:}".format(template_name)
                })), 404

        # Check that all variables are present in the POST'd form
        form_schema = Schema({v: Coerce(float)
                              for v in variables},
                             required=True,
                             extra=True)

        supplied = set([k for k, v in request.form.iteritems() if v])

        try:
            formula_vars = form_schema(request.form)
        except MultipleInvalid:
            missing = list(variables - supplied)
            return Response(json.dumps({'missing': missing})), 400

        # Evaluate the formula with the variables!
        return render_template(template, **formula_vars)
Example #4
0
    def get_calculator_variables(self, cid):
        calculator = Calculator.query.get(cid)

        if not calculator:
            return Response("Can't find calculator #{:}".format(cid)), 404

        template = os.path.join('formulae', calculator.template)

        variables, success = helpers.get_template_variables(template)

        if not success:
            return Response("Can't find calculator {:}".format(
                calculator)), 404

        # TODO is there a way to get `labels` straight out of the template?
        labels = ast.literal_eval(render_template(template, get_labels=True))
        labels['calculator'] = (calculator.template,)

        return 'You need to supply {:} in the post request to {:}'.format(
            {k: v[0] for k, v in labels.iteritems()},
            url_for('Endpoint:calculate', _external=True)
        )