110 lines
3.4 KiB
Python
110 lines
3.4 KiB
Python
import uuid
|
|
from decimal import Decimal, InvalidOperation
|
|
|
|
import transaction
|
|
from pyramid.view import view_config
|
|
|
|
from barker.models import Tax
|
|
from barker.models.validation_exception import ValidationError
|
|
|
|
|
|
@view_config(request_method='POST', route_name='v1_taxes_new', renderer='json', permission='Taxes', trans=True)
|
|
def save(request):
|
|
json = request.json_body
|
|
name = json.get("name", "").strip()
|
|
if name == "":
|
|
raise ValidationError("Name cannot be blank")
|
|
try:
|
|
rate = Decimal(json["rate"]) / 100
|
|
if rate < 0:
|
|
raise ValidationError("Tax Rate must be a decimal >= 0")
|
|
except (ValueError, InvalidOperation):
|
|
raise ValidationError("Tax Rate must be a decimal >= 0")
|
|
item = Tax(name, rate)
|
|
request.dbsession.add(item)
|
|
transaction.commit()
|
|
return tax_info(item.id, request.dbsession)
|
|
|
|
|
|
@view_config(request_method='PUT', route_name='v1_taxes_id', renderer='json', permission='Taxes', trans=True)
|
|
def update(request):
|
|
json = request.json_body
|
|
item = (
|
|
request.dbsession.query(Tax)
|
|
.filter(Tax.id == uuid.UUID(request.matchdict["id"]))
|
|
.first()
|
|
)
|
|
if item.is_fixture:
|
|
raise ValidationError(
|
|
"{0} is a fixture and cannot be edited or deleted.".format(item.full_name)
|
|
)
|
|
item.name = json['name'].strip()
|
|
try:
|
|
item.rate = Decimal(json["rate"]) / 100
|
|
if item.rate <= 0:
|
|
raise ValidationError("Tax Rate must be a decimal >= 0")
|
|
except (ValueError, InvalidOperation):
|
|
raise ValidationError("Tax Rate must be a decimal >= 0")
|
|
item.rate = json['rate']
|
|
transaction.commit()
|
|
item = request.dbsession.query(Tax).filter(Tax.id == item.id).first()
|
|
return tax_info(item.id, request.dbsession)
|
|
|
|
|
|
@view_config(request_method='DELETE', route_name='v1_taxes_id', renderer='json', permission='Taxes', trans=True)
|
|
def delete(request):
|
|
item = (
|
|
request.dbsession.query(Tax)
|
|
.filter(Tax.id == uuid.UUID(request.matchdict["id"]))
|
|
.first()
|
|
)
|
|
if item.is_fixture:
|
|
raise ValidationError(
|
|
"{0} is a fixture and cannot be edited or deleted.".format(item.full_name)
|
|
)
|
|
request.dbsession.delete(item)
|
|
transaction.commit()
|
|
return tax_info(None, request.dbsession)
|
|
|
|
|
|
@view_config(request_method='GET', route_name='v1_taxes_new', renderer='json', permission='Authenticated')
|
|
def show_blank(request):
|
|
return tax_info(None, request.dbsession)
|
|
|
|
|
|
@view_config(request_method='GET', route_name='v1_taxes_id', renderer='json', permission='Authenticated')
|
|
def show_id(request):
|
|
return tax_info(uuid.UUID(request.matchdict["id"]), request.dbsession)
|
|
|
|
|
|
@view_config(request_method='GET', route_name='v1_taxes_list', renderer='json', permission='Authenticated')
|
|
def show_list(request):
|
|
list_ = request.dbsession.query(Tax).order_by(Tax.name).all()
|
|
taxes = []
|
|
for item in list_:
|
|
taxes.append({
|
|
'id': item.id,
|
|
'name': item.name,
|
|
'rate': item.rate,
|
|
'isFixture': item.is_fixture
|
|
})
|
|
return taxes
|
|
|
|
|
|
def tax_info(id_, dbsession):
|
|
if id_ is None:
|
|
tax = {
|
|
"name": "",
|
|
"rate": 0,
|
|
"isFixture": False
|
|
}
|
|
else:
|
|
item = dbsession.query(Tax).filter(Tax.id == id_).first()
|
|
tax = {
|
|
'id': item.id,
|
|
'name': item.name,
|
|
'rate': item.rate * 100,
|
|
'isFixture': item.is_fixture
|
|
}
|
|
return tax
|