File: datastore.py

package info (click to toggle)
python-wsme 0.6-3
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 956 kB
  • ctags: 1,831
  • sloc: python: 8,452; makefile: 138
file content (121 lines) | stat: -rw-r--r-- 3,056 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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,), {}
)