f91767bf1e
Change-Id: I2adc6a5cbd76edd16e6079046b67b8fc10bf1671
97 lines
2.7 KiB
Python
97 lines
2.7 KiB
Python
from wsme.rest import expose, validate
|
|
import wsme.types
|
|
|
|
from wsmeext.sqlalchemy.types import SQLAlchemyRegistry
|
|
|
|
|
|
class CRUDControllerMeta(type):
|
|
def __init__(cls, name, bases, dct):
|
|
if cls.__saclass__ is not None:
|
|
if cls.__registry__ is None:
|
|
cls.__registry__ = wsme.types.registry
|
|
if cls.__wstype__ is None:
|
|
cls.__wstype__ = cls.__registry__.resolve_type(
|
|
SQLAlchemyRegistry.get(
|
|
cls.__registry__).getdatatype(cls.__saclass__))
|
|
|
|
cls.create = expose(
|
|
cls.__wstype__,
|
|
method='PUT',
|
|
wrap=True
|
|
)(cls.create)
|
|
cls.create = validate(cls.__wstype__)(cls.create)
|
|
|
|
cls.read = expose(
|
|
cls.__wstype__,
|
|
method='GET',
|
|
wrap=True
|
|
)(cls.read)
|
|
cls.read = validate(cls.__wstype__)(cls.read)
|
|
|
|
cls.update = expose(
|
|
cls.__wstype__,
|
|
method='POST',
|
|
wrap=True
|
|
)(cls.update)
|
|
cls.update = validate(cls.__wstype__)(cls.update)
|
|
|
|
cls.delete = expose(
|
|
method='DELETE',
|
|
wrap=True
|
|
)(cls.delete)
|
|
cls.delete = validate(cls.__wstype__)(cls.delete)
|
|
|
|
super(CRUDControllerMeta, cls).__init__(name, bases, dct)
|
|
|
|
|
|
class CRUDControllerBase(object):
|
|
__registry__ = None
|
|
__saclass__ = None
|
|
__wstype__ = None
|
|
__dbsession__ = None
|
|
|
|
def _create_one(self, data):
|
|
obj = self.__saclass__()
|
|
data.to_instance(obj)
|
|
self.__dbsession__.add(obj)
|
|
return obj
|
|
|
|
def _get_one(self, ref):
|
|
q = self.__dbsession__.query(self.__saclass__)
|
|
q = q.filter(ref.get_ref_criterion())
|
|
return q.one()
|
|
|
|
def _update_one(self, data):
|
|
obj = self._get_one(data)
|
|
if obj is None:
|
|
raise ValueError("No match for data=%s" % data)
|
|
data.to_instance(obj)
|
|
return obj
|
|
|
|
def _delete(self, ref):
|
|
obj = self._get_one(ref)
|
|
self.__dbsession__.delete(obj)
|
|
|
|
def create(self, data):
|
|
obj = self._create_one(data)
|
|
self.__dbsession__.flush()
|
|
return self.__wstype__(obj)
|
|
|
|
def read(self, ref):
|
|
obj = self._get_one(ref)
|
|
return self.__wstype__(obj)
|
|
|
|
def update(self, data):
|
|
obj = self._update_one(data)
|
|
self.__dbsession__.flush()
|
|
return self.__wstype__(obj)
|
|
|
|
def delete(self, ref):
|
|
self._delete(ref)
|
|
self.__dbsession__.flush()
|
|
return None
|
|
|
|
CRUDController = CRUDControllerMeta(
|
|
'CRUDController', (CRUDControllerBase,), {}
|
|
)
|