def edit(self, balance_uid):
        model = request.environ['sqlalchemy.model']
        db = request.environ['sqlalchemy.session']

        balance = db.query(model.Balance).filter_by(uid = balance_uid).first()
        if not balance or not balance.can_modify_balance(h.authenticated_user().uid):
            return { "failure": Messages.permissionDenied() }

        uid = int(request.params['uid'])
        bc = balance.changes.filter_by(uid=uid).first()
        if not bc:
            abort(404)

        try:
             with localcontext() as ctx:
                ctx.prec = 2
                bc.amount = h.parse_decimal(request.params['amount'])
        except:
            log.error("Invalid number: %s" % request.params.get('amount'), exc_info=1)
            pass

        try:
            if int(request.params['is_income']) >= 0:
                bc.income_category_uid = int(request.params['income_category_uid'])
                bc.expense_category_uid = None
                bc.is_income = True
            else:
                bc.expense_category_uid = int(request.params['expense_category_uid'])
                bc.income_category_uid = None
                bc.is_income = False
        except:
            pass

        try:
            bc.description = request.params['description']
        except:
            pass

        try:
            bc.occurred_on = h.parse_date(request.params['occurred_on'])
        except:
            log.error("Invalid date: %s" % request.params.get('occurred_on'), exc_info=1)
            pass

        ops = Operations(db, model)
        try:
            ops.change_tags_from_string(bc, request.params['tags'])
        except:
            pass

        ops.save_balance_change(bc)
        return { "id" : bc.uid }
    def add(self, balance_uid):
        model = request.environ['sqlalchemy.model']
        db = request.environ['sqlalchemy.session']

        if not Operations(db, model).can_modify_balance(h.authenticated_user().uid, balance_uid):
            return { "failure": Messages.permissionDenied() }

        try:
            with localcontext() as ctx:
                ctx.prec = 2
            	try:
                	amount = h.parse_decimal(request.params['amount'])
            	except NumberFormatError:
                	return { "failure": Messages.invalidCurrencyFormat() }
            expense_date = parser.parse(request.params['occurred_on']) 
            income_category_uid = None
            expense_category_uid = None

            if (int(request.params['is_income']) >= 0):
                    income_category_uid = int(request.params['income_category_uid'])
                    is_income = True
            else:
                    expense_category_uid = int(request.params['expense_category_uid'])
                    is_income = False
        except:
            return { "failure": Messages.invalidArguments() }

        tags = request.params.get('tags', '')
    
        try:
            description = request.params['description']
        except:
            description = ""

        try:
            bc = model.BalanceChange(
                amount = amount, 
                description = description, 
                balance_uid = balance_uid, 
                user_uid = h.authenticated_user().uid, 
                expense_category_uid = expense_category_uid,
                occurred_on = expense_date,
                is_income = is_income,
                income_category_uid = income_category_uid
            )
            ops = Operations(db, model)
            ops.change_tags_from_string(bc, tags)
            ops.save_balance_change(bc)
        except IntegrityError, e:
            return { "failure": Messages.primaryKeyViolation() }
    def add(self, balance_uid):
        model = request.environ['sqlalchemy.model']
        db = request.environ['sqlalchemy.session']

        balance = db.query(model.Balance).filter_by(uid = balance_uid).first()
        if not balance or not balance.can_modify_balance(h.authenticated_user().uid):
            return { "failure": Messages.permissionDenied() }

        try:
            with localcontext() as ctx:
                ctx.prec = 2
                try:
                    amount = h.parse_decimal(request.params['amount'])
                except:
                    log.error("Invalid number: %s" % request.params.get('amount'), exc_info=1)
                    return { "failure": Messages.invalidCurrencyFormat() }
            expense_date = h.parse_date(request.params['occurred_on']) 
            income_category_uid = None
            expense_category_uid = None

            if (int(request.params['is_income']) >= 0):
                    income_category_uid = int(request.params['income_category_uid'])
                    is_income = True
            else:
                    expense_category_uid = int(request.params['expense_category_uid'])
                    is_income = False
        except:
            log.error("Failed to parse arguments %s" % str(request.params), exc_info=1)
            return { "failure": Messages.invalidArguments() }

        tags = request.params.get('tags', '')
        description = request.params.get('description', '')

        bc = model.BalanceChange(
            amount = amount, 
            description = description,
            user_uid = h.authenticated_user().uid, 
            expense_category_uid = expense_category_uid,
            occurred_on = expense_date,
            is_income = is_income,
            income_category_uid = income_category_uid
        )

        balance.changes.append(bc)
        db.flush()
        ops = Operations(db, model)
        ops.change_tags_from_string(bc, tags)
        ops.save_balance_change(bc)

        return { "id" : bc.uid }
    def edit(self, balance_uid):
        model = request.environ['sqlalchemy.model']
        db = request.environ['sqlalchemy.session']

        if not Operations(db, model).can_modify_balance(h.authenticated_user().uid, balance_uid):
            return { "failure": Messages.permissionDenied() }

        uid = int(request.params['uid'])
        bc = db.query(model.BalanceChange).filter_by(uid=uid).filter_by(balance_uid=balance_uid).one()
        try:
             with localcontext() as ctx:
                ctx.prec = 2
                bc.amount = h.parse_decimal(request.params['amount'])
        except:
            pass

        try:
            if int(request.params['is_income']) >= 0:
                bc.income_category_uid = int(request.params['income_category_uid'])
                bc.expense_category_uid = None
                bc.is_income = True
            else:
                bc.expense_category_uid = int(request.params['expense_category_uid'])
                bc.income_category_uid = None
                bc.is_income = False
        except:
            pass

        try:
            bc.description = request.params['description']
        except:
            pass

        try:
            bc.occurred_on = parser.parse(request.params['occurred_on'])
        except:
            pass

        ops = Operations(db, model)
        try:
            ops.change_tags_from_string(bc, request.params['tags'])
        except:
            pass

        ops.save_balance_change(bc)
        return { "id" : bc.uid }