1 # Copyright (C) 2014 Ipsilon project Contributors, for license see COPYING
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
9 TRANSTABLE = 'transactions'
10 TRANSID = "ipsilon_transaction_id"
13 class Transaction(Log):
15 def __init__(self, provider, **kwargs):
16 self.provider = provider
17 self.transaction_id = None
18 self._ts = TranStore()
22 # if arguments are passed find or get new transaction
25 if not self.transaction_id:
28 def find_tid(self, kwargs):
29 tid = kwargs.get(TRANSID)
31 # If more than one only pick the first
32 if isinstance(tid, list):
34 self.transaction_id = tid
35 data = self.retrieve()
36 if data and 'provider' in data:
37 self.provider = data['provider']
38 self._get_cookie(data)
39 self.debug('Transaction: %s %s' % (self.provider,
46 data = {'provider': self.provider,
47 'origintime': str(datetime.now())}
48 self.transaction_id = self._ts.new_unique_data(TRANSTABLE, data)
50 self.debug('Transaction: %s %s' % (self.provider,
53 def _set_cookie(self):
54 self.cookie = SecureCookie(name=None, value=self.provider)
56 cookiedata = {'cookie': self.cookie.name}
57 data = {self.transaction_id: cookiedata}
58 self._ts.save_unique_data(TRANSTABLE, data)
60 def _get_cookie(self, data=None):
62 data = self.retrieve()
63 if data is None or 'cookie' not in data:
64 raise ValueError('Cookie name not available')
65 self.cookie = SecureCookie(data['cookie'])
67 if self.cookie.value is None:
68 raise ValueError('Missing or invalid cookie')
70 def _del_cookie(self):
75 if not self.transaction_id:
77 self._ts.del_unique_data(TRANSTABLE, self.transaction_id)
79 self.transaction_id = None
81 def store(self, data):
82 savedata = {self.transaction_id: data}
83 self._ts.save_unique_data(TRANSTABLE, savedata)
86 data = self._ts.get_unique_data(TRANSTABLE,
87 uuidval=self.transaction_id)
88 return data.get(self.transaction_id) or dict()
90 def get_GET_arg(self):
91 return "%s=%s" % (TRANSID, self.transaction_id)
93 def get_POST_tuple(self):
94 return (TRANSID, self.transaction_id)