Refactored model functionality

email
androiddrew 7 years ago
parent 3e2cf37921
commit 2eee8dc349

@ -1,13 +1,13 @@
import json import json
from apistar import Include, Route, http, Response, annotate from apistar import Include, Route, annotate, http
from apistar.frameworks.wsgi import WSGIApp as App from apistar.interfaces import Router
from apistar.handlers import docs_urls, static_urls
from apistar.backends import sqlalchemy_backend from apistar.backends import sqlalchemy_backend
from apistar.backends.sqlalchemy_backend import Session from apistar.backends.sqlalchemy_backend import Session
from apistar.frameworks.wsgi import WSGIApp as App
from models import Base, Cookie from apistar.handlers import docs_urls, static_urls
from model.util import alchemyencoder from models.schema import Base, Cookie
from render import JSONRenderer from render import JSONRenderer
@ -20,20 +20,46 @@ def welcome(name=None):
@annotate(renderers=[JSONRenderer()]) @annotate(renderers=[JSONRenderer()])
def get_cookies(session: Session): def get_cookies(session: Session):
cookies = session.query(Cookie).all() cookies = session.query(Cookie).all()
result = [{"id": cookie.id, # result = [{"id": cookie.id,
"created_date": cookie.created_date, # "created_date": cookie.created_date,
"modified_date": cookie.modified_date, # "modified_date": cookie.modified_date,
"name": cookie.name, # "name": cookie.name,
"recipe_url": cookie.recipe_url, # "recipe_url": cookie.recipe_url,
"sku": cookie.sku, # "sku": cookie.sku,
"qoh": cookie.unit_cost} # "qoh": cookie.qoh,
for cookie in cookies] # "unit_cost": cookie.unit_cost}
# for cookie in cookies]
result = [cookie.to_dict() for cookie in cookies]
return result 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 = [ routes = [
Route('/', 'GET', welcome), Route('/', 'GET', welcome),
Route('/cookies', 'GET', get_cookies), Route('/cookies', 'GET', get_cookies),
Route('/cookies', 'POST', create_cookie),
Route('/cookies/{id}', 'GET', get_cookie),
Include('/docs', docs_urls), Include('/docs', docs_urls),
Include('/static', static_urls) Include('/static', static_urls)
] ]
@ -50,3 +76,7 @@ app = App(routes=routes,
commands=sqlalchemy_backend.commands, commands=sqlalchemy_backend.commands,
components=sqlalchemy_backend.components 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.ext.compiler import compiles
from sqlalchemy.types import DateTime as DateTimeType from sqlalchemy.types import DateTime as DateTimeType
# can be moved to models util # can be moved to models util?
class utcnow(expression.FunctionElement): class utcnow(expression.FunctionElement):
type = DateTimeType() type = DateTimeType()
# Can be moved to the models util dirp # Can be moved to the models util?
@compiles(utcnow, 'postgresql') @compiles(utcnow, 'postgresql')
def pg_utcnow(element, compiler, **kw): def pg_utcnow(element, compiler, **kw):
return "TIMEZONE('utc', CURRENT_TIMESTAMP)" return "TIMEZONE('utc', CURRENT_TIMESTAMP)"
@ -24,6 +24,11 @@ class DBMixin:
created_date = Column(DateTime, server_default=utcnow()) created_date = Column(DateTime, server_default=utcnow())
modified_date = Column(DateTime, server_default=utcnow(), onupdate=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): def ReferenceCol(tablename, nullable=False, **kw):
return Column(ForeignKey('{}.id'.format(tablename)), nullable=nullable, **kw) return Column(ForeignKey('{}.id'.format(tablename)), nullable=nullable, **kw)

@ -1,8 +1,8 @@
import json import json
from apistar import http from apistar import http
from apistar.renderers import Renderer from apistar.renderers import Renderer
from models.util import alchemyencoder
from model.util import alchemyencoder
class JSONRenderer(Renderer): class JSONRenderer(Renderer):
@ -10,4 +10,4 @@ class JSONRenderer(Renderer):
charset = None charset = None
def render(self, data: http.ResponseData) -> bytes: 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