doc.py
3.03 KB
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from ISO8583.ISO8583 import ISO8583
class BaseISO8583(ISO8583):
@property
def ack_message(self):
"""Default ack_message property for compatibility."""
return getattr(self, '_ack_message', None)
@ack_message.setter
def ack_message(self, value):
self._ack_message = value
def to_dict(self):
"""Serialize all set bits and their values to a dict."""
d = {}
for item in self.getBitsAndValues():
bit = int(item['bit'])
d[bit] = self.getBit(bit)
d['MTI'] = self.getMTI()
return d
@classmethod
def from_dict(cls, d):
"""Create a new ISO8583 object from a dict of bits and values."""
mti = d.get('MTI')
obj = cls()
if mti:
obj.setMTI(mti)
for bit, value in d.items():
if bit == 'MTI':
continue
obj.setBit(int(bit), value)
return obj
def __init__(self, from_iso=None, debug=False):
ISO8583.__init__(self, debug=debug)
self.from_iso = from_iso
bits = self.get_bit_definition()
for bit in bits:
short_name, long_name, type_, size, valueType = bits[bit]
self.redefineBit(
bit, short_name, long_name, type_, size, valueType)
def _ISO8583__setBitTypeANS(self, bit, value): # Override
value = "%s" % value
if len(value) > self.getBitLimit(bit):
value = value[0:self.getBitLimit(bit)]
raise ValueTooLarge(
'Error: value up to size! Bit[%s] of type %s '
'limit size = %s' % (
bit, self.getBitType(bit), self.getBitLimit(bit)))
data_form = self.getBitFormat(bit)
if data_form == "A":
self.BITMAP_VALUES[bit] = value.ljust(self.getBitLimit(bit)).\
encode()
elif data_form == "E":
self.BITMAP_VALUES[bit] = value.zfill(self.getBitLimit(bit)).\
encode('cp1148')
def redefineBit(self, bit, short_name, long_name, type_, size, valueType):
if type_ in ('LL', 'LLL'):
LenForm = 'A' # ASCII
else:
LenForm = '-'
format_ = 'A' # ASCII
ISO8583.redefineBit(
self, bit, short_name, long_name, type_, LenForm, size,
valueType, format_)
def get_bit_definition(self):
return {}
def get_value(self, bit):
return self.getBit(bit)
def get_values(self):
r = {}
for item in self.getBitsAndValues():
bit = int(item['bit'])
r[bit] = self.getBit(bit)
return r
def copy(self, bits=[], from_iso=None):
if not from_iso:
from_iso = self.from_iso
values = from_iso.get_values()
for bit in values:
if bits and bit not in bits: # Hanya bit tertentu ?
continue
value = values[bit]
self.setBit(bit, value)