Merge branch 'master' into lgpl
[tiramisu.git] / tiramisu / storage / __init__.py
1 # Copyright (C) 2013 Team tiramisu (see AUTHORS for all contributors)
2 #
3 # This program is free software: you can redistribute it and/or modify it
4 # under the terms of the GNU Lesser General Public License as published by the
5 # Free Software Foundation, either version 3 of the License, or (at your
6 # option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful, but WITHOUT
9 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10 # FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
11 # details.
12 #
13 # You should have received a copy of the GNU Lesser General Public License
14 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
15 # ____________________________________________________________
16
17 """Config's informations are, by default, volatiles. This means, all values and
18 settings changes will be lost.
19
20 The storage is the system Tiramisu uses to communicate with various DB.
21 You can specified a persistent storage.
22
23 Storage is basic components used to set Config informations in DB.
24 The primary "entry point" class is the StorageType and it's public
25 configurator ``set_storage()``.
26 """
27
28
29 from time import time
30 from tiramisu.error import ConfigError
31 from tiramisu.i18n import _
32
33
34 class StorageType(object):
35     """Object to store storage's type. If a Config is already set,
36     default storage is store as selected storage. You cannot change it
37     after.
38     """
39     default_storage = 'dictionary'
40     storage_type = None
41     mod = None
42
43     def set(self, name):
44         if self.storage_type is not None:
45             if self.storage_type == name:
46                 return
47             raise ConfigError(_('storage_type is already set, cannot rebind it'))
48         self.storage_type = name
49
50     def get(self):
51         if self.storage_type is None:
52             self.storage_type = self.default_storage
53         storage = self.storage_type
54         if self.mod is None:
55             modulepath = 'tiramisu.storage.{0}'.format(storage)
56             mod = __import__(modulepath)
57             for token in modulepath.split(".")[1:]:
58                 mod = getattr(mod, token)
59             self.mod = mod
60         return self.mod
61
62
63 storage_type = StorageType()
64
65
66 def set_storage(name, **kwargs):
67     """Change storage's configuration
68
69     :params name: is the storage name. If storage is already set, cannot
70         reset storage name
71
72     Other attributes are differents according to the selected storage's name
73     """
74     storage_type.set(name)
75     setting = storage_type.get().setting
76     for option, value in kwargs.items():
77         try:
78             getattr(setting, option)
79             setattr(setting, option, value)
80         except AttributeError:
81             raise ValueError(_('option {0} not already exists in storage {1}'
82                                '').format(option, name))
83
84
85 def _impl_getstate_setting():
86     setting = storage_type.get().setting
87     state = {'name': storage_type.storage_type}
88     for var in dir(setting):
89         if not var.startswith('_'):
90             state[var] = getattr(setting, var)
91     return state
92
93
94 def get_storage(session_id, persistent, test):
95     """all used when __setstate__ a Config
96     """
97     return storage_type.get().Storage(session_id, persistent, test)
98
99
100 def get_storages(context, session_id, persistent):
101     def gen_id(config):
102         return str(id(config)) + str(time())
103
104     if session_id is None:
105         session_id = gen_id(context)
106     imp = storage_type.get()
107     storage = imp.Storage(session_id, persistent)
108     return imp.Settings(storage), imp.Values(storage)
109
110
111 def list_sessions():
112     """List all available session (persistent or not persistent)
113     """
114     return storage_type.get().list_sessions()
115
116
117 def delete_session(session_id):
118     """Delete a selected session, be careful, you can deleted a session
119     use by an other instance
120     :params session_id: id of session to delete
121     """
122     return storage_type.get().delete_session(session_id)
123
124
125 __all__ = (set_storage, list_sessions, delete_session)