Refactored model functionality

email
androiddrew 7 years ago
parent 3e2cf37921
commit 2eee8dc349

@ -1,13 +1,13 @@
import json
from apistar import Include, Route, http, Response, annotate
from apistar.frameworks.wsgi import WSGIApp as App
from apistar.handlers import docs_urls, static_urls
from apistar import Include, Route, annotate, http
from apistar.interfaces import Router
from apistar.backends import sqlalchemy_backend
from apistar.backends.sqlalchemy_backend import Session
from models import Base, Cookie
from model.util import alchemyencoder
from apistar.frameworks.wsgi import WSGIApp as App
from apistar.handlers import docs_urls, static_urls
from models.schema import Base, Cookie
from render import JSONRenderer
@ -20,20 +20,46 @@ def welcome(name=None):
@annotate(renderers=[JSONRenderer()])
def get_cookies(session: Session):
cookies = session.query(Cookie).all()
result = [{"id": cookie.id,
"created_date": cookie.created_date,
"modified_date": cookie.modified_date,
"name": cookie.name,
"recipe_url": cookie.recipe_url,
"sku": cookie.sku,
"qoh": cookie.unit_cost}
for cookie in cookies]
# result = [{"id": cookie.id,
# "created_date": cookie.created_date,
# "modified_date": cookie.modified_date,
# "name": cookie.name,
# "recipe_url": cookie.recipe_url,
# "sku": cookie.sku,
# "qoh": cookie.qoh,
# "unit_cost": cookie.unit_cost}
# for cookie in cookies]
result = [cookie.to_dict() for cookie in cookies]
return result
@annotate(renderers=[JSONRenderer()])
def get_cookie(session: Session, id):
cookie = session.query(Cookie).filter_by(id=id).one_or_none()
if cookie is None:
msg = {"error": "404 Not Found"}
return http.Response(msg, status=404)
return cookie.to_dict()
def create_cookie(session: Session, json_data: http.RequestData, route: Router):
cookie = Cookie(name=json_data['name'],
recipe_url=json_data['recipe_url'],
sku=json_data['sku'],
qoh=json_data['qoh'],
unit_cost=json_data['unit_cost'])
session.add(cookie)
session.flush()
headers = {'Location': route.reverse_url('get_cookie', dict(id=cookie.id))}
return http.Response(cookie.to_dict(), status=201, headers=headers)
routes = [
Route('/', 'GET', welcome),
Route('/cookies', 'GET', get_cookies),
Route('/cookies', 'POST', create_cookie),
Route('/cookies/{id}', 'GET', get_cookie),
Include('/docs', docs_urls),
Include('/static', static_urls)
]
@ -50,3 +76,7 @@ app = App(routes=routes,
commands=sqlalchemy_backend.commands,
components=sqlalchemy_backend.components
)
if __name__ == "__main__":
app.main()

@ -5,11 +5,11 @@ from sqlalchemy.sql import expression
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.types import DateTime as DateTimeType
# can be moved to models util
# can be moved to models util?
class utcnow(expression.FunctionElement):
type = DateTimeType()
# Can be moved to the models util dirp
# Can be moved to the models util?
@compiles(utcnow, 'postgresql')
def pg_utcnow(element, compiler, **kw):
return "TIMEZONE('utc', CURRENT_TIMESTAMP)"
@ -24,6 +24,11 @@ class DBMixin:
created_date = Column(DateTime, server_default=utcnow())
modified_date = Column(DateTime, server_default=utcnow(), onupdate=utcnow())
def to_dict(self):
d = self.__dict__
d.pop('_sa_instance_state')
return d
def ReferenceCol(tablename, nullable=False, **kw):
return Column(ForeignKey('{}.id'.format(tablename)), nullable=nullable, **kw)

@ -1,8 +1,8 @@
import json
from apistar import http
from apistar.renderers import Renderer
from model.util import alchemyencoder
from models.util import alchemyencoder
class JSONRenderer(Renderer):
@ -10,4 +10,4 @@ class JSONRenderer(Renderer):
charset = None
def render(self, data: http.ResponseData) -> bytes:
return json.dumps(data, default=alchemyencoder).encode('utf-8')
return json.dumps(data, default=alchemyencoder).encode('utf-8')
Loading…
Cancel
Save