1
from wsme.rest import expose, validate
4
from wsmeext.sqlalchemy.types import SQLAlchemyRegistry
7
class CRUDControllerMeta(type):
8
def __init__(cls, name, bases, dct):
9
if cls.__saclass__ is not None:
10
if cls.__registry__ is None:
11
cls.__registry__ = wsme.types.registry
12
if cls.__wstype__ is None:
13
cls.__wstype__ = cls.__registry__.resolve_type(
14
SQLAlchemyRegistry.get(
15
cls.__registry__).getdatatype(cls.__saclass__))
22
cls.create = validate(cls.__wstype__)(cls.create)
29
cls.read = validate(cls.__wstype__)(cls.read)
36
cls.update = validate(cls.__wstype__)(cls.update)
42
cls.delete = validate(cls.__wstype__)(cls.delete)
44
super(CRUDControllerMeta, cls).__init__(name, bases, dct)
47
class CRUDControllerBase(object):
53
def _create_one(self, data):
54
obj = self.__saclass__()
56
self.__dbsession__.add(obj)
59
def _get_one(self, ref):
60
q = self.__dbsession__.query(self.__saclass__)
61
q = q.filter(ref.get_ref_criterion())
64
def _update_one(self, data):
65
obj = self._get_one(data)
67
raise ValueError("No match for data=%s" % data)
71
def _delete(self, ref):
72
obj = self._get_one(ref)
73
self.__dbsession__.delete(obj)
75
def create(self, data):
76
obj = self._create_one(data)
77
self.__dbsession__.flush()
78
return self.__wstype__(obj)
81
obj = self._get_one(ref)
82
return self.__wstype__(obj)
84
def update(self, data):
85
obj = self._update_one(data)
86
self.__dbsession__.flush()
87
return self.__wstype__(obj)
89
def delete(self, ref):
91
self.__dbsession__.flush()
94
CRUDController = CRUDControllerMeta(
95
'CRUDController', (CRUDControllerBase,), {})