~ubuntu-branches/ubuntu/saucy/python-wsme/saucy-proposed

« back to all changes in this revision

Viewing changes to wsmeext/sqlalchemy/controllers.py

  • Committer: Package Import Robot
  • Author(s): Thomas Goirand
  • Date: 2013-04-27 13:06:20 UTC
  • mfrom: (0.1.3 experimental) (1.1.1)
  • Revision ID: package-import@ubuntu.com-20130427130620-v7mcfqp3wctxxcik
Tags: 0.5b2-1
New upstream release (Closes: #706238).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
from wsme.rest import expose, validate
 
2
import wsme.types
 
3
 
 
4
from wsmeext.sqlalchemy.types import SQLAlchemyRegistry
 
5
 
 
6
 
 
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__))
 
16
 
 
17
            cls.create = expose(
 
18
                cls.__wstype__,
 
19
                method='PUT',
 
20
                wrap=True
 
21
            )(cls.create)
 
22
            cls.create = validate(cls.__wstype__)(cls.create)
 
23
 
 
24
            cls.read = expose(
 
25
                cls.__wstype__,
 
26
                method='GET',
 
27
                wrap=True
 
28
            )(cls.read)
 
29
            cls.read = validate(cls.__wstype__)(cls.read)
 
30
 
 
31
            cls.update = expose(
 
32
                cls.__wstype__,
 
33
                method='POST',
 
34
                wrap=True
 
35
            )(cls.update)
 
36
            cls.update = validate(cls.__wstype__)(cls.update)
 
37
 
 
38
            cls.delete = expose(
 
39
                method='DELETE',
 
40
                wrap=True
 
41
            )(cls.delete)
 
42
            cls.delete = validate(cls.__wstype__)(cls.delete)
 
43
 
 
44
        super(CRUDControllerMeta, cls).__init__(name, bases, dct)
 
45
 
 
46
 
 
47
class CRUDControllerBase(object):
 
48
    __registry__ = None
 
49
    __saclass__ = None
 
50
    __wstype__ = None
 
51
    __dbsession__ = None
 
52
 
 
53
    def _create_one(self, data):
 
54
        obj = self.__saclass__()
 
55
        data.to_instance(obj)
 
56
        self.__dbsession__.add(obj)
 
57
        return obj
 
58
 
 
59
    def _get_one(self, ref):
 
60
        q = self.__dbsession__.query(self.__saclass__)
 
61
        q = q.filter(ref.get_ref_criterion())
 
62
        return q.one()
 
63
 
 
64
    def _update_one(self, data):
 
65
        obj = self._get_one(data)
 
66
        if obj is None:
 
67
            raise ValueError("No match for data=%s" % data)
 
68
        data.to_instance(obj)
 
69
        return obj
 
70
 
 
71
    def _delete(self, ref):
 
72
        obj = self._get_one(ref)
 
73
        self.__dbsession__.delete(obj)
 
74
 
 
75
    def create(self, data):
 
76
        obj = self._create_one(data)
 
77
        self.__dbsession__.flush()
 
78
        return self.__wstype__(obj)
 
79
 
 
80
    def read(self, ref):
 
81
        obj = self._get_one(ref)
 
82
        return self.__wstype__(obj)
 
83
 
 
84
    def update(self, data):
 
85
        obj = self._update_one(data)
 
86
        self.__dbsession__.flush()
 
87
        return self.__wstype__(obj)
 
88
 
 
89
    def delete(self, ref):
 
90
        self._delete(ref)
 
91
        self.__dbsession__.flush()
 
92
        return None
 
93
 
 
94
CRUDController = CRUDControllerMeta(
 
95
        'CRUDController', (CRUDControllerBase,), {})