147d8a87b501250c9b583ba5c9c6a81b6c5a846b
[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
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU General Public License
14 # along with this program; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16 #
17 # The original `Config` design model is unproudly borrowed from
18 # the rough gus of pypy: pypy: http://codespeak.net/svn/pypy/dist/pypy/config/
19 # the whole pypy projet is under MIT licence
20 # ____________________________________________________________
21
22 """Storage is basic components used to set Config informations in DB.
23 The primary "entry point" class is the StorageType and it's public
24 configurator ``set_storage()``.
25 """
26
27
28 from time import time
29 from tiramisu.error import ConfigError
30 from tiramisu.i18n import _
31
32
33 class StorageType(object):
34     """Object to store storage's type. If a Config is already set,
35     default storage is store as selected storage. You cannot change it
36     after.
37     """
38     default_storage = 'dictionary'
39     storage_type = None
40     mod = None
41
42     def set(self, name):
43         if self.storage_type is not None:
44             if self.storage_type == name:
45                 return
46             raise ConfigError(_('storage_type is already set, cannot rebind it'))
47         self.storage_type = name
48
49     def get(self):
50         if self.storage_type is None:
51             self.storage_type = self.default_storage
52         storage = self.storage_type
53         if self.mod is None:
54             modulepath = 'tiramisu.storage.{0}'.format(storage)
55             mod = __import__(modulepath)
56             for token in modulepath.split(".")[1:]:
57                 mod = getattr(mod, token)
58             self.mod = mod
59         return self.mod
60
61
62 storage_type = StorageType()
63
64
65 def set_storage(name, **args):
66     """Change storage's configuration
67
68     :params name: is the storage name. If storage is already set, cannot
69         reset storage name
70
71     Other attributes are differents according to the selected storage's name
72     """
73     storage_type.set(name)
74     settings = storage_type.get().Setting()
75     for option, value in args.items():
76         try:
77             getattr(settings, option)
78             setattr(settings, option, value)
79         except AttributeError:
80             raise ValueError(_('option {0} not already exists in storage {1}'
81                                '').format(option, name))
82
83
84 def get_storages(context, session_id, persistent):
85     def gen_id(config):
86         return str(id(config)) + str(time())
87
88     if session_id is None:
89         session_id = gen_id(context)
90     imp = storage_type.get()
91     storage = imp.Storage(session_id, persistent)
92     return imp.Settings(storage), imp.Values(storage)
93
94
95 def list_sessions():
96     """List all available session (persistent or not persistent)
97     """
98     return storage_type.get().list_sessions()
99
100
101 def delete_session(session_id):
102     """Delete a selected session, be careful, you can deleted a session
103     use by an other instance
104     :params session_id: id of session to delete
105     """
106     return storage_type.get().delete_session(session_id)
107
108
109 __all__ = (set_storage, list_sessions, delete_session)