summaryrefslogtreecommitdiffstats
path: root/ipsilon/util/trans.py
blob: 8d4be148181291ade8f1ae0df14f4916efe53059 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# Copyright (C) 2014  Ipsilon project Contributors, for licensee see COPYING

from ipsilon.util.data import TranStore
from ipsilon.util.log import Log
from datetime import datetime
from ipsilon.util.cookies import SecureCookie


TRANSTABLE = 'transactions'
TRANSID = "ipsilon_transaction_id"


class Transaction(Log):

    def __init__(self, provider, **kwargs):
        self.provider = provider
        self.transaction_id = None
        self._ts = TranStore()
        self.cookie = None
        tid = kwargs.get(TRANSID)
        if tid:
            self.transaction_id = tid
            data = self.retrieve()
            if data and 'provider' in data:
                self.provider = data['provider']
            self._get_cookie(data)
        else:
            data = {'provider': self.provider,
                    'origintime': str(datetime.now())}
            self.transaction_id = self._ts.new_unique_data(TRANSTABLE, data)
            self._set_cookie()
        self.debug('Transaction: %s %s' % (self.provider,
                                           self.transaction_id))

    def _set_cookie(self):
        self.cookie = SecureCookie(name=None, value=self.provider)
        self.cookie.send()
        cookiedata = {'cookie': self.cookie.name}
        data = {self.transaction_id: cookiedata}
        self._ts.save_unique_data(TRANSTABLE, data)

    def _get_cookie(self, data=None):
        if data is None:
            data = self.retrieve()
        if data is None or 'cookie' not in data:
            raise ValueError('Cookie name not available')
        self.cookie = SecureCookie(data['cookie'])
        self.cookie.receive()
        if self.cookie.value is None:
            raise ValueError('Missing or invalid cookie')

    def _del_cookie(self):
        if self.cookie:
            self.cookie.delete()

    def wipe(self):
        if not self.transaction_id:
            return
        self._ts.del_unique_data(TRANSTABLE, self.transaction_id)
        self._del_cookie()
        self.transaction_id = None

    def store(self, data):
        savedata = {self.transaction_id: data}
        self._ts.save_unique_data(TRANSTABLE, savedata)

    def retrieve(self):
        data = self._ts.get_unique_data(TRANSTABLE,
                                        uuidval=self.transaction_id)
        return data.get(self.transaction_id) or dict()

    def get_GET_arg(self):
        return "%s=%s" % (TRANSID, self.transaction_id)

    def get_POST_tuple(self):
        return (TRANSID, self.transaction_id)