122 lines
3.0 KiB
Python
122 lines
3.0 KiB
Python
import wsme
|
|
import wsme.types
|
|
|
|
try:
|
|
import simplejson as json
|
|
except ImportError:
|
|
import json
|
|
|
|
|
|
class ReadResultBase(wsme.types.Base):
|
|
total = int
|
|
success = bool
|
|
message = wsme.types.text
|
|
|
|
|
|
def make_readresult(datatype):
|
|
ReadResult = type(
|
|
datatype.__name__ + 'ReadResult',
|
|
(ReadResultBase,), {
|
|
'data': [datatype]
|
|
}
|
|
)
|
|
return ReadResult
|
|
|
|
|
|
class DataStoreControllerMeta(type):
|
|
def __init__(cls, name, bases, dct):
|
|
if cls.__datatype__ is None:
|
|
return
|
|
if getattr(cls, '__readresulttype__', None) is None:
|
|
cls.__readresulttype__ = make_readresult(cls.__datatype__)
|
|
|
|
cls.create = wsme.expose(
|
|
cls.__readresulttype__,
|
|
extdirect_params_notation='positional')(cls.create)
|
|
cls.create = wsme.validate(cls.__datatype__)(cls.create)
|
|
|
|
cls.read = wsme.expose(
|
|
cls.__readresulttype__,
|
|
extdirect_params_notation='named')(cls.read)
|
|
cls.read = wsme.validate(str, str, int, int, int)(cls.read)
|
|
|
|
cls.update = wsme.expose(
|
|
cls.__readresulttype__,
|
|
extdirect_params_notation='positional')(cls.update)
|
|
cls.update = wsme.validate(cls.__datatype__)(cls.update)
|
|
|
|
cls.destroy = wsme.expose(
|
|
cls.__readresulttype__,
|
|
extdirect_params_notation='positional')(cls.destroy)
|
|
cls.destroy = wsme.validate(cls.__idtype__)(cls.destroy)
|
|
|
|
|
|
class DataStoreControllerMixin(object):
|
|
__datatype__ = None
|
|
__idtype__ = int
|
|
|
|
__readresulttype__ = None
|
|
|
|
def create(self, obj):
|
|
pass
|
|
|
|
def read(self, query=None, sort=None, page=None, start=None, limit=None):
|
|
pass
|
|
|
|
def update(self, obj):
|
|
pass
|
|
|
|
def destroy(self, obj_id):
|
|
pass
|
|
|
|
def model(self):
|
|
tpl = """
|
|
Ext.define('%(appns)s.model.%(classname)s', {
|
|
extend: 'Ext.data.Model',
|
|
fields: %(fields)s,
|
|
|
|
proxy: {
|
|
type: 'direct',
|
|
api: {
|
|
create: %(appns)s.%(controllerns)s.create,
|
|
read: %(appns)s.%(controllerns)s.read,
|
|
update: %(appns)s.%(controllerns)s.update,
|
|
destroy: %(appns)s.%(controllerns)s.destroy
|
|
},
|
|
reader: {
|
|
root: 'data'
|
|
}
|
|
}
|
|
});
|
|
"""
|
|
fields = [
|
|
attr.name for attr in self.__datatype__._wsme_attributes
|
|
]
|
|
d = {
|
|
'appns': 'Demo',
|
|
'controllerns': 'stores.' + self.__datatype__.__name__.lower(),
|
|
'classname': self.__datatype__.__name__,
|
|
'fields': json.dumps(fields)
|
|
}
|
|
return tpl % d
|
|
|
|
def store(self):
|
|
tpl = """
|
|
Ext.define('%(appns)s.store.%(classname)s', {
|
|
extend: 'Ext.data.Store',
|
|
model: '%(appns)s.model.%(classname)s'
|
|
});
|
|
"""
|
|
d = {
|
|
'appns': 'Demo',
|
|
'classname': self.__datatype__.__name__,
|
|
}
|
|
|
|
return tpl % d
|
|
|
|
|
|
DataStoreController = DataStoreControllerMeta(
|
|
'DataStoreController',
|
|
(DataStoreControllerMixin,), {}
|
|
)
|