05d538e7eec2905273b430da4ef5d731be6b8693
[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.provider = provider
19         self.transaction_id = None
20         self._ts = TranStore()
21         self.cookie = None
22         tid = kwargs.get(TRANSID)
23         if tid:
24             self.transaction_id = tid
25             data = self.retrieve()
26             if data and 'provider' in data:
27                 self.provider = data['provider']
28             self._get_cookie(data)
29         else:
30             data = {'provider': self.provider,
31                     'origintime': str(datetime.now())}
32             self.transaction_id = self._ts.new_unique_data(TRANSTABLE, data)
33             self._set_cookie()
34         self.debug('Transaction: %s %s' % (self.provider,
35                                            self.transaction_id))
36
37     def _set_cookie(self):
38         self.cookie = SecureCookie(name=None, value=self.provider)
39         self.cookie.send()
40         cookiedata = {'cookie': self.cookie.name}
41         data = {self.transaction_id: cookiedata}
42         self._ts.save_unique_data(TRANSTABLE, data)
43
44     def _get_cookie(self, data=None):
45         if data is None:
46             data = self.retrieve()
47         if data is None or 'cookie' not in data:
48             raise ValueError('Cookie name not available')
49         self.cookie = SecureCookie(data['cookie'])
50         self.cookie.receive()
51         if self.cookie.value is None:
52             raise ValueError('Missing or invalid cookie')
53
54     def _del_cookie(self):
55         if self.cookie:
56             self.cookie.delete()
57
58     def wipe(self):
59         if not self.transaction_id:
60             return
61         self._ts.del_unique_data(TRANSTABLE, self.transaction_id)
62         self._del_cookie()
63         self.transaction_id = None
64
65     def store(self, data):
66         savedata = {self.transaction_id: data}
67         self._ts.save_unique_data(TRANSTABLE, savedata)
68
69     def retrieve(self):
70         data = self._ts.get_unique_data(TRANSTABLE,
71                                         uuidval=self.transaction_id)
72         return data.get(self.transaction_id) or dict()
73
74     def get_GET_arg(self):
75         return "%s=%s" % (TRANSID, self.transaction_id)
76
77     def get_POST_tuple(self):
78         return (TRANSID, self.transaction_id)