File: controllers.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 (96 lines) | stat: -rw-r--r-- 2,719 bytes parent folder | download | duplicates (3)
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
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,), {}
)