/[formed]/trunk/tools/anonym/anoymncsv.py
ViewVC logotype

Contents of /trunk/tools/anonym/anoymncsv.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 229 - (show annotations)
Fri Feb 15 17:23:32 2008 UTC (17 years ago) by teichmann
File MIME type: text/x-python
File size: 5959 byte(s)
Added simple script to fetch anonymous data from database.

1 #!/usr/bin/env python
2 #
3 # (c) 2008 by Intevation GmbH
4 # author: Sascha L. Teichmann ([email protected])
5 #
6
7 import sys
8 import os
9 import codecs
10 #import getopt
11 import psycopg2 as dbapi
12 import psycopg2.extras as extras
13
14 dbapi.extensions.register_type(dbapi.extensions.UNICODE)
15
16 SEP = "$"
17
18 DBNAME = "ka_inte00002_db"
19 HOST = "laodameia"
20 PORT = 5434
21 USER = "postgres"
22 PASSWORD = ""
23
24 ANON_ON = \
25 """SELECT wert FROM ka_konfiguration_tbl
26 WHERE bez = 'anon_transfer'"""
27
28 NUM_EINV = \
29 """SELECT count(*) FROM master_tbl_anonym_view
30 WHERE einverstaendniserklaerung = 1"""
31
32 SELECT_MASTER_TBL = \
33 """SELECT * FROM master_tbl_anonym_view
34 WHERE einverstaendniserklaerung = 1"""
35
36 RG_VIEWS = (
37 "rg_kompetenzfestellung_tbl_anonym_view",
38 "rg_angebote_berufliche_qualifizierung_tbl_anonym_view",
39 "rg_angebote_berufsvorbereitung_tbl_anonym_view",
40 "rg_angebote_bildenden_bereich_tbl_anonym_view",
41 "rg_angebote_lebensbewaeltigung_tbl_anonym_view")
42
43 SELECT_RG = \
44 """SELECT * FROM %s WHERE master_id = %d"""
45
46 BLACK_LIST = set(['id', 'master_id', 'uuid_id', 'bearbeiter_id'])
47
48 def empty(x):
49 if x is None: return ""
50 return x
51
52 class RepeatGroup:
53
54 def __init__(self, columns):
55 self.columns = columns
56
57 def headerFields(self):
58 return [a[0] for a in self.columns if a[0] not in BLACK_LIST]
59
60 def valueFields(self):
61 return [empty(a[2]) for a in self.columns if a[0] not in BLACK_LIST]
62
63 def numFields(self):
64 s = 0
65 for a in self.columns:
66 if a[0] not in BLACK_LIST:
67 s += 1
68 return s
69
70 class Case(RepeatGroup):
71 def __init__(self, columns):
72 RepeatGroup.__init__(self, columns)
73 self.rgs = []
74
75 def fetchRepeatGroups(self, cur):
76 master_id = self.columns[0][2]
77 print >> sys.stderr, "master: %d" % master_id
78 for view in RG_VIEWS:
79 cur.execute(SELECT_RG % (view, int(master_id)))
80 rs = []
81 while True:
82 row = cur.fetchone()
83 if not row: break
84 cs = row._index.items() # XXX: hackish!
85 cs.sort(lambda a, b: cmp(a[1], b[1]))
86 cs = [(a[0], a[1], row[a[1]]) for a in cs]
87 rs.append(RepeatGroup(cs))
88 print >> sys.stderr, "\t%d %s" % (len(rs), view)
89 self.rgs.append(rs)
90
91 class Cases:
92 def __init__(self):
93 self.cases = []
94
95 def appendCase(self, case):
96 self.cases.append(case)
97
98 def fetchRepeatGroups(self, cur):
99 for case in self.cases:
100 case.fetchRepeatGroups(cur)
101
102 def maxRepeatGroups(self):
103 mc = [0] * len(RG_VIEWS)
104
105 for rgs in [c.rgs for c in self.cases]:
106 for i in range(len(mc)):
107 mc[i] = max(mc[i], len(rgs[i]))
108
109 for l in mc:
110 print >> sys.stderr, "max len: %d" % l
111
112 self.maxRGs = mc
113
114 def noneEmptyRepeatGroup(self, i):
115 for case in self.cases:
116 rgs = case.rgs
117 if len(rgs[i]):
118 return rgs[i][0]
119 return None
120
121 def generateHeader(self, out):
122 if not self.cases:
123 return ""
124 case = self.cases[0]
125 headers = case.headerFields()
126 for i in range(len(RG_VIEWS)):
127 rg = self.noneEmptyRepeatGroup(i)
128 if rg is None:
129 continue
130 hs = rg.headerFields()
131 for j in range(self.maxRGs[i]):
132 if j > 0:
133 headers.extend([ "%s_%d" % (x, j) for x in hs])
134 else:
135 headers.extend(hs)
136 print >> out, "#%s" % SEP.join(headers)
137
138 def dumpFields(self, out):
139 fills = []
140 for i in range(len(RG_VIEWS)):
141 rg = self.noneEmptyRepeatGroup(i)
142 if rg is None: fills.append(0)
143 else: fills.append(rg.numFields())
144
145 for case in self.cases:
146 line = case.valueFields()
147 for m, rg, fill in zip(self.maxRGs, case.rgs, fills):
148 count = 0
149 for r in rg:
150 line.extend(r.valueFields())
151 count += 1
152 while count < m:
153 line.extend([''] * fill)
154 count += 1
155 print >> out, "%s" % SEP.join(map(lambda x: u"%s" % x, line))
156
157
158 def main():
159 Writer = codecs.getwriter("latin-1")
160 out = Writer(sys.stdout)
161 con, cur = None, None
162 try:
163 PASSWORD = raw_input("> ")
164 con = dbapi.connect(
165 database = DBNAME,
166 host = HOST,
167 port = PORT,
168 user = USER,
169 password = PASSWORD)
170
171 cur = con.cursor(cursor_factory=extras.DictCursor)
172 cur.execute(ANON_ON)
173 row = cur.next()
174
175 if row:
176 if row[0] != 'on':
177 print >> sys.stderr, "Anonymer Transfer nicht gestattet"
178 return
179 else:
180 print >> sys.stderr, "Anonymer Transfer nicht gestattet"
181 return
182
183 cur.execute(NUM_EINV)
184 row = cur.next()
185
186 if not row:
187 print >> sys.stderr, "Keine Akten gefunden"
188 return
189
190 print >> sys.stderr, "Uebermittelbare Akten: %d" % row[0]
191
192 cur.execute(SELECT_MASTER_TBL)
193
194 cases = Cases()
195
196 while True:
197 row = cur.fetchone()
198 if not row: break
199 columns = row._index.items() # XXX: hackish!
200 columns.sort(lambda a, b: cmp(a[1], b[1]))
201 columns = [(a[0], a[1], row[a[1]]) for a in columns]
202 cases.appendCase(Case(columns))
203
204 cases.fetchRepeatGroups(cur)
205 cases.maxRepeatGroups()
206 cases.generateHeader(out)
207 cases.dumpFields(out)
208
209 finally:
210 if cur:
211 try: cur.close()
212 except: pass
213 if con:
214 try: con.close()
215 except: pass
216
217
218 if __name__ == "__main__":
219 main()

Properties

Name Value
svn:executable *

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26