-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdatastructures.py
107 lines (86 loc) · 4.7 KB
/
datastructures.py
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
__author__ = 'Abraham Aondowase Yusuf <[email protected]>'
import zipfile
from base64 import b64decode
from xml.etree import cElementTree as ET
class OperationError(Exception):
pass
class PortraitData(object):
def __init__(self, portraitImage, imageType, imageCompression, compressionRatio):
self.PortraitImage = portraitImage
self.ImageType = imageType
self.ImageCompression = imageCompression
self.CompressionRatio = compressionRatio
class FingerData(object):
def __init__(self, fingerInfo, fingerReason, supervisorName, nfiq, wsqImageCompressionRatio, fingerprintImage):
self.FingerInfo = fingerInfo
self.FingerReason = fingerReason
self.SupervisorName = supervisorName
self.NFIQ = nfiq
self.WSQImageCompressionRatio = wsqImageCompressionRatio
self.FingerprintImage = fingerprintImage
class FEPRecord(object):
def __getattr__(self, item):
if hasattr(self, item):
return getattr(self, item)
if item in ['LeftThumbPrint', 'RightThumbPrint', 'LeftIndexFingerPrint', 'RightIndexFingerPrint']:
for finger in self._fingers:
if finger.FingerInfo == item:
return item
raise AttributeError
def __init__(self, zipf, xmlf):
self.packet_name, self.xml_filename = zipf, xmlf
try:
with zipfile.ZipFile(zipf) as input:
tree = ET.fromstring(input.open(xmlf).read())
except ET.ParseError as e:
raise OperationError('Invalid XML File')
attrs = [
('FEPCode','.//NigeriaSIMDemographics/FEPCode', None),
('FEPTrackingID','.//NigeriaSIMDemographics/FEPTrackingID', None),
('RegistrationType', './/NigeriaSIMDemographics/RegistrationType', None),
('FolioVersion', './/NigeriaSIMDemographics/FolioVersion', None),
('SubscriberID', './/NigeriaSIMDemographics/SubscriberID', None),
('RegistrationDate', './/NigeriaSIMDemographics/RegistrationDate', None),
('RegistrationTime','.//NigeriaSIMDemographics/RegistrationTime', None),
('RegistrationState', './/NigeriaSIMDemographics/RegistrationState', None),
('RegistrationLGA', './/NigeriaSIMDemographics/RegistrationLGA', None),
('Surname', './/NigeriaSIMDemographics/Surname', None),
('FirstName', './/NigeriaSIMDemographics/FirstName', None),
('MotherMaidenName', './/NigeriaSIMDemographics/MotherMaidenName', None),
('Gender', './/NigeriaSIMDemographics/Gender', None),
('DateOfBirth', './/NigeriaSIMDemographics/DateOfBirth', None),
('ResidentialAddress', './/NigeriaSIMDemographics/ResidentialAddress', None),
('ResidentialAddressLGA', './/NigeriaSIMDemographics/ResidentialAddressLGA', None),
('ResidentialAddressState', './/NigeriaSIMDemographics/ResidentialAddressState', None),
('Nationality', './/NigeriaSIMDemographics/Nationality', None),
('StateofOrigin', './/NigeriaSIMDemographics/StateofOrigin', None),
('MainMobileNumber', './/NigeriaSIMDemographics/MainMobileNumber', None),
('OtherMobileNumbers', './/NigeriaSIMDemographics/OtherMobileNumbers', ''),
('_PotraitImage', './/NigeriaSIMDemographics/PortraitData/PotraitImage', None),
('_ImageType', './/NigeriaSIMDemographics/PortraitData/ImageType', None),
('_ImageCompression', './/NigeriaSIMDemographics/PortraitData/ImageCompression', None),
('_CompressionRatio', './/NigeriaSIMDemographics/PortraitData/CompressionRatio', None)
]
for item in attrs:
attr, path, default_value = item
try:
value = b64decode(tree.findall(path)[0].text) if attr in ['_PotraitImage'] else tree.findall(path)[0].text
setattr(self, attr, value)
except:
setattr(self, attr, default_value or '')
self.PortraitData = PortraitData(self._PotraitImage, self._ImageType, self._ImageCompression, self._CompressionRatio)
self._fingers = []
finger_attrs = [
'FingerInfo', 'FingerReason', 'SupervisorName', 'NFIQ', 'WSQImageCompressionRatio', 'FingerprintImage'
]
for f in tree.findall('.//NigeriaSIMDemographics/FingerData'):
finger_args = []
for attr in finger_attrs:
try:
value = b64decode(f.findall(attr)[0].text) if attr in ['FingerprintImage'] else f.findall(attr)[0].text
except:
value = ''
finger_args.append(value)
self._fingers.append(
FingerData(*finger_args)
)