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