Move parsers to another module.
This commit is contained in:
parent
cbd1ad0e49
commit
53b961491b
@ -14,9 +14,7 @@
|
|||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with Accountant. If not, see <http://www.gnu.org/licenses/>.
|
along with Accountant. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
import dateutil.parser
|
from flask.ext.restful import Resource, fields, marshal_with_field
|
||||||
|
|
||||||
from flask.ext.restful import Resource, fields, reqparse, marshal_with_field
|
|
||||||
|
|
||||||
from accountant import db
|
from accountant import db
|
||||||
|
|
||||||
@ -28,6 +26,7 @@ from ..models.operations import Operation
|
|||||||
from ..fields import Object
|
from ..fields import Object
|
||||||
|
|
||||||
from .users import requires_auth
|
from .users import requires_auth
|
||||||
|
from .parsers import account_parser, range_parser
|
||||||
|
|
||||||
|
|
||||||
account_model = {
|
account_model = {
|
||||||
@ -49,17 +48,6 @@ balance_model = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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):
|
class AccountListResource(Resource):
|
||||||
@requires_auth
|
@requires_auth
|
||||||
@marshal_with_field(fields.List(Object(account_model)))
|
@marshal_with_field(fields.List(Object(account_model)))
|
||||||
@ -75,7 +63,7 @@ class AccountListResource(Resource):
|
|||||||
"""
|
"""
|
||||||
Create a new account.
|
Create a new account.
|
||||||
"""
|
"""
|
||||||
data = parser.parse_args()
|
data = account_parser.parse_args()
|
||||||
|
|
||||||
account = Account(**data)
|
account = Account(**data)
|
||||||
|
|
||||||
@ -105,7 +93,7 @@ class AccountResource(Resource):
|
|||||||
@requires_auth
|
@requires_auth
|
||||||
@marshal_with_field(Object(account_model))
|
@marshal_with_field(Object(account_model))
|
||||||
def post(self, id):
|
def post(self, id):
|
||||||
data = parser.parse_args()
|
data = account_parser.parse_args()
|
||||||
|
|
||||||
assert (id not in data or data.id is None
|
assert (id not in data or data.id is None
|
||||||
or data.id == id)
|
or data.id == id)
|
||||||
@ -160,11 +148,6 @@ class SoldsResource(Resource):
|
|||||||
return account.solds(), 200
|
return account.solds(), 200
|
||||||
|
|
||||||
|
|
||||||
range_parser = reqparse.RequestParser()
|
|
||||||
range_parser.add_argument('begin', type=lambda a: dateutil.parser.parse(a))
|
|
||||||
range_parser.add_argument('end', type=lambda a: dateutil.parser.parse(a))
|
|
||||||
|
|
||||||
|
|
||||||
class BalanceResource(Resource):
|
class BalanceResource(Resource):
|
||||||
@requires_auth
|
@requires_auth
|
||||||
@marshal_with_field(Object(balance_model))
|
@marshal_with_field(Object(balance_model))
|
||||||
|
@ -14,9 +14,7 @@
|
|||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with Accountant. If not, see <http://www.gnu.org/licenses/>.
|
along with Accountant. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
import dateutil.parser
|
from flask.ext.restful import Resource, fields, marshal_with_field
|
||||||
|
|
||||||
from flask.ext.restful import Resource, fields, reqparse, marshal_with_field
|
|
||||||
|
|
||||||
from accountant import db
|
from accountant import db
|
||||||
|
|
||||||
@ -25,6 +23,7 @@ from .. import api
|
|||||||
from ..models.operations import Operation
|
from ..models.operations import Operation
|
||||||
|
|
||||||
from .users import requires_auth
|
from .users import requires_auth
|
||||||
|
from .parsers import operation_parser, account_range_parser
|
||||||
|
|
||||||
from ..fields import Object
|
from ..fields import Object
|
||||||
|
|
||||||
@ -45,31 +44,12 @@ operation_with_sold_model = {
|
|||||||
|
|
||||||
operation_model = operation_with_sold_model
|
operation_model = operation_with_sold_model
|
||||||
|
|
||||||
parser = reqparse.RequestParser()
|
|
||||||
# Must use lambda because the parser passes other parameters badly interpreted
|
|
||||||
# by dateutil.parser.parse
|
|
||||||
parser.add_argument('operation_date', type=lambda a: dateutil.parser.parse(a))
|
|
||||||
parser.add_argument('label', type=str)
|
|
||||||
parser.add_argument('value', type=float)
|
|
||||||
parser.add_argument('pointed', type=bool)
|
|
||||||
parser.add_argument('category', type=str)
|
|
||||||
parser.add_argument('account_id', type=int)
|
|
||||||
parser.add_argument('scheduled_operation_id', type=int)
|
|
||||||
parser.add_argument('confirmed', type=bool)
|
|
||||||
parser.add_argument('canceled', type=bool)
|
|
||||||
|
|
||||||
|
|
||||||
range_parser = reqparse.RequestParser()
|
|
||||||
range_parser.add_argument('account_id', type=int)
|
|
||||||
range_parser.add_argument('begin', type=lambda a: dateutil.parser.parse(a))
|
|
||||||
range_parser.add_argument('end', type=lambda a: dateutil.parser.parse(a))
|
|
||||||
|
|
||||||
|
|
||||||
class OperationListResource(Resource):
|
class OperationListResource(Resource):
|
||||||
@requires_auth
|
@requires_auth
|
||||||
@marshal_with_field(fields.List(Object(operation_with_sold_model)))
|
@marshal_with_field(fields.List(Object(operation_with_sold_model)))
|
||||||
def get(self):
|
def get(self):
|
||||||
data = range_parser.parse_args()
|
data = account_range_parser.parse_args()
|
||||||
|
|
||||||
return Operation.query(
|
return Operation.query(
|
||||||
begin=data['begin'],
|
begin=data['begin'],
|
||||||
@ -81,7 +61,7 @@ class OperationListResource(Resource):
|
|||||||
@requires_auth
|
@requires_auth
|
||||||
@marshal_with_field(Object(operation_model))
|
@marshal_with_field(Object(operation_model))
|
||||||
def post(self):
|
def post(self):
|
||||||
data = parser.parse_args()
|
data = operation_parser.parse_args()
|
||||||
|
|
||||||
operation = Operation(**data)
|
operation = Operation(**data)
|
||||||
|
|
||||||
@ -107,7 +87,7 @@ class OperationResource(Resource):
|
|||||||
@requires_auth
|
@requires_auth
|
||||||
@marshal_with_field(Object(operation_model))
|
@marshal_with_field(Object(operation_model))
|
||||||
def post(self, id):
|
def post(self, id):
|
||||||
data = parser.parse_args()
|
data = operation_parser.parse_args()
|
||||||
|
|
||||||
assert (id not in data or data.id is None
|
assert (id not in data or data.id is None
|
||||||
or data.id == id)
|
or data.id == id)
|
||||||
|
76
accountant/api/views/parsers.py
Normal file
76
accountant/api/views/parsers.py
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
"""
|
||||||
|
This file is part of Accountant.
|
||||||
|
|
||||||
|
Accountant is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Accountant is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with Accountant. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
"""
|
||||||
|
import dateutil.parser
|
||||||
|
|
||||||
|
from flask.ext.restful import reqparse
|
||||||
|
|
||||||
|
# Parser for a date range.
|
||||||
|
range_parser = reqparse.RequestParser()
|
||||||
|
range_parser.add_argument(
|
||||||
|
'begin',
|
||||||
|
type=lambda a: dateutil.parser.parse(a) if a else None
|
||||||
|
)
|
||||||
|
range_parser.add_argument(
|
||||||
|
'end',
|
||||||
|
type=lambda a: dateutil.parser.parse(a) if a else None
|
||||||
|
)
|
||||||
|
|
||||||
|
# Parser for a date range and an account id.
|
||||||
|
account_range_parser = range_parser.copy()
|
||||||
|
account_range_parser.add_argument('account_id', type=int)
|
||||||
|
|
||||||
|
# Parser for an account.
|
||||||
|
account_parser = reqparse.RequestParser()
|
||||||
|
account_parser.add_argument('name', type=str, required=True)
|
||||||
|
account_parser.add_argument('authorized_overdraft', type=float, required=True)
|
||||||
|
|
||||||
|
# Parser for an operation.
|
||||||
|
operation_parser = reqparse.RequestParser()
|
||||||
|
# Must use lambda because the parser passes other parameters badly interpreted
|
||||||
|
# by dateutil.parser.parse
|
||||||
|
operation_parser.add_argument(
|
||||||
|
'operation_date', type=lambda a: dateutil.parser.parse(a))
|
||||||
|
operation_parser.add_argument('label', type=str)
|
||||||
|
operation_parser.add_argument('value', type=float)
|
||||||
|
operation_parser.add_argument('pointed', type=bool)
|
||||||
|
operation_parser.add_argument('category', type=str)
|
||||||
|
operation_parser.add_argument('account_id', type=int)
|
||||||
|
operation_parser.add_argument('scheduled_operation_id', type=int)
|
||||||
|
operation_parser.add_argument('confirmed', type=bool)
|
||||||
|
operation_parser.add_argument('canceled', type=bool)
|
||||||
|
|
||||||
|
# Parser for an account id.
|
||||||
|
account_id_parser = reqparse.RequestParser()
|
||||||
|
account_id_parser.add_argument('account_id', type=int)
|
||||||
|
|
||||||
|
# Parser for a scheduled operation.
|
||||||
|
scheduled_operation_parser = reqparse.RequestParser()
|
||||||
|
scheduled_operation_parser.add_argument(
|
||||||
|
'start_date', type=lambda a: dateutil.parser.parse(a))
|
||||||
|
scheduled_operation_parser.add_argument(
|
||||||
|
'stop_date', type=lambda a: dateutil.parser.parse(a))
|
||||||
|
scheduled_operation_parser.add_argument('day', type=int)
|
||||||
|
scheduled_operation_parser.add_argument('frequency', type=int)
|
||||||
|
scheduled_operation_parser.add_argument('label', type=str)
|
||||||
|
scheduled_operation_parser.add_argument('value', type=float)
|
||||||
|
scheduled_operation_parser.add_argument('category', type=str)
|
||||||
|
scheduled_operation_parser.add_argument('account_id', type=int)
|
||||||
|
|
||||||
|
# Parser for a login.
|
||||||
|
login_parser = reqparse.RequestParser()
|
||||||
|
login_parser.add_argument('email', type=str, required=True)
|
||||||
|
login_parser.add_argument('password', type=str, required=True)
|
@ -14,9 +14,7 @@
|
|||||||
You should have received a copy of the GNU Affero General Public License
|
You should have received a copy of the GNU Affero General Public License
|
||||||
along with Accountant. If not, see <http://www.gnu.org/licenses/>.
|
along with Accountant. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
import dateutil.parser
|
from flask.ext.restful import Resource, fields, marshal_with_field
|
||||||
|
|
||||||
from flask.ext.restful import Resource, fields, reqparse, marshal_with_field
|
|
||||||
|
|
||||||
from sqlalchemy import true
|
from sqlalchemy import true
|
||||||
|
|
||||||
@ -27,8 +25,8 @@ from ..models.operations import Operation
|
|||||||
|
|
||||||
from .. import api
|
from .. import api
|
||||||
|
|
||||||
|
|
||||||
from .users import requires_auth
|
from .users import requires_auth
|
||||||
|
from .parsers import account_id_parser, scheduled_operation_parser
|
||||||
|
|
||||||
from ..fields import Object
|
from ..fields import Object
|
||||||
|
|
||||||
@ -46,21 +44,6 @@ scheduled_operation_model = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
parser = reqparse.RequestParser()
|
|
||||||
parser.add_argument('start_date', type=lambda a: dateutil.parser.parse(a))
|
|
||||||
parser.add_argument('stop_date', type=lambda a: dateutil.parser.parse(a))
|
|
||||||
parser.add_argument('day', type=int)
|
|
||||||
parser.add_argument('frequency', type=int)
|
|
||||||
parser.add_argument('label', type=str)
|
|
||||||
parser.add_argument('value', type=float)
|
|
||||||
parser.add_argument('category', type=str)
|
|
||||||
parser.add_argument('account_id', type=int)
|
|
||||||
|
|
||||||
|
|
||||||
get_parser = reqparse.RequestParser()
|
|
||||||
get_parser.add_argument('account_id', type=int)
|
|
||||||
|
|
||||||
|
|
||||||
class ScheduledOperationListResource(Resource):
|
class ScheduledOperationListResource(Resource):
|
||||||
@requires_auth
|
@requires_auth
|
||||||
@marshal_with_field(fields.List(Object(scheduled_operation_model)))
|
@marshal_with_field(fields.List(Object(scheduled_operation_model)))
|
||||||
@ -68,7 +51,7 @@ class ScheduledOperationListResource(Resource):
|
|||||||
"""
|
"""
|
||||||
Get all scheduled operation for an account.
|
Get all scheduled operation for an account.
|
||||||
"""
|
"""
|
||||||
data = get_parser.parse_args()
|
data = account_id_parser.parse_args()
|
||||||
|
|
||||||
return ScheduledOperation.query().filter_by(**data).all(), 200
|
return ScheduledOperation.query().filter_by(**data).all(), 200
|
||||||
|
|
||||||
@ -78,7 +61,7 @@ class ScheduledOperationListResource(Resource):
|
|||||||
"""
|
"""
|
||||||
Add a new scheduled operation.
|
Add a new scheduled operation.
|
||||||
"""
|
"""
|
||||||
data = parser.parse_args()
|
data = scheduled_operation_parser.parse_args()
|
||||||
|
|
||||||
scheduled_operation = ScheduledOperation(**data)
|
scheduled_operation = ScheduledOperation(**data)
|
||||||
|
|
||||||
@ -111,7 +94,7 @@ class ScheduledOperationResource(Resource):
|
|||||||
"""
|
"""
|
||||||
Update a scheduled operation.
|
Update a scheduled operation.
|
||||||
"""
|
"""
|
||||||
data = parser.parse_args()
|
data = scheduled_operation_parser.parse_args()
|
||||||
|
|
||||||
assert (id not in data or data.id is None
|
assert (id not in data or data.id is None
|
||||||
or data.id == id)
|
or data.id == id)
|
||||||
@ -162,4 +145,4 @@ class ScheduledOperationResource(Resource):
|
|||||||
|
|
||||||
api.add_resource(ScheduledOperationListResource, "/scheduled_operation")
|
api.add_resource(ScheduledOperationListResource, "/scheduled_operation")
|
||||||
api.add_resource(ScheduledOperationResource,
|
api.add_resource(ScheduledOperationResource,
|
||||||
"/scheduled_operation/<int:id>")
|
"/scheduled_operation/<int:id>")
|
||||||
|
@ -20,7 +20,7 @@ import arrow
|
|||||||
from functools import wraps
|
from functools import wraps
|
||||||
|
|
||||||
from flask import request, g
|
from flask import request, g
|
||||||
from flask.ext.restful import Resource, fields, reqparse, marshal_with, marshal_with_field
|
from flask.ext.restful import Resource, fields, marshal_with, marshal_with_field
|
||||||
|
|
||||||
from accountant import app
|
from accountant import app
|
||||||
|
|
||||||
@ -30,6 +30,8 @@ from ..fields import Object
|
|||||||
|
|
||||||
from ..models.users import User
|
from ..models.users import User
|
||||||
|
|
||||||
|
from .parsers import login_parser
|
||||||
|
|
||||||
|
|
||||||
def load_user_from_token(token):
|
def load_user_from_token(token):
|
||||||
return User.verify_auth_token(token)
|
return User.verify_auth_token(token)
|
||||||
@ -73,10 +75,6 @@ user_model = {
|
|||||||
'active': fields.Boolean
|
'active': fields.Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
parser = reqparse.RequestParser()
|
|
||||||
parser.add_argument('email', type=str, required=True)
|
|
||||||
parser.add_argument('password', type=str, required=True)
|
|
||||||
|
|
||||||
|
|
||||||
class LoginResource(Resource):
|
class LoginResource(Resource):
|
||||||
@marshal_with(token_model)
|
@marshal_with(token_model)
|
||||||
@ -84,7 +82,7 @@ class LoginResource(Resource):
|
|||||||
"""
|
"""
|
||||||
Login to retrieve authentication token.
|
Login to retrieve authentication token.
|
||||||
"""
|
"""
|
||||||
data = parser.parse_args()
|
data = login_parser.parse_args()
|
||||||
|
|
||||||
user = User.query().filter(
|
user = User.query().filter(
|
||||||
User.email == data['email']
|
User.email == data['email']
|
||||||
|
Loading…
Reference in New Issue
Block a user