diff options
| author | Byron Ullauri <Ullauri.Byron@gmail.com> | 2019-01-03 04:03:13 -0500 |
|---|---|---|
| committer | Alexis Metaireau <alexis@notmyidea.org> | 2019-01-03 10:03:13 +0100 |
| commit | 04adfe4155e1bb37609edfe78ae67b361f51e0cf (patch) | |
| tree | 49237e7eaf0cc5ee3818a8f9984dde4ecc6356e2 /ihatemoney/utils.py | |
| parent | 7cb339c0bb8aacaeae47838a68c7af60cf414618 (diff) | |
| download | ihatemoney-mirror-04adfe4155e1bb37609edfe78ae67b361f51e0cf.zip ihatemoney-mirror-04adfe4155e1bb37609edfe78ae67b361f51e0cf.tar.gz ihatemoney-mirror-04adfe4155e1bb37609edfe78ae67b361f51e0cf.tar.bz2 | |
Provide basic math operations on bills (#413)
* allow basic math ops in amount field for bills form
* docs: changing compile-translations to build-translations
Diffstat (limited to 'ihatemoney/utils.py')
| -rw-r--r-- | ihatemoney/utils.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/ihatemoney/utils.py b/ihatemoney/utils.py index ec22834..2fac4ef 100644 --- a/ihatemoney/utils.py +++ b/ihatemoney/utils.py @@ -1,5 +1,8 @@ +from __future__ import division import base64 import re +import ast +import operator from io import BytesIO, StringIO import jinja2 @@ -206,3 +209,33 @@ class IhmJSONEncoder(JSONEncoder): except ImportError: pass return JSONEncoder.default(self, o) + + +def eval_arithmetic_expression(expr): + def _eval(node): + # supported operators + operators = { + ast.Add: operator.add, + ast.Sub: operator.sub, + ast.Mult: operator.mul, + ast.Div: operator.truediv, + ast.USub: operator.neg, + } + + if isinstance(node, ast.Num): # <number> + return node.n + elif isinstance(node, ast.BinOp): # <left> <operator> <right> + return operators[type(node.op)](_eval(node.left), _eval(node.right)) + elif isinstance(node, ast.UnaryOp): # <operator> <operand> e.g., -1 + return operators[type(node.op)](_eval(node.operand)) + else: + raise TypeError(node) + + expr = str(expr) + + try: + result = _eval(ast.parse(expr, mode='eval').body) + except (SyntaxError, TypeError, ZeroDivisionError, KeyError): + raise ValueError("Error evaluating expression: {}".format(expr)) + + return result |
