8d4be148181291ade8f1ae0df14f4916efe53059
[cascardo/ipsilon.git] / ipsilon / util / trans.py
1 # Copyright (C) 2014  Ipsilon project Contributors, for licensee see COPYING
2
3 from ipsilon.util.data import TranStore
4 from ipsilon.util.log import Log
5 from datetime import datetime
6 from ipsilon.util.cookies import SecureCookie
7
8
9 TRANSTABLE = 'transactions'
10 TRANSID = "ipsilon_transaction_id"
11
12
13 class Transaction(Log):
14
15     def __init__(self, provider, **kwargs):
16         self.provider = provider
17         self.transaction_id = None
18         self._ts = TranStore()
19         self.cookie = None
20         tid = kwargs.get(TRANSID)
21         if tid:
22             self.transaction_id = tid
23             data = self.retrieve()
24             if data and 'provider' in data:
25                 self.provider = data['provider']
26             self._get_cookie(data)
27         else:
28             data = {'provider': self.provider,
29                     'origintime': str(datetime.now())}
30             self.transaction_id = self._ts.new_unique_data(TRANSTABLE, data)
31             self._set_cookie()
32         self.debug('Transaction: %s %s' % (self.provider,
33                                            self.transaction_id))
34
35     def _set_cookie(self):
36         self.cookie = SecureCookie(name=None, value=self.provider)
37         self.cookie.send()
38         cookiedata = {'cookie': self.cookie.name}
39         data = {self.transaction_id: cookiedata}
40         self._ts.save_unique_data(TRANSTABLE, data)
41
42     def _get_cookie(self, data=None):
43         if data is None:
44             data = self.retrieve()
45         if data is None or 'cookie' not in data:
46             raise ValueError('Cookie name not available')
47         self.cookie = SecureCookie(data['cookie'])
48         self.cookie.receive()
49         if self.cookie.value is None:
50             raise ValueError('Missing or invalid cookie')
51
52     def _del_cookie(self):
53         if self.cookie:
54             self.cookie.delete()
55
56     def wipe(self):
57         if not self.transaction_id:
58             return
59         self._ts.del_unique_data(TRANSTABLE, self.transaction_id)
60         self._del_cookie()
61         self.transaction_id = None
62
63     def store(self, data):
64         savedata = {self.transaction_id: data}
65         self._ts.save_unique_data(TRANSTABLE, savedata)
66
67     def retrieve(self):
68         data = self._ts.get_unique_data(TRANSTABLE,
69                                         uuidval=self.transaction_id)
70         return data.get(self.transaction_id) or dict()
71
72     def get_GET_arg(self):
73         return "%s=%s" % (TRANSID, self.transaction_id)
74
75     def get_POST_tuple(self):
76         return (TRANSID, self.transaction_id)