Fix transaction handling in providers
[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()
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):
45         data = self.retrieve()
46         if 'cookie' not in data:
47             raise ValueError('Cookie name not available')
48         self.cookie = SecureCookie(data['cookie'])
49         self.cookie.receive()
50         if self.cookie.value is None:
51             raise ValueError('Missing or invalid cookie')
52
53     def _del_cookie(self):
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)
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)