diff --git a/accountant/api/views/accounts.py b/accountant/api/views/accounts.py index 71e012e..5f30413 100644 --- a/accountant/api/views/accounts.py +++ b/accountant/api/views/accounts.py @@ -14,7 +14,9 @@ You should have received a copy of the GNU Affero General Public License along with Accountant. If not, see . """ -from flask import json, request +import dateutil.parser + +from flask import json from flask.ext.restful import Resource, fields, reqparse, marshal_with_field from sqlalchemy.orm.exc import NoResultFound @@ -26,34 +28,10 @@ from .. import api, api_api from ..models.accounts import Account from ..models.entries import Entry -from ..models.operations import Operation from ..fields import Object -@api.route("/accounts////") -@auth.login_required -def get_account_status(account_id, year, month): - with session_scope() as session: - query = Operation.get_account_status(session, account_id, year, month) - - if query.count() == 1: - result = query.one() - revenues = result.revenues - expenses = result.expenses - balance = result.balance - else: - revenues = 0.0 - expenses = 0.0 - balance = 0.0 - - return json.dumps({ - "expenses": str(expenses), - "revenues": str(revenues), - "balance": str(balance) - }) - - @api.route("/accounts//months") @auth.login_required def get_months(account_id): @@ -67,12 +45,15 @@ def get_months(account_id): resource_fields = { - 'id': fields.Integer, + 'id': fields.Integer(default=None), 'name': fields.String, 'authorized_overdraft': fields.Fixed(decimals=2), - 'current': fields.Float, - 'pointed': fields.Float, - 'future': fields.Float, + 'current': fields.Fixed(decimals=2), + 'pointed': fields.Fixed(decimals=2), + 'future': fields.Fixed(decimals=2), + 'expenses': fields.Fixed(decimals=2), + 'revenues': fields.Fixed(decimals=2), + 'balance': fields.Fixed(decimals=2), } @@ -80,6 +61,12 @@ parser = reqparse.RequestParser() parser.add_argument('name', type=str, required=True) parser.add_argument('authorized_overdraft', type=float, required=True) +date_parser = reqparse.RequestParser() +date_parser.add_argument('begin', + type=lambda a: dateutil.parser.parse(a) if a else None) +date_parser.add_argument('end', + type=lambda a: dateutil.parser.parse(a) if a else None) + class AccountListResource(Resource): @session_aware @@ -124,8 +111,10 @@ class AccountResource(Resource): """ Get account. """ + kwargs = date_parser.parse_args() + try: - return Account.get(session, account_id) + return Account.get(session, account_id, **kwargs) except NoResultFound: return None, 404 diff --git a/accountant/frontend/static/js/entries.js b/accountant/frontend/static/js/entries.js index 7536f6b..7cc7223 100644 --- a/accountant/frontend/static/js/entries.js +++ b/accountant/frontend/static/js/entries.js @@ -86,8 +86,15 @@ var EntryController = function($scope, $http, $rootScope, $filter) { $scope.getAccountStatus = function(account, month) { if(account != null && month != null) { - $http.get("/api/accounts/" + account.id + "/" + month.year + "/" + month.month). - success($scope.getAccountStatus_success); + // Note: Month is 0 indexed. + var begin = moment({year: month.year, month: month.month - 1, day: 1}); + var end = begin.clone().endOf('month'); + + $http.get("/api/accounts/" + account.id, + {params: { + begin: begin.format('YYYY-MM-DD'), + end: end.format('YYYY-MM-DD') + }}).success($scope.getAccountStatus_success); } }; diff --git a/accountant/frontend/templates/layout.html b/accountant/frontend/templates/layout.html index 36e96a8..17f0b28 100644 --- a/accountant/frontend/templates/layout.html +++ b/accountant/frontend/templates/layout.html @@ -83,6 +83,8 @@ {% block footer %}{% endblock %} + +